feat(embedded-mpv): configurable extra libmpv options and network auto-reconnect (#1515)

Extra libmpv options (Settings > Playback) reach every embedded engine off the command line (createSession array on Windows/macOS, a 0600 --include file on Linux native-view, a stdin preamble for the frame-copy helper); the keys the embed depends on are refused, and keys libmpv rejects are reported once per session. Dropped streams reload automatically (error, or ended on live) with 2 s -> 30 s backoff, six attempts per outage and a 30 s stability reset, only for a load that already played; engine failures stay terminal, a running recording is filed as interrupted and restarted after the reload, and an external subtitle file is re-added. Settings.embeddedMpvAutoReconnect (default on) opts out; the player shows 'Reconnecting... attempt N of M'.

Started by Bpl5966 in #1515 and finished by the maintainers in the same PR.

Co-authored-by: Bpl5966 <amine.b1959@gmail.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
ZoultandClaude Fable 5.1 authored and GitHub committed 2026-09-04 16:36:14 +02:00
1 parent 6cfdaf5900
commit 5a11b82eaf
66 files changed
+3740 -101

No files matched your search

@@ -212,6 +212,23 @@ export interface Settings {
* for its preload frame pump, which is fixed at window creation.
*/
embeddedMpvFrameCopy?: boolean;
/**
* Extra libmpv options for the embedded engine, one `key=value` per line
* (no leading `--`), applied on every engine after the built-in options
* and the network defaults, so a line here overrides them. Keys the
* embed depends on (`EMBEDDED_MPV_FORBIDDEN_OPTION_KEYS`) are refused by
* the form and skipped at session creation. Mirrored into the
* main-process config like `embeddedMpvFrameCopy`; a change applies to
* the next embedded session.
*/
embeddedMpvExtraOptions?: string;
/**
* Reload a dropped embedded MPV stream automatically (mpv error, or EOF
* on a live stream) with capped backoff. Default on; only a stream that
* already played is retried, so a dead URL stays on the manual Retry.
* Captured per session, so a change applies to the next session.
*/
embeddedMpvAutoReconnect?: boolean;
/** Cover/poster sizing preset applied across grids and rails */
coverSize?: CoverSize;
/** Live EPG panel layout: horizontal timeline (default) or vertical list */