fix Scheduler

This commit is contained in:
2026-05-06 15:04:18 +07:00
parent 16c35803a7
commit ac376714d2
+23 -28
View File
@@ -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")