feat: 番剧支持媒体通知

This commit is contained in:
Riri
2023-10-25 20:24:38 +08:00
parent 0a5dea0535
commit 79be397f91
4 changed files with 49 additions and 14 deletions

View File

@ -52,14 +52,12 @@ class _VideoIntroPanelState extends State<VideoIntroPanel>
_futureBuilderFuture = videoIntroController.queryVideoIntro(); _futureBuilderFuture = videoIntroController.queryVideoIntro();
videoIntroController.videoDetail.listen((value) { videoIntroController.videoDetail.listen((value) {
videoDetail = value; videoDetail = value;
videoPlayerServiceHandler.onVideoIntroChange(value);
}); });
} }
@override @override
void dispose() { void dispose() {
videoIntroController.onClose(); videoIntroController.onClose();
videoPlayerServiceHandler.onVideoIntroDispose();
super.dispose(); super.dispose();
} }

View File

@ -18,6 +18,7 @@ import 'package:pilipala/pages/video/detail/introduction/index.dart';
import 'package:pilipala/pages/video/detail/related/index.dart'; import 'package:pilipala/pages/video/detail/related/index.dart';
import 'package:pilipala/plugin/pl_player/index.dart'; import 'package:pilipala/plugin/pl_player/index.dart';
import 'package:pilipala/plugin/pl_player/models/play_repeat.dart'; import 'package:pilipala/plugin/pl_player/models/play_repeat.dart';
import 'package:pilipala/services/service_locator.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'widgets/header_control.dart'; import 'widgets/header_control.dart';
@ -61,7 +62,19 @@ class _VideoDetailPageState extends State<VideoDetailPage>
heroTag = Get.arguments['heroTag']; heroTag = Get.arguments['heroTag'];
videoDetailController = Get.put(VideoDetailController(), tag: heroTag); videoDetailController = Get.put(VideoDetailController(), tag: heroTag);
videoIntroController = Get.put(VideoIntroController(), tag: heroTag); videoIntroController = Get.put(VideoIntroController(), tag: heroTag);
videoIntroController.videoDetail.listen((value) {
videoPlayerServiceHandler.onVideoDetailChange(
value, videoDetailController.cid.value);
});
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag); bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
bangumiIntroController.bangumiDetail.listen((value) {
videoPlayerServiceHandler.onVideoDetailChange(
value, videoDetailController.cid.value);
});
videoDetailController.cid.listen((p0) {
videoPlayerServiceHandler.onVideoDetailChange(
bangumiIntroController.bangumiDetail.value, p0);
});
statusBarHeight = localCache.get('statusBarHeight'); statusBarHeight = localCache.get('statusBarHeight');
autoExitFullcreen = autoExitFullcreen =
setting.get(SettingBoxKey.enableAutoExit, defaultValue: false); setting.get(SettingBoxKey.enableAutoExit, defaultValue: false);
@ -154,6 +167,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
if (videoDetailController.floating != null) { if (videoDetailController.floating != null) {
videoDetailController.floating!.dispose(); videoDetailController.floating!.dispose();
} }
videoPlayerServiceHandler.onVideoDetailDispose();
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
floating.dispose(); floating.dispose();
super.dispose(); super.dispose();

View File

@ -1021,6 +1021,7 @@ class PlPlayerController {
_instance = null; _instance = null;
// 关闭所有视频页面恢复亮度 // 关闭所有视频页面恢复亮度
resetBrightness(); resetBrightness();
videoPlayerServiceHandler.clear();
} catch (err) { } catch (err) {
print(err); print(err);
} }

View File

@ -1,4 +1,5 @@
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:pilipala/models/bangumi/info.dart';
import 'package:pilipala/models/video_detail_res.dart'; import 'package:pilipala/models/video_detail_res.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/plugin/pl_player/index.dart'; import 'package:pilipala/plugin/pl_player/index.dart';
@ -18,8 +19,7 @@ Future<VideoPlayerServiceHandler> initAudioService() async {
); );
} }
class VideoPlayerServiceHandler extends BaseAudioHandler class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler {
with QueueHandler, SeekHandler {
static final List<MediaItem> _item = []; static final List<MediaItem> _item = [];
@override @override
@ -42,7 +42,6 @@ class VideoPlayerServiceHandler extends BaseAudioHandler
Future<void> setMediaItem(MediaItem newMediaItem) async { Future<void> setMediaItem(MediaItem newMediaItem) async {
mediaItem.add(newMediaItem); mediaItem.add(newMediaItem);
addQueueItem(newMediaItem);
} }
Future<void> setPlaybackState(PlayerStatus status, bool isBuffering) async { Future<void> setPlaybackState(PlayerStatus status, bool isBuffering) async {
@ -77,22 +76,36 @@ class VideoPlayerServiceHandler extends BaseAudioHandler
setPlaybackState(status, isBuffering); setPlaybackState(status, isBuffering);
} }
onVideoIntroChange(VideoDetailData data) { onVideoDetailChange(dynamic data, int cid) {
Map argMap = Get.arguments; Map argMap = Get.arguments;
final heroTag = argMap['heroTag']; final heroTag = argMap['heroTag'];
final mediaItem = MediaItem( late MediaItem? mediaItem;
if (data is VideoDetailData) {
mediaItem = MediaItem(
id: heroTag, id: heroTag,
title: data.title ?? "", title: data.title ?? "",
artist: data.owner?.name ?? "", artist: data.owner?.name ?? "",
duration: Duration(seconds: data.duration ?? 0), duration: Duration(seconds: data.duration ?? 0),
artUri: Uri.parse(data.pic ?? ""), artUri: Uri.parse(data.pic ?? ""),
); );
} else if (data is BangumiInfoModel) {
final current =
data.episodes?.firstWhere((element) => element.cid == cid);
mediaItem = MediaItem(
id: heroTag,
title: current?.longTitle ?? "",
artist: data.title ?? "",
duration: Duration(milliseconds: current?.duration ?? 0),
artUri: Uri.parse(data.cover ?? ""),
);
}
if (mediaItem == null) return;
setMediaItem(mediaItem); setMediaItem(mediaItem);
_item.add(mediaItem); _item.add(mediaItem);
} }
onVideoIntroDispose() { onVideoDetailDispose() {
playbackState.add(playbackState.value.copyWith( playbackState.add(playbackState.value.copyWith(
processingState: AudioProcessingState.idle, processingState: AudioProcessingState.idle,
playing: false, playing: false,
@ -108,6 +121,15 @@ class VideoPlayerServiceHandler extends BaseAudioHandler
} }
} }
clear() {
playbackState.add(PlaybackState(
processingState: AudioProcessingState.idle,
playing: false,
));
mediaItem.add(null);
_item.clear();
}
onPositionChange(Duration position) { onPositionChange(Duration position) {
playbackState.add(playbackState.value.copyWith( playbackState.add(playbackState.value.copyWith(
updatePosition: position, updatePosition: position,