From 9aed64d998ee1163640fec5bd8de6954d0958cc1 Mon Sep 17 00:00:00 2001 From: "Timothy Z." Date: Fri, 2 May 2025 00:00:15 +0300 Subject: [PATCH] test(Player): fix binge watching (4) --- src/routes/Player/Player.js | 78 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/src/routes/Player/Player.js b/src/routes/Player/Player.js index e47a2179c..2ad9efd17 100644 --- a/src/routes/Player/Player.js +++ b/src/routes/Player/Player.js @@ -83,6 +83,7 @@ const Player = ({ urlParams, queryParams }) => { return immersed && !casting && video.state.paused !== null && !video.state.paused && !menusOpen && !nextVideoPopupOpen; }, [immersed, casting, video.state.paused, menusOpen, nextVideoPopupOpen]); + const nextVideoHandledRef = React.useRef(false); const nextVideoPopupDismissed = React.useRef(false); const defaultSubtitlesSelected = React.useRef(false); const defaultAudioTrackSelected = React.useRef(false); @@ -215,26 +216,22 @@ const Player = ({ urlParams, queryParams }) => { }, []); const onNextVideoRequested = React.useCallback(() => { - if (player.nextVideo !== null) { + if (player.nextVideo !== null && !nextVideoHandledRef.current) { + nextVideoHandledRef.current = true; + const navigationData = { playerLink: player.nextVideo.deepLinks.player, metaDetailsLink: player.nextVideo.deepLinks.metaDetailsStreams }; - if (navigationData.playerLink) { - requestAnimationFrame(() => { - window.location.replace(navigationData.playerLink); - }); - setTimeout(() => { - nextVideo(); - }, 500); - } else if (navigationData.metaDetailsLink) { - requestAnimationFrame(() => { - window.location.replace(navigationData.metaDetailsLink); - }); - setTimeout(() => { - nextVideo(); - }, 500); + const targetLink = navigationData.playerLink || navigationData.metaDetailsLink; + + if (targetLink) { + nextVideo(); + + window.location.replace(targetLink); + } else { + nextVideo(); } } }, [player.nextVideo]); @@ -430,6 +427,7 @@ const Player = ({ urlParams, queryParams }) => { defaultSubtitlesSelected.current = false; defaultAudioTrackSelected.current = false; nextVideoPopupDismissed.current = false; + nextVideoHandledRef.current = false; }, [video.state.stream]); React.useEffect(() => { @@ -493,6 +491,31 @@ const Player = ({ urlParams, queryParams }) => { } }, [settings.pauseOnMinimize, shell.windowClosed, shell.windowHidden]); + React.useEffect(() => { + nextVideoHandledRef.current = false; + }, [player.selected]); + + React.useEffect(() => { + video.events.on('error', onError); + video.events.on('ended', onEnded); + video.events.on('subtitlesTrackLoaded', onSubtitlesTrackLoaded); + video.events.on('extraSubtitlesTrackLoaded', onExtraSubtitlesTrackLoaded); + video.events.on('extraSubtitlesTrackAdded', onExtraSubtitlesTrackAdded); + video.events.on('implementationChanged', onImplementationChanged); + + return () => { + video.events.off('error', onError); + video.events.off('ended', onEnded); + video.events.off('subtitlesTrackLoaded', onSubtitlesTrackLoaded); + video.events.off('extraSubtitlesTrackLoaded', onExtraSubtitlesTrackLoaded); + video.events.off('extraSubtitlesTrackAdded', onExtraSubtitlesTrackAdded); + video.events.off('implementationChanged', onImplementationChanged); + }; + }, [ + onEnded, + onImplementationChanged + ]); + React.useLayoutEffect(() => { const onKeyDown = (event) => { switch (event.code) { @@ -616,31 +639,6 @@ const Player = ({ urlParams, queryParams }) => { }; }, [player.metaItem, player.selected, streamingServer.statistics, settings.seekTimeDuration, settings.seekShortTimeDuration, settings.escExitFullscreen, routeFocused, menusOpen, nextVideoPopupOpen, video.state.paused, video.state.time, video.state.volume, video.state.audioTracks, video.state.subtitlesTracks, video.state.extraSubtitlesTracks, video.state.playbackSpeed, toggleSubtitlesMenu, toggleStatisticsMenu, toggleSideDrawer]); - React.useEffect(() => { - video.events.on('error', onError); - video.events.on('ended', onEnded); - video.events.on('subtitlesTrackLoaded', onSubtitlesTrackLoaded); - video.events.on('extraSubtitlesTrackLoaded', onExtraSubtitlesTrackLoaded); - video.events.on('extraSubtitlesTrackAdded', onExtraSubtitlesTrackAdded); - video.events.on('implementationChanged', onImplementationChanged); - - return () => { - video.events.off('error', onError); - video.events.off('ended', onEnded); - video.events.off('subtitlesTrackLoaded', onSubtitlesTrackLoaded); - video.events.off('extraSubtitlesTrackLoaded', onExtraSubtitlesTrackLoaded); - video.events.off('extraSubtitlesTrackAdded', onExtraSubtitlesTrackAdded); - video.events.off('implementationChanged', onImplementationChanged); - }; - }, [ - onEnded, - onImplementationChanged - ]); - - React.useEffect(() => { - console.log('Player next video in use effect', player.nextVideo); // eslint-disable-line no-console - }, [player.nextVideo]); - React.useLayoutEffect(() => { return () => { setImmersedDebounced.cancel();