From 4458e137871f61f2d8358cff3ff4acd9a55ce17a Mon Sep 17 00:00:00 2001 From: guozhigq Date: Fri, 11 Aug 2023 11:45:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=86=E9=A2=91=E7=94=BB=E8=B4=A8?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/models/video/play/url.dart | 4 +- lib/pages/video/detail/controller.dart | 110 ++++++++++++------------- lib/utils/utils.dart | 16 ++++ 3 files changed, 72 insertions(+), 58 deletions(-) diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index 07dd684c..c3109467 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -29,7 +29,7 @@ class PlayUrlModel { int? timeLength; String? acceptFormat; List? acceptDesc; - List? acceptQuality; + List? acceptQuality; int? videoCodecid; String? seekParam; String? seekType; @@ -48,7 +48,7 @@ class PlayUrlModel { timeLength = json['timelength']; acceptFormat = json['accept_format']; acceptDesc = json['accept_description']; - acceptQuality = json['accept_quality']; + acceptQuality = json['accept_quality'].map((e) => e as int).toList(); videoCodecid = json['video_codecid']; seekParam = json['seek_param']; seekType = json['seek_type']; diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index d4cda6b2..3916a064 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -13,40 +13,47 @@ import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/pages/video/detail/replyReply/index.dart'; import 'package:pilipala/plugin/pl_player/index.dart'; import 'package:pilipala/utils/storage.dart'; +import 'package:pilipala/utils/utils.dart'; class VideoDetailController extends GetxController with GetSingleTickerProviderStateMixin { - int tabInitialIndex = 0; - TabController? tabCtr; - // tabs - RxList tabs = ['简介', '评论'].obs; - - // 视频aid + /// 路由传参 String bvid = Get.parameters['bvid']!; int cid = int.parse(Get.parameters['cid']!); - // 视频类型 默认投稿视频 - SearchType videoType = SearchType.video; - - late PlayUrlModel data; - - Box setting = GStrorage.setting; - // 当前画质 - late VideoQuality currentVideoQa; - // 当前音质 - late AudioQuality currentAudioQa; - // 当前解码格式 - late VideoDecodeFormats currentDecodeFormats; - - // 是否预渲染 骨架屏 - bool preRender = false; - - // 视频详情 上个页面传入 + String heroTag = Get.arguments['heroTag']; + // 视频详情 Map videoItem = {}; + // 视频类型 默认投稿视频 + SearchType videoType = Get.arguments['videoType'] ?? SearchType.video; + /// tabs相关配置 + int tabInitialIndex = 0; + late TabController tabCtr; + RxList tabs = ['简介', '评论'].obs; + + // 请求返回的视频信息 + late PlayUrlModel data; // 请求状态 RxBool isLoading = false.obs; - String heroTag = ''; + /// 播放器配置 画质 音质 解码格式 + late VideoQuality currentVideoQa; + late AudioQuality currentAudioQa; + late VideoDecodeFormats currentDecodeFormats; + PlPlayerController plPlayerController = PlPlayerController(); + // 是否开始自动播放 存在多p的情况下,第二p需要为true + RxBool autoPlay = true.obs; + // 视频资源是否有效 + RxBool isEffective = true.obs; + // 封面图的展示 + RxBool isShowCover = true.obs; + // 硬解 + RxBool enableHA = true.obs; + + /// 本地存储 + Box user = GStrorage.user; + Box localCache = GStrorage.localCache; + Box setting = GStrorage.setting; int oid = 0; // 评论id 请求楼中楼评论使用 @@ -55,38 +62,27 @@ class VideoDetailController extends GetxController ReplyItemModel? firstFloor; final scaffoldKey = GlobalKey(); Timer? timer; - RxString bgCover = ''.obs; - Box user = GStrorage.user; - Box localCache = GStrorage.localCache; - PlPlayerController plPlayerController = PlPlayerController(); - // 是否开始自动播放 存在多p的情况下,第二p需要为true - RxBool autoPlay = true.obs; - // 视频资源是否有效 - RxBool isEffective = true.obs; - // 封面图的展示 - RxBool isShowCover = true.obs; @override void onInit() { super.onInit(); - if (Get.arguments.isNotEmpty) { - if (Get.arguments.containsKey('videoItem')) { - preRender = true; - var args = Get.arguments['videoItem']; + Map argMap = Get.arguments; + var keys = argMap.keys.toList(); + if (keys.isNotEmpty) { + if (keys.contains('videoItem')) { + var args = argMap['videoItem']; if (args.pic != null && args.pic != '') { videoItem['pic'] = args.pic; - bgCover.value = args.pic; } } - if (Get.arguments.containsKey('pic')) { - videoItem['pic'] = Get.arguments['pic']; - bgCover.value = Get.arguments['pic']; + if (keys.contains('pic')) { + videoItem['pic'] = argMap['pic']; } - heroTag = Get.arguments['heroTag']; - videoType = Get.arguments['videoType'] ?? SearchType.video; } tabCtr = TabController(length: 2, vsync: this); - // queryVideoUrl(); + autoPlay.value = + setting.get(SettingBoxKey.autoPlayEnable, defaultValue: true); + enableHA.value = setting.get(SettingBoxKey.enableHA, defaultValue: true); } showReplyReplyPanel() { @@ -123,7 +119,6 @@ class VideoDetailController extends GetxController data.dash!.video!.where((i) => i.id == currentVideoQa.code).toList(); VideoItem firstVideo = videoList .firstWhere((i) => i.codecs!.startsWith(currentDecodeFormats.code)); - // String videoUrl = firstVideo.baseUrl!; /// 根据currentAudioQa 重新设置audioUrl AudioItem firstAudio = @@ -147,7 +142,7 @@ class VideoDetailController extends GetxController }, ), // 硬解 - enableHA: true, + enableHA: enableHA.value, autoplay: autoPlay.value, seekTo: defaultST, duration: Duration(milliseconds: duration), @@ -180,8 +175,10 @@ class VideoDetailController extends GetxController defaultValue: currentHighVideoQa); int resVideoQa = currentHighVideoQa; if (cacheVideoQa <= currentHighVideoQa) { - // 如果默认设置的画质比当前可用的低,使用默认值 - resVideoQa = cacheVideoQa; + List numbers = data.acceptQuality! + .where((e) => e <= currentHighVideoQa) + .toList(); + resVideoQa = Utils.findClosestNumber(cacheVideoQa, numbers); } currentVideoQa = VideoQualityCode.fromCode(resVideoQa)!; @@ -208,16 +205,17 @@ class VideoDetailController extends GetxController /// 优先顺序 设置中指定质量 -> 当前可选的最高质量 late AudioItem firstAudio; + List audiosList = data.dash!.audio!; try { - if (data.dash!.audio!.isNotEmpty) { - firstAudio = data.dash!.audio!.first; + if (audiosList.isNotEmpty) { + firstAudio = audiosList.first; int resultAudioQa = setting.get(SettingBoxKey.defaultAudioQa, - defaultValue: data.dash!.audio!.first.id); + defaultValue: firstAudio.id); // 选择最接近的那个音轨 - try { - firstAudio = - data.dash!.audio!.firstWhere((e) => e.id == resultAudioQa); - } catch (_) {} + firstAudio = audiosList.firstWhere( + (e) => e.id == resultAudioQa, + orElse: () => AudioItem(), + ); } else { firstAudio = AudioItem(); } diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index fdf5009e..7dfe972e 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -162,4 +162,20 @@ class Utils { } return 0; } + + static int findClosestNumber(int target, List numbers) { + int minDiff = 127; + late int closestNumber; + try { + for (int number in numbers) { + int diff = (number - target).abs(); + + if (diff < minDiff) { + minDiff = diff; + closestNumber = number; + } + } + } catch (_) {} + return closestNumber; + } }