mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-30 04:58:41 +00:00
feat: video download
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -24,7 +24,6 @@ import 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';
|
||||
import 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';
|
||||
import 'package:PiliPlus/pages/common/common_intro_controller.dart';
|
||||
import 'package:PiliPlus/pages/dynamics_repost/view.dart';
|
||||
import 'package:PiliPlus/pages/video/controller.dart';
|
||||
import 'package:PiliPlus/pages/video/pay_coins/view.dart';
|
||||
import 'package:PiliPlus/pages/video/related/controller.dart';
|
||||
import 'package:PiliPlus/pages/video/reply/controller.dart';
|
||||
@@ -104,15 +103,12 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
}
|
||||
videoDetail.value = data;
|
||||
try {
|
||||
final videoDetailController = Get.find<VideoDetailController>(
|
||||
tag: heroTag,
|
||||
);
|
||||
if (videoDetailController.cover.value.isEmpty ||
|
||||
(videoDetailController.videoUrl.isNullOrEmpty &&
|
||||
!videoDetailController.isQuerying)) {
|
||||
videoDetailController.cover.value = data.pic ?? '';
|
||||
if (videoDetailCtr.cover.value.isEmpty ||
|
||||
(videoDetailCtr.videoUrl.isNullOrEmpty &&
|
||||
!videoDetailCtr.isQuerying)) {
|
||||
videoDetailCtr.cover.value = data.pic ?? '';
|
||||
}
|
||||
if (videoDetailController.showReply) {
|
||||
if (videoDetailCtr.showReply) {
|
||||
try {
|
||||
Get.find<VideoReplyController>(tag: heroTag).count.value =
|
||||
data.stat?.reply ?? 0;
|
||||
@@ -129,7 +125,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
status.value = false;
|
||||
}
|
||||
|
||||
if (accountService.isLogin.value) {
|
||||
if (isLogin) {
|
||||
queryAllStatus();
|
||||
queryFollowStatus();
|
||||
}
|
||||
@@ -184,7 +180,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
@override
|
||||
Future<void> actionTriple() async {
|
||||
feedBack();
|
||||
if (!accountService.isLogin.value) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -224,7 +220,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
// (取消)点赞
|
||||
@override
|
||||
Future<void> actionLikeVideo() async {
|
||||
if (!accountService.isLogin.value) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -246,7 +242,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
}
|
||||
|
||||
Future<void> actionDislikeVideo() async {
|
||||
if (!accountService.isLogin.value) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -274,7 +270,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
// 投币
|
||||
@override
|
||||
void actionCoinVideo() {
|
||||
if (!accountService.isLogin.value) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -426,7 +422,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
|
||||
// 关注/取关up
|
||||
Future<void> actionRelationMod(BuildContext context) async {
|
||||
if (!accountService.isLogin.value) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -479,7 +475,6 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
final String? cover = episode.cover;
|
||||
|
||||
// 重新获取视频资源
|
||||
final videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);
|
||||
|
||||
if (videoDetailCtr.isPlayAll) {
|
||||
if (videoDetailCtr.mediaList.indexWhere((item) => item.bvid == bvid) ==
|
||||
@@ -566,7 +561,6 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
final List<BaseEpisodeItem> episodes = <BaseEpisodeItem>[];
|
||||
bool isPart = false;
|
||||
|
||||
final videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);
|
||||
final videoDetail = this.videoDetail.value;
|
||||
|
||||
if (!skipPart && (videoDetail.pages?.length ?? 0) > 1) {
|
||||
@@ -632,7 +626,6 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
|
||||
try {
|
||||
final List<BaseEpisodeItem> episodes = <BaseEpisodeItem>[];
|
||||
bool isPart = false;
|
||||
final videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);
|
||||
final videoDetail = this.videoDetail.value;
|
||||
|
||||
// part -> playall -> season
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:PiliPlus/pages/video/controller.dart';
|
||||
import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';
|
||||
import 'package:PiliPlus/utils/id_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
// TODO refa
|
||||
@@ -18,6 +19,8 @@ class PagesPanel extends StatefulWidget {
|
||||
required this.heroTag,
|
||||
this.showEpisodes,
|
||||
required this.ugcIntroController,
|
||||
this.onDownload,
|
||||
this.cidSet,
|
||||
});
|
||||
|
||||
final List<Part>? list;
|
||||
@@ -28,6 +31,9 @@ class PagesPanel extends StatefulWidget {
|
||||
final Function? showEpisodes;
|
||||
final UgcIntroController ugcIntroController;
|
||||
|
||||
final Set<int?>? cidSet;
|
||||
final bool Function(Part part)? onDownload;
|
||||
|
||||
@override
|
||||
State<PagesPanel> createState() => _PagesPanelState();
|
||||
}
|
||||
@@ -105,7 +111,7 @@ class _PagesPanelState extends State<PagesPanel> {
|
||||
const Text('视频选集 '),
|
||||
Expanded(
|
||||
child: Text(
|
||||
' 正在播放:${pages[pageIndex].pagePart}',
|
||||
' 正在播放:${pages[pageIndex].part}',
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
@@ -160,6 +166,12 @@ class _PagesPanelState extends State<PagesPanel> {
|
||||
child: InkWell(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(6)),
|
||||
onTap: () {
|
||||
if (widget.onDownload case final onDownload?) {
|
||||
if (onDownload(item) && mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (widget.showEpisodes == null) {
|
||||
Get.back();
|
||||
}
|
||||
@@ -193,7 +205,7 @@ class _PagesPanelState extends State<PagesPanel> {
|
||||
],
|
||||
Expanded(
|
||||
child: Text(
|
||||
item.pagePart!,
|
||||
item.part!,
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
@@ -204,6 +216,14 @@ class _PagesPanelState extends State<PagesPanel> {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
if (widget.cidSet?.contains(item.cid) ?? false)
|
||||
Icon(
|
||||
size: 13,
|
||||
color: theme.colorScheme.secondary.withValues(
|
||||
alpha: 0.8,
|
||||
),
|
||||
FontAwesomeIcons.circleDown,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -20,7 +20,7 @@ mixin TripleMixin on GetxController, TickerProvider {
|
||||
bool get hasTriple => hasLike.value && hasCoin && hasFav.value;
|
||||
|
||||
void actionTriple();
|
||||
Future<void> actionLikeVideo();
|
||||
void actionLikeVideo();
|
||||
|
||||
// no need for pugv
|
||||
AnimationController? _tripleAnimCtr;
|
||||
|
||||
Reference in New Issue
Block a user