dragonflight/services
Zac 5538683d78 feat(mam-api): /playout control plane + auto-failover
Routes: channel + playlist CRUD, start/stop/play/pause/skip transport, as-run
log. RBAC via assertProjectAccess on channel.project_id; null project ⇒
admin-only (recorder convention).

Sidecar orchestration mirrors recorders.js: Docker socket for local node,
node-agent /sidecar/start for remote. Channel start passes CHANNEL_ID env so
the sidecar can write HLS preview to /media/live/<id>.

DeckLink port-contention guard: blocks starting a decklink channel when a
recorder or another channel on the same node+device_index is active.

restartChannel(id) helper picks another healthy cluster node and re-places
non-decklink channels; decklink is alert-only. Exposed for the scheduler.

Scheduler tick adds step 6: poll each running channel's sidecar /status,
update last_heartbeat_at, and after ~3 misses trigger restartChannel +
self-call /start. Reuses the existing PG advisory lock so multi-replica
deploys don't double-fire failovers.
2026-05-30 14:02:25 +00:00
..
capture build(capture): nvenc-enabled ffmpeg Dockerfile (validated build) 2026-05-29 13:33:37 -04:00
mam-api feat(mam-api): /playout control plane + auto-failover 2026-05-30 14:02:25 +00:00
node-agent feat(nvenc): GPU sidecar passthrough + All-Intra HEVC capture codec 2026-05-29 12:35:23 -04:00
playout feat(playout): CasparCG sidecar image + Node AMCP shim 2026-05-30 14:02:25 +00:00
premiere-plugin diag(premiere-plugin): v1.2.5 — no-op IIFE writes to Documents/ + reports lf.open result 2026-05-28 03:59:40 +00:00
premiere-plugin-uxp feat(uxp): ship the icon-rail panel redesign as v2.2.2 (recover from redesign branch) 2026-05-29 20:45:29 -04:00
web-ui feat(mam-api,web-ui): Google OAuth (OIDC) sign-in 2026-05-30 02:51:59 +00:00
worker feat(worker): playout-stage job — S3 → /media + EBU R128 loudnorm 2026-05-30 14:02:25 +00:00