feat: play all member archives

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-27 12:50:11 +08:00
parent 329eb31387
commit 64672dbdf9
9 changed files with 190 additions and 129 deletions

View File

@@ -6,6 +6,7 @@ import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart';
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
import 'package:PiliPalaX/pages/member/new/controller.dart';
import 'package:PiliPalaX/pages/video/detail/reply/view.dart';
import 'package:PiliPalaX/utils/grid.dart';
import 'package:flutter/material.dart';
@@ -19,6 +20,7 @@ class MemberVideo extends StatefulWidget {
required this.mid,
this.seasonId,
this.seriesId,
this.title,
});
final ContributeType type;
@@ -26,6 +28,7 @@ class MemberVideo extends StatefulWidget {
final int mid;
final int? seasonId;
final int? seriesId;
final String? title;
@override
State<MemberVideo> createState() => _MemberVideoState();
@@ -42,6 +45,8 @@ class _MemberVideoState extends State<MemberVideo>
mid: widget.mid,
seasonId: widget.seasonId,
seriesId: widget.seriesId,
username: Get.find<MemberControllerNew>(tag: widget.heroTag).username,
title: widget.title,
),
tag:
'${widget.heroTag}${widget.type.name}${widget.seasonId}${widget.seriesId}',
@@ -72,7 +77,6 @@ class _MemberVideoState extends State<MemberVideo>
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),
color: Theme.of(context).colorScheme.surface,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Obx(
() => Text(
@@ -82,6 +86,33 @@ class _MemberVideoState extends State<MemberVideo>
style: const TextStyle(fontSize: 13),
),
),
if (_controller.episodicButton != null) ...[
const SizedBox(width: 5),
SizedBox(
height: 35,
child: TextButton.icon(
onPressed: _controller.toViewPlayAll,
icon: Icon(
Icons.play_circle_outline_rounded,
size: 16,
color:
Theme.of(context).colorScheme.secondary,
),
label: Text(
'播放全部',
style: TextStyle(
fontSize: 13,
color: Theme.of(context)
.colorScheme
.secondary,
),
), // TODO: continue playing
// label: Text(
// '${_controller.episodicButton?.text}'),
),
),
],
const Spacer(),
SizedBox(
height: 35,
child: TextButton.icon(
@@ -110,7 +141,7 @@ class _MemberVideoState extends State<MemberVideo>
),
),
),
)
),
],
),
),

View File

@@ -1,9 +1,14 @@
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/http/member.dart';
import 'package:PiliPalaX/models/space_archive/data.dart';
import 'package:PiliPalaX/models/space_archive/episodic_button.dart';
import 'package:PiliPalaX/models/space_archive/item.dart';
import 'package:PiliPalaX/pages/common/common_controller.dart';
import 'package:PiliPalaX/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
import 'package:PiliPalaX/utils/id_utils.dart';
import 'package:PiliPalaX/utils/utils.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class MemberVideoCtr extends CommonController {
@@ -12,6 +17,8 @@ class MemberVideoCtr extends CommonController {
required this.mid,
required this.seasonId,
required this.seriesId,
this.username,
this.title,
});
ContributeType type;
@@ -23,6 +30,9 @@ class MemberVideoCtr extends CommonController {
RxString sort = 'desc'.obs;
RxInt count = (-1).obs;
int? next;
EpisodicButton? episodicButton;
final String? username;
final String? title;
@override
Future onRefresh() async {
@@ -43,6 +53,7 @@ class MemberVideoCtr extends CommonController {
@override
bool customHandleResponse(Success response) {
Data data = response.response;
episodicButton = data.episodicButton;
next = data.next;
aid = data.item?.lastOrNull?.param;
isEnd =
@@ -80,4 +91,34 @@ class MemberVideoCtr extends CommonController {
loadingState.value = LoadingState.loading();
onRefresh();
}
void toViewPlayAll() {
if (loadingState.value is Success) {
List<Item> list = (loadingState.value as Success).response;
for (Item element in list) {
if (element.firstCid == null) {
continue;
} else {
if (element.bvid != list.first.bvid) {
SmartDialog.showToast('已跳过不支持播放的视频');
}
final String heroTag = Utils.makeHeroTag(element.bvid);
Get.toNamed(
'/video?bvid=${element.bvid}&cid=${element.firstCid}',
arguments: {
'videoItem': element,
'heroTag': heroTag,
'sourceType': 'archive',
'mediaId': seasonId ?? seriesId ?? mid,
'oid': IdUtils.bv2av(element.bvid!), // TODO: continue playing
'favTitle':
'$username: ${title ?? episodicButton?.text ?? '播放全部'}',
'count': count.value,
},
);
break;
}
}
}
}
}

View File

@@ -83,11 +83,13 @@ class _MemberContributeState extends State<MemberContribute>
type: ContributeType.video,
heroTag: widget.heroTag,
mid: widget.mid,
title: item.title,
),
'charging_video' => MemberVideo(
type: ContributeType.charging,
heroTag: widget.heroTag,
mid: widget.mid,
title: item.title,
),
'article' => MemberArticle(
heroTag: widget.heroTag,
@@ -99,12 +101,14 @@ class _MemberContributeState extends State<MemberContribute>
heroTag: widget.heroTag,
mid: widget.mid,
seasonId: item.seasonId,
title: item.title,
),
'series' => MemberVideo(
type: ContributeType.series,
heroTag: widget.heroTag,
mid: widget.mid,
seriesId: item.seriesId,
title: item.title,
),
_ => Center(child: Text(item.title!))
},
@@ -118,6 +122,7 @@ class _MemberContributeState extends State<MemberContribute>
type: ContributeType.video,
heroTag: widget.heroTag,
mid: widget.mid,
title: '视频',
);
}
}