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.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<int>? 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,6 +91,9 @@ class VideoCardH extends StatelessWidget {
try {
final int cid = videoItem.cid ??
await SearchHttp.ab2c(aid: aid, bvid: bvid);
if (source == 'later') {
onViewLater!(cid);
} else {
Utils.toViewPage(
'bvid=$bvid&cid=$cid',
arguments: {
@@ -96,6 +101,7 @@ class VideoCardH extends StatelessWidget {
'heroTag': Utils.makeHeroTag(aid)
},
);
}
} catch (err) {
SmartDialog.showToast(err.toString());
}

View File

@@ -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<FavPage> {
IconButton(
onPressed: () {
if (_favController.loadingState.value is Success) {
try {
final item = (_favController.loadingState.value as Success)
.response
.first;
Get.toNamed('/favSearch', arguments: {
'type': 1,
'mediaId': (_favController.loadingState.value as Success)
.response
.first
.id,
'mediaId': item.id,
'title': item.title,
'count': item.mediaCount,
'searchType': SearchType.fav,
});
} catch (_) {}
}
},
icon: const Icon(Icons.search_outlined),

View File

@@ -190,6 +190,9 @@ class _FavDetailPageState extends State<FavDetailPage> {
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<FavDetailPage> {
),
);
}
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);

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/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) {

View File

@@ -85,17 +85,34 @@ class _FavSearchPageState extends State<FavSearchPage> {
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,

View File

@@ -201,6 +201,22 @@ class _LaterPageState extends State<LaterPage> {
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
: () {

View File

@@ -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,10 +352,9 @@ 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
withCurrent:
mediaList.isEmpty && Get.arguments['isContinuePlaying'] == true
? true
: false,
);
if (res['status']) {
@@ -444,6 +442,8 @@ class VideoDetailController extends GetxController
: null,
),
);
} else {
getMediaList();
}
}