mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-11 02:46:16 -08:00
WebPlayerViewComponent resolves the engine from its own asynchronous settings read and falls back to Video.js until it lands. The engine is part of the application token, so anyone whose saved player is not Video.js got a first application on the wrong engine and a swap a tick later. The M3U live layout never showed it because it passes an explicit playerOverride; the detail path goes through the shared inline player, which had no way to. PortalInlinePlayerComponent now accepts an optional playerOverride (null keeps the portals' behaviour) and the M3U detail chain forwards the value the live layout already uses. The E2E guard is a MutationObserver over engine mounts, not a polling locator: both engines leave the same final DOM, so only the record of what was ever attached can see the defect. Verified to fail without the fix. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>