|
@@ -504,6 +504,10 @@ class CameraConfig(FrigateBaseModel):
|
|
|
for idx, (name, z) in enumerate(config["zones"].items())
|
|
|
}
|
|
|
|
|
|
+ # add roles to the input if there is only one
|
|
|
+ if len(config["ffmpeg"]["inputs"]) == 1:
|
|
|
+ config["ffmpeg"]["inputs"][0]["roles"] = ["record", "rtmp", "detect"]
|
|
|
+
|
|
|
super().__init__(**config)
|
|
|
|
|
|
@property
|
|
@@ -798,6 +802,23 @@ class FrigateConfig(FrigateBaseModel):
|
|
|
raise ValueError("Zones cannot share names with cameras")
|
|
|
return v
|
|
|
|
|
|
+ @validator("cameras")
|
|
|
+ def ensure_cameras_are_not_missing_roles(cls, v: Dict[str, CameraConfig]):
|
|
|
+ for name, camera in v.items():
|
|
|
+ assigned_roles = list(
|
|
|
+ set([r for i in camera.ffmpeg.inputs for r in i.roles])
|
|
|
+ )
|
|
|
+ if camera.record.enabled and not "record" in assigned_roles:
|
|
|
+ raise ValueError(
|
|
|
+ f"Camera {name} has record enabled, but record is not assigned to an input."
|
|
|
+ )
|
|
|
+
|
|
|
+ if camera.rtmp.enabled and not "rtmp" in assigned_roles:
|
|
|
+ raise ValueError(
|
|
|
+ f"Camera {name} has rtmp enabled, but rtmp is not assigned to an input."
|
|
|
+ )
|
|
|
+ return v
|
|
|
+
|
|
|
@classmethod
|
|
|
def parse_file(cls, config_file):
|
|
|
with open(config_file) as f:
|