diff --git a/api/app/main.py b/api/app/main.py index 7911538..9e2c195 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -97,6 +97,20 @@ def _save_mediamtx_yml(data: dict) -> None: ) +def _set_recording_in_mediamtx_yml(enabled: bool) -> bool: + data = _load_mediamtx_yml() + path_defaults = data.setdefault("pathDefaults", {}) + if not isinstance(path_defaults, dict): + raise HTTPException(status_code=400, detail="invalid_mediamtx_path_defaults") + current = bool(path_defaults.get("record", False)) + if current == bool(enabled): + return False + path_defaults["record"] = bool(enabled) + data["pathDefaults"] = path_defaults + _save_mediamtx_yml(data) + return True + + def _build_mediamtx_view(data: dict, cfg: AppConfig) -> MediaMTXConfigView: path_defaults = data.get("pathDefaults") or {} record_enabled = bool(path_defaults.get("record", False)) @@ -163,26 +177,8 @@ async def _apply_recording(enabled: bool) -> None: if _sanitize_cfg_fields(cfg): await store.save(cfg) try: - paths = await MediaMTXClient( - api_url=cfg.mediamtx_api_url, - username=cfg.mediamtx_api_user, - password=cfg.mediamtx_api_pass, - ).list_paths_status() - names = [it.get("name") for it in (paths.get("items") or []) if isinstance(it, dict) and it.get("name")] - except httpx.HTTPError as e: - logger.warning("scheduler_skip_apply_recording: mediamtx_unreachable (%s)", type(e).__name__) - return - if not names: - return - - client = MediaMTXClient( - api_url=cfg.mediamtx_api_url, - username=cfg.mediamtx_api_user, - password=cfg.mediamtx_api_pass, - ) - try: - await client.set_recording_bulk(names, enabled) - except httpx.HTTPError as e: + _set_recording_in_mediamtx_yml(enabled) + except Exception as e: logger.warning("scheduler_apply_recording_failed: %s", type(e).__name__) @@ -313,13 +309,8 @@ async def delete_mediamtx_camera(name: str) -> MediaMTXConfigView: @app.post("/api/mediamtx/recording") async def set_mediamtx_recording(data: RecordingToggle) -> MediaMTXConfigView: cfg = await store.load() + _set_recording_in_mediamtx_yml(data.enabled) payload = _load_mediamtx_yml() - path_defaults = payload.setdefault("pathDefaults", {}) - if not isinstance(path_defaults, dict): - raise HTTPException(status_code=400, detail="invalid_mediamtx_path_defaults") - path_defaults["record"] = bool(data.enabled) - payload["pathDefaults"] = path_defaults - _save_mediamtx_yml(payload) return _build_mediamtx_view(payload, cfg) @@ -354,21 +345,25 @@ async def toggle_recording(data: RecordingToggle) -> dict: @app.post("/api/scheduler/enabled") async def set_scheduler_enabled(data: SchedulerEnabled) -> AppConfig: cfg = await store.load() + if _sanitize_cfg_fields(cfg): + await store.save(cfg) cfg.schedule.enabled = data.enabled await store.save(cfg) await scheduler.tick(cfg.schedule) - return cfg + return await _sync_app_config_from_mediamtx() @app.post("/api/scheduler/schedule") async def update_schedule(data: ScheduleUpdate) -> AppConfig: cfg = await store.load() + if _sanitize_cfg_fields(cfg): + await store.save(cfg) cfg.schedule.weekdays_from = data.weekdays_from cfg.schedule.weekdays_to = data.weekdays_to cfg.schedule.weekend_all_day = data.weekend_all_day await store.save(cfg) await scheduler.tick(cfg.schedule) - return cfg + return await _sync_app_config_from_mediamtx() @app.get("/api/recordings")