From b99cf4f629f883059ac71339c65ec819be9056ff Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 16 Mar 2025 17:28:51 +0800 Subject: [PATCH] opt: playall Closes #450 Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/video_card_h.dart | 22 +++++++++------ lib/pages/fav/view.dart | 20 +++++++------ lib/pages/fav_detail/view.dart | 28 +++++++++++++++++-- .../fav_detail/widget/fav_video_card.dart | 22 ++++++++------- lib/pages/fav_search/view.dart | 23 +++++++++++++-- lib/pages/later/view.dart | 16 +++++++++++ lib/pages/video/detail/controller.dart | 14 +++++----- 7 files changed, 106 insertions(+), 39 deletions(-) diff --git a/lib/common/widgets/video_card_h.dart b/lib/common/widgets/video_card_h.dart index 3590d299..c95bbc0a 100644 --- a/lib/common/widgets/video_card_h.dart +++ b/lib/common/widgets/video_card_h.dart @@ -23,6 +23,7 @@ class VideoCardH extends StatelessWidget { this.showPubdate = false, this.onTap, this.onLongPress, + this.onViewLater, }); final dynamic videoItem; final String source; @@ -32,6 +33,7 @@ class VideoCardH extends StatelessWidget { final bool showPubdate; final VoidCallback? onTap; final VoidCallback? onLongPress; + final ValueChanged? onViewLater; @override Widget build(BuildContext context) { @@ -73,7 +75,7 @@ class VideoCardH extends StatelessWidget { }, onTap: () async { if (onTap != null) { - onTap?.call(); + onTap!(); return; } if (type == 'ketang') { @@ -89,13 +91,17 @@ class VideoCardH extends StatelessWidget { try { final int cid = videoItem.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid); - Utils.toViewPage( - 'bvid=$bvid&cid=$cid', - arguments: { - 'videoItem': videoItem, - 'heroTag': Utils.makeHeroTag(aid) - }, - ); + if (source == 'later') { + onViewLater!(cid); + } else { + Utils.toViewPage( + 'bvid=$bvid&cid=$cid', + arguments: { + 'videoItem': videoItem, + 'heroTag': Utils.makeHeroTag(aid) + }, + ); + } } catch (err) { SmartDialog.showToast(err.toString()); } diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 19f4e696..a9fe03de 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/common/skeleton/video_card_h.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/pages/fav_search/view.dart'; +import 'package:PiliPlus/pages/fav_search/view.dart' show SearchType; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -47,14 +47,18 @@ class _FavPageState extends State { IconButton( onPressed: () { if (_favController.loadingState.value is Success) { - Get.toNamed('/favSearch', arguments: { - 'type': 1, - 'mediaId': (_favController.loadingState.value as Success) + try { + final item = (_favController.loadingState.value as Success) .response - .first - .id, - 'searchType': SearchType.fav, - }); + .first; + Get.toNamed('/favSearch', arguments: { + 'type': 1, + 'mediaId': item.id, + 'title': item.title, + 'count': item.mediaCount, + 'searchType': SearchType.fav, + }); + } catch (_) {} } }, icon: const Icon(Icons.search_outlined), diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index ffc43859..c7137088 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -190,6 +190,9 @@ class _FavDetailPageState extends State { Get.toNamed('/favSearch', arguments: { 'type': 0, 'mediaId': int.parse(mediaId), + 'title': _favDetailController.item.value.title, + 'count': + _favDetailController.item.value.mediaCount, 'searchType': SearchType.fav, }), icon: const Icon(Icons.search_outlined), @@ -426,15 +429,34 @@ class _FavDetailPageState extends State { ), ); } + final element = loadingState.response[index]; return Stack( children: [ Positioned.fill( child: FavVideoCardH( - videoItem: loadingState.response[index], + videoItem: element, callFn: () => _favDetailController.onCancelFav( - loadingState.response[index].id, - loadingState.response[index].type, + element.id, + element.type, ), + onViewFav: () { + Utils.toViewPage( + 'bvid=${element.bvid}&cid=${element.cid}', + arguments: { + 'videoItem': element, + 'heroTag': Utils.makeHeroTag(element.bvid), + 'sourceType': 'fav', + 'mediaId': _favDetailController.item.value.id, + 'oid': element.id, + 'favTitle': + _favDetailController.item.value.title, + 'count': _favDetailController + .item.value.mediaCount, + 'desc': true, + 'isContinuePlaying': index != 0, + }, + ); + }, onTap: _favDetailController.enableMultiSelect.value ? () { _favDetailController.onSelect(index); diff --git a/lib/pages/fav_detail/widget/fav_video_card.dart b/lib/pages/fav_detail/widget/fav_video_card.dart index 9938e8e7..831d7792 100644 --- a/lib/pages/fav_detail/widget/fav_video_card.dart +++ b/lib/pages/fav_detail/widget/fav_video_card.dart @@ -10,7 +10,6 @@ import 'package:PiliPlus/common/widgets/stat/danmu.dart'; import 'package:PiliPlus/common/widgets/stat/view.dart'; import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/models/common/search_type.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; @@ -24,6 +23,7 @@ class FavVideoCardH extends StatelessWidget { final GestureTapCallback? onTap; final GestureLongPressCallback? onLongPress; final bool isOwner; + final VoidCallback? onViewFav; const FavVideoCardH({ super.key, @@ -33,6 +33,7 @@ class FavVideoCardH extends StatelessWidget { this.onTap, this.onLongPress, this.isOwner = false, + this.onViewFav, }); @override @@ -66,15 +67,16 @@ class FavVideoCardH extends StatelessWidget { Get.toNamed('/member?mid=${videoItem.owner?.mid}'); return; } - Utils.toViewPage( - 'bvid=$bvid&cid=${videoItem.cid}${epId?.isNotEmpty == true ? '&epId=$epId' : ''}', - arguments: { - 'videoItem': videoItem, - 'heroTag': Utils.makeHeroTag(id), - 'videoType': - epId != null ? SearchType.media_bangumi : SearchType.video, - }, - ); + onViewFav!(); + // Utils.toViewPage( + // 'bvid=$bvid&cid=${videoItem.cid}${epId?.isNotEmpty == true ? '&epId=$epId' : ''}', + // arguments: { + // 'videoItem': videoItem, + // 'heroTag': Utils.makeHeroTag(id), + // 'videoType': + // epId != null ? SearchType.media_bangumi : SearchType.video, + // }, + // ); }, onLongPress: () { if (onLongPress != null) { diff --git a/lib/pages/fav_search/view.dart b/lib/pages/fav_search/view.dart index d3d60e18..497bff50 100644 --- a/lib/pages/fav_search/view.dart +++ b/lib/pages/fav_search/view.dart @@ -85,17 +85,34 @@ class _FavSearchPageState extends State { if (index == loadingState.response.length) { _favSearchCtr.onLoadMore(); } + final element = loadingState.response[index]; return FavVideoCardH( - videoItem: loadingState.response[index], + videoItem: element, searchType: _favSearchCtr.type, callFn: _favSearchCtr.type != 1 ? () { _favSearchCtr.onCancelFav( - loadingState.response[index].id!, - loadingState.response[index].type, + element.id!, + element.type, ); } : null, + onViewFav: () { + Utils.toViewPage( + 'bvid=${element.bvid}&cid=${element.cid}', + arguments: { + 'videoItem': element, + 'heroTag': Utils.makeHeroTag(element.bvid), + 'sourceType': 'fav', + 'mediaId': Get.arguments['mediaId'], + 'oid': element.id, + 'favTitle': Get.arguments['title'], + 'count': Get.arguments['count'], + 'desc': true, + 'isContinuePlaying': true, + }, + ); + }, ); }, childCount: loadingState.response.length, diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart index 40b7220c..e8df550c 100644 --- a/lib/pages/later/view.dart +++ b/lib/pages/later/view.dart @@ -201,6 +201,22 @@ class _LaterPageState extends State { VideoCardH( videoItem: videoItem, source: 'later', + onViewLater: (cid) { + Utils.toViewPage( + 'bvid=${videoItem.bvid}&cid=$cid', + arguments: { + 'videoItem': videoItem, + 'oid': videoItem.aid, + 'heroTag': Utils.makeHeroTag(videoItem.bvid), + 'sourceType': 'watchLater', + 'count': loadingState.response.length, + 'favTitle': '稍后再看', + 'mediaId': _laterController.mid, + 'desc': false, + 'isContinuePlaying': index != 0, + }, + ); + }, onTap: _laterController.enableMultiSelect.value.not ? null : () { diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 616c7e50..2ad5711f 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -337,8 +337,7 @@ class VideoDetailController extends GetxController oid: isReverse ? null : mediaList.isEmpty - ? _mediaType == 1 && - Get.arguments['mediaType'] == null // member archive + ? Get.arguments['isContinuePlaying'] == true ? Get.arguments['oid'] : null : isLoadPrevious @@ -353,11 +352,10 @@ class VideoDetailController extends GetxController : mediaList.last.type, desc: _mediaDesc, sortField: Get.arguments['sortField'] ?? 1, - withCurrent: mediaList.isEmpty && - _mediaType == 1 && - Get.arguments['mediaType'] == null - ? true // init && member archive - : false, + withCurrent: + mediaList.isEmpty && Get.arguments['isContinuePlaying'] == true + ? true + : false, ); if (res['status']) { if (res['data'].isNotEmpty) { @@ -444,6 +442,8 @@ class VideoDetailController extends GetxController : null, ), ); + } else { + getMediaList(); } }