Browse Source

store has_clip and has_snapshot on events

Blake Blackshear 4 years ago
parent
commit
89e3c2e4b1
3 changed files with 25 additions and 21 deletions
  1. 12 19
      frigate/events.py
  2. 8 0
      frigate/http.py
  3. 5 2
      frigate/object_processing.py

+ 12 - 19
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))

+ 8 - 0
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))
 

+ 5 - 2
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: