Przeglądaj źródła

add clip retention to config

Blake Blackshear 4 lat temu
rodzic
commit
5155875a72
2 zmienionych plików z 71 dodań i 8 usunięć
  1. 44 8
      frigate/config.py
  2. 27 0
      frigate/test/test_config.py

+ 44 - 8
frigate/config.py

@@ -36,11 +36,21 @@ MQTT_SCHEMA = vol.Schema(
     }
 )
 
+SAVE_CLIPS_RETAIN_SCHEMA = vol.Schema(
+    {
+        vol.Required('default',default=10): int,
+        'objects': {
+            str: int
+        }
+    }
+)
+
 SAVE_CLIPS_SCHEMA = vol.Schema(
     {
         vol.Optional('max_seconds', default=300): int,
         vol.Optional('clips_dir', default='/media/frigate/clips'): str,
-        vol.Optional('cache_dir', default='/tmp/cache'): str
+        vol.Optional('cache_dir', default='/tmp/cache'): str,
+        vol.Optional('retain', default={}): SAVE_CLIPS_RETAIN_SCHEMA
     }
 )
 
@@ -130,6 +140,7 @@ CAMERAS_SCHEMA = vol.Schema(
                 vol.Optional('enabled', default=False): bool,
                 vol.Optional('pre_capture', default=30): int,
                 'objects': [str],
+                vol.Optional('retain', default={}): SAVE_CLIPS_RETAIN_SCHEMA
              },
              vol.Optional('snapshots', default=DEFAULT_CAMERA_SNAPSHOTS): {
                 vol.Optional('show_timestamp', default=True): bool,
@@ -216,6 +227,25 @@ class MqttConfig():
             'user': self.user
         }
 
+class SaveClipsRetainConfig():
+    def __init__(self, global_config, config):
+        self._default = config.get('default', global_config.get('default'))
+        self._objects = config.get('objects', global_config.get('objects'))
+    
+    @property
+    def default(self):
+        return self._default
+    
+    @property
+    def objects(self):
+        return self._objects
+    
+    def to_dict(self):
+        return {
+            'default': self.default,
+            'objects': self.objects
+        }
+
 class SaveClipsConfig():
     def __init__(self, config):
         self._max_seconds = config['max_seconds']
@@ -360,10 +390,11 @@ class CameraSnapshotsConfig():
         }
 
 class CameraSaveClipsConfig():
-    def __init__(self, config):
+    def __init__(self, global_config, config):
         self._enabled = config['enabled']
         self._pre_capture = config['pre_capture']
         self._objects = config.get('objects')
+        self._retain = SaveClipsRetainConfig(global_config['retain'], config['retain'])
     
     @property
     def enabled(self):
@@ -377,11 +408,16 @@ class CameraSaveClipsConfig():
     def objects(self):
         return self._objects
     
+    @property
+    def retain(self):
+        return self._retain
+    
     def to_dict(self):
         return {
             'enabled': self.enabled,
             'pre_capture': self.pre_capture,
-            'objects': self.objects
+            'objects': self.objects,
+            'retain': self.retain.to_dict()
         }
 
 class ZoneConfig():
@@ -430,9 +466,9 @@ class ZoneConfig():
         }
 
 class CameraConfig():
-    def __init__(self, name, config, cache_dir, global_ffmpeg, global_objects):
+    def __init__(self, name, config, cache_dir, global_config):
         self._name = name
-        self._ffmpeg = FfmpegConfig(global_ffmpeg, config['ffmpeg'])
+        self._ffmpeg = FfmpegConfig(global_config['ffmpeg'], config['ffmpeg'])
         self._height = config.get('height')
         self._width = config.get('width')
         self._frame_shape = (self._height, self._width)
@@ -441,9 +477,9 @@ class CameraConfig():
         self._mask = self._create_mask(config.get('mask'))
         self._best_image_timeout = config['best_image_timeout']
         self._zones = { name: ZoneConfig(name, z) for name, z in config['zones'].items() }
-        self._save_clips = CameraSaveClipsConfig(config['save_clips'])
+        self._save_clips = CameraSaveClipsConfig(global_config['save_clips'], config['save_clips'])
         self._snapshots = CameraSnapshotsConfig(config['snapshots'])
-        self._objects = ObjectConfig(global_objects, config.get('objects', {}))
+        self._objects = ObjectConfig(global_config['objects'], config.get('objects', {}))
 
         self._ffmpeg_cmd = self._get_ffmpeg_cmd(cache_dir)
 
@@ -598,7 +634,7 @@ class FrigateConfig():
         self._detectors = { name: DetectorConfig(d) for name, d in config['detectors'].items() }
         self._mqtt = MqttConfig(config['mqtt'])
         self._save_clips = SaveClipsConfig(config['save_clips'])
-        self._cameras = { name: CameraConfig(name, c, self._save_clips.cache_dir, config['ffmpeg'], config['objects']) for name, c in config['cameras'].items() }
+        self._cameras = { name: CameraConfig(name, c, self._save_clips.cache_dir, config) for name, c in config['cameras'].items() }
 
         self._ensure_dirs()
 

+ 27 - 0
frigate/test/test_config.py

@@ -176,6 +176,33 @@ class TestConfig(TestCase):
         }
         frigate_config = FrigateConfig(config=config)
         assert('-re' in frigate_config.cameras['back'].ffmpeg_cmd)
+    
+    def test_inherit_save_clips_retention(self):
+        config = {
+            'mqtt': {
+                'host': 'mqtt'
+            },
+            'save_clips': {
+                'retain': {
+                    'default': 20,
+                    'objects': {
+                        'person': 30
+                    }
+                }
+            },
+            'cameras': {
+                'back': {
+                    'ffmpeg': {
+                        'input': 'rtsp://10.0.0.1:554/video'
+                    },
+                    'height': 1080,
+                    'width': 1920
+                }
+            }
+        }
+        frigate_config = FrigateConfig(config=config)
+        print(json.dumps(frigate_config.to_dict(), indent=2))
+        assert(frigate_config.cameras['back'].save_clips.retain.objects['person'] == 30)
 
 if __name__ == '__main__':
     main(verbosity=2)