From fb56e6cdc084e56ec9d3668ef9052262e7033ffc Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Wed, 25 Mar 2026 11:50:01 +0300 Subject: [PATCH] feat: persist audio capture device selection to config.yaml Device choice now survives server restarts. Falls back to default if the saved device is no longer available. --- media_server/config_manager.py | 28 ++++++++++++++++++++++++++++ media_server/routes/media.py | 6 ++++++ 2 files changed, 34 insertions(+) diff --git a/media_server/config_manager.py b/media_server/config_manager.py index ff1e478..0bbf56b 100644 --- a/media_server/config_manager.py +++ b/media_server/config_manager.py @@ -451,6 +451,34 @@ class ConfigManager: del settings.links[name] logger.info(f"Link '{name}' deleted from config") + def set_setting(self, key: str, value) -> None: + """Set a top-level config setting and persist to YAML. + + Args: + key: Setting name (e.g., "visualizer_device"). + value: Setting value (None removes the key). + """ + with self._lock: + if not self._config_path.exists(): + data = {} + else: + with open(self._config_path, "r", encoding="utf-8") as f: + data = yaml.safe_load(f) or {} + + if value is None: + data.pop(key, None) + else: + data[key] = value + + self._config_path.parent.mkdir(parents=True, exist_ok=True) + with open(self._config_path, "w", encoding="utf-8") as f: + yaml.dump(data, f, default_flow_style=False, sort_keys=False) + + # Update in-memory settings + if hasattr(settings, key): + setattr(settings, key, value) + logger.info("Setting '%s' updated to: %s", key, value) + # Global config manager instance config_manager = ConfigManager() diff --git a/media_server/routes/media.py b/media_server/routes/media.py index ab69804..711961b 100644 --- a/media_server/routes/media.py +++ b/media_server/routes/media.py @@ -307,6 +307,12 @@ async def set_visualizer_device( # set_device() handles stop/start internally if capture was running success = analyzer.set_device(device_name) + # Persist selection to config.yaml so it survives server restarts + if success: + from ..config_manager import config_manager + + config_manager.set_setting("visualizer_device", device_name) + return { "success": success, "current_device": analyzer.current_device,