2024-09-28 22:21:42 +03:00
from enum import Enum
from pydantic import Field
from frigate.const import MAX_PRE_CAPTURE
2024-12-19 09:46:14 -06:00
from frigate.review.types import SeverityEnum
2024-09-28 22:21:42 +03:00
from ..base import FrigateBaseModel
__all__ = [
2026-06-09 09:07:42 -06:00
"ChaptersEnum" ,
2024-09-28 22:21:42 +03:00
"RecordConfig" ,
"RecordExportConfig" ,
"RecordPreviewConfig" ,
"RecordQualityEnum" ,
2026-08-16 13:59:03 -05:00
"RecordSubConfig" ,
2024-09-28 22:21:42 +03:00
"EventsConfig" ,
"ReviewRetainConfig" ,
"RecordRetainConfig" ,
"RetainModeEnum" ,
]
2025-05-30 17:01:39 -06:00
class RecordRetainConfig ( FrigateBaseModel ):
2026-02-27 09:55:36 -06:00
days : float = Field (
default = 0 ,
ge = 0 ,
title = "Retention days" ,
description = "Days to retain recordings." ,
)
2025-05-30 17:01:39 -06:00
2024-09-28 22:21:42 +03:00
class RetainModeEnum ( str , Enum ):
all = "all"
motion = "motion"
active_objects = "active_objects"
class ReviewRetainConfig ( FrigateBaseModel ):
2026-02-27 09:55:36 -06:00
days : float = Field (
default = 10 ,
ge = 0 ,
title = "Retention days" ,
description = "Number of days to retain recordings of detection events." ,
)
mode : RetainModeEnum = Field (
default = RetainModeEnum . motion ,
title = "Retention mode" ,
description = "Mode for retention: all (save all segments), motion (save segments with motion), or active_objects (save segments with active objects)." ,
)
2024-09-28 22:21:42 +03:00
class EventsConfig ( FrigateBaseModel ):
pre_capture : int = Field (
2025-05-30 17:01:39 -06:00
default = 5 ,
2026-02-27 09:55:36 -06:00
title = "Pre-capture seconds" ,
description = "Number of seconds before the detection event to include in the recording." ,
2025-05-30 17:01:39 -06:00
le = MAX_PRE_CAPTURE ,
ge = 0 ,
)
post_capture : int = Field (
2026-02-27 09:55:36 -06:00
default = 5 ,
ge = 0 ,
title = "Post-capture seconds" ,
description = "Number of seconds after the detection event to include in the recording." ,
2024-09-28 22:21:42 +03:00
)
retain : ReviewRetainConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = ReviewRetainConfig ,
title = "Event retention" ,
description = "Retention settings for recordings of detection events." ,
2024-09-28 22:21:42 +03:00
)
class RecordQualityEnum ( str , Enum ):
very_low = "very_low"
low = "low"
medium = "medium"
high = "high"
very_high = "very_high"
class RecordPreviewConfig ( FrigateBaseModel ):
quality : RecordQualityEnum = Field (
2026-02-27 09:55:36 -06:00
default = RecordQualityEnum . medium ,
title = "Preview quality" ,
description = "Preview quality level (very_low, low, medium, high, very_high)." ,
2024-09-28 22:21:42 +03:00
)
2026-06-09 09:07:42 -06:00
class ChaptersEnum ( str , Enum ):
none = "none"
recording_segments = "recording_segments"
2026-06-28 15:04:01 +02:00
review_items = "review_items"
2026-06-09 09:07:42 -06:00
2024-09-28 22:21:42 +03:00
class RecordExportConfig ( FrigateBaseModel ):
2026-07-06 09:28:02 -08:00
hwaccel_args : str | list [ str ] = Field (
2026-02-27 09:55:36 -06:00
default = "auto" ,
title = "Export hwaccel args" ,
description = "Hardware acceleration args to use for export/transcode operations." ,
2025-12-22 11:10:40 -05:00
)
2026-04-14 09:19:50 -05:00
max_concurrent : int = Field (
default = 3 ,
ge = 1 ,
title = "Maximum concurrent exports" ,
description = "Maximum number of export jobs to process at the same time." ,
)
2026-06-09 09:07:42 -06:00
chapters : ChaptersEnum = Field (
2026-06-28 15:04:01 +02:00
default = ChaptersEnum . review_items ,
2026-06-09 09:07:42 -06:00
title = "Chapter metadata to embed in exported recordings" ,
)
2024-09-28 22:21:42 +03:00
2026-08-16 13:59:03 -05:00
class RecordSubConfig ( FrigateBaseModel ):
enabled : bool = Field (
default = False ,
title = "Enable sub stream recording" ,
description = "Enable recording of a second, lower quality stream for adaptive quality playback and extended retention." ,
)
continuous : RecordRetainConfig = Field (
default_factory = RecordRetainConfig ,
title = "Sub stream continuous retention" ,
description = "Number of days to retain sub stream recordings regardless of tracked objects or motion." ,
)
motion : RecordRetainConfig = Field (
default_factory = RecordRetainConfig ,
title = "Sub stream motion retention" ,
description = "Number of days to retain sub stream recordings triggered by motion." ,
)
alerts : ReviewRetainConfig = Field (
default_factory = ReviewRetainConfig ,
title = "Sub stream alert retention" ,
description = "Retention settings for sub stream recordings of alerts." ,
)
detections : ReviewRetainConfig = Field (
default_factory = ReviewRetainConfig ,
title = "Sub stream detection retention" ,
description = "Retention settings for sub stream recordings of detections." ,
)
2024-09-28 22:21:42 +03:00
class RecordConfig ( FrigateBaseModel ):
2026-02-27 09:55:36 -06:00
enabled : bool = Field (
default = False ,
title = "Enable recording" ,
description = "Enable or disable recording for all cameras; can be overridden per-camera." ,
)
2024-09-28 22:21:42 +03:00
expire_interval : int = Field (
default = 60 ,
2026-02-27 09:55:36 -06:00
title = "Record cleanup interval" ,
description = "Minutes between cleanup passes that remove expired recording segments." ,
2024-09-28 22:21:42 +03:00
)
2025-05-30 17:01:39 -06:00
continuous : RecordRetainConfig = Field (
default_factory = RecordRetainConfig ,
2026-02-27 09:55:36 -06:00
title = "Continuous retention" ,
description = "Number of days to retain recordings regardless of tracked objects or motion. Set to 0 if you only want to retain recordings of alerts and detections." ,
2025-05-30 17:01:39 -06:00
)
motion : RecordRetainConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = RecordRetainConfig ,
title = "Motion retention" ,
description = "Number of days to retain recordings triggered by motion regardless of tracked objects. Set to 0 if you only want to retain recordings of alerts and detections." ,
2024-09-28 22:21:42 +03:00
)
detections : EventsConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = EventsConfig ,
title = "Detection retention" ,
description = "Recording retention settings for detection events including pre/post capture durations." ,
2024-09-28 22:21:42 +03:00
)
alerts : EventsConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = EventsConfig ,
title = "Alert retention" ,
description = "Recording retention settings for alert events including pre/post capture durations." ,
2024-09-28 22:21:42 +03:00
)
export : RecordExportConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = RecordExportConfig ,
title = "Export config" ,
description = "Settings used when exporting recordings such as timelapse and hardware acceleration." ,
2024-09-28 22:21:42 +03:00
)
preview : RecordPreviewConfig = Field (
2026-02-27 09:55:36 -06:00
default_factory = RecordPreviewConfig ,
title = "Preview config" ,
description = "Settings controlling the quality of recording previews shown in the UI." ,
2024-09-28 22:21:42 +03:00
)
2026-08-16 13:59:03 -05:00
sub : RecordSubConfig = Field (
default_factory = RecordSubConfig ,
title = "Sub stream recording" ,
description = "Settings for recording a second, lower quality stream." ,
)
2026-07-06 09:28:02 -08:00
enabled_in_config : bool | None = Field (
2026-02-27 09:55:36 -06:00
default = None ,
title = "Original recording state" ,
description = "Indicates whether recording was enabled in the original static configuration." ,
2024-09-28 22:21:42 +03:00
)
2024-10-31 06:31:01 -06:00
2026-08-16 13:59:03 -05:00
@property
def effective_alert_days ( self ) -> float :
"""Alert retention extended to the sub stream window when sub is enabled.
Review items and tracked objects must stay visible for as long as
either stream still has recordings.
"""
if self . sub . enabled :
return max ( self . alerts . retain . days , self . sub . alerts . days )
return self . alerts . retain . days
@property
def effective_detection_days ( self ) -> float :
"""Detection retention extended to the sub window when sub is enabled."""
if self . sub . enabled :
return max ( self . detections . retain . days , self . sub . detections . days )
return self . detections . retain . days
2024-10-31 06:31:01 -06:00
@property
def event_pre_capture ( self ) -> int :
return max (
self . alerts . pre_capture ,
self . detections . pre_capture ,
)
2024-12-19 09:46:14 -06:00
def get_review_pre_capture ( self , severity : SeverityEnum ) -> int :
if severity == SeverityEnum . alert :
return self . alerts . pre_capture
else :
return self . detections . pre_capture
def get_review_post_capture ( self , severity : SeverityEnum ) -> int :
if severity == SeverityEnum . alert :
return self . alerts . post_capture
else :
return self . detections . post_capture