diff --git a/frigate/events.py b/frigate/events.py index b90204361..68900495c 100644 --- a/frigate/events.py +++ b/frigate/events.py @@ -14,6 +14,11 @@ from frigate.models import Event logger = logging.getLogger(__name__) +def should_insert_db(prev_event, current_event): + return ( + (not prev_event["has_clip"] and not prev_event["has_snapshot"]) + and (current_event["has_clip"] or current_event["has_snapshot"]) + ) def should_update_db(prev_event, current_event): return ( @@ -58,7 +63,7 @@ class EventProcessor(threading.Thread): if event_type == "start": self.events_in_process[event_data["id"]] = event_data - elif event_type == "update" and should_update_db( + elif event_type == "update" and should_insert_db( self.events_in_process[event_data["id"]], event_data ): self.events_in_process[event_data["id"]] = event_data @@ -81,10 +86,31 @@ class EventProcessor(threading.Thread): has_snapshot=event_data["has_snapshot"], ).execute() + elif event_type == "update" and should_update_db( + self.events_in_process[event_data["id"]], event_data + ): + self.events_in_process[event_data["id"]] = event_data + # TODO: this will generate a lot of db activity possibly + if event_data["has_clip"] or event_data["has_snapshot"]: + Event.update( + label=event_data["label"], + camera=camera, + start_time=event_data["start_time"] - event_config.pre_capture, + end_time=None, + top_score=event_data["top_score"], + false_positive=event_data["false_positive"], + zones=list(event_data["entered_zones"]), + thumbnail=event_data["thumbnail"], + region=event_data["region"], + box=event_data["box"], + area=event_data["area"], + has_clip=event_data["has_clip"], + has_snapshot=event_data["has_snapshot"], + ).where(Event.id == event_data["id"]).execute() + elif event_type == "end": if event_data["has_clip"] or event_data["has_snapshot"]: - Event.replace( - id=event_data["id"], + Event.update( label=event_data["label"], camera=camera, start_time=event_data["start_time"] - event_config.pre_capture, @@ -98,7 +124,7 @@ class EventProcessor(threading.Thread): area=event_data["area"], has_clip=event_data["has_clip"], has_snapshot=event_data["has_snapshot"], - ).execute() + ).where(Event.id == event_data["id"]).execute() del self.events_in_process[event_data["id"]] self.event_processed_queue.put((event_data["id"], camera))