HLS VOD playback for browser (supplements MP4 proxy) #170

Open
zgaetano wants to merge 7 commits from feat/hls-vod-playback into main

7 commits

Author SHA1 Message Date
01a19c0d69 feat(hls): add xhrSetup withCredentials to hls.js instances in visuals.jsx 2026-06-03 04:22:08 +00:00
39e010544c fix(merge): resolve conflicts in playout UI and styles 2026-06-03 04:21:38 +00:00
d58982ad18 feat(hls): return type='hls' in stream endpoint and add audio sync placeholders in editor 2026-06-03 04:18:29 +00:00
a1b8211ea1 feat(editor): add Hls.js support for source and program monitors 2026-06-03 04:17:17 +00:00
ac5a667e65 feat(playout): redesigned MCR CSS — monitor, timeline, SCTE-35, drawer 2026-05-31 19:30:59 -04:00
1ca295d799 fix: upload growing file to S3 on stop so proxy job succeeds
When growing_enabled=true the capture container writes the master to
/growing/{projectId}/{clipName}.{ext} instead of streaming it to S3.
The capture container's graceful-shutdown handler (running during the
Docker stop) calls POST /assets/:id/finalize with the expected S3 key,
which queues a proxy job.  That key never had data in S3 so the proxy
worker downloaded an empty object and failed with 'unable to open file'.

Fix: in the stop endpoint, after the container has exited (meaning
ffmpeg has finished flushing the growing file), upload the growing file
to S3 from the mam-api node (which has /growing mounted).  The upload
completes before the HTTP response is sent, so by the time the client
refreshes and the BullMQ worker dequeues the proxy job the S3 object
exists.

Also handles the edge case where finalize already ran and flipped the
asset to 'processing' — we still do the upload so the already-queued
proxy job can succeed.  Best-effort: a missing growing file (empty
recording or SMB-path scenario) is logged but does not fail the stop."
2026-05-31 19:30:13 -04:00
be819353a7 feat(playout): redesigned MCR screen — design polish + real API wiring 2026-05-31 19:28:08 -04:00