The engine is part of the application token, so picking one before the
persisted settings arrive mounts a second application and swaps the player
mid-playback. The settings read is an async IndexedDB subscription with no
initial value, so anyone who had not selected Video.js briefly got it —
visible on the new M3U movie detail path, which (unlike the live layout)
mounts the shared portal inline player and passes no explicit override.
SettingsStore holds the same value synchronously; an unhydrated store still
yields the Video.js default this used to hard-code, and host overrides keep
winning. Fixes the transient wrong engine for the portals' inline players too.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>