diff --git a/lib/http/video.dart b/lib/http/video.dart index 6805ad9a9..faad43b45 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -208,19 +208,15 @@ abstract final class VideoHttp { case .pgc: final result = res.data['result']; - data = PlayUrlModel.fromJson(result['video_info']); - if (result['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress'] - case final int progress when progress > 0) { - data.lastPlayTime = progress; - } + data = PlayUrlModel.fromJson(result['video_info']) + ..lastPlayTime = + result['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress']; case .pugv: final result = res.data['data']; - data = PlayUrlModel.fromJson(result); - if (result['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress'] - case final int progress when progress > 0) { - data.lastPlayTime = progress; - } + data = PlayUrlModel.fromJson(result) + ..lastPlayTime = + result['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress']; } return Success(data); } else if (epid != null && videoType == .ugc) { diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index fd941964a..38b3f8aac 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -22,7 +22,7 @@ class PlayUrlModel { this.seekType, this.dash, this.supportFormats, - this.lastPlayTime, + this._lastPlayTime = 0, this.lastPlayCid, }); @@ -42,7 +42,17 @@ class PlayUrlModel { List? durl; List? supportFormats; Volume? volume; - int? lastPlayTime; + + late int _lastPlayTime; + int get lastPlayTime => _lastPlayTime; + set lastPlayTime(int? value) { + if (value != null && value > 0) { + _lastPlayTime = value; + } else { + _lastPlayTime = 0; + } + } + int? lastPlayCid; String? curLanguage; Language? language; @@ -69,9 +79,7 @@ class PlayUrlModel { ?.map((e) => FormatItem.fromJson(e)) .toList(); volume = json['volume'] == null ? null : Volume.fromJson(json['volume']); - if (json['last_play_time'] case final int progress when progress > 0) { - lastPlayTime = progress; - } + lastPlayTime = json['last_play_time']; lastPlayCid = json['last_play_cid']; curLanguage = json['cur_language']; language = json['language'] == null diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index b57f76efa..b485f08cc 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -667,15 +667,8 @@ class VideoDetailController extends GetxController return null; } - Future playerInit({ - String? video, - String? audio, - Duration? seekToTime, - Duration? duration, - bool? autoplay, - Volume? volume, - }) async { - Duration? seek = seekToTime ?? defaultST ?? playedTime; + Future playerInit({bool? autoplay}) async { + Duration? seek = defaultST ?? playedTime; if (seek == null || seek == Duration.zero) { seek = getFirstSegment(); } @@ -688,15 +681,13 @@ class VideoDetailController extends GetxController hasDashAudio: entry.hasDashAudio, ) : NetworkSource( - videoSource: video ?? videoUrl!, - audioSource: audio ?? audioUrl, + videoSource: videoUrl!, + audioSource: audioUrl, ), seekTo: seek, - duration: - duration ?? - (data.timeLength == null - ? null - : Duration(milliseconds: data.timeLength!)), + duration: data.timeLength == null + ? null + : Duration(milliseconds: data.timeLength!), isVertical: isVertical, aid: aid, bvid: bvid, @@ -712,7 +703,7 @@ class VideoDetailController extends GetxController }, width: firstVideo.width, height: firstVideo.height, - volume: volume ?? this.volume, + volume: volume, ); if (isClosed) return; @@ -741,16 +732,13 @@ class VideoDetailController extends GetxController return; } currLang.value = language; - queryVideoUrl(defaultST: playedTime); + queryVideoUrl(fromReset: true); } Volume? volume; // 视频链接 - Future queryVideoUrl({ - Duration? defaultST, - bool fromReset = false, - }) async { + Future queryVideoUrl({bool fromReset = false}) async { if (isFileSource) { return _initPlayerIfNeeded(); } @@ -790,11 +778,13 @@ class VideoDetailController extends GetxController volume = data.volume; - final progress = args.remove('progress'); - if (progress != null) { - this.defaultST = Duration(milliseconds: progress); - } else if (defaultST == null && data.lastPlayTime != null) { - this.defaultST = Duration(milliseconds: data.lastPlayTime!); + if (!fromReset) { + final progress = args.remove('progress'); + if (progress != null) { + defaultST = Duration(milliseconds: progress); + } else { + defaultST = Duration(milliseconds: data.lastPlayTime); + } } if (!isUgc && !fromReset && plPlayerController.enablePgcSkip) { diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index c1e4ad408..7a15f3a4d 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -72,11 +72,7 @@ class VideoDetailPageV extends StatefulWidget { } class _VideoDetailPageVState extends State - with - TickerProviderStateMixin, - RouteAware, - RouteAwareMixin, - WidgetsBindingObserver { + with RouteAware, RouteAwareMixin, WidgetsBindingObserver { final heroTag = Get.arguments['heroTag']; late final VideoDetailController videoDetailController; @@ -1071,7 +1067,7 @@ class _VideoDetailPageVState extends State if (videoDetailController.tabCtr.length != tabs.length) { videoDetailController.tabCtr.dispose(); videoDetailController.tabCtr = TabController( - vsync: this, + vsync: videoDetailController, length: tabs.length, initialIndex: tabs.isEmpty ? 0 diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 54e04869e..3c38ecf9b 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -445,10 +445,7 @@ class HeaderControlState extends State dense: true, onTap: () { Get.back(); - videoDetailCtr.queryVideoUrl( - defaultST: videoDetailCtr.playedTime, - fromReset: true, - ); + videoDetailCtr.queryVideoUrl(fromReset: true); }, leading: const Icon(Icons.refresh_outlined, size: 20), title: const Text('重载视频', style: titleStyle), @@ -493,10 +490,7 @@ class HeaderControlState extends State VideoUtils.cdnService = result; setting.put(SettingBoxKey.CDNService, result.name); SmartDialog.showToast('已设置为 ${result.desc},正在重载视频'); - videoDetailCtr.queryVideoUrl( - defaultST: videoDetailCtr.playedTime, - fromReset: true, - ); + videoDetailCtr.queryVideoUrl(fromReset: true); } }, ),