diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 01e028fb..b39d04b7 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -1113,6 +1113,18 @@ class VideoDetailController extends GetxController return; } isQuerying = true; + await Future.wait([ + if (enableSponsorBlock) _querySponsorBlock(), + _actualQuery(), + ]); + if (autoPlay.value && videoUrl != null && audioUrl != null) { + isShowCover.value = false; + await playerInit(); + } + isQuerying = false; + } + + Future _actualQuery() async { if (cacheVideoQa == null) { await Connectivity().checkConnectivity().then((res) { cacheVideoQa = res.contains(ConnectivityResult.wifi) @@ -1128,7 +1140,7 @@ class VideoDetailController extends GetxController defaultValue: AudioQuality.k192.code); }); } - var result = await VideoHttp.videoUrl( + dynamic result = await VideoHttp.videoUrl( cid: cid.value, bvid: bvid, epid: epId, @@ -1137,15 +1149,14 @@ class VideoDetailController extends GetxController if (result['status']) { data = result['data']; - if (enableSponsorBlock) { - await _querySponsorBlock(); - } if (data.acceptDesc!.isNotEmpty && data.acceptDesc!.contains('试看')) { SmartDialog.showToast( '该视频为专属视频,仅提供试看', displayTime: const Duration(seconds: 3), ); } + + /// #1 if (data.dash == null && data.durl != null) { videoUrl = data.durl!.first.url!; audioUrl = ''; @@ -1158,22 +1169,26 @@ class VideoDetailController extends GetxController quality: VideoQualityCode.fromCode(data.quality!)!); currentDecodeFormats = VideoDecodeFormatsCode.fromString('avc1')!; currentVideoQa = VideoQualityCode.fromCode(data.quality!)!; - if (autoPlay.value) { - isShowCover.value = false; - await playerInit(); - } + + /// await sponsorblock + // if (autoPlay.value) { + // isShowCover.value = false; + // await playerInit(); + // } videoState.value = LoadingState.success(null); - isQuerying = false; return; } + + /// #2 if (data.dash == null) { SmartDialog.showToast('视频资源不存在'); autoPlay.value = false; isShowCover.value = true; - videoState.value = LoadingState.success(null); - isQuerying = false; + videoState.value = LoadingState.error('视频资源不存在'); return; } + + /// #3 final List allVideosList = data.dash!.video!; // debugPrint("allVideosList:${allVideosList}"); // 当前可播放的最高质量视频 @@ -1267,13 +1282,17 @@ class VideoDetailController extends GetxController } // defaultST = Duration(milliseconds: data.lastPlayTime!); - if (autoPlay.value) { - isShowCover.value = false; - await playerInit(); - } + + /// await sponsorblock + // if (autoPlay.value) { + // isShowCover.value = false; + // await playerInit(); + // } + videoState.value = LoadingState.success(null); } else { autoPlay.value = false; isShowCover.value = true; + videoState.value = LoadingState.error(result['msg']); if (result['code'] == -404) { SmartDialog.showToast('视频不存在或已被删除'); } @@ -1283,8 +1302,6 @@ class VideoDetailController extends GetxController SmartDialog.showToast("错误(${result['code']}):${result['msg']}"); } } - isQuerying = false; - videoState.value = LoadingState.success(null); } List? list; diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 8e6d6446..cbc8fbb2 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -281,14 +281,14 @@ class _VideoDetailPageState extends State /// 未开启自动播放时触发播放 Future handlePlay() async { + if (videoDetailController.isQuerying) { + debugPrint('handlePlay: querying'); + return; + } if (videoDetailController.videoUrl == null || videoDetailController.audioUrl == null) { - // SmartDialog.showToast('not initialized'); debugPrint('handlePlay: videoUrl/audioUrl not initialized'); - if (videoDetailController.isQuerying.not) { - videoDetailController.autoPlay.value = true; - videoDetailController.queryVideoUrl(); - } + videoDetailController.queryVideoUrl(); return; } plPlayerController = videoDetailController.plPlayerController; diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index a41fa655..241e9971 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -500,11 +500,9 @@ class PlPlayerController { dataSource, _looping, enableHA, hwdec, width, height); // 获取视频时长 00:00 _duration.value = duration ?? _videoPlayerController!.state.duration; - _position.value = - _sliderPosition.value = _buffered.value = seekTo ?? Duration.zero; + _position.value = _sliderPosition.value = seekTo ?? Duration.zero; updateDurationSecond(); updatePositionSecond(); - updateBufferedSecond(); updateSliderPositionSecond(); // 数据加载完成 dataStatus.status.value = DataStatus.loaded; @@ -855,7 +853,11 @@ class PlPlayerController { await _videoPlayerController?.stream.buffer.first; } danmakuController?.clear(); - await _videoPlayerController?.seek(position); + try { + await _videoPlayerController?.seek(position); + } catch (e) { + debugPrint('seek failed: $e'); + } // if (playerStatus.stopped) { // play(); // }