From de0fbce46633ecf569023e15c602c3321430234f Mon Sep 17 00:00:00 2001 From: ale Date: Sat, 29 Nov 2025 22:58:02 +0100 Subject: [PATCH] fix player reload Signed-off-by: ale --- src/app/page.js | 1 - src/components/VideoPlayer.js | 58 +++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/app/page.js b/src/app/page.js index 5aab380..70af83b 100644 --- a/src/app/page.js +++ b/src/app/page.js @@ -520,7 +520,6 @@ export default function Home() { ) : ( // Modo normal: video propio { - if (isInitializedRef.current) return; if (!url || !videoRef.current || isRemoteStream) return; + // Si la URL cambió, necesitamos reiniciar + const urlChanged = currentUrlRef.current && currentUrlRef.current !== url; + + if (urlChanged) { + console.log('📺 URL cambió, recargando video...', url); + isInitializedRef.current = false; + if (hlsRef.current) { + hlsRef.current.destroy(); + hlsRef.current = null; + } + segmentCache.current.clear(); + } + + if (isInitializedRef.current && !urlChanged) return; + isInitializedRef.current = true; + currentUrlRef.current = url; const video = videoRef.current; @@ -126,37 +142,47 @@ export default function VideoPlayer({ hls.loadSource(url); hls.attachMedia(video); - if (socket) { - socket.on('request-segment', (data) => { - const segment = segmentCache.current.get(data.segmentUrl); - if (segment) { - socket.emit('segment-response', { - to: data.from, - segmentUrl: data.segmentUrl, - data: Array.from(new Uint8Array(segment)) - }); - } - }); - } - return () => { - if (socket) socket.off('request-segment'); if (hlsRef.current) { hlsRef.current.destroy(); hlsRef.current = null; } segmentCache.current.clear(); isInitializedRef.current = false; + currentUrlRef.current = null; }; } else if (video.canPlayType('application/vnd.apple.mpegurl')) { video.src = url; return () => { isInitializedRef.current = false; + currentUrlRef.current = null; }; } else { setError('Tu navegador no soporta HLS'); } - }, [url, socket]); + }, [url, isRemoteStream]); + + // Efecto separado para manejar eventos del socket (no reinicia el player) + useEffect(() => { + if (!socket) return; + + const handleRequestSegment = (data) => { + const segment = segmentCache.current.get(data.segmentUrl); + if (segment) { + socket.emit('segment-response', { + to: data.from, + segmentUrl: data.segmentUrl, + data: Array.from(new Uint8Array(segment)) + }); + } + }; + + socket.on('request-segment', handleRequestSegment); + + return () => { + socket.off('request-segment', handleRequestSegment); + }; + }, [socket]); return (