diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index c3eddd9ac..465059f9b 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -800,6 +800,10 @@ class PlPlayerController { videoPlayerController!.stream.error.listen((String event) { // 直播的错误提示没有参考价值,均不予显示 if (videoType.value == 'live') return; + if (event.startsWith("Failed to open .") || + event.startsWith("Cannot open file ''")) { + SmartDialog.showToast('视频源为空'); + } if (event.startsWith("Failed to open https://") || event.startsWith("Can not open external file https://") || //tcp: ffurl_read returned 0xdfb9b0bb @@ -807,13 +811,15 @@ class PlPlayerController { event.startsWith('tcp: ffurl_read returned ')) { EasyThrottle.throttle('videoPlayerController!.stream.error.listen', const Duration(milliseconds: 10000), () { - Future.delayed(const Duration(milliseconds: 3000), () { + Future.delayed(const Duration(milliseconds: 3000), () async { debugPrint("isBuffering.value: ${isBuffering.value}"); debugPrint("_buffered.value: ${_buffered.value}"); if (isBuffering.value && _buffered.value == Duration.zero) { - refreshPlayer(); SmartDialog.showToast('视频链接打开失败,重试中', displayTime: const Duration(milliseconds: 500)); + if (!await refreshPlayer()) { + debugPrint("failed"); + } } }); }); diff --git a/lib/utils/video_utils.dart b/lib/utils/video_utils.dart index b07f6b425..1c58c42e0 100644 --- a/lib/utils/video_utils.dart +++ b/lib/utils/video_utils.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/models/video/play/CDN.dart'; import 'package:PiliPlus/models/video/play/url.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart'; @@ -20,11 +21,15 @@ class VideoUtils { if (item is AudioItem) { if (GStorage.setting .get(SettingBoxKey.disableAudioCDN, defaultValue: true)) { - return item.backupUrl ?? item.baseUrl ?? ""; + return item.backupUrl.isNullOrEmpty.not + ? item.backupUrl! + : item.baseUrl ?? ""; } } if (defaultCDNService == CDNService.baseUrl.code) { - return item.baseUrl ?? ""; + return item.baseUrl.isNullOrEmpty.not + ? item.baseUrl + : item.backupUrl ?? ""; } if (item is CodecItem) { backupUrl = (item.urlInfo?.first.host)! + @@ -34,20 +39,20 @@ class VideoUtils { backupUrl = item.backupUrl; } if (defaultCDNService == CDNService.backupUrl.code) { - return backupUrl ?? item.baseUrl ?? ""; + return backupUrl.isNullOrEmpty.not ? backupUrl : item.baseUrl ?? ""; } - videoUrl = (backupUrl == null || isMCDNorPCDN(backupUrl)) + videoUrl = (backupUrl.isNullOrEmpty || isMCDNorPCDN(backupUrl!)) ? item.baseUrl : backupUrl; - if (videoUrl == null) { + if (videoUrl.isNullOrEmpty) { return ""; } debugPrint("videoUrl:$videoUrl"); String defaultCDNHost = CDNServiceCode.fromCode(defaultCDNService)!.host; debugPrint("defaultCDNHost:$defaultCDNHost"); - if (videoUrl.contains("szbdyd.com")) { + if (videoUrl!.contains("szbdyd.com")) { String hostname = Uri.parse(videoUrl).queryParameters['xy_usource'] ?? defaultCDNHost; videoUrl =