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();
videoIntroController.videoDetail.listen((value) {
videoDetail = value;
videoPlayerServiceHandler.onVideoIntroChange(value);
});
}
@override
void dispose() {
videoIntroController.onClose();
videoPlayerServiceHandler.onVideoIntroDispose();
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/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<VideoDetailPage>
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<VideoDetailPage>
if (videoDetailController.floating != null) {
videoDetailController.floating!.dispose();
}
videoPlayerServiceHandler.onVideoDetailDispose();
WidgetsBinding.instance.removeObserver(this);
floating.dispose();
super.dispose();

View File

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

View File

@ -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<VideoPlayerServiceHandler> initAudioService() async {
);
}
class VideoPlayerServiceHandler extends BaseAudioHandler
with QueueHandler, SeekHandler {
class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler {
static final List<MediaItem> _item = [];
@override
@ -42,7 +42,6 @@ class VideoPlayerServiceHandler extends BaseAudioHandler
Future<void> setMediaItem(MediaItem newMediaItem) async {
mediaItem.add(newMediaItem);
addQueueItem(newMediaItem);
}
Future<void> 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,