diff --git a/lib/pages/play/play_controller.dart b/lib/pages/play/play_controller.dart index c375823..11a22c1 100644 --- a/lib/pages/play/play_controller.dart +++ b/lib/pages/play/play_controller.dart @@ -1,4 +1,5 @@ // Package imports: +import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; @@ -91,8 +92,13 @@ class PlayController extends StateNotifier { /// 保存播放进度 Future saveProgress() async { + if (state.player.state.playlist.medias.isEmpty) return; var progress = state.player.state.position.inMilliseconds; - await state.hive.updateProgress(progress); + var media = + state.player.state.playlist.medias[state.player.state.playlist.index]; + var episode = media.extras?['episode']; + debugPrint('progress: $progress, episode: $episode'); + await state.hive.updateProgress(progress, episode); } /// 跳转 diff --git a/lib/pages/play/play_history_page.dart b/lib/pages/play/play_history_page.dart index b24efb4..241e79b 100644 --- a/lib/pages/play/play_history_page.dart +++ b/lib/pages/play/play_history_page.dart @@ -1,3 +1,6 @@ +// Flutter imports: +import 'package:flutter/foundation.dart'; + // Package imports: import 'package:fluent_ui/fluent_ui.dart'; @@ -268,7 +271,7 @@ class _PlayHistoryPageState extends State { children: [ buildDelHistoryButton(item), buildEditButton(item), - buildSearchButton(item), + if (kDebugMode) buildSearchButton(item), ], ), content: Column( diff --git a/lib/pages/play/play_list_page.dart b/lib/pages/play/play_list_page.dart index c721bdd..76d1946 100644 --- a/lib/pages/play/play_list_page.dart +++ b/lib/pages/play/play_list_page.dart @@ -1,3 +1,6 @@ +// Flutter imports: +import 'package:flutter/foundation.dart'; + // Package imports: import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -135,8 +138,7 @@ class _PlayListPageState extends ConsumerState onPressed: () async => await fileTool.openScreenshotDir(), ), ), - const SizedBox(width: 8), - buildSourceBox(), + if (kDebugMode) ...[const SizedBox(width: 8), buildSourceBox()], const Spacer(), const SizedBox(width: 8), ]); diff --git a/lib/pages/play/play_video.dart b/lib/pages/play/play_video.dart index e7f8048..f2fb549 100644 --- a/lib/pages/play/play_video.dart +++ b/lib/pages/play/play_video.dart @@ -153,6 +153,15 @@ class _PlayVideoWidgetState extends ConsumerState { await player.play(); } + /// 保存进度 + Future saveProgress() async { + if (player.state.playlist.medias.isEmpty) return; + var progress = player.state.position.inMilliseconds; + var media = player.state.playlist.medias[player.state.playlist.index]; + var episode = media.extras?['episode']; + await hivePlay.updateProgress(progress, episode); + } + /// 控制栏的数据构建 /// todo,这边的 widget 似乎不会改变,详见 https://github.com/media-kit/media-kit/issues/808 MaterialDesktopVideoControlsThemeData buildControls() { @@ -162,13 +171,12 @@ class _PlayVideoWidgetState extends ConsumerState { seekBarPositionColor: base.darker, bottomButtonBar: [ IconButton( - icon: const Icon(FluentIcons.play), + icon: const Icon(FluentIcons.play, color: Colors.white), onPressed: () async { var isPlaying = player.state.playing; if (isPlaying) { await player.pause(); - await hivePlay - .updateProgress(player.state.position.inMilliseconds); + await saveProgress(); } else { await player.play(); } diff --git a/lib/pages/play/play_vod_page.dart b/lib/pages/play/play_vod_page.dart index 0a4f7b0..c75cb15 100644 --- a/lib/pages/play/play_vod_page.dart +++ b/lib/pages/play/play_vod_page.dart @@ -85,7 +85,6 @@ class _PlayVodPageState extends ConsumerState super.didUpdateWidget(oldWidget); if (oldWidget.subject == widget.subject) return; Future.microtask(() async { - await saveProgress(); await freshList(); }); } @@ -115,7 +114,7 @@ class _PlayVodPageState extends ConsumerState var progress = player.state.position.inMilliseconds; var media = playList[index]; var episode = media.extras?['episode']; - await hive.updateProgress(progress, index: episode); + await hive.updateProgress(progress, episode); } /// 处理非本地源的播放 diff --git a/lib/source/utils/source_dialog.dart b/lib/source/utils/source_dialog.dart index c24b6fe..95ebe57 100644 --- a/lib/source/utils/source_dialog.dart +++ b/lib/source/utils/source_dialog.dart @@ -36,8 +36,7 @@ Future showSourceSearchDialog( content: ListView.separated( padding: const EdgeInsets.only(right: 12), itemCount: find.length, - separatorBuilder: (context, index) => - const SizedBox(height: 12, child: Center(child: Divider())), + separatorBuilder: (context, index) => const SizedBox(height: 16), itemBuilder: (context, index) { return SourceSearchItem( item: item, data: find[index], callback: callback); @@ -83,21 +82,29 @@ class _SourceSearchItemState extends State { /// 构建无封面的卡片 Widget buildEmptyCover({String? err}) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - BaseThemeIcon.darkest(FluentIcons.photo_error, size: 28.sp), - Text( - err ?? '无封面', - style: TextStyle( - color: FluentTheme.of(context).accentColor.darkest, + return DecoratedBox( + decoration: BoxDecoration(color: FluentTheme.of(context).cardColor), + child: Padding( + padding: const EdgeInsets.all(8), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + BaseThemeIcon.darkest(FluentIcons.photo_error, size: 28.sp), + Expanded( + child: Tooltip( + message: err ?? '无封面', + child: Text( + err ?? '无封面', + style: TextStyle( + color: FluentTheme.of(context).accentColor.darkest, + ), + ), + ), ), - ), - ], + ], + ), ), ), ); @@ -135,7 +142,7 @@ class _SourceSearchItemState extends State { ), ), if (find.desc != null && find.desc!.isNotEmpty) - Text(find.desc!, maxLines: 2, overflow: TextOverflow.ellipsis), + Text(find.desc!, maxLines: 3, overflow: TextOverflow.ellipsis), const Spacer(), IconButton( icon: const BaseThemeIcon(FluentIcons.accept), @@ -180,18 +187,16 @@ class _SourceSearchItemState extends State { /// buildCard Widget buildCard(BtSourceFind find) { return SizedBox( - height: 150.h, + height: 200.h, child: Card( padding: EdgeInsets.zero, child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - ConstrainedBox( - constraints: BoxConstraints(maxHeight: 150.h, maxWidth: 200.w), - child: buildCover(find), - ), + Flexible(child: buildCover(find)), Expanded( + flex: 5, child: Padding( padding: EdgeInsets.all(4.sp), child: buildInfo(find), @@ -203,6 +208,17 @@ class _SourceSearchItemState extends State { ); } + /// buildList + List buildList() { + var res = []; + for (var find in widget.data.find) { + res.add(buildCard(find)); + if (find == widget.data.find.last) continue; + res.add(const SizedBox(height: 12, child: Center(child: Divider()))); + } + return res; + } + @override Widget build(BuildContext context) { return Column( @@ -211,7 +227,7 @@ class _SourceSearchItemState extends State { source.name, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), ), - for (var find in widget.data.find) buildCard(find), + ...buildList(), ], ); } diff --git a/lib/store/play_store.dart b/lib/store/play_store.dart index f44b084..d5fe494 100644 --- a/lib/store/play_store.dart +++ b/lib/store/play_store.dart @@ -239,15 +239,10 @@ class PlayHive extends ChangeNotifier { } /// 更新当前播放进度 - Future updateProgress(int progress, {int? index}) async { + Future updateProgress(int progress, int index) async { var model = curModel; if (model == null) return; - int find; - if (index != null) { - find = model.items.indexWhere((e) => e.episode == index); - } else { - find = model.items.indexWhere((e) => e.episode == curEp); - } + var find = model.items.indexWhere((e) => e.episode == curEp); if (find == -1) return; model.items[find].progress = progress; BTLogTool.info('更新进度: $progress'); @@ -278,18 +273,6 @@ class PlayHive extends ChangeNotifier { return model.sources[sourceIndex].items[find].index; } - int getNextBmfEpisode(int subject) { - var model = box.get(subject); - if (model == null) return 0; - var sourceIndex = model.sources.indexWhere((e) => e.source == "BMF"); - if (sourceIndex == -1) return 0; - var max = 0; - for (var item in model.sources[sourceIndex].items) { - if (item.index > max) max = item.index; - } - return max + 1; - } - /// 删除播放进度 Future deleteProgress(int subjectId, {int? episode}) async { var model = box.get(subjectId); @@ -327,10 +310,9 @@ class PlayHive extends ChangeNotifier { void switchSubject(int value) { curModel = box.get(value); curSource = curModel!.sources[0].source; - if (curModel!.items.isNotEmpty) { - curEp = curModel!.items[0].episode; - } else { - curEp = 0; + var list = getPlayList(subject: value); + if (list.isNotEmpty) { + curEp = list[0].extras?['episode']; } notifyListeners(); } diff --git a/lib/tools/log_tool.dart b/lib/tools/log_tool.dart index aac88c5..4e82137 100644 --- a/lib/tools/log_tool.dart +++ b/lib/tools/log_tool.dart @@ -74,7 +74,7 @@ class BTLogTool { printTime: true, ); } else { - printer = PrettyPrinter(printTime: true); + printer = PrettyPrinter(printTime: true, methodCount: 5); } logger = Logger( filter: BTLogFilter(),