From cab4336b7fb918bab4198e241a77c6bd55404c0c Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Thu, 14 Mar 2024 08:12:43 -0600 Subject: [PATCH] Cleanup scrubbing logic --- .../player/dynamic/DynamicVideoController.ts | 8 ++--- .../player/dynamic/DynamicVideoPlayer.tsx | 4 +++ web/src/views/events/RecordingView.tsx | 31 +++++-------------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/web/src/components/player/dynamic/DynamicVideoController.ts b/web/src/components/player/dynamic/DynamicVideoController.ts index c6e7da2d1..2b3956db7 100644 --- a/web/src/components/player/dynamic/DynamicVideoController.ts +++ b/web/src/components/player/dynamic/DynamicVideoController.ts @@ -47,10 +47,6 @@ export class DynamicVideoController { } seekToTimestamp(time: number, play: boolean = false) { - if (this.playerMode != "playback") { - this.playerMode = "playback"; - } - if ( this.recordings.length == 0 || time < this.recordings[0].start_time || @@ -60,6 +56,10 @@ export class DynamicVideoController { return; } + if (this.playerMode != "playback") { + this.playerMode = "playback"; + } + let seekSeconds = 0; (this.recordings || []).every((segment) => { // if the next segment is past the desired time, stop calculating diff --git a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx index 805aeddcc..da169a838 100644 --- a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx +++ b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx @@ -133,6 +133,10 @@ export default function DynamicVideoPlayer({ return; } + if (playerRef.current) { + playerRef.current.autoplay = !isScrubbing; + } + setSource( `${apiHost}vod/${camera}/start/${timeRange.start}/end/${timeRange.end}/master.m3u8`, ); diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index 6235d812d..3965d1b82 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -89,13 +89,16 @@ export function DesktopRecordingView({ const [playerTime, setPlayerTime] = useState(startTime); const updateSelectedSegment = useCallback( - (currentTime: number) => { + (currentTime: number, updateStartTime: boolean) => { const index = timeRange.ranges.findIndex( (seg) => seg.start <= currentTime && seg.end >= currentTime, ); if (index != -1) { - setPlaybackStart(currentTime); + if (updateStartTime) { + setPlaybackStart(currentTime); + } + setSelectedRangeIdx(index); } }, @@ -108,7 +111,7 @@ export function DesktopRecordingView({ currentTime > currentTimeRange.end + 60 || currentTime < currentTimeRange.start - 60 ) { - updateSelectedSegment(currentTime); + updateSelectedSegment(currentTime, false); return; } @@ -126,40 +129,22 @@ export function DesktopRecordingView({ updateSelectedSegment, ]); - useEffect(() => { - if (!scrubbing) { - if ( - currentTimeRange.start <= currentTime && - currentTimeRange.end >= currentTime - ) { - mainControllerRef.current?.seekToTimestamp(currentTime, true); - } else { - updateSelectedSegment(currentTime); - } - } - - // we only want to seek when user stops scrubbing - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [scrubbing]); - useEffect(() => { if (!scrubbing) { if (Math.abs(currentTime - playerTime) > 10) { - mainControllerRef.current?.pause(); - if ( currentTimeRange.start <= currentTime && currentTimeRange.end >= currentTime ) { mainControllerRef.current?.seekToTimestamp(currentTime, true); } else { - updateSelectedSegment(currentTime); + updateSelectedSegment(currentTime, true); } } } // we only want to seek when current time doesn't match the player update time // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currentTime]); + }, [currentTime, scrubbing]); const onSelectCamera = useCallback( (newCam: string) => {