diff --git a/frigate/review/maintainer.py b/frigate/review/maintainer.py index 4f419b36b..2d95c082e 100644 --- a/frigate/review/maintainer.py +++ b/frigate/review/maintainer.py @@ -441,11 +441,14 @@ class ReviewSegmentMaintainer(threading.Thread): if camera not in self.indefinite_events: self.indefinite_events[camera] = {} - if not self.config.cameras[camera].record.enabled: - continue - current_segment = self.active_review_segments.get(camera) + if not self.config.cameras[camera].record.enabled: + if current_segment: + self.update_existing_segment(current_segment, frame_time, []) + + continue + if current_segment is not None: if topic == DetectionTypeEnum.video: self.update_existing_segment( diff --git a/web/src/components/player/PreviewPlayer.tsx b/web/src/components/player/PreviewPlayer.tsx index b6f98a540..364fd8898 100644 --- a/web/src/components/player/PreviewPlayer.tsx +++ b/web/src/components/player/PreviewPlayer.tsx @@ -40,6 +40,33 @@ export default function PreviewPlayer({ }: PreviewPlayerProps) { const [currentHourFrame, setCurrentHourFrame] = useState(); + const currentPreview = useMemo(() => { + return cameraPreviews.find( + (preview) => + preview.camera == camera && + Math.round(preview.start) >= timeRange.after && + Math.floor(preview.end) <= timeRange.before, + ); + }, [cameraPreviews, camera, timeRange]); + + if (currentPreview) { + return ( + + ); + } + if (isCurrentHour(timeRange.before)) { return ( - ); +
+ No Preview Found +
+ ) } export abstract class PreviewController { @@ -89,6 +107,7 @@ type PreviewVideoPlayerProps = { camera: string; timeRange: TimeRange; cameraPreviews: Preview[]; + initialPreview?: Preview; startTime?: number; isScrubbing: boolean; currentHourFrame?: string; @@ -101,6 +120,7 @@ function PreviewVideoPlayer({ camera, timeRange, cameraPreviews, + initialPreview, startTime, isScrubbing, currentHourFrame, @@ -147,18 +167,6 @@ function PreviewVideoPlayer({ const [firstLoad, setFirstLoad] = useState(true); - const initialPreview = useMemo(() => { - return cameraPreviews.find( - (preview) => - preview.camera == camera && - Math.round(preview.start) >= timeRange.after && - Math.floor(preview.end) <= timeRange.before, - ); - - // we only want to calculate this once - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const [currentPreview, setCurrentPreview] = useState(initialPreview); const onPreviewSeeked = useCallback(() => { diff --git a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx index e67468e6c..b068b25bd 100644 --- a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx +++ b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx @@ -222,7 +222,7 @@ export default function DynamicVideoPlayer({ setPreviewController(previewController); }} /> - {isLoading && !noRecording && ( + {!isScrubbing && isLoading && !noRecording && ( )} {!isScrubbing && noRecording && ( diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index ce9a7eebc..2f3efa715 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -544,7 +544,7 @@ export function RecordingView({ className={cn( "flex gap-2 overflow-auto", mainCameraAspect == "tall" - ? "h-full w-48 flex-col" + ? "h-full w-72 flex-col" : `h-28 w-full`, previewRowOverflows ? "" : "items-center justify-center", )} @@ -559,7 +559,7 @@ export function RecordingView({