From f571473bf76554274daa7bced1a82a6ec5d9ddd2 Mon Sep 17 00:00:00 2001 From: drinfernoo Date: Tue, 31 Aug 2021 10:28:06 -0700 Subject: [PATCH] :memo::white_check_mark::wrench: - Make timestamp style config global Fixes #1656 --- docs/docs/configuration/index.md | 31 +++++++++++++ frigate/config.py | 4 ++ frigate/test/test_config.py | 75 ++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md index 4a3c58ffc..9fb6f738b 100644 --- a/docs/docs/configuration/index.md +++ b/docs/docs/configuration/index.md @@ -242,4 +242,35 @@ Can be overridden at the camera level. See the [cameras configuration page](came rtmp: # Optional: Enable the RTMP stream (default: True) enabled: True +``` + +## `timestamp_style` + +Can be overridden at the camera level. See the [cameras configuration page](cameras.md) for more information about timestamp styling. + +```yaml +# Optional: in-feed timestamp style configuration +timestamp_style: + # Optional: Position of the timestamp (default: shown below) + # "tl" (top left), "tr" (top right), "bl" (bottom left), "br" (bottom right) + position: "tl" + # Optional: Format specifier conform to the Python package "datetime" (default: shown below) + # Additional Examples: + # german: "%d.%m.%Y %H:%M:%S" + format: "%m/%d/%Y %H:%M:%S" + # Optional: Color of font + color: + # All Required when color is specified (default: shown below) + red: 255 + green: 255 + blue: 255 + # Optional: Scale factor for font (default: shown below) + scale: 1.0 + # Optional: Line thickness of font (default: shown below) + thickness: 2 + # Optional: Effect of lettering (default: shown below) + # None (No effect), + # "solid" (solid background in inverse color of font) + # "shadow" (shadow for font) + effect: None ``` \ No newline at end of file diff --git a/frigate/config.py b/frigate/config.py index 8cea05622..5da19847b 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -675,6 +675,9 @@ class FrigateConfig(BaseModel): default_factory=DetectConfig, title="Global object tracking configuration." ) cameras: Dict[str, CameraConfig] = Field(title="Camera configuration.") + timestamp_style: TimestampStyleConfig = Field( + default_factory=TimestampStyleConfig, title="Global timestamp style configuration." + ) @property def runtime_config(self) -> FrigateConfig: @@ -695,6 +698,7 @@ class FrigateConfig(BaseModel): "motion": ..., "detect": ..., "ffmpeg": ..., + "timestamp_style": ..., }, exclude_unset=True, ) diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py index cccfcebb7..774d4f146 100644 --- a/frigate/test/test_config.py +++ b/frigate/test/test_config.py @@ -958,6 +958,81 @@ class TestConfig(unittest.TestCase): runtime_config = frigate_config.runtime_config assert runtime_config.cameras["back"].rtmp.enabled + def test_global_timestamp_style(self): + + config = { + "mqtt": {"host": "mqtt"}, + "timestamp_style": {"position": "bl", "scale": 1.5}, + "cameras": { + "back": { + "ffmpeg": { + "inputs": [ + { + "path": "rtsp://10.0.0.1:554/video", + "roles": ["detect"], + }, + ] + }, + } + }, + } + frigate_config = FrigateConfig(**config) + assert config == frigate_config.dict(exclude_unset=True) + + runtime_config = frigate_config.runtime_config + assert runtime_config.cameras["back"].timestamp_style.position == "bl" + assert runtime_config.cameras["back"].timestamp_style.scale == 1.5 + + def test_default_timestamp_style(self): + + config = { + "mqtt": {"host": "mqtt"}, + "cameras": { + "back": { + "ffmpeg": { + "inputs": [ + { + "path": "rtsp://10.0.0.1:554/video", + "roles": ["detect"], + }, + ] + } + } + }, + } + frigate_config = FrigateConfig(**config) + assert config == frigate_config.dict(exclude_unset=True) + + runtime_config = frigate_config.runtime_config + assert runtime_config.cameras["back"].timestamp_style.position == "tl" + assert runtime_config.cameras["back"].timestamp_style.scale == 1.0 + + def test_global_timestamp_style_merge(self): + + config = { + "mqtt": {"host": "mqtt"}, + "rtmp": {"enabled": False}, + "timestamp_style": {"position": "br", "scale": 2.0}, + "cameras": { + "back": { + "ffmpeg": { + "inputs": [ + { + "path": "rtsp://10.0.0.1:554/video", + "roles": ["detect"], + }, + ] + }, + "timestamp_style": {"position": "bl", "scale": 1.5}, + } + }, + } + frigate_config = FrigateConfig(**config) + assert config == frigate_config.dict(exclude_unset=True) + + runtime_config = frigate_config.runtime_config + assert runtime_config.cameras["back"].timestamp_style.position == "bl" + assert runtime_config.cameras["back"].timestamp_style.scale == 1.5 if __name__ == "__main__": unittest.main(verbosity=2)