diff --git a/web/src/components/player/dynamic/DynamicVideoController.ts b/web/src/components/player/dynamic/DynamicVideoController.ts index 7258ddebe..e8772c49e 100644 --- a/web/src/components/player/dynamic/DynamicVideoController.ts +++ b/web/src/components/player/dynamic/DynamicVideoController.ts @@ -1,7 +1,7 @@ import { Recording } from "@/types/record"; import { DynamicPlayback } from "@/types/playback"; import { PreviewController } from "../PreviewPlayer"; -import { Timeline } from "@/types/timeline"; +import { TimeRange, Timeline } from "@/types/timeline"; type PlayerMode = "playback" | "scrubbing"; @@ -10,11 +10,13 @@ export class DynamicVideoController { public camera = ""; private playerController: HTMLVideoElement; private previewController: PreviewController; + private setNoRecording: (noRecs: boolean) => void; private setFocusedItem: (timeline: Timeline) => void; private playerMode: PlayerMode = "playback"; // playback private recordings: Recording[] = []; + private timeRange: TimeRange = { after: 0, before: 0 }; private annotationOffset: number; private timeToStart: number | undefined = undefined; @@ -24,6 +26,7 @@ export class DynamicVideoController { previewController: PreviewController, annotationOffset: number, defaultMode: PlayerMode, + setNoRecording: (noRecs: boolean) => void, setFocusedItem: (timeline: Timeline) => void, ) { this.camera = camera; @@ -31,11 +34,13 @@ export class DynamicVideoController { this.previewController = previewController; this.annotationOffset = annotationOffset; this.playerMode = defaultMode; + this.setNoRecording = setNoRecording; this.setFocusedItem = setFocusedItem; } newPlayback(newPlayback: DynamicPlayback) { this.recordings = newPlayback.recordings; + this.timeRange = newPlayback.timeRange; if (this.timeToStart) { this.seekToTimestamp(this.timeToStart); @@ -52,12 +57,17 @@ export class DynamicVideoController { } seekToTimestamp(time: number, play: boolean = false) { + if (time < this.timeRange.after || time > this.timeRange.before) { + this.timeToStart = time; + return; + } + if ( this.recordings.length == 0 || time < this.recordings[0].start_time || time > this.recordings[this.recordings.length - 1].end_time ) { - this.timeToStart = time; + this.setNoRecording(true); return; } @@ -90,6 +100,8 @@ export class DynamicVideoController { } else { this.playerController.pause(); } + } else { + console.log(`seek time is 0`); } } diff --git a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx index f923fbd43..70d387258 100644 --- a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx +++ b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx @@ -45,6 +45,7 @@ export default function DynamicVideoPlayer({ const playerRef = useRef(null); const [previewController, setPreviewController] = useState(null); + const [noRecording, setNoRecording] = useState(false); const controller = useMemo(() => { if (!config || !playerRef.current || !previewController) { return undefined; @@ -56,6 +57,7 @@ export default function DynamicVideoPlayer({ previewController, (config.cameras[camera]?.detect?.annotation_offset || 0) / 1000, isScrubbing ? "scrubbing" : "playback", + setNoRecording, () => {}, ); // we only want to fire once when players are ready @@ -92,9 +94,11 @@ export default function DynamicVideoPlayer({ return () => { if (loadingTimeout) { - clearTimeout(loadingTimeout) + clearTimeout(loadingTimeout); } - } + }; + // we only want trigger when scrubbing state changes + // eslint-disable-next-line react-hooks/exhaustive-deps }, [camera, isScrubbing]); const onPlayerLoaded = useCallback(() => { @@ -149,6 +153,7 @@ export default function DynamicVideoPlayer({ controller.newPlayback({ recordings: recordings ?? [], + timeRange, }); // we only want this to change when recordings update @@ -175,6 +180,7 @@ export default function DynamicVideoPlayer({ } setIsLoading(false); + setNoRecording(false); }} /> - {isLoading && ( + {isLoading && !noRecording && ( )} + {noRecording && ( +
+ No recordings found for this time +
+ )} ); } diff --git a/web/src/types/playback.ts b/web/src/types/playback.ts index 6c4202304..ae45d43d7 100644 --- a/web/src/types/playback.ts +++ b/web/src/types/playback.ts @@ -4,6 +4,7 @@ import { TimeRange } from "./timeline"; export type DynamicPlayback = { recordings: Recording[]; + timeRange: TimeRange; }; export type PreviewPlayback = {