dragonflight/services/playout/src
Zac d62af34e98 feat(playout): CasparCG sidecar image + Node AMCP shim
One container per channel. Built like capture/build-with-decklink: NDI +
DeckLink SDKs fetched at build, runs --privileged with Xvfb for the GL
context where no real display is present.

Components:
- entrypoint.sh: Xvfb + CasparCG launch, creates /media/live/<CHANNEL_ID>
- src/amcp.js: TCP AMCP client
- src/playout-manager.js: channel lifecycle, playlist walk via LOADBG AUTO
  for gapless transitions; primary consumer (decklink/ndi/srt/rtmp) plus a
  second FFMPEG HLS consumer (~600 kbps, 2s segments) for the UI preview
- src/index.js: HTTP shim — /channel/start, /playlist/load, transport
- frame-rate helper picks fps from video_format (59.94 → 60000/1001) so
  SEEK / LENGTH frame math is correct
2026-05-30 14:02:25 +00:00
..
amcp.js feat(playout): CasparCG sidecar image + Node AMCP shim 2026-05-30 14:02:25 +00:00
index.js feat(playout): CasparCG sidecar image + Node AMCP shim 2026-05-30 14:02:25 +00:00
playout-manager.js feat(playout): CasparCG sidecar image + Node AMCP shim 2026-05-30 14:02:25 +00:00