add clip retention to config

This commit is contained in:
Blake Blackshear 2020-11-23 08:25:46 -06:00
parent 4ed1217366
commit 5155875a72
2 changed files with 71 additions and 8 deletions

View File

@ -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( SAVE_CLIPS_SCHEMA = vol.Schema(
{ {
vol.Optional('max_seconds', default=300): int, vol.Optional('max_seconds', default=300): int,
vol.Optional('clips_dir', default='/media/frigate/clips'): str, 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('enabled', default=False): bool,
vol.Optional('pre_capture', default=30): int, vol.Optional('pre_capture', default=30): int,
'objects': [str], 'objects': [str],
vol.Optional('retain', default={}): SAVE_CLIPS_RETAIN_SCHEMA
}, },
vol.Optional('snapshots', default=DEFAULT_CAMERA_SNAPSHOTS): { vol.Optional('snapshots', default=DEFAULT_CAMERA_SNAPSHOTS): {
vol.Optional('show_timestamp', default=True): bool, vol.Optional('show_timestamp', default=True): bool,
@ -216,6 +227,25 @@ class MqttConfig():
'user': self.user '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(): class SaveClipsConfig():
def __init__(self, config): def __init__(self, config):
self._max_seconds = config['max_seconds'] self._max_seconds = config['max_seconds']
@ -360,10 +390,11 @@ class CameraSnapshotsConfig():
} }
class CameraSaveClipsConfig(): class CameraSaveClipsConfig():
def __init__(self, config): def __init__(self, global_config, config):
self._enabled = config['enabled'] self._enabled = config['enabled']
self._pre_capture = config['pre_capture'] self._pre_capture = config['pre_capture']
self._objects = config.get('objects') self._objects = config.get('objects')
self._retain = SaveClipsRetainConfig(global_config['retain'], config['retain'])
@property @property
def enabled(self): def enabled(self):
@ -377,11 +408,16 @@ class CameraSaveClipsConfig():
def objects(self): def objects(self):
return self._objects return self._objects
@property
def retain(self):
return self._retain
def to_dict(self): def to_dict(self):
return { return {
'enabled': self.enabled, 'enabled': self.enabled,
'pre_capture': self.pre_capture, 'pre_capture': self.pre_capture,
'objects': self.objects 'objects': self.objects,
'retain': self.retain.to_dict()
} }
class ZoneConfig(): class ZoneConfig():
@ -430,9 +466,9 @@ class ZoneConfig():
} }
class CameraConfig(): 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._name = name
self._ffmpeg = FfmpegConfig(global_ffmpeg, config['ffmpeg']) self._ffmpeg = FfmpegConfig(global_config['ffmpeg'], config['ffmpeg'])
self._height = config.get('height') self._height = config.get('height')
self._width = config.get('width') self._width = config.get('width')
self._frame_shape = (self._height, self._width) self._frame_shape = (self._height, self._width)
@ -441,9 +477,9 @@ class CameraConfig():
self._mask = self._create_mask(config.get('mask')) self._mask = self._create_mask(config.get('mask'))
self._best_image_timeout = config['best_image_timeout'] self._best_image_timeout = config['best_image_timeout']
self._zones = { name: ZoneConfig(name, z) for name, z in config['zones'].items() } 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._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) 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._detectors = { name: DetectorConfig(d) for name, d in config['detectors'].items() }
self._mqtt = MqttConfig(config['mqtt']) self._mqtt = MqttConfig(config['mqtt'])
self._save_clips = SaveClipsConfig(config['save_clips']) 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() self._ensure_dirs()

View File

@ -176,6 +176,33 @@ class TestConfig(TestCase):
} }
frigate_config = FrigateConfig(config=config) frigate_config = FrigateConfig(config=config)
assert('-re' in frigate_config.cameras['back'].ffmpeg_cmd) 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__': if __name__ == '__main__':
main(verbosity=2) main(verbosity=2)