From 6b0f425cb002370255bc4d35a2b02e452079ee2a Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Fri, 1 Aug 2025 12:49:33 -0600 Subject: [PATCH] Basic implementation for testing review processor --- .../post/review_descriptions.py | 25 +++++++++++++++++++ frigate/embeddings/maintainer.py | 5 +++- frigate/review/maintainer.py | 4 +++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 frigate/data_processing/post/review_descriptions.py diff --git a/frigate/data_processing/post/review_descriptions.py b/frigate/data_processing/post/review_descriptions.py new file mode 100644 index 000000000..923f96497 --- /dev/null +++ b/frigate/data_processing/post/review_descriptions.py @@ -0,0 +1,25 @@ +"""Post processor for review items to get descriptions.""" + +import logging +from typing import Any + +from frigate.data_processing.types import PostProcessDataEnum + +from ..post.api import PostProcessorApi + +logger = logging.getLogger(__name__) + + +class ReviewDescriptionProcessor(PostProcessorApi): + def __init__(self, config, metrics): + super().__init__(config, metrics, None) + self.tracked_review_items: dict[str, list[Any]] = {} + + def process_data(self, data, data_type): + if data_type != PostProcessDataEnum.review: + return + + logger.info(f"processor is looking at {data}") + + def handle_request(self, request_data): + pass diff --git a/frigate/embeddings/maintainer.py b/frigate/embeddings/maintainer.py index 7b1c29006..a803d3b9d 100644 --- a/frigate/embeddings/maintainer.py +++ b/frigate/embeddings/maintainer.py @@ -50,6 +50,7 @@ from frigate.data_processing.post.audio_transcription import ( from frigate.data_processing.post.license_plate import ( LicensePlatePostProcessor, ) +from frigate.data_processing.post.review_descriptions import ReviewDescriptionProcessor from frigate.data_processing.post.semantic_trigger import SemanticTriggerProcessor from frigate.data_processing.real_time.api import RealTimeProcessorApi from frigate.data_processing.real_time.bird import BirdRealTimeProcessor @@ -534,7 +535,9 @@ class EmbeddingMaintainer(threading.Thread): if review_updates == None: break - logger.info(f"revieved review update {review_updates}") + for processor in self.post_processors: + if isinstance(processor, ReviewDescriptionProcessor): + processor.process_data(review_updates, PostProcessDataEnum.review) def _process_event_metadata(self): # Check for regenerate description requests diff --git a/frigate/review/maintainer.py b/frigate/review/maintainer.py index b1452be34..6035f83a5 100644 --- a/frigate/review/maintainer.py +++ b/frigate/review/maintainer.py @@ -1,6 +1,7 @@ """Maintain review segments in db.""" import copy +import datetime import json import logging import os @@ -64,6 +65,7 @@ class PendingReviewSegment: self.zones = zones self.audio = audio self.last_update = frame_time + self.thumb_time: float | None = None # thumbnail self._frame = np.zeros((THUMB_HEIGHT * 3 // 2, THUMB_WIDTH), np.uint8) @@ -105,6 +107,7 @@ class PendingReviewSegment: ) if self._frame is not None: + self.thumb_time = datetime.datetime.now().timestamp() self.has_frame = True cv2.imwrite( self.frame_path, self._frame, [int(cv2.IMWRITE_WEBP_QUALITY), 60] @@ -138,6 +141,7 @@ class PendingReviewSegment: "sub_labels": list(self.sub_labels.values()), "zones": self.zones, "audio": list(self.audio), + "thumb_time": self.thumb_time, }, } )