feat: 番剧支持媒体通知
This commit is contained in:
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -1021,6 +1021,7 @@ class PlPlayerController {
|
|||||||
_instance = null;
|
_instance = null;
|
||||||
// 关闭所有视频页面恢复亮度
|
// 关闭所有视频页面恢复亮度
|
||||||
resetBrightness();
|
resetBrightness();
|
||||||
|
videoPlayerServiceHandler.clear();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
print(err);
|
print(err);
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user