diff --git a/frigate/events.py b/frigate/events.py index 86342e9b8..7f6821f48 100644 --- a/frigate/events.py +++ b/frigate/events.py @@ -148,7 +148,8 @@ class EventProcessor(threading.Thread): p = sp.run(ffmpeg_cmd, input="\n".join(playlist_lines), encoding='ascii', capture_output=True) if p.returncode != 0: logger.error(p.stderr) - return + return False + return True def run(self): while True: @@ -166,27 +167,17 @@ class EventProcessor(threading.Thread): logger.debug(f"Event received: {event_type} {camera} {event_data['id']}") self.refresh_cache() - clips_config = self.config.cameras[camera].clips - - # if save clips is not enabled for this camera, just continue - if not clips_config.enabled: - logger.debug(f"Clips not enabled for {camera}. Not making a clip.") - if event_type == 'end': - self.event_processed_queue.put((event_data['id'], camera)) - continue - - # if specific objects are listed for this camera, only save clips for them - if not event_data['label'] in clips_config.objects: - if event_type == 'end': - self.event_processed_queue.put((event_data['id'], camera)) - continue - if event_type == 'start': self.events_in_process[event_data['id']] = event_data if event_type == 'end': - if len(self.cached_clips) > 0 and not event_data['false_positive']: - self.create_clip(camera, event_data, clips_config.pre_capture, clips_config.post_capture) + clips_config = self.config.cameras[camera].clips + + if not event_data['false_positive']: + clip_created = False + if clips_config.enabled and event_data['label'] in clips_config.objects: + clip_created = self.create_clip(camera, event_data, clips_config.pre_capture, clips_config.post_capture) + Event.create( id=event_data['id'], label=event_data['label'], @@ -196,7 +187,9 @@ class EventProcessor(threading.Thread): top_score=event_data['top_score'], false_positive=event_data['false_positive'], zones=list(event_data['entered_zones']), - thumbnail=event_data['thumbnail'] + thumbnail=event_data['thumbnail'], + has_clip=clip_created, + has_snapshot=event_data['has_snapshot'], ) del self.events_in_process[event_data['id']] self.event_processed_queue.put((event_data['id'], camera)) diff --git a/frigate/http.py b/frigate/http.py index 94466920a..d4db5aa26 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -114,6 +114,8 @@ def events(): zone = request.args.get('zone') after = request.args.get('after', type=int) before = request.args.get('before', type=int) + has_clip = request.args.get('has_clip', type=int) + has_snapshot = request.args.get('has_snapshot', type=int) clauses = [] @@ -132,6 +134,12 @@ def events(): if before: clauses.append((Event.start_time <= before)) + if not has_clip is None: + clauses.append((Event.has_clip == has_clip)) + + if not has_snapshot is None: + clauses.append((Event.has_snapshot == has_snapshot)) + if len(clauses) == 0: clauses.append((1 == 1)) diff --git a/frigate/object_processing.py b/frigate/object_processing.py index b27c573b0..fba02ebf9 100644 --- a/frigate/object_processing.py +++ b/frigate/object_processing.py @@ -432,6 +432,8 @@ class TrackedObjectProcessor(threading.Thread): def end(camera, obj: TrackedObject, current_frame_time): snapshot_config = self.config.cameras[camera].snapshots + event_data = obj.to_dict(include_thumbnail=True) + event_data['has_snapshot'] = False if not obj.false_positive: message = { 'before': obj.previous, 'after': obj.to_dict() } self.client.publish(f"{self.topic_prefix}/events", json.dumps(message), retain=False) @@ -445,8 +447,9 @@ class TrackedObjectProcessor(threading.Thread): ) with open(os.path.join(CLIPS_DIR, f"{camera}-{obj.obj_data['id']}.jpg"), 'wb') as j: j.write(jpg_bytes) - self.event_queue.put(('end', camera, obj.to_dict(include_thumbnail=True))) - + event_data['has_snapshot'] = True + self.event_queue.put(('end', camera, event_data)) + def snapshot(camera, obj: TrackedObject, current_frame_time): mqtt_config = self.config.cameras[camera].mqtt if mqtt_config.enabled: