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:
|
def _build_mediamtx_view(data: dict, cfg: AppConfig) -> MediaMTXConfigView:
|
||||||
path_defaults = data.get("pathDefaults") or {}
|
path_defaults = data.get("pathDefaults") or {}
|
||||||
record_enabled = bool(path_defaults.get("record", False))
|
record_enabled = bool(path_defaults.get("record", False))
|
||||||
@@ -163,26 +177,8 @@ async def _apply_recording(enabled: bool) -> None:
|
|||||||
if _sanitize_cfg_fields(cfg):
|
if _sanitize_cfg_fields(cfg):
|
||||||
await store.save(cfg)
|
await store.save(cfg)
|
||||||
try:
|
try:
|
||||||
paths = await MediaMTXClient(
|
_set_recording_in_mediamtx_yml(enabled)
|
||||||
api_url=cfg.mediamtx_api_url,
|
except Exception as e:
|
||||||
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:
|
|
||||||
logger.warning("scheduler_apply_recording_failed: %s", type(e).__name__)
|
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")
|
@app.post("/api/mediamtx/recording")
|
||||||
async def set_mediamtx_recording(data: RecordingToggle) -> MediaMTXConfigView:
|
async def set_mediamtx_recording(data: RecordingToggle) -> MediaMTXConfigView:
|
||||||
cfg = await store.load()
|
cfg = await store.load()
|
||||||
|
_set_recording_in_mediamtx_yml(data.enabled)
|
||||||
payload = _load_mediamtx_yml()
|
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)
|
return _build_mediamtx_view(payload, cfg)
|
||||||
|
|
||||||
|
|
||||||
@@ -354,21 +345,25 @@ async def toggle_recording(data: RecordingToggle) -> dict:
|
|||||||
@app.post("/api/scheduler/enabled")
|
@app.post("/api/scheduler/enabled")
|
||||||
async def set_scheduler_enabled(data: SchedulerEnabled) -> AppConfig:
|
async def set_scheduler_enabled(data: SchedulerEnabled) -> AppConfig:
|
||||||
cfg = await store.load()
|
cfg = await store.load()
|
||||||
|
if _sanitize_cfg_fields(cfg):
|
||||||
|
await store.save(cfg)
|
||||||
cfg.schedule.enabled = data.enabled
|
cfg.schedule.enabled = data.enabled
|
||||||
await store.save(cfg)
|
await store.save(cfg)
|
||||||
await scheduler.tick(cfg.schedule)
|
await scheduler.tick(cfg.schedule)
|
||||||
return cfg
|
return await _sync_app_config_from_mediamtx()
|
||||||
|
|
||||||
|
|
||||||
@app.post("/api/scheduler/schedule")
|
@app.post("/api/scheduler/schedule")
|
||||||
async def update_schedule(data: ScheduleUpdate) -> AppConfig:
|
async def update_schedule(data: ScheduleUpdate) -> AppConfig:
|
||||||
cfg = await store.load()
|
cfg = await store.load()
|
||||||
|
if _sanitize_cfg_fields(cfg):
|
||||||
|
await store.save(cfg)
|
||||||
cfg.schedule.weekdays_from = data.weekdays_from
|
cfg.schedule.weekdays_from = data.weekdays_from
|
||||||
cfg.schedule.weekdays_to = data.weekdays_to
|
cfg.schedule.weekdays_to = data.weekdays_to
|
||||||
cfg.schedule.weekend_all_day = data.weekend_all_day
|
cfg.schedule.weekend_all_day = data.weekend_all_day
|
||||||
await store.save(cfg)
|
await store.save(cfg)
|
||||||
await scheduler.tick(cfg.schedule)
|
await scheduler.tick(cfg.schedule)
|
||||||
return cfg
|
return await _sync_app_config_from_mediamtx()
|
||||||
|
|
||||||
|
|
||||||
@app.get("/api/recordings")
|
@app.get("/api/recordings")
|
||||||
|
|||||||
Reference in New Issue
Block a user