From 9f18629df3af5251dfe3be09695946665af332f1 Mon Sep 17 00:00:00 2001 From: Blake Blackshear Date: Sat, 11 Dec 2021 09:22:44 -0600 Subject: [PATCH] switch to retain config instead of retain_days --- frigate/config.py | 28 +++++++++++++++++++++++++++- frigate/record.py | 14 +++++++------- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/frigate/config.py b/frigate/config.py index 0de01a711..2e5f1d97b 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -65,8 +65,17 @@ class MqttConfig(FrigateBaseModel): return v +class RetainModeEnum(str, Enum): + all = "all" + motion = "motion" + active_objects = "active_objects" + + class RetainConfig(FrigateBaseModel): default: float = Field(default=10, title="Default retention period.") + mode: RetainModeEnum = Field( + default=RetainModeEnum.active_objects, title="Retain mode." + ) objects: Dict[str, float] = Field( default_factory=dict, title="Object retention period." ) @@ -88,9 +97,18 @@ class EventsConfig(FrigateBaseModel): ) +class RecordRetainConfig(FrigateBaseModel): + days: float = Field(default=0, title="Default retention period.") + mode: RetainModeEnum = Field(default=RetainModeEnum.all, title="Retain mode.") + + class RecordConfig(FrigateBaseModel): enabled: bool = Field(default=False, title="Enable record on all cameras.") - retain_days: float = Field(default=0, title="Recording retention period in days.") + # deprecated - to be removed in a future version + retain_days: Optional[float] = Field(title="Recording retention period in days.") + retain: RecordRetainConfig = Field( + default_factory=RecordRetainConfig, title="Record retention settings." + ) events: EventsConfig = Field( default_factory=EventsConfig, title="Event specific settings." ) @@ -810,6 +828,14 @@ class FrigateConfig(FrigateBaseModel): f"Camera {name} has rtmp enabled, but rtmp is not assigned to an input." ) + # backwards compatibility for retain_days + if not camera_config.record.retain_days is None: + logger.warning( + "The 'retain_days' config option has been DEPRECATED and will be removed in a future version. Please use the 'days' setting under 'retain'" + ) + if camera_config.record.retain.days == 0: + camera_config.record.retain.days = camera_config.record.retain_days + config.cameras[name] = camera_config return config diff --git a/frigate/record.py b/frigate/record.py index 41ed0cc7e..b5181dcf5 100644 --- a/frigate/record.py +++ b/frigate/record.py @@ -165,12 +165,12 @@ class RecordingMaintainer(threading.Thread): Path(cache_path).unlink(missing_ok=True) continue - # if cached file's start_time is earlier than the retain_days for the camera + # if cached file's start_time is earlier than the retain days for the camera if start_time <= ( ( datetime.datetime.now() - datetime.timedelta( - days=self.config.cameras[camera].record.retain_days + days=self.config.cameras[camera].record.retain.days ) ) ): @@ -203,7 +203,7 @@ class RecordingMaintainer(threading.Thread): duration, cache_path, ) - # else retain_days includes this segment + # else retain days includes this segment else: self.store_segment( camera, start_time, end_time, duration, cache_path @@ -314,7 +314,7 @@ class RecordingCleanup(threading.Thread): logger.debug("Start deleted cameras.") # Handle deleted cameras - expire_days = self.config.record.retain_days + expire_days = self.config.record.retain.days expire_before = ( datetime.datetime.now() - datetime.timedelta(days=expire_days) ).timestamp() @@ -340,7 +340,7 @@ class RecordingCleanup(threading.Thread): datetime.datetime.now() - datetime.timedelta(seconds=config.record.events.max_seconds) ).timestamp() - expire_days = config.record.retain_days + expire_days = config.record.retain.days expire_before = ( datetime.datetime.now() - datetime.timedelta(days=expire_days) ).timestamp() @@ -416,14 +416,14 @@ class RecordingCleanup(threading.Thread): default_expire = ( datetime.datetime.now().timestamp() - - SECONDS_IN_DAY * self.config.record.retain_days + - SECONDS_IN_DAY * self.config.record.retain.days ) delete_before = {} for name, camera in self.config.cameras.items(): delete_before[name] = ( datetime.datetime.now().timestamp() - - SECONDS_IN_DAY * camera.record.retain_days + - SECONDS_IN_DAY * camera.record.retain.days ) # find all the recordings older than the oldest recording in the db