👽 Authorized audio, video access

This commit is contained in:
2026-01-14 22:34:17 +08:00
parent 95daa3c28d
commit dd7696132c
2 changed files with 26 additions and 6 deletions

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/pods/config.dart';
import 'package:island/pods/network.dart'; import 'package:island/pods/network.dart';
import 'package:island/services/time.dart'; import 'package:island/services/time.dart';
import 'package:island/talker.dart'; import 'package:island/talker.dart';
@@ -57,10 +58,14 @@ class _UniversalAudioState extends ConsumerState<UniversalAudio> {
final inCacheInfo = await DefaultCacheManager().getFileFromCache(url); final inCacheInfo = await DefaultCacheManager().getFileFromCache(url);
if (inCacheInfo == null) { if (inCacheInfo == null) {
talker.info('[MediaPlayer] Miss cache: $url'); 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( DefaultCacheManager().downloadFile(
url, url,
authHeaders: {'Authorization': 'AtField $token'}, authHeaders: authHeaders,
); );
uri = url; uri = url;
} else { } else {
@@ -68,7 +73,13 @@ class _UniversalAudioState extends ConsumerState<UniversalAudio> {
talker.info('[MediaPlayer] Hit cache: $url'); 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<String, String>? httpHeaders = uri.startsWith(serverUrl) && token != null
? {'Authorization': 'AtField ${token.token}'}
: null;
_player!.open(Media(uri, httpHeaders: httpHeaders), play: widget.autoplay);
} }
@override @override
@@ -164,4 +175,4 @@ class _UniversalAudioState extends ConsumerState<UniversalAudio> {
).padding(horizontal: 24, vertical: 16), ).padding(horizontal: 24, vertical: 16),
); );
} }
} }

View File

@@ -2,6 +2,8 @@ import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.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/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
@@ -30,7 +32,14 @@ class _UniversalVideoState extends ConsumerState<UniversalVideo> {
_player = Player(); _player = Player();
_videoController = VideoController(_player!); _videoController = VideoController(_player!);
_player!.open(Media(widget.uri), play: widget.autoplay); final serverUrl = ref.read(serverUrlProvider);
final token = ref.read(tokenProvider);
final Map<String, String>? httpHeaders =
widget.uri.startsWith(serverUrl) && token != null
? {'Authorization': 'AtField ${token.token}'}
: null;
_player!.open(Media(widget.uri, httpHeaders: httpHeaders), play: widget.autoplay);
} }
@override @override
@@ -61,4 +70,4 @@ class _UniversalVideoState extends ConsumerState<UniversalVideo> {
: MaterialDesktopVideoControls, : MaterialDesktopVideoControls,
); );
} }
} }