diff --git a/web/src/components/player/MsePlayer.tsx b/web/src/components/player/MsePlayer.tsx index ad2c10e24..bff6a5928 100644 --- a/web/src/components/player/MsePlayer.tsx +++ b/web/src/components/player/MsePlayer.tsx @@ -46,6 +46,7 @@ function MSEPlayer({ const visibilityCheck: boolean = !pip; const [isPlaying, setIsPlaying] = useState(false); + const playTimeoutRef = useRef(null); const [wsState, setWsState] = useState(WebSocket.CLOSED); const [connectTS, setConnectTS] = useState(0); @@ -371,49 +372,65 @@ function MSEPlayer({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [playbackEnabled]); + const handleLoadedData = useCallback(() => { + handleLoadedMetadata?.(); + if (playTimeoutRef.current) { + clearTimeout(playTimeoutRef.current); + playTimeoutRef.current = null; + } + onPlaying?.(); + setIsPlaying(true); + }, [handleLoadedMetadata, onPlaying]); + + const handleProgress = useCallback(() => { + if (!isPlaying && !playTimeoutRef.current && playbackEnabled) { + playTimeoutRef.current = setTimeout(() => { + handleLoadedData(); + }, 5000); + } + if (onError != undefined) { + if (videoRef.current?.paused) { + return; + } + + if (bufferTimeout) { + clearTimeout(bufferTimeout); + setBufferTimeout(undefined); + } + + setBufferTimeout( + setTimeout(() => { + if ( + document.visibilityState === "visible" && + wsRef.current != null && + videoRef.current + ) { + onDisconnect(); + onError("stalled"); + } + }, 3000), + ); + } + }, [ + isPlaying, + onError, + videoRef, + bufferTimeout, + onDisconnect, + handleLoadedData, + playbackEnabled, + ]); + return (