From c98dbccbd744bbc12db6b2759cca329d790590f8 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sat, 1 Mar 2025 16:37:49 +0800 Subject: [PATCH] fix: #359 Signed-off-by: bggRGjQaUbCoE --- lib/pages/video/detail/controller.dart | 2 + lib/pages/video/detail/view.dart | 17 +++---- lib/pages/video/detail/view_v.dart | 19 ++++---- .../video/detail/widgets/header_control.dart | 1 + lib/plugin/pl_player/controller.dart | 2 +- lib/services/audio_handler.dart | 44 ++++++++++++------- pubspec.lock | 12 ++--- 7 files changed, 58 insertions(+), 39 deletions(-) diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 5ef92ef8..e8f6e013 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -145,6 +145,8 @@ class VideoDetailController extends GetxController max(max(Get.height, Get.width) * 0.65, min(Get.height, Get.width)); late double videoHeight = minVideoHeight; + bool? backToHome; + void setVideoHeight() { String direction = firstVideo.width != null && firstVideo.height != null ? firstVideo.width! > firstVideo.height! diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 26b58d32..e0fe3544 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -130,7 +130,7 @@ class _VideoDetailPageState extends State _listenerDetail = videoIntroController.videoDetail.listen((value) { if (!context.mounted) return; videoPlayerServiceHandler.onVideoDetailChange( - value, videoDetailController.cid.value); + value, videoDetailController.cid.value, heroTag); }); if (videoDetailController.videoType == SearchType.media_bangumi) { bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag); @@ -139,18 +139,16 @@ class _VideoDetailPageState extends State if (!context.mounted) return; if (value is Success) { videoPlayerServiceHandler.onVideoDetailChange( - value.response, - videoDetailController.cid.value, - ); + value.response, videoDetailController.cid.value, heroTag); } }); _listenerCid = videoDetailController.cid.listen((p0) { if (!context.mounted) return; if (bangumiIntroController.loadingState.value is Success) { videoPlayerServiceHandler.onVideoDetailChange( - (bangumiIntroController.loadingState.value as Success).response, - p0, - ); + (bangumiIntroController.loadingState.value as Success).response, + p0, + heroTag); } }); } @@ -371,6 +369,9 @@ class _VideoDetailPageState extends State } shutdownTimerService.handleWaitingFinished(); // _bufferedListener?.cancel(); + if (videoDetailController.backToHome != true) { + videoPlayerServiceHandler.onVideoDetailDispose(heroTag); + } if (plPlayerController != null) { videoDetailController.makeHeartBeat(); plPlayerController!.removeStatusLister(playerListener); @@ -379,7 +380,6 @@ class _VideoDetailPageState extends State } else { PlPlayerController.updatePlayCount(); } - videoPlayerServiceHandler.onVideoDetailDispose(); VideoDetailPage.routeObserver.unsubscribe(this); // _lifecycleListener.dispose(); showStatusBar(); @@ -1068,6 +1068,7 @@ class _VideoDetailPageState extends State ], ), onPressed: () { + videoDetailController.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/pages/video/detail/view_v.dart b/lib/pages/video/detail/view_v.dart index 4c9b1731..e368f13a 100644 --- a/lib/pages/video/detail/view_v.dart +++ b/lib/pages/video/detail/view_v.dart @@ -135,7 +135,7 @@ class _VideoDetailPageVState extends State _listenerDetail = videoIntroController.videoDetail.listen((value) { if (!context.mounted) return; videoPlayerServiceHandler.onVideoDetailChange( - value, videoDetailController.cid.value); + value, videoDetailController.cid.value, heroTag); }); if (videoDetailController.videoType == SearchType.media_bangumi) { bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag); @@ -144,18 +144,16 @@ class _VideoDetailPageVState extends State if (!context.mounted) return; if (value is Success) { videoPlayerServiceHandler.onVideoDetailChange( - value.response, - videoDetailController.cid.value, - ); + value.response, videoDetailController.cid.value, heroTag); } }); _listenerCid = videoDetailController.cid.listen((p0) { if (!context.mounted) return; if (bangumiIntroController.loadingState.value is Success) { videoPlayerServiceHandler.onVideoDetailChange( - (bangumiIntroController.loadingState.value as Success).response, - p0, - ); + (bangumiIntroController.loadingState.value as Success).response, + p0, + heroTag); } }); } @@ -410,6 +408,9 @@ class _VideoDetailPageVState extends State } shutdownTimerService.handleWaitingFinished(); // _bufferedListener?.cancel(); + if (videoDetailController.backToHome != true) { + videoPlayerServiceHandler.onVideoDetailDispose(heroTag); + } if (plPlayerController != null) { videoDetailController.makeHeartBeat(); plPlayerController!.removeStatusLister(playerListener); @@ -418,7 +419,6 @@ class _VideoDetailPageVState extends State } else { PlPlayerController.updatePlayCount(); } - videoPlayerServiceHandler.onVideoDetailDispose(); VideoDetailPageV.routeObserver.unsubscribe(this); // _lifecycleListener.dispose(); showStatusBar(); @@ -815,6 +815,8 @@ class _VideoDetailPageVState extends State .onSurface, ), onPressed: () { + videoDetailController + .backToHome = true; Get.until((route) => route.isFirst); }, @@ -1359,6 +1361,7 @@ class _VideoDetailPageVState extends State ], ), onPressed: () { + videoDetailController.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 27e2701a..5096efdc 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1809,6 +1809,7 @@ class _HeaderControlState extends State { color: Colors.white, ), onPressed: () { + widget.videoDetailCtr.backToHome = true; Get.until((route) => route.isFirst); }, ), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 55aa5f25..b25aab48 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1529,6 +1529,7 @@ class PlPlayerController { return; } _playerCount.value = 0; + videoPlayerServiceHandler.clear(); Utils.channel.setMethodCallHandler(null); pause(); try { @@ -1559,7 +1560,6 @@ class PlPlayerController { _videoPlayerController = null; } _instance = null; - videoPlayerServiceHandler.clear(); } catch (err) { debugPrint(err.toString()); } diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index d0622eb3..b002ec1b 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -1,5 +1,5 @@ +import 'package:PiliPlus/utils/extension.dart'; import 'package:audio_service/audio_service.dart'; -import 'package:flutter/cupertino.dart'; import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/video_detail_res.dart'; import 'package:PiliPlus/plugin/pl_player/index.dart'; @@ -67,7 +67,9 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { } Future setPlaybackState(PlayerStatus status, bool isBuffering) async { - if (!enableBackgroundPlay) return; + if (!enableBackgroundPlay || PlPlayerController.instanceExists().not) { + return; + } final AudioProcessingState processingState; final playing = status == PlayerStatus.playing; @@ -103,20 +105,21 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { setPlaybackState(status, isBuffering); } - onVideoDetailChange(dynamic data, int cid) { + onVideoDetailChange(dynamic data, int cid, String herotag) { if (!enableBackgroundPlay) return; // debugPrint('当前调用栈为:'); // debugPrint(StackTrace.current); if (!PlPlayerController.instanceExists()) return; if (data == null) return; + late final id = '$cid$herotag'; MediaItem? mediaItem; if (data is VideoDetailData) { if ((data.pages?.length ?? 0) > 1) { final current = data.pages?.firstWhereOrNull((element) => element.cid == cid); mediaItem = MediaItem( - id: UniqueKey().toString(), + id: id, title: current?.pagePart ?? "", artist: data.title ?? "", album: data.title ?? "", @@ -125,7 +128,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { ); } else { mediaItem = MediaItem( - id: UniqueKey().toString(), + id: id, title: data.title ?? "", artist: data.owner?.name ?? "", duration: Duration(seconds: data.duration ?? 0), @@ -136,7 +139,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { final current = data.episodes?.firstWhereOrNull((element) => element.cid == cid); mediaItem = MediaItem( - id: UniqueKey().toString(), + id: id, title: current?.longTitle ?? "", artist: data.title ?? "", duration: Duration(milliseconds: current?.duration ?? 0), @@ -150,33 +153,42 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { setMediaItem(mediaItem); } - onVideoDetailDispose() { + onVideoDetailDispose(String herotag) { if (!enableBackgroundPlay) return; - playbackState.add(playbackState.value.copyWith( - processingState: AudioProcessingState.idle, - playing: false, - )); if (_item.isNotEmpty) { - _item.removeLast(); + _item.removeWhere((item) => item.id.endsWith(herotag)); } if (_item.isNotEmpty) { + playbackState.add(playbackState.value.copyWith( + processingState: AudioProcessingState.idle, + playing: false, + )); setMediaItem(_item.last); stop(); - } else { - clear(); } } clear() { if (!enableBackgroundPlay) return; mediaItem.add(null); + _item.clear(); + /** + * if (playbackState.processingState == AudioProcessingState.idle && + previousState?.processingState != AudioProcessingState.idle) { + await AudioService._stop(); + } + */ + if (playbackState.value.processingState == AudioProcessingState.idle) { + playbackState.add(PlaybackState( + processingState: AudioProcessingState.completed, + playing: false, + )); + } playbackState.add(PlaybackState( processingState: AudioProcessingState.idle, playing: false, )); - _item.clear(); - stop(); } onPositionChange(Duration position) { diff --git a/pubspec.lock b/pubspec.lock index 6884541a..c0313a94 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -106,10 +106,10 @@ packages: dependency: "direct main" description: name: audio_service - sha256: f6c8191bef6b843da34675dd0731ad11d06094c36b691ffcf3148a4feb2e585f + sha256: "887ddf15fce31fd12aa8044c3bffd14c58929fb20e31d96284fe3aaf48315ac6" url: "https://pub.dev" source: hosted - version: "0.18.16" + version: "0.18.17" audio_service_platform_interface: dependency: transitive description: @@ -122,18 +122,18 @@ packages: dependency: transitive description: name: audio_service_web - sha256: "4cdc2127cd4562b957fb49227dc58e3303fafb09bde2573bc8241b938cf759d9" + sha256: b8ea9243201ee53383157fbccf13d5d2a866b5dda922ec19d866d1d5d70424df url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.1.4" audio_session: dependency: "direct main" description: name: audio_session - sha256: b2a26ba8b7efa1790d6460e82971fde3e398cfbe2295df9dea22f3499d2c12a7 + sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac" url: "https://pub.dev" source: hosted - version: "0.1.23" + version: "0.1.25" auto_orientation: dependency: "direct main" description: