From 08cb807f39d4983743fda5e8359ef1655cbf9714 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 11 Nov 2024 23:46:08 +0800 Subject: [PATCH 01/14] fix: history cid --- lib/pages/video/detail/introduction/controller.dart | 10 +++++----- lib/pages/video/detail/introduction/view.dart | 2 +- .../detail/introduction/widgets/season_panel.dart | 12 ++++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index 2671f4d8..eafedd08 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -85,15 +85,14 @@ class VideoIntroController extends GetxController { } // 获取视频简介&分p - Future queryVideoIntro({cover}) async { + Future queryVideoIntro({String? cover, String? type, int? cid}) async { var result = await VideoHttp.videoIntro(bvid: bvid); if (result['status']) { videoDetail.value = result['data']!; ugcSeason = result['data']!.ugcSeason; pages.value = result['data']!.pages!; - lastPlayCid.value = videoDetail.value.cid!; - if (pages.isNotEmpty) { - lastPlayCid.value = pages.first.cid!; + if (type == null) { + lastPlayCid.value = cid ?? videoDetail.value.cid!; } final VideoDetailController videoDetailCtr = Get.find(tag: heroTag); @@ -473,7 +472,8 @@ class VideoIntroController extends GetxController { videoReplyCtr.queryReplyList(type: 'init'); } catch (_) {} this.bvid = bvid; - await queryVideoIntro(cover: cover); + // 点击切换时,优先取当前cid + await queryVideoIntro(cover: cover, cid: cid); } void startTimer() { diff --git a/lib/pages/video/detail/introduction/view.dart b/lib/pages/video/detail/introduction/view.dart index a02ed530..9ceb35e0 100644 --- a/lib/pages/video/detail/introduction/view.dart +++ b/lib/pages/video/detail/introduction/view.dart @@ -57,7 +57,7 @@ class _VideoIntroPanelState extends State heroTag = Get.arguments['heroTag']; videoIntroController = Get.put(VideoIntroController(bvid: widget.bvid), tag: heroTag); - _futureBuilderFuture = videoIntroController.queryVideoIntro(); + _futureBuilderFuture = videoIntroController.queryVideoIntro(type: 'init'); videoIntroController.videoDetail.listen((value) { videoDetail = value; }); diff --git a/lib/pages/video/detail/introduction/widgets/season_panel.dart b/lib/pages/video/detail/introduction/widgets/season_panel.dart index e5a9ea84..291f1622 100644 --- a/lib/pages/video/detail/introduction/widgets/season_panel.dart +++ b/lib/pages/video/detail/introduction/widgets/season_panel.dart @@ -27,7 +27,7 @@ class SeasonPanel extends StatefulWidget { } class _SeasonPanelState extends State { - late List episodes; + List? episodes; late int cid; late RxInt currentIndex = (-1).obs; final String heroTag = Get.arguments['heroTag']; @@ -75,7 +75,10 @@ class _SeasonPanelState extends State { // 获取currentIndex void getCurrentIndex() { - currentIndex.value = episodes.indexWhere((EpisodeItem e) => e.cid == cid); + if (episodes != null) { + currentIndex.value = + episodes!.indexWhere((EpisodeItem e) => e.cid == cid); + } final List sections = widget.ugcSeason.sections!; if (sections.length == 1 && sections.first.type == 1) { final List episodesList = sections.first.episodes!; @@ -83,6 +86,7 @@ class _SeasonPanelState extends State { for (int j = 0; j < episodesList[i].pages!.length; j++) { if (episodesList[i].pages![j].cid == cid) { currentIndex.value = i; + episodes = episodesList; continue; } } @@ -137,7 +141,7 @@ class _SeasonPanelState extends State { widget.videoIntroCtr.bottomSheetController = _bottomSheetController = EpisodeBottomSheet( currentCid: cid, - episodes: episodes, + episodes: episodes!, changeFucCall: changeFucCall, sheetHeight: widget.sheetHeight, dataType: VideoEpidoesType.videoEpisode, @@ -165,7 +169,7 @@ class _SeasonPanelState extends State { ), const SizedBox(width: 10), Obx(() => Text( - '${currentIndex.value + 1}/${episodes.length}', + '${currentIndex.value + 1}/${episodes!.length}', style: Theme.of(context).textTheme.labelMedium, )), const SizedBox(width: 6), From b8affcef050ecc4529a06e390468d693e8247e10 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 18 Nov 2024 00:27:58 +0800 Subject: [PATCH 02/14] feat: view invalid fav video --- lib/http/api.dart | 4 ++ lib/http/common.dart | 29 ++++++++ lib/http/constants.dart | 2 + lib/models/common/invalid_video.dart | 70 +++++++++++++++++++ lib/pages/fav_detail/controller.dart | 21 ++++++ lib/pages/fav_detail/view.dart | 2 + .../fav_detail/widget/fav_video_card.dart | 22 ++++-- .../fav_detail/widget/invalid_video_card.dart | 51 ++++++++++++++ 8 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 lib/models/common/invalid_video.dart create mode 100644 lib/pages/fav_detail/widget/invalid_video_card.dart diff --git a/lib/http/api.dart b/lib/http/api.dart index 5b2cdf58..379540a5 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -622,4 +622,8 @@ class Api { /// 视频标签 static const String videoTag = '/x/tag/archive/tags'; + + /// 修复标题和海报 + // /api/view?id=${aid} /all/video/av${aid} /video/av${aid}/ + static const String fixTitleAndPic = '${HttpString.biliplusBaseUrl}/api/view'; } diff --git a/lib/http/common.dart b/lib/http/common.dart index 2f5f0e84..87d5e2a2 100644 --- a/lib/http/common.dart +++ b/lib/http/common.dart @@ -1,3 +1,6 @@ +import 'dart:developer'; + +import 'package:pilipala/models/common/invalid_video.dart'; import 'package:pilipala/models/sponsor_block/segment.dart'; import 'index.dart'; @@ -43,4 +46,30 @@ class CommonHttp { }; } } + + static Future fixVideoPicAndTitle({required int aid}) async { + var res = await Request().getWithoutCookie(Api.fixTitleAndPic, data: { + 'id': aid, + }); + if (res != null) { + if (res.data['code'] == -404) { + return { + 'status': false, + 'data': null, + 'msg': '没有相关信息', + }; + } else { + return { + 'status': true, + 'data': InvalidVideoModel.fromJson(res.data), + }; + } + } else { + return { + 'status': false, + 'data': null, + 'msg': '没有相关信息', + }; + } + } } diff --git a/lib/http/constants.dart b/lib/http/constants.dart index 07d06958..e7e031bb 100644 --- a/lib/http/constants.dart +++ b/lib/http/constants.dart @@ -8,6 +8,8 @@ class HttpString { static const String messageBaseUrl = 'https://message.bilibili.com'; static const String bangumiBaseUrl = 'https://bili.meark.me'; static const String sponsorBlockBaseUrl = 'https://www.bsbsb.top'; + static const String biliplusBaseUrl = 'https://www.biliplus.com'; + static const List validateStatusCodes = [ 302, 304, diff --git a/lib/models/common/invalid_video.dart b/lib/models/common/invalid_video.dart new file mode 100644 index 00000000..c4813872 --- /dev/null +++ b/lib/models/common/invalid_video.dart @@ -0,0 +1,70 @@ +class InvalidVideoModel { + final int? id; + final int? ver; + final int? aid; + final String? lastupdate; + final int? lastupdatets; + final String? title; + final String? description; + final String? pic; + final int? tid; + final String? typename; + final int? created; + final String? createdAt; + final String? author; + final int? mid; + final String? play; + final String? coins; + final String? review; + final String? videoReview; + final String? favorites; + final String? tag; + + InvalidVideoModel({ + this.id, + this.ver, + this.aid, + this.lastupdate, + this.lastupdatets, + this.title, + this.description, + this.pic, + this.tid, + this.typename, + this.created, + this.createdAt, + this.author, + this.mid, + this.play, + this.coins, + this.review, + this.videoReview, + this.favorites, + this.tag, + }); + + factory InvalidVideoModel.fromJson(Map json) { + return InvalidVideoModel( + id: json['id'], + ver: json['ver'], + aid: json['aid'], + lastupdate: json['lastupdate'], + lastupdatets: json['lastupdatets'], + title: json['title'], + description: json['description'], + pic: json['pic'], + tid: json['tid'], + typename: json['typename'], + created: json['created'], + createdAt: json['created_at'], + author: json['author'], + mid: json['mid'], + play: json['play'], + coins: json['coins'], + review: json['review'], + videoReview: json['video_review'], + favorites: json['favorites'], + tag: json['tag'], + ); + } +} diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 93efd3aa..022e0103 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import 'package:pilipala/http/common.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/http/video.dart'; import 'package:pilipala/models/user/fav_detail.dart'; @@ -8,6 +9,8 @@ import 'package:pilipala/models/user/fav_folder.dart'; import 'package:pilipala/pages/fav/index.dart'; import 'package:pilipala/utils/utils.dart'; +import 'widget/invalid_video_card.dart'; + class FavDetailController extends GetxController { FavFolderItemData? item; RxString title = ''.obs; @@ -152,4 +155,22 @@ class FavDetailController extends GetxController { }, ); } + + // 查看无效视频信息 + Future toViewInvalidVideo(FavDetailItemData item) async { + SmartDialog.showLoading(msg: '加载中...'); + var res = await CommonHttp.fixVideoPicAndTitle(aid: item.id!); + SmartDialog.dismiss(); + if (res['status']) { + showModalBottomSheet( + context: Get.context!, + isScrollControlled: true, + builder: (context) { + return InvalidVideoCard(videoInfo: res['data']); + }, + ); + } else { + SmartDialog.showToast(res['msg']); + } + } } diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 462c7df3..30a15bf4 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -226,6 +226,8 @@ class _FavDetailPageState extends State { isOwner: _favDetailController.isOwner, callFn: () => _favDetailController .onCancelFav(favList[index].id), + viewInvalidVideoCb: () => _favDetailController + .toViewInvalidVideo(favList[index]), ); }, childCount: favList.length), ), diff --git a/lib/pages/fav_detail/widget/fav_video_card.dart b/lib/pages/fav_detail/widget/fav_video_card.dart index ecb4dd4a..ec2a7755 100644 --- a/lib/pages/fav_detail/widget/fav_video_card.dart +++ b/lib/pages/fav_detail/widget/fav_video_card.dart @@ -19,6 +19,7 @@ class FavVideoCardH extends StatelessWidget { final Function? callFn; final int? searchType; final String isOwner; + final Function? viewInvalidVideoCb; const FavVideoCardH({ Key? key, @@ -26,6 +27,7 @@ class FavVideoCardH extends StatelessWidget { this.callFn, this.searchType, required this.isOwner, + this.viewInvalidVideoCb, }) : super(key: key); @override @@ -36,6 +38,10 @@ class FavVideoCardH extends StatelessWidget { return InkWell( onTap: () async { // int? seasonId; + if (videoItem.title == '已失效视频') { + viewInvalidVideoCb?.call(); + return; + } String? epId; if (videoItem.ogv != null && (videoItem.ogv['type_name'] == '番剧' || @@ -65,11 +71,17 @@ class FavVideoCardH extends StatelessWidget { epId != null ? SearchType.media_bangumi : SearchType.video, }); }, - onLongPress: () => imageSaveDialog( - context, - videoItem, - SmartDialog.dismiss, - ), + onLongPress: () { + if (videoItem.title == '已失效视频') { + SmartDialog.showToast('视频已失效'); + return; + } + imageSaveDialog( + context, + videoItem, + SmartDialog.dismiss, + ); + }, child: Column( children: [ Padding( diff --git a/lib/pages/fav_detail/widget/invalid_video_card.dart b/lib/pages/fav_detail/widget/invalid_video_card.dart new file mode 100644 index 00000000..e8e82d0e --- /dev/null +++ b/lib/pages/fav_detail/widget/invalid_video_card.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:pilipala/common/widgets/network_img_layer.dart'; +import 'package:pilipala/models/common/invalid_video.dart'; + +class InvalidVideoCard extends StatelessWidget { + const InvalidVideoCard({required this.videoInfo, Key? key}) : super(key: key); + final InvalidVideoModel videoInfo; + + @override + Widget build(BuildContext context) { + const TextStyle textStyle = TextStyle(fontSize: 14.0); + return Padding( + padding: EdgeInsets.fromLTRB( + 12, + 14, + 12, + MediaQuery.of(context).padding.bottom + 20, + ), + child: LayoutBuilder( + builder: (context, constraints) { + double maxWidth = constraints.maxWidth; + double maxHeight = maxWidth * 9 / 16; + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + NetworkImgLayer( + width: maxWidth, + height: maxHeight, + src: videoInfo.pic, + radius: 20, + ), + const SizedBox(height: 10), + SelectableText('标题:${videoInfo.title}', style: textStyle), + SelectableText('作者:${videoInfo.author}', style: textStyle), + SelectableText('创建时间:${videoInfo.createdAt}', style: textStyle), + SelectableText('上次更新时间:${videoInfo.lastupdate}', + style: textStyle), + SelectableText('分类:${videoInfo.typename}', style: textStyle), + SelectableText('投币:${videoInfo.coins}', style: textStyle), + SelectableText('收藏:${videoInfo.favorites}', style: textStyle), + SelectableText('标签:${videoInfo.tag}', style: textStyle), + ], + ), + ); + }, + ), + ); + } +} From 85ace29282303ea5f52f1ee0887fa0e91e6fcfa5 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Tue, 19 Nov 2024 23:22:33 +0800 Subject: [PATCH 03/14] mod: invalid video style --- lib/http/common.dart | 2 - lib/models/common/invalid_video.dart | 3 + .../fav_detail/widget/invalid_video_card.dart | 58 +++++++++++++++++-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/lib/http/common.dart b/lib/http/common.dart index 87d5e2a2..c6354900 100644 --- a/lib/http/common.dart +++ b/lib/http/common.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:pilipala/models/common/invalid_video.dart'; import 'package:pilipala/models/sponsor_block/segment.dart'; diff --git a/lib/models/common/invalid_video.dart b/lib/models/common/invalid_video.dart index c4813872..e1541f9c 100644 --- a/lib/models/common/invalid_video.dart +++ b/lib/models/common/invalid_video.dart @@ -19,6 +19,7 @@ class InvalidVideoModel { final String? videoReview; final String? favorites; final String? tag; + final List? tagList; InvalidVideoModel({ this.id, @@ -41,6 +42,7 @@ class InvalidVideoModel { this.videoReview, this.favorites, this.tag, + this.tagList, }); factory InvalidVideoModel.fromJson(Map json) { @@ -65,6 +67,7 @@ class InvalidVideoModel { videoReview: json['video_review'], favorites: json['favorites'], tag: json['tag'], + tagList: json['tag'].toString().split(',').toList(), ); } } diff --git a/lib/pages/fav_detail/widget/invalid_video_card.dart b/lib/pages/fav_detail/widget/invalid_video_card.dart index e8e82d0e..78e9ab0a 100644 --- a/lib/pages/fav_detail/widget/invalid_video_card.dart +++ b/lib/pages/fav_detail/widget/invalid_video_card.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/models/common/invalid_video.dart'; @@ -32,15 +33,28 @@ class InvalidVideoCard extends StatelessWidget { radius: 20, ), const SizedBox(height: 10), - SelectableText('标题:${videoInfo.title}', style: textStyle), - SelectableText('作者:${videoInfo.author}', style: textStyle), + SelectableText( + videoInfo.title!, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 2), + SelectableText(videoInfo.author!, style: textStyle), + const SizedBox(height: 2), SelectableText('创建时间:${videoInfo.createdAt}', style: textStyle), - SelectableText('上次更新时间:${videoInfo.lastupdate}', + SelectableText('更新时间:${videoInfo.lastupdate}', style: textStyle), SelectableText('分类:${videoInfo.typename}', style: textStyle), - SelectableText('投币:${videoInfo.coins}', style: textStyle), - SelectableText('收藏:${videoInfo.favorites}', style: textStyle), - SelectableText('标签:${videoInfo.tag}', style: textStyle), + SelectableText( + '投币:${videoInfo.coins} 收藏:${videoInfo.favorites}', + style: textStyle), + if (videoInfo.tagList != null && + videoInfo.tagList!.isNotEmpty) ...[ + const SizedBox(height: 6), + _buildTags(context, videoInfo.tagList), + ], ], ), ); @@ -48,4 +62,36 @@ class InvalidVideoCard extends StatelessWidget { ), ); } + + Widget _buildTags(BuildContext context, List? videoTags) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return Wrap( + spacing: 6, + runSpacing: 6, + direction: Axis.horizontal, + textDirection: TextDirection.ltr, + children: videoTags!.map((tag) { + return InkWell( + onTap: () { + Get.toNamed('/searchResult', parameters: {'keyword': tag}); + }, + borderRadius: BorderRadius.circular(6), + child: Container( + decoration: BoxDecoration( + color: colorScheme.surfaceVariant.withOpacity(0.5), + borderRadius: BorderRadius.circular(6), + ), + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 10), + child: Text( + tag, + style: TextStyle( + fontSize: 12, + color: colorScheme.onSurfaceVariant, + ), + ), + ), + ); + }).toList(), + ); + } } From e1c7a74e1be2226527f5b1eafd7ffec07a59ed88 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sat, 23 Nov 2024 01:15:32 +0800 Subject: [PATCH 04/14] feat: SponsorBlock switch --- lib/pages/setting/extra_setting.dart | 9 +++++++++ lib/pages/video/detail/controller.dart | 3 ++- lib/utils/global_data_cache.dart | 4 ++++ lib/utils/storage.dart | 3 ++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index 004f3e9c..f4b56508 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -199,6 +199,15 @@ class _ExtraSettingState extends State { GlobalDataCache.enableDlna = val; }, ), + SetSwitchItem( + title: 'Sponsor Block', + subTitle: '自动跳过视频中赞助片段', + setKey: SettingBoxKey.enableSponsorBlock, + defaultVal: false, + callFn: (bool val) { + GlobalDataCache.enableSponsorBlock = val; + }, + ), ListTile( dense: false, title: Text('评论展示', style: titleStyle), diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index da3b0cbc..cb2e324c 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -21,6 +21,7 @@ import 'package:pilipala/models/video/play/url.dart'; import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/pages/video/detail/reply_reply/index.dart'; import 'package:pilipala/plugin/pl_player/index.dart'; +import 'package:pilipala/utils/global_data_cache.dart'; import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/video_utils.dart'; @@ -198,7 +199,7 @@ class VideoDetailController extends GetxController }); /// 仅投稿视频skip - if (videoType == SearchType.video) { + if (videoType == SearchType.video && GlobalDataCache.enableSponsorBlock) { querySkipSegments(); } } diff --git a/lib/utils/global_data_cache.dart b/lib/utils/global_data_cache.dart index a421f829..90b42795 100644 --- a/lib/utils/global_data_cache.dart +++ b/lib/utils/global_data_cache.dart @@ -55,6 +55,8 @@ class GlobalDataCache { static late bool enableDynamicSwitch; // 投屏开关 static bool enableDlna = false; + // sponsorBlock开关 + static bool enableSponsorBlock = false; // 私有构造函数 GlobalDataCache._(); @@ -123,5 +125,7 @@ class GlobalDataCache { enableDynamicSwitch = setting.get(SettingBoxKey.enableDynamicSwitch, defaultValue: true); enableDlna = setting.get(SettingBoxKey.enableDlna, defaultValue: false); + enableSponsorBlock = + setting.get(SettingBoxKey.enableSponsorBlock, defaultValue: false); } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 49a5c734..9133314c 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -116,7 +116,8 @@ class SettingBoxKey { enableAutoExpand = 'enableAutoExpand', defaultHomePage = 'defaultHomePage', enableRelatedVideo = 'enableRelatedVideo', - enableDlna = 'enableDlna'; + enableDlna = 'enableDlna', + enableSponsorBlock = 'enableSponsorBlock'; /// 外观 static const String themeMode = 'themeMode', From e1948b159b0b6e129d993c1093f639d5a53cf7a4 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 24 Nov 2024 01:16:33 +0800 Subject: [PATCH 05/14] feat: comment can be closed --- lib/models/common/comment_range_type.dart | 18 ++++ lib/pages/setting/extra_setting.dart | 83 ++++++++++++++++++- lib/pages/video/detail/controller.dart | 13 ++- .../video/detail/introduction/controller.dart | 17 ++-- lib/pages/video/detail/view.dart | 22 +++-- lib/utils/global_data_cache.dart | 28 ++++--- lib/utils/storage.dart | 3 +- 7 files changed, 156 insertions(+), 28 deletions(-) create mode 100644 lib/models/common/comment_range_type.dart diff --git a/lib/models/common/comment_range_type.dart b/lib/models/common/comment_range_type.dart new file mode 100644 index 00000000..979c84d8 --- /dev/null +++ b/lib/models/common/comment_range_type.dart @@ -0,0 +1,18 @@ +enum CommentRangeType { + video, + bangumi, + // dynamic, +} + +extension ActionTypeExtension on CommentRangeType { + String get value => [ + 'video', + 'bangumi', + // 'dynamic', + ][index]; + String get label => [ + '视频', + '番剧', + // '动态', + ][index]; +} diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index 004f3e9c..299f9094 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; +import 'package:pilipala/models/common/comment_range_type.dart'; import 'package:pilipala/models/common/dynamics_type.dart'; import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/pages/setting/widgets/select_dialog.dart'; @@ -27,6 +28,8 @@ class _ExtraSettingState extends State { late String defaultSystemProxyHost; late String defaultSystemProxyPort; bool userLogin = false; + // 记录每个选项是否被选中的状态 + late List enableComment; @override void initState() { @@ -47,6 +50,8 @@ class _ExtraSettingState extends State { localCache.get(LocalCacheKey.systemProxyHost, defaultValue: ''); defaultSystemProxyPort = localCache.get(LocalCacheKey.systemProxyPort, defaultValue: ''); + enableComment = setting + .get(SettingBoxKey.enableComment, defaultValue: ['video', 'bangumi']); } // 设置代理 @@ -202,6 +207,82 @@ class _ExtraSettingState extends State { ListTile( dense: false, title: Text('评论展示', style: titleStyle), + onTap: () async { + List tempEnableComment = List.from(enableComment); + int? result = await showDialog( + context: context, + builder: (context) { + // 带多选框的list + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return AlertDialog( + title: const Text('评论展示'), + contentPadding: const EdgeInsets.fromLTRB(0, 24, 0, 24), + content: SizedBox( + width: double.maxFinite, + child: ListView.builder( + itemCount: CommentRangeType.values.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return CheckboxListTile( + contentPadding: const EdgeInsets.symmetric( + horizontal: 24, vertical: 0), + title: Text( + '${CommentRangeType.values[index].label}评论'), + value: tempEnableComment.contains( + CommentRangeType.values[index].value), + onChanged: (bool? value) { + setState(() { + if (value == true) { + tempEnableComment.add( + CommentRangeType.values[index].value); + } else { + tempEnableComment.remove( + CommentRangeType.values[index].value); + } + }); + }, + ); + }, + ), + ), + actions: [ + TextButton( + onPressed: Navigator.of(context).pop, + child: Text( + '取消', + style: TextStyle( + color: Theme.of(context).colorScheme.outline), + ), + ), + TextButton( + onPressed: () async { + enableComment = tempEnableComment; + setting.put( + SettingBoxKey.enableComment, enableComment); + GlobalDataCache.enableComment = enableComment; + SmartDialog.showToast('操作成功'); + Navigator.of(context).pop(); + }, + child: const Text('确认'), + ) + ], + ); + }, + ); + }, + ); + if (result != null) { + defaultReplySort = result; + setting.put(SettingBoxKey.replySortType, result); + setState(() {}); + } + }, + ), + ListTile( + dense: false, + title: Text('评论排序', style: titleStyle), subtitle: Text( '当前优先展示「${ReplySortType.values[defaultReplySort].titles}」', style: subTitleStyle, @@ -211,7 +292,7 @@ class _ExtraSettingState extends State { context: context, builder: (context) { return SelectDialog( - title: '评论展示', + title: '评论排序', value: defaultReplySort, values: ReplySortType.values.map((e) { return {'title': e.titles, 'value': e.index}; diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index ca5a73be..3755233c 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -21,6 +21,7 @@ import 'package:pilipala/models/video/play/url.dart'; import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/pages/video/detail/reply_reply/index.dart'; import 'package:pilipala/plugin/pl_player/index.dart'; +import 'package:pilipala/utils/global_data_cache.dart'; import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/video_utils.dart'; @@ -140,8 +141,16 @@ class VideoDetailController extends GetxController } else if (argMap.containsKey('pic')) { updateCover(argMap['pic']); } - - tabCtr = TabController(length: 2, vsync: this); + tabs.value = [ + '简介', + 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); diff --git a/lib/pages/video/detail/introduction/controller.dart b/lib/pages/video/detail/introduction/controller.dart index 24bd7db0..5af5d57a 100644 --- a/lib/pages/video/detail/introduction/controller.dart +++ b/lib/pages/video/detail/introduction/controller.dart @@ -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(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(tag: heroTag); - videoReplyCtr.aid = aid; - videoReplyCtr.queryReplyList(type: 'init'); + if (GlobalDataCache.enableComment.contains('video')) { + final VideoReplyController videoReplyCtr = + Get.find(tag: heroTag); + videoReplyCtr.aid = aid; + videoReplyCtr.queryReplyList(type: 'init'); + } } catch (_) {} this.bvid = bvid; await queryVideoIntro(cover: cover); diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 488ed14d..564ab65a 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -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 ); }, ), - 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, + ), + ) + ], ], ), ), diff --git a/lib/utils/global_data_cache.dart b/lib/utils/global_data_cache.dart index a421f829..01b68dc6 100644 --- a/lib/utils/global_data_cache.dart +++ b/lib/utils/global_data_cache.dart @@ -5,7 +5,7 @@ import 'package:pilipala/plugin/pl_player/models/play_speed.dart'; import 'package:pilipala/utils/storage.dart'; import '../models/common/index.dart'; -Box setting = GStorage.setting; +Box settingBox = GStorage.setting; Box localCache = GStorage.localCache; Box videoStorage = GStorage.video; Box userInfoCache = GStorage.userInfo; @@ -55,6 +55,8 @@ class GlobalDataCache { static late bool enableDynamicSwitch; // 投屏开关 static bool enableDlna = false; + // 视频评论开关 + static List enableComment = ['video', 'bangumi']; // 私有构造函数 GlobalDataCache._(); @@ -67,18 +69,18 @@ class GlobalDataCache { // 异步初始化方法 static Future initialize() async { - imgQuality = await setting.get(SettingBoxKey.defaultPicQa, + imgQuality = await settingBox.get(SettingBoxKey.defaultPicQa, defaultValue: 10); // 设置全局变量 - fullScreenGestureMode = FullScreenGestureMode.values[setting.get( + fullScreenGestureMode = FullScreenGestureMode.values[settingBox.get( SettingBoxKey.fullScreenGestureMode, defaultValue: FullScreenGestureMode.fromBottomtoTop.index)]; - enablePlayerControlAnimation = setting + enablePlayerControlAnimation = settingBox .get(SettingBoxKey.enablePlayerControlAnimation, defaultValue: true); - actionTypeSort = await setting.get(SettingBoxKey.actionTypeSort, + actionTypeSort = await settingBox.get(SettingBoxKey.actionTypeSort, defaultValue: ['like', 'coin', 'collect', 'watchLater', 'share']); - isOpenDanmu = - await setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: false); + isOpenDanmu = await settingBox.get(SettingBoxKey.enableShowDanmaku, + defaultValue: false); blockTypes = await localCache.get(LocalCacheKey.danmakuBlockType, defaultValue: []); showArea = @@ -99,7 +101,7 @@ class GlobalDataCache { .firstWhere((e) => e.value == defaultPlayRepeat); playbackSpeed = await videoStorage.get(VideoBoxKey.playSpeedDefault, defaultValue: 1.0); - enableAutoLongPressSpeed = await setting + enableAutoLongPressSpeed = await settingBox .get(SettingBoxKey.enableAutoLongPressSpeed, defaultValue: false); if (!enableAutoLongPressSpeed) { longPressSpeed = await videoStorage.get(VideoBoxKey.longPressSpeedDefault, @@ -117,11 +119,13 @@ class GlobalDataCache { sheetHeight = localCache.get('sheetHeight', defaultValue: 0.0); historyCacheList = localCache.get('cacheList', defaultValue: []); enableSearchSuggest = - setting.get(SettingBoxKey.enableSearchSuggest, defaultValue: true); + settingBox.get(SettingBoxKey.enableSearchSuggest, defaultValue: true); enableAutoExpand = - setting.get(SettingBoxKey.enableAutoExpand, defaultValue: false); + settingBox.get(SettingBoxKey.enableAutoExpand, defaultValue: false); enableDynamicSwitch = - setting.get(SettingBoxKey.enableDynamicSwitch, defaultValue: true); - enableDlna = setting.get(SettingBoxKey.enableDlna, defaultValue: false); + settingBox.get(SettingBoxKey.enableDynamicSwitch, defaultValue: true); + enableDlna = settingBox.get(SettingBoxKey.enableDlna, defaultValue: false); + enableComment = settingBox + .get(SettingBoxKey.enableComment, defaultValue: ['video', 'bangumi']); } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 49a5c734..8fb00cb5 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -116,7 +116,8 @@ class SettingBoxKey { enableAutoExpand = 'enableAutoExpand', defaultHomePage = 'defaultHomePage', enableRelatedVideo = 'enableRelatedVideo', - enableDlna = 'enableDlna'; + enableDlna = 'enableDlna', + enableComment = 'enableComment'; /// 外观 static const String themeMode = 'themeMode', From 5201c66ac163af98fa1ad0047a2b240857b4015e Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 24 Nov 2024 17:38:35 +0800 Subject: [PATCH 06/14] feat: hardwareDecodeFormat --- lib/pages/setting/play_setting.dart | 31 ++++++++++++++++++++++++++++ lib/plugin/pl_player/controller.dart | 1 + lib/utils/global_data_cache.dart | 5 +++++ lib/utils/storage.dart | 3 ++- 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/pages/setting/play_setting.dart b/lib/pages/setting/play_setting.dart index 7090bfaf..c6d7fe0b 100644 --- a/lib/pages/setting/play_setting.dart +++ b/lib/pages/setting/play_setting.dart @@ -31,6 +31,7 @@ class _PlaySettingState extends State { late int defaultFullScreenMode; late int defaultBtmProgressBehavior; late String defaultAoOutput; + late String hardwareDecodeFormat; @override void initState() { @@ -49,6 +50,8 @@ class _PlaySettingState extends State { defaultValue: BtmProgresBehavior.values.first.code); defaultAoOutput = setting.get(SettingBoxKey.defaultAoOutput, defaultValue: '0'); + hardwareDecodeFormat = setting.get(SettingBoxKey.hardwareDecodeFormat, + defaultValue: Platform.isAndroid ? 'auto-safe' : 'auto'); } @override @@ -294,6 +297,34 @@ class _PlaySettingState extends State { } }, ), + ListTile( + dense: false, + title: Text('硬解方式', style: titleStyle), + subtitle: Text( + '当前硬解方式(--hwdec):$hardwareDecodeFormat', + style: subTitleStyle, + ), + onTap: () async { + String? result = await showDialog( + context: context, + builder: (context) { + return SelectDialog( + title: '硬解方式', + value: hardwareDecodeFormat, + values: ['no', 'auto-safe', 'auto', 'yes', 'auto-copy'] + .map((e) { + return {'title': e, 'value': e}; + }).toList()); + }, + ); + if (result != null) { + setting.put(SettingBoxKey.hardwareDecodeFormat, result); + hardwareDecodeFormat = result; + GlobalDataCache.hardwareDecodeFormat = result; + setState(() {}); + } + }, + ), ListTile( dense: false, title: Text('默认全屏方式', style: titleStyle), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 2013d5b2..075a2e91 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -470,6 +470,7 @@ class PlPlayerController { configuration: VideoControllerConfiguration( enableHardwareAcceleration: enableHA, androidAttachSurfaceAfterVideoParameters: false, + hwdec: enableHA ? GlobalDataCache.hardwareDecodeFormat : null, ), ); diff --git a/lib/utils/global_data_cache.dart b/lib/utils/global_data_cache.dart index a421f829..911a4285 100644 --- a/lib/utils/global_data_cache.dart +++ b/lib/utils/global_data_cache.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'package:hive/hive.dart'; import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/plugin/pl_player/models/play_repeat.dart'; @@ -55,6 +56,8 @@ class GlobalDataCache { static late bool enableDynamicSwitch; // 投屏开关 static bool enableDlna = false; + // 硬件解码格式 + static late String hardwareDecodeFormat; // 私有构造函数 GlobalDataCache._(); @@ -123,5 +126,7 @@ class GlobalDataCache { enableDynamicSwitch = setting.get(SettingBoxKey.enableDynamicSwitch, defaultValue: true); enableDlna = setting.get(SettingBoxKey.enableDlna, defaultValue: false); + hardwareDecodeFormat = setting.get(SettingBoxKey.hardwareDecodeFormat, + defaultValue: Platform.isAndroid ? 'auto-safe' : 'auto'); } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 49a5c734..04896341 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -116,7 +116,8 @@ class SettingBoxKey { enableAutoExpand = 'enableAutoExpand', defaultHomePage = 'defaultHomePage', enableRelatedVideo = 'enableRelatedVideo', - enableDlna = 'enableDlna'; + enableDlna = 'enableDlna', + hardwareDecodeFormat = 'hardwareDecodeFormat'; /// 外观 static const String themeMode = 'themeMode', From 747ed377b510a66d98cd4559cd83f0cd2ee805b4 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 24 Nov 2024 17:46:20 +0800 Subject: [PATCH 07/14] mod --- lib/pages/whisper_detail/view.dart | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index 3c3d9f18..e70c6f3c 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -101,25 +101,11 @@ class _WhisperDetailPageState extends State Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - automaticallyImplyLeading: false, title: SizedBox( - width: double.infinity, + width: double.maxFinite, height: 50, child: Row( children: [ - SizedBox( - width: 34, - height: 34, - child: IconButton( - onPressed: () => Get.back(), - icon: Icon( - Icons.arrow_back_ios, - size: 18, - color: Theme.of(context).colorScheme.onPrimaryContainer, - ), - ), - ), - const SizedBox(width: 10), GestureDetector( onTap: () { feedBack(); From 17a87d23366419ff1ea7ccb226ce18ad6adc9395 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 24 Nov 2024 22:08:45 +0800 Subject: [PATCH 08/14] fix: liveRoom layout error --- lib/http/init.dart | 11 ++++++---- lib/pages/live_room/view.dart | 41 +++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/lib/http/init.dart b/lib/http/init.dart index 03de43b7..9c0f368c 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -68,7 +68,7 @@ class Request { // 从cookie中获取 csrf token static Future getCsrf() async { List cookies = await cookieManager.cookieJar - .loadForRequest(Uri.parse(HttpString.apiBaseUrl)); + .loadForRequest(Uri.parse(HttpString.baseUrl)); String token = ''; if (cookies.where((e) => e.name == 'bili_jct').isNotEmpty) { token = cookies.firstWhere((e) => e.name == 'bili_jct').value; @@ -82,9 +82,12 @@ class Request { } final List cookies = await cookieManager.cookieJar - .loadForRequest(Uri.parse(HttpString.baseUrl)); - buvid = cookies.firstWhere((cookie) => cookie.name == 'buvid3').value; - if (buvid == null) { + .loadForRequest(Uri.parse(HttpString.apiBaseUrl)); + buvid = cookies + .firstWhere((cookie) => cookie.name == 'buvid3', + orElse: () => Cookie('buvid3', '')) + .value; + if (buvid == null || buvid!.isEmpty) { try { var result = await Request().get( "${HttpString.apiBaseUrl}/x/frontend/finger/spi", diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 11864391..ced55e37 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -312,25 +312,28 @@ class _LiveRoomPageState extends State ), ), // 消息列表 - Obx( - () => Align( - alignment: Alignment.bottomCenter, - child: Container( - margin: EdgeInsets.only( - bottom: 90 + padding.bottom, - ), - height: Get.size.height - - (padding.top + - kToolbarHeight + - (_liveRoomController.isPortrait.value - ? Get.size.width - : Get.size.width * 9 / 16) + - 100 + - padding.bottom), - child: buildMessageListUI( - context, - _liveRoomController, - _scrollController, + Visibility( + visible: !isLandscape, + child: Obx( + () => Align( + alignment: Alignment.bottomCenter, + child: Container( + margin: EdgeInsets.only( + bottom: 90 + padding.bottom, + ), + height: Get.size.height - + (padding.top + + kToolbarHeight + + (_liveRoomController.isPortrait.value + ? Get.size.width + : Get.size.width * 9 / 16) + + 100 + + padding.bottom), + child: buildMessageListUI( + context, + _liveRoomController, + _scrollController, + ), ), ), ), From ea900ffe4eaf3f4ceef1d3b57064b845a5045844 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sun, 24 Nov 2024 22:53:48 +0800 Subject: [PATCH 09/14] opt: jumpTo rebound --- lib/common/pages_bottom_sheet.dart | 64 ++++++++++++++++-------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/lib/common/pages_bottom_sheet.dart b/lib/common/pages_bottom_sheet.dart index dd8c5490..fa6f61c7 100644 --- a/lib/common/pages_bottom_sheet.dart +++ b/lib/common/pages_bottom_sheet.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; @@ -98,7 +99,8 @@ class _PagesBottomSheetState extends State with TickerProviderStateMixin { final ScrollController _listScrollController = ScrollController(); late ListObserverController _listObserverController; - final ScrollController _scrollController = ScrollController(); + late GridObserverController _gridObserverController; + final ScrollController _gridScrollController = ScrollController(); late int currentIndex; TabController? tabController; List? _listObserverControllerList; @@ -163,6 +165,9 @@ class _PagesBottomSheetState extends State ); }, ); + } else { + _gridObserverController = + GridObserverController(controller: _gridScrollController); } } @@ -185,18 +190,12 @@ class _PagesBottomSheetState extends State ); } } + } else { + _gridObserverController.initialIndexModel = ObserverIndexPositionModel( + index: currentIndex, + isFixedHeight: false, + ); } - - WidgetsBinding.instance.addPostFrameCallback((_) { - if (widget.dataType != VideoEpidoesType.videoEpisode) { - double itemHeight = (widget.isFullScreen - ? 400 - : Get.size.width - 3 * StyleString.safeSpace) / - 5.2; - double offset = ((currentIndex - 1) / 2).ceil() * itemHeight; - _scrollController.jumpTo(offset); - } - }); } // 获取订阅状态 @@ -236,7 +235,9 @@ class _PagesBottomSheetState extends State void dispose() { try { _listObserverController.controller?.dispose(); + _gridObserverController.controller?.dispose(); _listScrollController.dispose(); + _gridScrollController.dispose(); for (var element in _listObserverControllerList!) { element.controller?.dispose(); } @@ -303,24 +304,27 @@ class _PagesBottomSheetState extends State : Padding( padding: const EdgeInsets.symmetric( horizontal: 12.0), // 设置左右间距为12 - child: GridView.count( - controller: _scrollController, - crossAxisCount: 2, - crossAxisSpacing: StyleString.safeSpace, - childAspectRatio: 2.6, - children: List.generate( - widget.episodes.length, - (index) { - bool isCurrentIndex = currentIndex == index; - return EpisodeGridItem( - episode: widget.episodes[index], - index: index, - isCurrentIndex: isCurrentIndex, - dataType: widget.dataType, - changeFucCall: widget.changeFucCall, - isFullScreen: widget.isFullScreen, - ); - }, + child: GridViewObserver( + controller: _gridObserverController, + child: GridView.count( + controller: _gridScrollController, + crossAxisCount: 2, + crossAxisSpacing: StyleString.safeSpace, + childAspectRatio: 2.6, + children: List.generate( + widget.episodes.length, + (index) { + bool isCurrentIndex = currentIndex == index; + return EpisodeGridItem( + episode: widget.episodes[index], + index: index, + isCurrentIndex: isCurrentIndex, + dataType: widget.dataType, + changeFucCall: widget.changeFucCall, + isFullScreen: widget.isFullScreen, + ); + }, + ), ), ), ), From 0ae6238d0e4bb39152ad0ff249fc465d39950bc3 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 25 Nov 2024 22:39:04 +0800 Subject: [PATCH 10/14] opt: pl_gallery layout --- .../pl_gallery/interactiveviewer_gallery.dart | 109 +++++++++--------- 1 file changed, 53 insertions(+), 56 deletions(-) diff --git a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart index f0b11619..88c9129c 100644 --- a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart +++ b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart @@ -234,17 +234,17 @@ class _InteractiveviewerGalleryState extends State @override Widget build(BuildContext context) { - return InteractiveViewerBoundary( - controller: _transformationController, - boundaryWidth: MediaQuery.of(context).size.width, - onScaleChanged: _onScaleChanged, - onLeftBoundaryHit: _onLeftBoundaryHit, - onRightBoundaryHit: _onRightBoundaryHit, - onNoBoundaryHit: _onNoBoundaryHit, - maxScale: widget.maxScale, - minScale: widget.minScale, - child: Stack(children: [ - CustomDismissible( + return Stack(children: [ + InteractiveViewerBoundary( + controller: _transformationController, + boundaryWidth: MediaQuery.of(context).size.width, + onScaleChanged: _onScaleChanged, + onLeftBoundaryHit: _onLeftBoundaryHit, + onRightBoundaryHit: _onRightBoundaryHit, + onNoBoundaryHit: _onNoBoundaryHit, + maxScale: widget.maxScale, + minScale: widget.minScale, + child: CustomDismissible( onDismissed: () { Navigator.of(context).pop(); widget.onDismissed?.call(_pageController!.page!.floor()); @@ -275,53 +275,50 @@ class _InteractiveviewerGalleryState extends State }, ), ), - Positioned( - bottom: 0, - left: 0, - right: 0, - child: Container( - padding: EdgeInsets.fromLTRB( - 12, 8, 20, MediaQuery.of(context).padding.bottom + 8), - decoration: _enablePageView - ? BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Colors.transparent, - Colors.black.withOpacity(0.3) - ], - ), - ) - : null, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - IconButton( - icon: const Icon(Icons.close, color: Colors.white), - onPressed: () { - Navigator.of(context).pop(); - widget.onDismissed?.call(_pageController!.page!.floor()); - }, - ), - widget.sources.length > 1 - ? Text( - "${currentIndex! + 1}/${widget.sources.length}", - style: const TextStyle(color: Colors.white), - ) - : const SizedBox(), - PopupMenuButton( - itemBuilder: (context) { - return _buildPopupMenuList(); - }, - child: const Icon(Icons.more_horiz, color: Colors.white), - ), - ], - ), + ), + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.fromLTRB( + 12, 8, 20, MediaQuery.of(context).padding.bottom + 8), + decoration: _enablePageView + ? BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Colors.transparent, Colors.black.withOpacity(0.3)], + ), + ) + : null, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: const Icon(Icons.close, color: Colors.white), + onPressed: () { + Navigator.of(context).pop(); + widget.onDismissed?.call(_pageController!.page!.floor()); + }, + ), + widget.sources.length > 1 + ? Text( + "${currentIndex! + 1}/${widget.sources.length}", + style: const TextStyle(color: Colors.white), + ) + : const SizedBox(), + PopupMenuButton( + itemBuilder: (context) { + return _buildPopupMenuList(); + }, + child: const Icon(Icons.more_horiz, color: Colors.white), + ), + ], ), ), - ]), - ); + ), + ]); } // 图片分享 From 859ee82367162c82a92d1cd7bd0f15fa8122d18a Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 25 Nov 2024 23:40:48 +0800 Subject: [PATCH 11/14] opt: bottomSheet DragHandle --- lib/common/widgets/drag_handle.dart | 25 +++ lib/common/widgets/video_card_h.dart | 20 +-- lib/common/widgets/video_card_v.dart | 20 +-- lib/pages/bangumi/introduction/view.dart | 20 +-- .../introduction/widgets/intro_detail.dart | 154 ++++++++---------- lib/pages/dynamics/widgets/author_panel.dart | 21 +-- .../detail/reply/widgets/reply_item.dart | 20 +-- lib/pages/video/detail/widgets/ai_detail.dart | 36 ++-- .../video/detail/widgets/header_control.dart | 18 +- .../pl_gallery/interactiveviewer_gallery.dart | 22 +-- 10 files changed, 129 insertions(+), 227 deletions(-) create mode 100644 lib/common/widgets/drag_handle.dart diff --git a/lib/common/widgets/drag_handle.dart b/lib/common/widgets/drag_handle.dart new file mode 100644 index 00000000..1143a732 --- /dev/null +++ b/lib/common/widgets/drag_handle.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class DragHandle extends StatelessWidget { + const DragHandle({super.key}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: Navigator.of(context).pop, + child: SizedBox( + height: 36, + child: Center( + child: Container( + width: 32, + height: 4, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.outline, + borderRadius: BorderRadius.circular(4), + ), + ), + ), + ), + ); + } +} diff --git a/lib/common/widgets/video_card_h.dart b/lib/common/widgets/video_card_h.dart index 78c4ba87..b662a3b0 100644 --- a/lib/common/widgets/video_card_h.dart +++ b/lib/common/widgets/video_card_h.dart @@ -12,6 +12,7 @@ import '../../http/video.dart'; import '../../utils/utils.dart'; import '../constants.dart'; import 'badge.dart'; +import 'drag_handle.dart'; import 'network_img_layer.dart'; import 'stat/danmu.dart'; import 'stat/view.dart'; @@ -373,27 +374,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('block'), minLeadingWidth: 0, diff --git a/lib/common/widgets/video_card_v.dart b/lib/common/widgets/video_card_v.dart index 8cec3523..72cfb998 100644 --- a/lib/common/widgets/video_card_v.dart +++ b/lib/common/widgets/video_card_v.dart @@ -5,6 +5,7 @@ import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/image_save.dart'; import 'package:pilipala/utils/route_push.dart'; import '../../models/model_rec_video_item.dart'; +import 'drag_handle.dart'; import 'stat/danmu.dart'; import 'stat/view.dart'; import '../../http/dynamics.dart'; @@ -368,27 +369,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('block'), minLeadingWidth: 0, diff --git a/lib/pages/bangumi/introduction/view.dart b/lib/pages/bangumi/introduction/view.dart index 75e293c4..4fc6a1b1 100644 --- a/lib/pages/bangumi/introduction/view.dart +++ b/lib/pages/bangumi/introduction/view.dart @@ -5,6 +5,7 @@ import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/badge.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; @@ -445,27 +446,12 @@ class BangumiStatusWidget extends StatelessWidget { } Widget morePanel(BuildContext context, BangumiIntroController ctr) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ...ctr.followStatusList .map( (e) => ListTile( diff --git a/lib/pages/bangumi/introduction/widgets/intro_detail.dart b/lib/pages/bangumi/introduction/widgets/intro_detail.dart index a4c469de..04c035ed 100644 --- a/lib/pages/bangumi/introduction/widgets/intro_detail.dart +++ b/lib/pages/bangumi/introduction/widgets/intro_detail.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/stat/danmu.dart'; import 'package:pilipala/common/widgets/stat/view.dart'; import 'package:pilipala/utils/storage.dart'; @@ -23,94 +24,81 @@ class IntroDetail extends StatelessWidget { color: Theme.of(context).colorScheme.onSurface, ); return Container( - color: Theme.of(context).colorScheme.surface, - padding: const EdgeInsets.only(left: 14, right: 14), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), height: sheetHeight, child: Column( children: [ - Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer - .withOpacity(0.5), - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), + const DragHandle(), Expanded( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - bangumiDetail!.title, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bangumiDetail!.title, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), ), - ), - const SizedBox(height: 4), - Row( - children: [ - StatView( - view: bangumiDetail!.stat!['views'], - size: 'medium', - ), - const SizedBox(width: 6), - StatDanMu( - danmu: bangumiDetail!.stat!['danmakus'], - size: 'medium', - ), - ], - ), - const SizedBox(height: 4), - Row( - children: [ - Text( - bangumiDetail!.areas!.first['name'], - style: smallTitle, - ), - const SizedBox(width: 6), - Text( - bangumiDetail!.publish!['pub_time_show'], - style: smallTitle, - ), - const SizedBox(width: 6), - Text( - bangumiDetail!.newEp!['desc'], - style: smallTitle, - ), - ], - ), - const SizedBox(height: 20), - Text( - '简介:', - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 4), - Text( - '${bangumiDetail!.evaluate!}', - style: smallTitle.copyWith(fontSize: 13), - ), - const SizedBox(height: 20), - Text( - '声优:', - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 4), - Text( - bangumiDetail.actors, - style: smallTitle.copyWith(fontSize: 13), - ), - SizedBox(height: MediaQuery.of(context).padding.bottom + 20) - ], + const SizedBox(height: 4), + Row( + children: [ + StatView( + view: bangumiDetail!.stat!['views'], + size: 'medium', + ), + const SizedBox(width: 6), + StatDanMu( + danmu: bangumiDetail!.stat!['danmakus'], + size: 'medium', + ), + ], + ), + const SizedBox(height: 4), + Row( + children: [ + Text( + bangumiDetail!.areas!.first['name'], + style: smallTitle, + ), + const SizedBox(width: 6), + Text( + bangumiDetail!.publish!['pub_time_show'], + style: smallTitle, + ), + const SizedBox(width: 6), + Text( + bangumiDetail!.newEp!['desc'], + style: smallTitle, + ), + ], + ), + const SizedBox(height: 20), + Text( + '简介:', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Text( + '${bangumiDetail!.evaluate!}', + style: smallTitle.copyWith(fontSize: 13), + ), + const SizedBox(height: 20), + Text( + '声优:', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Text( + bangumiDetail.actors, + style: smallTitle.copyWith(fontSize: 13), + ), + SizedBox(height: MediaQuery.of(context).padding.bottom + 20) + ], + ), ), ), ) diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 8acdc26a..64068b0a 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/utils/feed_back.dart'; @@ -108,28 +109,12 @@ class MorePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), - // clipBehavior: Clip.hardEdge, child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async { try { diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index e0a6d07f..a453a0fb 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -7,6 +7,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/widgets/badge.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/http/reply.dart'; import 'package:pilipala/models/common/reply_type.dart'; @@ -1117,27 +1118,12 @@ class MorePanel extends StatelessWidget { ColorScheme colorScheme = Theme.of(context).colorScheme; TextTheme textTheme = Theme.of(context).textTheme; Color errorColor = colorScheme.error; - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: colorScheme.outline, - borderRadius: const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ListTile( onTap: () async => await menuActionHandler('copyAll'), minLeadingWidth: 0, diff --git a/lib/pages/video/detail/widgets/ai_detail.dart b/lib/pages/video/detail/widgets/ai_detail.dart index c17591fb..a82e3506 100644 --- a/lib/pages/video/detail/widgets/ai_detail.dart +++ b/lib/pages/video/detail/widgets/ai_detail.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/models/video/ai.dart'; import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/utils/global_data_cache.dart'; @@ -17,21 +18,24 @@ class AiDetail extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.only(left: 16, right: 16), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), height: GlobalDataCache.sheetHeight, child: Column( children: [ - _buildHeader(context), + const DragHandle(), Expanded( child: SingleChildScrollView( - child: Column( - children: [ - if (modelResult!.summary != '') ...[ - _buildSummaryText(modelResult!.summary!), - const SizedBox(height: 20), + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: Column( + children: [ + if (modelResult!.summary != '') ...[ + _buildSummaryText(modelResult!.summary!), + const SizedBox(height: 20), + ], + _buildOutlineList(context), ], - _buildOutlineList(context), - ], + ), ), ), ), @@ -40,20 +44,6 @@ class AiDetail extends StatelessWidget { ); } - Widget _buildHeader(BuildContext context) { - return Center( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).hintColor, - borderRadius: const BorderRadius.all(Radius.circular(10)), - ), - height: 4, - width: 40, - margin: const EdgeInsets.symmetric(vertical: 16), - ), - ); - } - Widget _buildSummaryText(String summary) { return SelectableText( summary, diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 5b2c51ae..0fbdc493 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -8,6 +8,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:ns_danmaku/ns_danmaku.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/video/play/quality.dart'; import 'package:pilipala/models/video/play/url.dart'; @@ -102,22 +103,7 @@ class _HeaderControlState extends State { margin: const EdgeInsets.all(12), child: Column( children: [ - SizedBox( - height: 35, - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer - .withOpacity(0.5), - borderRadius: - const BorderRadius.all(Radius.circular(3))), - ), - ), - ), + const DragHandle(), Expanded( child: Material( child: ListView( diff --git a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart index 88c9129c..6776b10c 100644 --- a/lib/plugin/pl_gallery/interactiveviewer_gallery.dart +++ b/lib/plugin/pl_gallery/interactiveviewer_gallery.dart @@ -7,8 +7,8 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:pilipala/common/widgets/drag_handle.dart'; import 'package:pilipala/utils/download.dart'; import 'package:share_plus/share_plus.dart'; import 'package:status_bar_control/status_bar_control.dart'; @@ -423,29 +423,13 @@ class _InteractiveviewerGalleryState extends State useRootNavigator: true, isScrollControlled: true, builder: (context) { - return Container( + return Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom), child: Column( mainAxisSize: MainAxisSize.min, children: [ - InkWell( - onTap: () => Get.back(), - child: Container( - height: 35, - padding: const EdgeInsets.only(bottom: 2), - child: Center( - child: Container( - width: 32, - height: 3, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.outline, - borderRadius: - const BorderRadius.all(Radius.circular(3))), - ), - ), - ), - ), + const DragHandle(), ..._buildListTitles(), ], ), From 6ba022828c8ba4aa4fdd92f9bb3d01bb21ffae23 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Tue, 26 Nov 2024 23:31:20 +0800 Subject: [PATCH 12/14] opt: videoDetail SliverAppBar height change --- lib/pages/video/detail/view.dart | 4 +-- lib/plugin/pl_player/view.dart | 42 +++++++++++++++++++------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 564ab65a..55aafeb5 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -680,8 +680,8 @@ class _VideoDetailPageState extends State forceElevated: innerBoxIsScrolled, expandedHeight: expandedHeight, backgroundColor: Colors.black, - flexibleSpace: FlexibleSpaceBar( - background: PopScope( + flexibleSpace: SizedBox.expand( + child: PopScope( canPop: plPlayerController?.isFullScreen.value != true, onPopInvoked: (bool didPop) { diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index c73bc55f..4c405cc0 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -739,29 +739,37 @@ class _PLVideoPlayerState extends State // 头部、底部控制条 Obx( () => Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - if (widget.headerControl != null || _.headerControl != null) - ClipRect( + if (widget.headerControl != null || _.headerControl != null) ...[ + Flexible( + child: ClipRect( + child: AppBarAni( + controller: animationController, + visible: !_.controlsLock.value && _.showControls.value, + position: 'top', + child: widget.headerControl ?? _.headerControl!, + ), + ), + ), + ] else ...[ + const SizedBox.shrink() + ], + Flexible( + flex: _.videoType == 'live' ? 0 : 1, + child: ClipRect( child: AppBarAni( controller: animationController, visible: !_.controlsLock.value && _.showControls.value, - position: 'top', - child: widget.headerControl ?? _.headerControl!, + position: 'bottom', + child: widget.bottomControl ?? + BottomControl( + controller: widget.controller, + triggerFullScreen: _.triggerFullScreen, + buildBottomControl: buildBottomControl(), + ), ), ), - const Spacer(), - ClipRect( - child: AppBarAni( - controller: animationController, - visible: !_.controlsLock.value && _.showControls.value, - position: 'bottom', - child: widget.bottomControl ?? - BottomControl( - controller: widget.controller, - triggerFullScreen: _.triggerFullScreen, - buildBottomControl: buildBottomControl(), - ), - ), ), ], ), From bae15505938b5ac49560bf1531bf07852311925f Mon Sep 17 00:00:00 2001 From: guozhigq Date: Tue, 26 Nov 2024 23:35:48 +0800 Subject: [PATCH 13/14] mod: enableCDN default false --- lib/pages/live_room/controller.dart | 2 +- lib/pages/setting/play_setting.dart | 2 +- lib/pages/video/detail/controller.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index a918ec7b..28f92005 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -69,7 +69,7 @@ class LiveRoomController extends GetxController { Request.getBuvid().then((value) => buvid = value); } // CDN优化 - enableCDN = setting.get(SettingBoxKey.enableCDN, defaultValue: true); + enableCDN = setting.get(SettingBoxKey.enableCDN, defaultValue: false); final userInfo = userInfoCache.get('userInfoCache'); if (userInfo != null && userInfo.mid != null) { userId = userInfo.mid; diff --git a/lib/pages/setting/play_setting.dart b/lib/pages/setting/play_setting.dart index c6d7fe0b..1151775e 100644 --- a/lib/pages/setting/play_setting.dart +++ b/lib/pages/setting/play_setting.dart @@ -95,7 +95,7 @@ class _PlaySettingState extends State { title: 'CDN优化', subTitle: '使用优质CDN线路', setKey: SettingBoxKey.enableCDN, - defaultVal: true, + defaultVal: false, ), const SetSwitchItem( title: '自动播放', diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 78028904..cc2cbffc 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -169,7 +169,7 @@ class VideoDetailController extends GetxController } // CDN优化 - enableCDN = setting.get(SettingBoxKey.enableCDN, defaultValue: true); + enableCDN = setting.get(SettingBoxKey.enableCDN, defaultValue: false); // 预设的画质 cacheVideoQa = setting.get(SettingBoxKey.defaultVideoQa); // 预设的解码格式 From 518f49973c967f026f90393d49ead3cdff9bd1b1 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Wed, 27 Nov 2024 00:05:10 +0800 Subject: [PATCH 14/14] mod: fav folder edit --- lib/pages/fav_detail/controller.dart | 5 ++-- lib/pages/fav_edit/controller.dart | 11 +++++++++ lib/pages/fav_edit/view.dart | 35 +++++++++++----------------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 022e0103..32bad5c9 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -134,8 +134,9 @@ class FavDetailController extends GetxController { 'privacy': [22, 0].contains(item!.attr) ? 0 : 1, }, ); - title.value = res['title']; - print(title); + if (res != null) { + title.value = res['title']; + } } Future toViewPlayAll() async { diff --git a/lib/pages/fav_edit/controller.dart b/lib/pages/fav_edit/controller.dart index bf310389..18e88a03 100644 --- a/lib/pages/fav_edit/controller.dart +++ b/lib/pages/fav_edit/controller.dart @@ -53,6 +53,7 @@ class FavEditController extends GetxController { intro: intro, mediaId: mediaId!, cover: cover, + privacy: privacy.value, ); if (res['status']) { SmartDialog.showToast('编辑成功'); @@ -74,4 +75,14 @@ class FavEditController extends GetxController { SmartDialog.showToast(res['msg']); } } + + void togglePrivacy() { + if (privacy.value == 0) { + privacy.value = 1; + SmartDialog.showToast('设置为私密后,只有自己可见'); + } else { + privacy.value = 0; + SmartDialog.showToast('设置为公开后,所有人可见'); + } + } } diff --git a/lib/pages/fav_edit/view.dart b/lib/pages/fav_edit/view.dart index 2fecf070..4b5db10c 100644 --- a/lib/pages/fav_edit/view.dart +++ b/lib/pages/fav_edit/view.dart @@ -21,31 +21,22 @@ class _FavEditPageState extends State { appBar: AppBar( title: Obx( () => _favEditController.type.value == 'add' - ? Text( - '新建收藏夹', - style: Theme.of(context).textTheme.titleMedium, - ) - : Text( - '编辑收藏夹', - style: Theme.of(context).textTheme.titleMedium, - ), + ? const Text('新建收藏夹') + : const Text('编辑收藏夹'), ), actions: [ Obx( - () => _favEditController.privacy.value == 0 - ? IconButton( - onPressed: () { - _favEditController.privacy.value = 1; - }, - icon: const Icon(Icons.lock_open_outlined)) - : IconButton( - onPressed: () { - _favEditController.privacy.value = 0; - }, - icon: Icon( - Icons.lock_outlined, - color: Theme.of(context).colorScheme.error, - )), + () => IconButton( + onPressed: _favEditController.togglePrivacy, + icon: Icon( + _favEditController.privacy.value == 0 + ? Icons.lock_open_outlined + : Icons.lock_outlined, + color: _favEditController.privacy.value == 0 + ? null + : Theme.of(context).colorScheme.error, + ), + ), ), TextButton( onPressed: _favEditController.onSubmit, child: const Text('保存')),