From 4d35b92e8ae96076bf8ec93bb8d38c32ba18cf96 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Mon, 1 May 2023 08:17:10 -0600 Subject: [PATCH] Handle external events in the event queue --- frigate/events/external.py | 4 +++- frigate/events/maintainer.py | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/frigate/events/external.py b/frigate/events/external.py index 6d22eed5c..da78f9378 100644 --- a/frigate/events/external.py +++ b/frigate/events/external.py @@ -60,4 +60,6 @@ class ExternalEventProcessor: def finish_manual_event(self, event_id: str): """Finish external event with indeterminate duration.""" now = datetime.datetime.now().timestamp() - self.queue.put((EventTypeEnum.api, "end", None, {"end_time": now})) + self.queue.put( + (EventTypeEnum.api, "end", None, {"id": event_id, "end_time": now}) + ) diff --git a/frigate/events/maintainer.py b/frigate/events/maintainer.py index 22c27c132..73e456255 100644 --- a/frigate/events/maintainer.py +++ b/frigate/events/maintainer.py @@ -1,11 +1,9 @@ import datetime import logging -import os import queue import threading from enum import Enum -from pathlib import Path from peewee import fn @@ -96,6 +94,8 @@ class EventProcessor(threading.Thread): continue self.handle_object_detection(event_type, camera, event_data) + elif source_type == EventTypeEnum.api: + self.handle_external_detection(event_type, event_data) # set an end_time on events without an end_time before exiting Event.update(end_time=datetime.datetime.now().timestamp()).where( @@ -195,3 +195,31 @@ class EventProcessor(threading.Thread): if event_type == "end": del self.events_in_process[event_data["id"]] self.event_processed_queue.put((event_data["id"], camera)) + + def handle_external_detection(self, type: str, event_data: Event): + if type == "new": + event = { + Event.id: event_data["id"], + Event.label: event_data["label"], + Event.sub_label: event_data["sub_label"], + Event.camera: event_data["camera"], + Event.start_time: event_data["start_time"], + Event.end_time: event_data["end_time"], + Event.thumbnail: event_data["thumbnail"], + Event.has_clip: event_data["has_clip"], + Event.has_snapshot: event_data["has_snapshot"], + } + elif type == "end": + event = { + Event.id: event_data["id"], + Event.end_time: event_data["end_time"], + } + + ( + Event.insert(event) + .on_conflict( + conflict_target=[Event.id], + update=event, + ) + .execute() + )