From cba980602b6d367c7b075b35acaa8a820d9707a2 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sat, 24 Feb 2024 07:26:15 -0700 Subject: [PATCH] Convert preview player to use html5 --- .../player/PreviewThumbnailPlayer.tsx | 140 +++++++++--------- 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/web/src/components/player/PreviewThumbnailPlayer.tsx b/web/src/components/player/PreviewThumbnailPlayer.tsx index d2edbff88..436b842e4 100644 --- a/web/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web/src/components/player/PreviewThumbnailPlayer.tsx @@ -181,7 +181,10 @@ function PreviewContent({ setProgress, setReviewed, }: PreviewContentProps) { - const playerRef = useRef(null); + const playerRef = useRef(null); + + // keep track of playback state + const playerStartTime = useMemo(() => { if (!relevantPreview) { return 0; @@ -190,6 +193,57 @@ function PreviewContent({ // start with a bit of padding return Math.max(0, review.start_time - relevantPreview.start - 8); }, []); + const [lastPercent, setLastPercent] = useState(0.0); + + // initialize player correctly + + useEffect(() => { + if (!playerRef.current) { + return; + } + + if (isSafari) { + playerRef.current.pause(); + setManualPlayback(true); + } else { + playerRef.current.currentTime = playerStartTime; + playerRef.current.playbackRate = 8; + } + }, [playerRef]); + + // time progress update + + const onProgress = useCallback(() => { + if (!setProgress) { + return; + } + + const playerProgress = + (playerRef.current?.currentTime || 0) - playerStartTime; + + // end with a bit of padding + const playerDuration = review.end_time - review.start_time + 8; + const playerPercent = (playerProgress / playerDuration) * 100; + + if ( + setReviewed && + !review.has_been_reviewed && + lastPercent < 50 && + playerPercent > 50 + ) { + setReviewed(); + } + + setLastPercent(playerPercent); + + if (playerPercent > 100) { + playerRef.current?.pause(); + setManualPlayback(false); + setProgress(100.0); + } else { + setProgress(playerPercent); + } + }, [setProgress, lastPercent]); // manual playback // safari is incapable of playing at a speed > 2x @@ -204,7 +258,7 @@ function PreviewContent({ let counter = 0; const intervalId: NodeJS.Timeout = setInterval(() => { if (playerRef.current) { - playerRef.current.currentTime(playerStartTime + counter); + playerRef.current.currentTime = playerStartTime + counter; counter += 1; } }, 125); @@ -215,77 +269,17 @@ function PreviewContent({ if (relevantPreview) { return ( - { - playerRef.current = player; - - if (!relevantPreview) { - return; - } - - if (isSafari) { - player.pause(); - setManualPlayback(true); - } else { - player.currentTime(playerStartTime); - player.playbackRate(8); - } - - let lastPercent = 0; - player.on("timeupdate", () => { - if (!setProgress) { - return; - } - - const playerProgress = - (player.currentTime() || 0) - playerStartTime; - - // end with a bit of padding - const playerDuration = review.end_time - review.start_time + 8; - const playerPercent = (playerProgress / playerDuration) * 100; - - if ( - setReviewed && - !review.has_been_reviewed && - lastPercent < 50 && - playerPercent > 50 - ) { - setReviewed(); - } - - lastPercent = playerPercent; - - if (playerPercent > 100) { - playerRef.current?.pause(); - setManualPlayback(false); - setProgress(100.0); - } else { - setProgress(playerPercent); - } - }); - }} - onDispose={() => { - playerRef.current = null; - }} - /> + ); } else if (isCurrentHour(review.start_time)) { return (