Uses PyYAML's implicit resolver to handle all variable substitutions when loading the YAML file.

Environment variables must use the ${FRIGATE } format (add the $ symbol) and must not be enclosed in quotation marks.
This commit is contained in:
you 2024-06-29 18:58:38 +02:00
parent 0d63838f02
commit b3b6c4d7fe

View File

@ -5,6 +5,7 @@ import datetime
import logging
import multiprocessing as mp
import queue
import os
import re
import shlex
import urllib.parse
@ -96,6 +97,18 @@ def load_config_with_no_duplicates(raw_config) -> dict:
class PreserveDuplicatesLoader(yaml.loader.SafeLoader):
pass
env_var_pattern = re.compile(r'\$\{FRIGATE_[A-Z0-9_]+\}')
def env_var_constructor(loader, node):
value = loader.construct_scalar(node)
matches = env_var_pattern.findall(value)
for match in matches:
env_var_name = match[2:-1] # Strip '${' and '}'
env_var_value = os.getenv(env_var_name)
if env_var_value is not None:
value = value.replace(match, env_var_value)
return value
def map_constructor(loader, node, deep=False):
keys = [loader.construct_object(node, deep=deep) for node, _ in node.value]
vals = [loader.construct_object(node, deep=deep) for _, node in node.value]
@ -110,6 +123,13 @@ def load_config_with_no_duplicates(raw_config) -> dict:
data[key] = val
return data
PreserveDuplicatesLoader.add_implicit_resolver(
'!env_var', env_var_pattern, None
)
PreserveDuplicatesLoader.add_constructor(
'!env_var', env_var_constructor
)
PreserveDuplicatesLoader.add_constructor(
yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, map_constructor
)