fix Scheduler
This commit is contained in:
+23
-28
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user