Merge branch 'main' into feature-sponsorBlock

This commit is contained in:
guozhigq
2024-11-24 16:38:43 +08:00
16 changed files with 532 additions and 171 deletions

View File

@ -141,8 +141,16 @@ class VideoDetailController extends GetxController
} else if (argMap.containsKey('pic')) {
updateCover(argMap['pic']);
}
tabCtr = TabController(length: 2, vsync: this);
tabs.value = <String>[
'简介',
if (videoType == SearchType.video &&
GlobalDataCache.enableComment.contains('video'))
'评论',
if (videoType == SearchType.media_bangumi &&
GlobalDataCache.enableComment.contains('bangumi'))
'评论'
];
tabCtr = TabController(length: tabs.length, vsync: this);
autoPlay.value =
setting.get(SettingBoxKey.autoPlayEnable, defaultValue: true);
enableHA.value = setting.get(SettingBoxKey.enableHA, defaultValue: false);
@ -481,6 +489,15 @@ class VideoDetailController extends GetxController
getDanmaku(subtitles);
}
}
headerControl = HeaderControl(
controller: plPlayerController,
videoDetailCtr: this,
floating: floating,
bvid: bvid,
videoType: videoType,
showSubtitleBtn: result['status'] && result['data'].subtitles.isNotEmpty,
);
plPlayerController.setHeaderControl(headerControl);
}
// 获取弹幕

View File

@ -17,6 +17,7 @@ import 'package:pilipala/pages/video/detail/controller.dart';
import 'package:pilipala/pages/video/detail/reply/index.dart';
import 'package:pilipala/plugin/pl_player/models/play_repeat.dart';
import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/global_data_cache.dart';
import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/storage.dart';
import 'package:share_plus/share_plus.dart';
@ -99,7 +100,11 @@ class VideoIntroController extends GetxController {
}
final VideoDetailController videoDetailCtr =
Get.find<VideoDetailController>(tag: heroTag);
videoDetailCtr.tabs.value = ['简介', '评论 ${result['data']?.stat?.reply}'];
videoDetailCtr.tabs.value = [
'简介',
if (GlobalDataCache.enableComment.contains('video'))
'评论 ${result['data']?.stat?.reply}'
];
videoDetailCtr.cover.value = cover ?? result['data'].pic ?? '';
// 获取到粉丝数再返回
await queryUserStat();
@ -469,10 +474,12 @@ class VideoIntroController extends GetxController {
// 重新请求评论
try {
/// 未渲染回复组件时可能异常
final VideoReplyController videoReplyCtr =
Get.find<VideoReplyController>(tag: heroTag);
videoReplyCtr.aid = aid;
videoReplyCtr.queryReplyList(type: 'init');
if (GlobalDataCache.enableComment.contains('video')) {
final VideoReplyController videoReplyCtr =
Get.find<VideoReplyController>(tag: heroTag);
videoReplyCtr.aid = aid;
videoReplyCtr.queryReplyList(type: 'init');
}
} catch (_) {}
this.bvid = bvid;
await queryVideoIntro(cover: cover);

View File

@ -6,8 +6,8 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:lottie/lottie.dart';
import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/skeleton/video_intro.dart';
import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/pages/video/detail/index.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart';
@ -76,10 +76,8 @@ class _VideoIntroPanelState extends State<VideoIntroPanel>
future: _futureBuilderFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data == null) {
return const SliverToBoxAdapter(child: SizedBox());
}
if (snapshot.data['status']) {
Map? data = snapshot.data;
if (data != null && data['status']) {
// 请求成功
return Obx(
() => VideoInfo(
@ -91,25 +89,16 @@ class _VideoIntroPanelState extends State<VideoIntroPanel>
} else {
// 请求错误
return HttpError(
errMsg: snapshot.data['msg'],
btnText: snapshot.data['code'] == -404 ||
snapshot.data['code'] == 62002
errMsg: data?['msg'] ?? '请求异常',
btnText: (data?['code'] == -404 || data?['code'] == 62002)
? '返回上一页'
: null,
fn: () => Get.back(),
);
}
} else {
return SliverToBoxAdapter(
child: SizedBox(
height: 100,
child: Center(
child: Lottie.asset(
'assets/loading.json',
width: 200,
),
),
),
return const SliverToBoxAdapter(
child: VideoIntroSkeleton(),
);
}
},

View File

@ -89,9 +89,12 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
return AppBar(
toolbarHeight: 45,
automaticallyImplyLeading: false,
title: Text(
'评论详情',
style: Theme.of(context).textTheme.titleSmall,
title: Padding(
padding: const EdgeInsets.only(left: 14),
child: Text(
'评论详情',
style: Theme.of(context).textTheme.titleSmall,
),
),
actions: [
IconButton(
@ -102,7 +105,7 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel> {
Navigator.pop(context);
},
),
const SizedBox(width: 14),
const SizedBox(width: 12),
],
);
}

View File

@ -24,6 +24,7 @@ import 'package:pilipala/pages/video/detail/related/index.dart';
import 'package:pilipala/plugin/pl_player/index.dart';
import 'package:pilipala/plugin/pl_player/models/play_repeat.dart';
import 'package:pilipala/services/service_locator.dart';
import 'package:pilipala/utils/global_data_cache.dart';
import 'package:pilipala/utils/storage.dart';
import 'package:status_bar_control/status_bar_control.dart';
@ -779,13 +780,20 @@ class _VideoDetailPageState extends State<VideoDetailPage>
);
},
),
Obx(
() => VideoReplyPanel(
bvid: vdCtr.bvid,
oid: vdCtr.oid.value,
onControllerCreated: vdCtr.onControllerCreated,
),
)
if ((vdCtr.videoType == SearchType.media_bangumi &&
GlobalDataCache.enableComment
.contains('bangumi')) ||
(vdCtr.videoType == SearchType.video &&
GlobalDataCache.enableComment
.contains('video'))) ...[
Obx(
() => VideoReplyPanel(
bvid: vdCtr.bvid,
oid: vdCtr.oid.value,
onControllerCreated: vdCtr.onControllerCreated,
),
)
],
],
),
),
@ -909,6 +917,21 @@ class _VideoDetailPageState extends State<VideoDetailPage>
icon: const Icon(FontAwesomeIcons.arrowLeft, size: 15),
fuc: () => Get.back(),
),
const SizedBox(width: 8),
ComBtn(
icon: const Icon(
FontAwesomeIcons.house,
size: 15,
color: Colors.white,
),
fuc: () async {
await vdCtr.plPlayerController.dispose(type: 'all');
if (mounted) {
Navigator.popUntil(
context, (Route<dynamic> route) => route.isFirst);
}
},
),
const Spacer(),
ComBtn(
icon: const Icon(Icons.history_outlined, size: 22),

View File

@ -31,7 +31,7 @@ class HeaderControl extends StatefulWidget implements PreferredSizeWidget {
this.floating,
this.bvid,
this.videoType,
this.showSubtitleBtn,
this.showSubtitleBtn = true,
super.key,
});
final PlPlayerController? controller;
@ -39,7 +39,7 @@ class HeaderControl extends StatefulWidget implements PreferredSizeWidget {
final Floating? floating;
final String? bvid;
final SearchType? videoType;
final bool? showSubtitleBtn;
final bool showSubtitleBtn;
@override
State<HeaderControl> createState() => _HeaderControlState();
@ -1329,7 +1329,7 @@ class _HeaderControlState extends State<HeaderControl> {
],
/// 字幕
if (widget.showSubtitleBtn ?? true)
if (widget.showSubtitleBtn)
ComBtn(
icon: const Icon(
Icons.closed_caption_off,