From 7ffb48b8836ce8eb41cdba65dc12e04f797111d9 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Wed, 22 Jul 2026 06:52:19 -0500 Subject: [PATCH] recreate review thumbnail directory before writing and log write failures cleanup's remove_empty_directories() can rmdir an empty clips/review, after which thumbnail writes silently fail. Ensure the directory exists before both cv2.imwrite calls and check their return value --- frigate/review/maintainer.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frigate/review/maintainer.py b/frigate/review/maintainer.py index f3abc1bba3..fe7f873638 100644 --- a/frigate/review/maintainer.py +++ b/frigate/review/maintainer.py @@ -115,9 +115,11 @@ class PendingReviewSegment: if self._frame is not None: self.thumb_time = datetime.datetime.now().timestamp() self.has_frame = True - cv2.imwrite( + Path(self.frame_path).parent.mkdir(parents=True, exist_ok=True) + if not cv2.imwrite( self.frame_path, self._frame, [int(cv2.IMWRITE_WEBP_QUALITY), 60] - ) + ): + logger.error("Failed to write review thumbnail to %s", self.frame_path) def save_full_frame(self, camera_config: CameraConfig, frame: np.ndarray) -> None: color_frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) @@ -128,9 +130,11 @@ class PendingReviewSegment: if self._frame is not None: self.has_frame = True - cv2.imwrite( + Path(self.frame_path).parent.mkdir(parents=True, exist_ok=True) + if not cv2.imwrite( self.frame_path, self._frame, [int(cv2.IMWRITE_WEBP_QUALITY), 60] - ) + ): + logger.error("Failed to write review thumbnail to %s", self.frame_path) def get_data(self, ended: bool) -> dict: end_time = None