mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-03-10 10:33:11 +03:00
Add RetainPolicyEnum and retain_policy config field for NVR-style storage
Introduce a new RetainPolicyEnum with 'time' (default, existing behavior) and 'continuous_rollover' (fill disk, overwrite oldest) options. Add the retain_policy field to RecordConfig and include unit tests for config validation.
This commit is contained in:
parent
4232cc483d
commit
aed3793ce1
@ -17,6 +17,7 @@ __all__ = [
|
||||
"ReviewRetainConfig",
|
||||
"RecordRetainConfig",
|
||||
"RetainModeEnum",
|
||||
"RetainPolicyEnum",
|
||||
]
|
||||
|
||||
|
||||
@ -35,6 +36,11 @@ class RetainModeEnum(str, Enum):
|
||||
active_objects = "active_objects"
|
||||
|
||||
|
||||
class RetainPolicyEnum(str, Enum):
|
||||
time = "time"
|
||||
continuous_rollover = "continuous_rollover"
|
||||
|
||||
|
||||
class ReviewRetainConfig(FrigateBaseModel):
|
||||
days: float = Field(
|
||||
default=10,
|
||||
@ -100,6 +106,11 @@ class RecordConfig(FrigateBaseModel):
|
||||
title="Enable recording",
|
||||
description="Enable or disable recording for all cameras; can be overridden per-camera.",
|
||||
)
|
||||
retain_policy: RetainPolicyEnum = Field(
|
||||
default=RetainPolicyEnum.time,
|
||||
title="Retention policy",
|
||||
description="Storage retention policy. 'time' expires recordings after configured days. 'continuous_rollover' fills available disk space and overwrites oldest recordings when space is needed.",
|
||||
)
|
||||
expire_interval: int = Field(
|
||||
default=60,
|
||||
title="Record cleanup interval",
|
||||
|
||||
49
frigate/test/test_config_retain_policy.py
Normal file
49
frigate/test/test_config_retain_policy.py
Normal file
@ -0,0 +1,49 @@
|
||||
import unittest
|
||||
|
||||
from frigate.config import FrigateConfig
|
||||
|
||||
|
||||
class TestRetainPolicyConfig(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.base_config = {
|
||||
"mqtt": {"host": "mqtt"},
|
||||
"cameras": {
|
||||
"front_door": {
|
||||
"ffmpeg": {
|
||||
"inputs": [
|
||||
{"path": "rtsp://10.0.0.1:554/video", "roles": ["detect"]}
|
||||
]
|
||||
},
|
||||
"detect": {"height": 1080, "width": 1920, "fps": 5},
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
def test_default_retain_policy_is_time(self):
|
||||
config = FrigateConfig(**self.base_config)
|
||||
assert config.record.retain_policy.value == "time"
|
||||
|
||||
def test_continuous_rollover_policy(self):
|
||||
self.base_config["record"] = {
|
||||
"enabled": True,
|
||||
"retain_policy": "continuous_rollover",
|
||||
}
|
||||
config = FrigateConfig(**self.base_config)
|
||||
assert config.record.retain_policy.value == "continuous_rollover"
|
||||
|
||||
def test_continuous_rollover_ignores_continuous_days(self):
|
||||
self.base_config["record"] = {
|
||||
"enabled": True,
|
||||
"retain_policy": "continuous_rollover",
|
||||
"continuous": {"days": 30},
|
||||
}
|
||||
config = FrigateConfig(**self.base_config)
|
||||
assert config.record.retain_policy.value == "continuous_rollover"
|
||||
assert config.record.continuous.days == 30
|
||||
|
||||
def test_invalid_retain_policy_rejected(self):
|
||||
self.base_config["record"] = {
|
||||
"retain_policy": "invalid_value",
|
||||
}
|
||||
with self.assertRaises(Exception):
|
||||
FrigateConfig(**self.base_config)
|
||||
Loading…
Reference in New Issue
Block a user