opt: playall

Closes #450

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-16 17:28:51 +08:00
parent b07cf62bdd
commit b99cf4f629
7 changed files with 106 additions and 39 deletions

View File

@@ -23,6 +23,7 @@ class VideoCardH extends StatelessWidget {
this.showPubdate = false, this.showPubdate = false,
this.onTap, this.onTap,
this.onLongPress, this.onLongPress,
this.onViewLater,
}); });
final dynamic videoItem; final dynamic videoItem;
final String source; final String source;
@@ -32,6 +33,7 @@ class VideoCardH extends StatelessWidget {
final bool showPubdate; final bool showPubdate;
final VoidCallback? onTap; final VoidCallback? onTap;
final VoidCallback? onLongPress; final VoidCallback? onLongPress;
final ValueChanged<int>? onViewLater;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -73,7 +75,7 @@ class VideoCardH extends StatelessWidget {
}, },
onTap: () async { onTap: () async {
if (onTap != null) { if (onTap != null) {
onTap?.call(); onTap!();
return; return;
} }
if (type == 'ketang') { if (type == 'ketang') {
@@ -89,13 +91,17 @@ class VideoCardH extends StatelessWidget {
try { try {
final int cid = videoItem.cid ?? final int cid = videoItem.cid ??
await SearchHttp.ab2c(aid: aid, bvid: bvid); await SearchHttp.ab2c(aid: aid, bvid: bvid);
Utils.toViewPage( if (source == 'later') {
'bvid=$bvid&cid=$cid', onViewLater!(cid);
arguments: { } else {
'videoItem': videoItem, Utils.toViewPage(
'heroTag': Utils.makeHeroTag(aid) 'bvid=$bvid&cid=$cid',
}, arguments: {
); 'videoItem': videoItem,
'heroTag': Utils.makeHeroTag(aid)
},
);
}
} catch (err) { } catch (err) {
SmartDialog.showToast(err.toString()); SmartDialog.showToast(err.toString());
} }

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_h.dart'; import 'package:PiliPlus/common/skeleton/video_card_h.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.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:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -47,14 +47,18 @@ class _FavPageState extends State<FavPage> {
IconButton( IconButton(
onPressed: () { onPressed: () {
if (_favController.loadingState.value is Success) { if (_favController.loadingState.value is Success) {
Get.toNamed('/favSearch', arguments: { try {
'type': 1, final item = (_favController.loadingState.value as Success)
'mediaId': (_favController.loadingState.value as Success)
.response .response
.first .first;
.id, Get.toNamed('/favSearch', arguments: {
'searchType': SearchType.fav, 'type': 1,
}); 'mediaId': item.id,
'title': item.title,
'count': item.mediaCount,
'searchType': SearchType.fav,
});
} catch (_) {}
} }
}, },
icon: const Icon(Icons.search_outlined), icon: const Icon(Icons.search_outlined),

View File

@@ -190,6 +190,9 @@ class _FavDetailPageState extends State<FavDetailPage> {
Get.toNamed('/favSearch', arguments: { Get.toNamed('/favSearch', arguments: {
'type': 0, 'type': 0,
'mediaId': int.parse(mediaId), 'mediaId': int.parse(mediaId),
'title': _favDetailController.item.value.title,
'count':
_favDetailController.item.value.mediaCount,
'searchType': SearchType.fav, 'searchType': SearchType.fav,
}), }),
icon: const Icon(Icons.search_outlined), icon: const Icon(Icons.search_outlined),
@@ -426,15 +429,34 @@ class _FavDetailPageState extends State<FavDetailPage> {
), ),
); );
} }
final element = loadingState.response[index];
return Stack( return Stack(
children: [ children: [
Positioned.fill( Positioned.fill(
child: FavVideoCardH( child: FavVideoCardH(
videoItem: loadingState.response[index], videoItem: element,
callFn: () => _favDetailController.onCancelFav( callFn: () => _favDetailController.onCancelFav(
loadingState.response[index].id, element.id,
loadingState.response[index].type, 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 onTap: _favDetailController.enableMultiSelect.value
? () { ? () {
_favDetailController.onSelect(index); _favDetailController.onSelect(index);

View File

@@ -10,7 +10,6 @@ import 'package:PiliPlus/common/widgets/stat/danmu.dart';
import 'package:PiliPlus/common/widgets/stat/view.dart'; import 'package:PiliPlus/common/widgets/stat/view.dart';
import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/http/video.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/id_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart';
@@ -24,6 +23,7 @@ class FavVideoCardH extends StatelessWidget {
final GestureTapCallback? onTap; final GestureTapCallback? onTap;
final GestureLongPressCallback? onLongPress; final GestureLongPressCallback? onLongPress;
final bool isOwner; final bool isOwner;
final VoidCallback? onViewFav;
const FavVideoCardH({ const FavVideoCardH({
super.key, super.key,
@@ -33,6 +33,7 @@ class FavVideoCardH extends StatelessWidget {
this.onTap, this.onTap,
this.onLongPress, this.onLongPress,
this.isOwner = false, this.isOwner = false,
this.onViewFav,
}); });
@override @override
@@ -66,15 +67,16 @@ class FavVideoCardH extends StatelessWidget {
Get.toNamed('/member?mid=${videoItem.owner?.mid}'); Get.toNamed('/member?mid=${videoItem.owner?.mid}');
return; return;
} }
Utils.toViewPage( onViewFav!();
'bvid=$bvid&cid=${videoItem.cid}${epId?.isNotEmpty == true ? '&epId=$epId' : ''}', // Utils.toViewPage(
arguments: { // 'bvid=$bvid&cid=${videoItem.cid}${epId?.isNotEmpty == true ? '&epId=$epId' : ''}',
'videoItem': videoItem, // arguments: {
'heroTag': Utils.makeHeroTag(id), // 'videoItem': videoItem,
'videoType': // 'heroTag': Utils.makeHeroTag(id),
epId != null ? SearchType.media_bangumi : SearchType.video, // 'videoType':
}, // epId != null ? SearchType.media_bangumi : SearchType.video,
); // },
// );
}, },
onLongPress: () { onLongPress: () {
if (onLongPress != null) { if (onLongPress != null) {

View File

@@ -85,17 +85,34 @@ class _FavSearchPageState extends State<FavSearchPage> {
if (index == loadingState.response.length) { if (index == loadingState.response.length) {
_favSearchCtr.onLoadMore(); _favSearchCtr.onLoadMore();
} }
final element = loadingState.response[index];
return FavVideoCardH( return FavVideoCardH(
videoItem: loadingState.response[index], videoItem: element,
searchType: _favSearchCtr.type, searchType: _favSearchCtr.type,
callFn: _favSearchCtr.type != 1 callFn: _favSearchCtr.type != 1
? () { ? () {
_favSearchCtr.onCancelFav( _favSearchCtr.onCancelFav(
loadingState.response[index].id!, element.id!,
loadingState.response[index].type, element.type,
); );
} }
: null, : 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, childCount: loadingState.response.length,

View File

@@ -201,6 +201,22 @@ class _LaterPageState extends State<LaterPage> {
VideoCardH( VideoCardH(
videoItem: videoItem, videoItem: videoItem,
source: 'later', 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 onTap: _laterController.enableMultiSelect.value.not
? null ? null
: () { : () {

View File

@@ -337,8 +337,7 @@ class VideoDetailController extends GetxController
oid: isReverse oid: isReverse
? null ? null
: mediaList.isEmpty : mediaList.isEmpty
? _mediaType == 1 && ? Get.arguments['isContinuePlaying'] == true
Get.arguments['mediaType'] == null // member archive
? Get.arguments['oid'] ? Get.arguments['oid']
: null : null
: isLoadPrevious : isLoadPrevious
@@ -353,11 +352,10 @@ class VideoDetailController extends GetxController
: mediaList.last.type, : mediaList.last.type,
desc: _mediaDesc, desc: _mediaDesc,
sortField: Get.arguments['sortField'] ?? 1, sortField: Get.arguments['sortField'] ?? 1,
withCurrent: mediaList.isEmpty && withCurrent:
_mediaType == 1 && mediaList.isEmpty && Get.arguments['isContinuePlaying'] == true
Get.arguments['mediaType'] == null ? true
? true // init && member archive : false,
: false,
); );
if (res['status']) { if (res['status']) {
if (res['data'].isNotEmpty) { if (res['data'].isNotEmpty) {
@@ -444,6 +442,8 @@ class VideoDetailController extends GetxController
: null, : null,
), ),
); );
} else {
getMediaList();
} }
} }