diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index c5db91a1..eb954510 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -52,14 +52,12 @@ class _VideoIntroPanelState extends State _futureBuilderFuture = videoIntroController.queryVideoIntro(); videoIntroController.videoDetail.listen((value) { videoDetail = value; - videoPlayerServiceHandler.onVideoIntroChange(value); }); } @override void dispose() { videoIntroController.onClose(); - videoPlayerServiceHandler.onVideoIntroDispose(); super.dispose(); } diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 75d91c23..21695e9e 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -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/plugin/pl_player/index.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 'widgets/header_control.dart'; @@ -61,7 +62,19 @@ class _VideoDetailPageState extends State heroTag = Get.arguments['heroTag']; videoDetailController = Get.put(VideoDetailController(), 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.bangumiDetail.listen((value) { + videoPlayerServiceHandler.onVideoDetailChange( + value, videoDetailController.cid.value); + }); + videoDetailController.cid.listen((p0) { + videoPlayerServiceHandler.onVideoDetailChange( + bangumiIntroController.bangumiDetail.value, p0); + }); statusBarHeight = localCache.get('statusBarHeight'); autoExitFullcreen = setting.get(SettingBoxKey.enableAutoExit, defaultValue: false); @@ -154,6 +167,7 @@ class _VideoDetailPageState extends State if (videoDetailController.floating != null) { videoDetailController.floating!.dispose(); } + videoPlayerServiceHandler.onVideoDetailDispose(); WidgetsBinding.instance.removeObserver(this); floating.dispose(); super.dispose(); diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index bbd5158c..e4f1b3d3 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1021,6 +1021,7 @@ class PlPlayerController { _instance = null; // 关闭所有视频页面恢复亮度 resetBrightness(); + videoPlayerServiceHandler.clear(); } catch (err) { print(err); } diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index 5cbfccb6..8e4a9ff8 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -1,4 +1,5 @@ import 'package:audio_service/audio_service.dart'; +import 'package:pilipala/models/bangumi/info.dart'; import 'package:pilipala/models/video_detail_res.dart'; import 'package:get/get.dart'; import 'package:pilipala/plugin/pl_player/index.dart'; @@ -18,8 +19,7 @@ Future initAudioService() async { ); } -class VideoPlayerServiceHandler extends BaseAudioHandler - with QueueHandler, SeekHandler { +class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { static final List _item = []; @override @@ -42,7 +42,6 @@ class VideoPlayerServiceHandler extends BaseAudioHandler Future setMediaItem(MediaItem newMediaItem) async { mediaItem.add(newMediaItem); - addQueueItem(newMediaItem); } Future setPlaybackState(PlayerStatus status, bool isBuffering) async { @@ -77,22 +76,36 @@ class VideoPlayerServiceHandler extends BaseAudioHandler setPlaybackState(status, isBuffering); } - onVideoIntroChange(VideoDetailData data) { + onVideoDetailChange(dynamic data, int cid) { Map argMap = Get.arguments; final heroTag = argMap['heroTag']; - final mediaItem = MediaItem( - id: heroTag, - title: data.title ?? "", - artist: data.owner?.name ?? "", - duration: Duration(seconds: data.duration ?? 0), - artUri: Uri.parse(data.pic ?? ""), - ); + late MediaItem? mediaItem; + if (data is VideoDetailData) { + mediaItem = MediaItem( + id: heroTag, + title: data.title ?? "", + artist: data.owner?.name ?? "", + duration: Duration(seconds: data.duration ?? 0), + 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); _item.add(mediaItem); } - onVideoIntroDispose() { + onVideoDetailDispose() { playbackState.add(playbackState.value.copyWith( processingState: AudioProcessingState.idle, 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) { playbackState.add(playbackState.value.copyWith( updatePosition: position,