2.2 KiB
2.2 KiB
ECP-0102: Linux Widevine NBC Worker on ecp-forge
Why
NBC live playback currently exists only in the desktop app:
- macOS native
WKWebViewfor in-app auth and playback capture - local Chrome fallback for browser-driven playback capture
ecp-forge cannot originate an NBC live stream today because ec-node has no NBC source worker, no Adobe auth bootstrap flow, and no Linux browser runtime with Widevine.
Decision
Build a forge-capable NBC source worker around Linux Google Chrome plus a persistent authenticated profile.
- Use Google Chrome on
x86_64Linux, not bare Chromium, as the browser runtime for NBC on forge. - Run Chrome in a virtual display session on
ecp-forgeso DRM playback remains in a normal browser path even when no physical display is attached. Keep the forge worker on a dedicated display number and disable GPU acceleration by default under Xvfb. - Persist the NBC/Adobe browser profile on forge so auth warmup is amortized across runs.
- Add an explicit bootstrap path that surfaces interactive auth only when the stored session is cold or expired.
- Launch Chrome as an external process and attach over DevTools rather than relying on the crate-managed Chrome launcher path.
- Publish the resulting captured stream through the existing
ec-noderelay path so archive, replay, and downstream nodes stay unchanged. - Expose the forge operator surface as
ec-node nbc-bootstrapandec-node nbc-wt-publish, with a persistent virtual display onecp-forge.
Consequences
- NBC live origin becomes possible from forge without depending on a user’s macOS desktop session.
- We keep the existing every.channel transport/archive model and only replace the source worker.
- The first forge implementation should be browser-frame capture first; audio and full unattended auth renewal can follow once the Linux worker is stable.
Rejected Alternatives
- Reuse the macOS
WKWebViewpath on forge: impossible on Linux. - Depend on bare Chromium only: rejected because Widevine support is the central requirement.
- Require true headless-only DRM playback from the start: rejected because the safer first implementation is a normal Chrome session inside a virtual display.