Tiered recordings (#18492)

* Implement tiered recording

* Add migration for record config

* Update docs

* Update reference docs

* Fix preview query

* Fix incorrect accesses

* Fix

* Fix

* Fix

* Fix
This commit is contained in:
Nicolas Mowen
2025-08-16 10:20:33 -05:00
committed by Blake Blackshear
parent 0b9997015a
commit 3f8ec72336
7 changed files with 143 additions and 110 deletions
+59 -1
View File
@@ -13,7 +13,7 @@ from frigate.util.services import get_video_properties
logger = logging.getLogger(__name__)
CURRENT_CONFIG_VERSION = "0.16-0"
CURRENT_CONFIG_VERSION = "0.17-0"
DEFAULT_CONFIG_FILE = os.path.join(CONFIG_DIR, "config.yml")
@@ -91,6 +91,13 @@ def migrate_frigate_config(config_file: str):
yaml.dump(new_config, f)
previous_version = "0.16-0"
if previous_version < "0.17-0":
logger.info(f"Migrating frigate config from {previous_version} to 0.17-0...")
new_config = migrate_017_0(config)
with open(config_file, "w") as f:
yaml.dump(new_config, f)
previous_version = "0.17-0"
logger.info("Finished frigate config migration...")
@@ -340,6 +347,57 @@ def migrate_016_0(config: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any]
return new_config
def migrate_017_0(config: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any]]:
"""Handle migrating frigate config to 0.16-0"""
new_config = config.copy()
# migrate global to new recording configuration
global_record_retain = config.get("record", {}).get("retain")
if global_record_retain:
continuous = {"days": 0}
motion = {"days": 0}
days = global_record_retain.get("days")
mode = global_record_retain.get("mode", "all")
if days:
if mode == "all":
continuous["days"] = days
else:
motion["days"] = days
new_config["record"]["continuous"] = continuous
new_config["record"]["motion"] = motion
del new_config["record"]["retain"]
for name, camera in config.get("cameras", {}).items():
camera_config: dict[str, dict[str, Any]] = camera.copy()
camera_record_retain = camera_config.get("record", {}).get("retain")
if camera_record_retain:
continuous = {"days": 0}
motion = {"days": 0}
days = camera_record_retain.get("days")
mode = camera_record_retain.get("mode", "all")
if days:
if mode == "all":
continuous["days"] = days
else:
motion["days"] = days
camera_config["record"]["continuous"] = continuous
camera_config["record"]["motion"] = motion
del camera_config["record"]["retain"]
new_config["cameras"][name] = camera_config
new_config["version"] = "0.17-0"
return new_config
def get_relative_coordinates(
mask: Optional[Union[str, list]], frame_shape: tuple[int, int]
) -> Union[str, list]: