From 482ebf37bd494f7dfc7b83f39af3f2b3ed5362d7 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Fri, 2 Feb 2024 11:22:30 -0700 Subject: [PATCH] Start playing next hour when current hour ends --- .../components/player/DynamicVideoPlayer.tsx | 12 ++++++ web/src/views/history/DesktopTimelineView.tsx | 39 +++++++++++++++---- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/web/src/components/player/DynamicVideoPlayer.tsx b/web/src/components/player/DynamicVideoPlayer.tsx index c2a9503fc..306f10392 100644 --- a/web/src/components/player/DynamicVideoPlayer.tsx +++ b/web/src/components/player/DynamicVideoPlayer.tsx @@ -228,6 +228,7 @@ export default function DynamicVideoPlayer({ player.on("timeupdate", () => { controller.updateProgress(player.currentTime() || 0); }); + player.on("ended", () => controller.fireClipEndEvent()); if (onControllerReady) { onControllerReady(controller); @@ -284,6 +285,7 @@ export class DynamicVideoController { // playback private recordings: Recording[] = []; private onPlaybackTimestamp: ((time: number) => void) | undefined = undefined; + private onClipEnded: (() => void) | undefined = undefined; private annotationOffset: number; private timeToStart: number | undefined = undefined; @@ -393,6 +395,16 @@ export class DynamicVideoController { this.onPlaybackTimestamp = listener; } + onClipEndedEvent(listener: () => void) { + this.onClipEnded = listener; + } + + fireClipEndEvent() { + if (this.onClipEnded) { + this.onClipEnded(); + } + } + scrubToTimestamp(time: number) { if (this.playerMode != "scrubbing") { this.playerMode = "scrubbing"; diff --git a/web/src/views/history/DesktopTimelineView.tsx b/web/src/views/history/DesktopTimelineView.tsx index 994b89a59..fdac8d921 100644 --- a/web/src/views/history/DesktopTimelineView.tsx +++ b/web/src/views/history/DesktopTimelineView.tsx @@ -34,9 +34,6 @@ export default function DesktopTimelineView({ const controllerRef = useRef(undefined); const initialScrollRef = useRef(null); - const [selectedPlayback, setSelectedPlayback] = useState(initialPlayback); - const [timelineTime, setTimelineTime] = useState(0); - // handle scrolling to initial timeline item useEffect(() => { if (initialScrollRef.current != null) { @@ -50,17 +47,45 @@ export default function DesktopTimelineView({ }); }, []); + const [timelineTime, setTimelineTime] = useState(0); const timelineStack = useMemo( () => getTimelineHoursForDay( - selectedPlayback.camera, + initialPlayback.camera, timelineData, cameraPreviews, - selectedPlayback.range.start + 60 + initialPlayback.range.start + 60 ), [] ); + const [selectedPlaybackIdx, setSelectedPlaybackIdx] = useState( + timelineStack.playbackItems.findIndex((playback) => { + return ( + playback.range.start == initialPlayback.range.start && + playback.range.end == initialPlayback.range.end + ); + }) + ); + const selectedPlayback = useMemo( + () => timelineStack.playbackItems[selectedPlaybackIdx], + [selectedPlaybackIdx] + ); + + // handle moving to next clip + useEffect(() => { + if (!controllerRef.current) { + return; + } + + if (selectedPlaybackIdx > 0) { + controllerRef.current.onClipEndedEvent(() => { + console.log("setting to " + (selectedPlaybackIdx - 1)); + setSelectedPlaybackIdx(selectedPlaybackIdx - 1); + }); + } + }, [controllerRef, selectedPlaybackIdx]); + const { data: activity } = useSWR( [ `${initialPlayback.camera}/recording/hourly/activity`, @@ -148,7 +173,7 @@ export default function DesktopTimelineView({
- {timelineStack.playbackItems.map((timeline) => { + {timelineStack.playbackItems.map((timeline, tIdx) => { const isInitiallySelected = initialPlayback.range.start == timeline.range.start; const isSelected = @@ -224,7 +249,7 @@ export default function DesktopTimelineView({ startTime={timeline.range.start} graphData={graphData} onClick={() => { - setSelectedPlayback(timeline); + setSelectedPlaybackIdx(tIdx); let startTs; if (timeline.timelineItems.length > 0) {