diff --git a/components/player/hooks/useHlsPlayer.ts b/components/player/hooks/useHlsPlayer.ts index 83ea2a5..c9a75c3 100644 --- a/components/player/hooks/useHlsPlayer.ts +++ b/components/player/hooks/useHlsPlayer.ts @@ -323,6 +323,40 @@ export function useHlsPlayer({ processMasterPlaylist(src).then((result) => { video.src = result.masterBlobUrl; extraBlobs = result.allBlobs; + + // Some WebView-based browsers (Alook, Arthur, etc.) cannot play from blob: URLs. + // Detect playback failure and fall back to the original source. + let blobPlaybackFailed = false; + + const onBlobError = () => { + if (blobPlaybackFailed) return; + blobPlaybackFailed = true; + console.warn('[HLS Native] Blob URL playback failed, falling back to original source.'); + video.removeEventListener('error', onBlobError); + onError?.('当前浏览器不支持广告过滤,已回退到原始视频流'); + // Revoke blob URLs immediately + extraBlobs.forEach(url => URL.revokeObjectURL(url)); + extraBlobs = []; + video.src = src; + }; + + video.addEventListener('error', onBlobError); + + // Also set a timeout: if video hasn't started loading within 8s, fall back + const fallbackTimer = setTimeout(() => { + if (video.readyState === 0 && !blobPlaybackFailed) { + console.warn('[HLS Native] Blob URL playback timed out, falling back to original source.'); + onBlobError(); + } + }, 8000); + + // Clear the timeout once video starts loading + const onLoadedData = () => { + clearTimeout(fallbackTimer); + video.removeEventListener('error', onBlobError); + video.removeEventListener('loadeddata', onLoadedData); + }; + video.addEventListener('loadeddata', onLoadedData); }).catch((e) => { console.warn('[HLS Native] Ad filtering failed, falling back to original source.', e); onError?.('广告过滤失败,已回退到原始视频流'); diff --git a/package-lock.json b/package-lock.json index 29c40d7..3aa18ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kvideo", - "version": "4.1.1", + "version": "4.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kvideo", - "version": "4.1.1", + "version": "4.1.2", "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", diff --git a/package.json b/package.json index 1da14f7..a9a5a31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kvideo", - "version": "4.1.1", + "version": "4.1.2", "private": true, "scripts": { "dev": "next dev",