From dd7696132c771571567319c4ab08071ebd30b717 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 14 Jan 2026 22:34:17 +0800 Subject: [PATCH] :alien: Authorized audio, video access --- lib/widgets/content/audio.dart | 19 +++++++++++++++---- lib/widgets/content/video.native.dart | 13 +++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/widgets/content/audio.dart b/lib/widgets/content/audio.dart index 48fbb544..514848c5 100644 --- a/lib/widgets/content/audio.dart +++ b/lib/widgets/content/audio.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; import 'package:island/services/time.dart'; import 'package:island/talker.dart'; @@ -57,10 +58,14 @@ class _UniversalAudioState extends ConsumerState { final inCacheInfo = await DefaultCacheManager().getFileFromCache(url); if (inCacheInfo == null) { talker.info('[MediaPlayer] Miss cache: $url'); - final token = ref.watch(tokenProvider)?.token; + final serverUrl = ref.read(serverUrlProvider); + final token = ref.read(tokenProvider); + final authHeaders = url.startsWith(serverUrl) && token != null + ? {'Authorization': 'AtField ${token.token}'} + : null; DefaultCacheManager().downloadFile( url, - authHeaders: {'Authorization': 'AtField $token'}, + authHeaders: authHeaders, ); uri = url; } else { @@ -68,7 +73,13 @@ class _UniversalAudioState extends ConsumerState { talker.info('[MediaPlayer] Hit cache: $url'); } - _player!.open(Media(uri), play: widget.autoplay); + final serverUrl = ref.read(serverUrlProvider); + final token = ref.read(tokenProvider); + final Map? httpHeaders = uri.startsWith(serverUrl) && token != null + ? {'Authorization': 'AtField ${token.token}'} + : null; + + _player!.open(Media(uri, httpHeaders: httpHeaders), play: widget.autoplay); } @override @@ -164,4 +175,4 @@ class _UniversalAudioState extends ConsumerState { ).padding(horizontal: 24, vertical: 16), ); } -} +} \ No newline at end of file diff --git a/lib/widgets/content/video.native.dart b/lib/widgets/content/video.native.dart index e67a7a1d..b6058500 100644 --- a/lib/widgets/content/video.native.dart +++ b/lib/widgets/content/video.native.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:island/pods/config.dart'; +import 'package:island/pods/network.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; @@ -30,7 +32,14 @@ class _UniversalVideoState extends ConsumerState { _player = Player(); _videoController = VideoController(_player!); - _player!.open(Media(widget.uri), play: widget.autoplay); + final serverUrl = ref.read(serverUrlProvider); + final token = ref.read(tokenProvider); + final Map? httpHeaders = + widget.uri.startsWith(serverUrl) && token != null + ? {'Authorization': 'AtField ${token.token}'} + : null; + + _player!.open(Media(widget.uri, httpHeaders: httpHeaders), play: widget.autoplay); } @override @@ -61,4 +70,4 @@ class _UniversalVideoState extends ConsumerState { : MaterialDesktopVideoControls, ); } -} +} \ No newline at end of file