diff --git a/lib/models/common/sponsor_block/segment_model.dart b/lib/models/common/sponsor_block/segment_model.dart index ec99ce54..5258ab4a 100644 --- a/lib/models/common/sponsor_block/segment_model.dart +++ b/lib/models/common/sponsor_block/segment_model.dart @@ -10,11 +10,11 @@ class SegmentModel { required this.segmentType, required this.segment, required this.skipType, - this.hasSkipped, + this.hasSkipped = false, }); String UUID; SegmentType segmentType; Pair segment; SkipType skipType; - bool? hasSkipped; + bool hasSkipped; } diff --git a/lib/models_new/sponsor_block/segment_item.dart b/lib/models_new/sponsor_block/segment_item.dart index 5887ee4d..0c280da1 100644 --- a/lib/models_new/sponsor_block/segment_item.dart +++ b/lib/models_new/sponsor_block/segment_item.dart @@ -1,18 +1,18 @@ class SegmentItemModel { - String cid; + String? cid; String category; - String actionType; + String? actionType; List segment; String uuid; - double videoDuration; + num? videoDuration; SegmentItemModel({ - required this.cid, + this.cid, required this.category, - required this.actionType, + this.actionType, required this.segment, required this.uuid, - required this.videoDuration, + this.videoDuration, }); factory SegmentItemModel.fromJson(Map json) => @@ -20,9 +20,12 @@ class SegmentItemModel { cid: json["cid"], category: json["category"], actionType: json["actionType"], - segment: - (json["segment"] as List).map((e) => (e as num).round()).toList(), + segment: (json["segment"] as List) + .map((e) => ((e as num) * 1000).round()) + .toList(), uuid: json["UUID"], - videoDuration: (json["videoDuration"] as num).toDouble(), + videoDuration: json["videoDuration"] == null + ? null + : (json["videoDuration"] as num) * 1000, ); } diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index fd3d7bcb..bbf0fdeb 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -611,7 +611,7 @@ class VideoDetailController extends GetxController ), contentPadding: const EdgeInsets.only(left: 16, right: 8), subtitle: Text( - '${Utils.formatDuration(item.segment.first)} 至 ${Utils.formatDuration(item.segment.second)}', + '${Utils.formatDuration(item.segment.first / 1000)} 至 ${Utils.formatDuration(item.segment.second / 1000)}', style: const TextStyle(fontSize: 13), ), trailing: Row( @@ -696,7 +696,8 @@ class VideoDetailController extends GetxController void handleSBData(List list) { if (list.isNotEmpty) { try { - double duration = list.first.videoDuration; + final duration = list.first.videoDuration ?? + plPlayerController.duration.value.inMilliseconds; // segmentList segmentList.addAll(list .where((item) => @@ -704,13 +705,12 @@ class VideoDetailController extends GetxController item.segment[1] >= item.segment[0]) .map( (item) { - SegmentType segmentType = SegmentType - .values[plPlayerController.segmentTypes.indexOf(item.category)]; + final segmentType = SegmentType.values.byName(item.category); if (item.segment[0] == 0 && item.segment[1] == 0) { videoLabel.value += '${videoLabel.value.isNotEmpty ? '/' : ''}${segmentType.title}'; } - SkipType skipType = + var skipType = plPlayerController.blockSettings[segmentType.index].second; if (skipType != SkipType.showOnly) { if (item.segment[1] == item.segment[0] || @@ -733,7 +733,7 @@ class VideoDetailController extends GetxController if (positionSubscription == null && !isShowCover.value && plPlayerController.videoPlayerController != null) { - final currPost = plPlayerController.position.value.inSeconds; + final currPost = plPlayerController.position.value.inMilliseconds; if (currPost > segmentModel.segment.first && currPost < segmentModel.segment.second) { if (segmentModel.skipType == SkipType.alwaysSkip) { @@ -760,8 +760,7 @@ class VideoDetailController extends GetxController ).toList()); // _segmentProgressList - segmentProgressList ??= []; - segmentProgressList!.addAll(segmentList.map((e) { + (segmentProgressList ??= []).addAll(segmentList.map((e) { double start = (e.segment.first / duration).clamp(0.0, 1.0); double end = (e.segment.second / duration).clamp(0.0, 1.0); return Segment(start, end, _getColor(e.segmentType)); @@ -790,16 +789,18 @@ class VideoDetailController extends GetxController int currentPos = position.inSeconds; if (currentPos != _lastPos) { _lastPos = currentPos; + final msPos = currentPos * 1000; for (SegmentModel item in segmentList) { // if (kDebugMode) { // debugPrint( // '${position.inSeconds},,${item.segment.first},,${item.segment.second},,${item.skipType.name},,${item.hasSkipped}'); // } - if (item.segment.first == position.inSeconds) { + if (msPos <= item.segment.first && + item.segment.first <= msPos + 1000) { if (item.skipType == SkipType.alwaysSkip) { onSkip(item); } else if (item.skipType == SkipType.skipOnce && - item.hasSkipped != true) { + item.hasSkipped) { item.hasSkipped = true; onSkip(item); } else if (item.skipType == SkipType.skipManually) { @@ -905,7 +906,7 @@ class VideoDetailController extends GetxController try { plPlayerController.danmakuController?.clear(); await plPlayerController.videoPlayerController - ?.seek(Duration(seconds: item.segment.second)); + ?.seek(Duration(milliseconds: item.segment.second)); if (isSkip) { if (GStorage.blockToast) { _showBlockToast('已跳过${item.segmentType.shortTitle}片段'); diff --git a/lib/pages/video/post_panel/view.dart b/lib/pages/video/post_panel/view.dart index 573c455a..a83932b3 100644 --- a/lib/pages/video/post_panel/view.dart +++ b/lib/pages/video/post_panel/view.dart @@ -325,8 +325,8 @@ class _PostPanelState extends CommonCollapseSlidePageState { int start = max( 0, (list![index].segment.first * 1000) - .toInt() - - 2, + .round() - + 2000, ); await widget .plPlayerController.videoPlayerController! @@ -349,7 +349,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { Duration( milliseconds: (list![index].segment.second * 1000) - .toInt(), + .round(), ), ); } diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 787c806e..379ce966 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -300,12 +300,10 @@ class PlPlayerController { late final List> blockSettings = GStorage.blockSettings; late final List blockColor = GStorage.blockColor; - late final List segmentTypes = - SegmentType.values.map((item) => item.name).toList(); - late final List enableList = blockSettings + late final Set enableList = blockSettings .where((item) => item.second != SkipType.disable) .map((item) => item.first.name) - .toList(); + .toSet(); late final blockServer = GStorage.blockServer; // settings diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 2b251250..0ada69cb 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -455,22 +455,16 @@ class Utils { } static String formatDuration(num seconds) { - int hours = seconds ~/ 3600; - int minutes = (seconds % 3600) ~/ 60; - num remainingSeconds = seconds % 60; - if (remainingSeconds is double) { - remainingSeconds = remainingSeconds.toPrecision(3); - } - - String minutesStr = minutes.toString().padLeft(2, '0'); - String secondsStr = remainingSeconds.toString().padLeft(2, '0'); - - if (hours > 0) { - String hoursStr = hours.toString().padLeft(2, '0'); - return "$hoursStr:$minutesStr:$secondsStr"; - } else { - return "$minutesStr:$secondsStr"; - } + int h = seconds ~/ 3600; + seconds %= 3600; + int m = seconds ~/ 60; + seconds %= 60; + String sms = seconds is double + ? seconds.toStringAsFixed(3).padLeft(6, '0') + : seconds.toString().padLeft(2, '0'); + return h == 0 + ? "${m.toString().padLeft(2, '0')}:$sms" + : "${h.toString().padLeft(2, '0')}:${m.toString().padLeft(2, '0')}:$sms"; } static int duration(String duration) {