From 5a11b82eafc6b36f0cc3962bdf01a04652f5b6bd Mon Sep 17 00:00:00 2001 From: Zoult Date: Fri, 4 Sep 2026 16:36:14 +0200 Subject: [PATCH] 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 Co-Authored-By: Claude Fable 5.1 --- .../embedded-mpv-extra-options-reconnect.md | 11 + CLAUDE.md | 4 +- .../native/helper/mpv_frame_helper.cpp | 67 +- .../native/src/embedded_mpv.mm | 72 +- .../native/src/embedded_mpv_extra_options.h | 58 ++ .../native/src/embedded_mpv_wid_common.h | 79 +- .../app/events/embedded-mpv.events.spec.ts | 28 + .../src/app/events/embedded-mpv.events.ts | 20 +- .../src/app/events/settings.events.spec.ts | 49 ++ .../src/app/events/settings.events.ts | 15 + .../embedded-mpv-frame-copy-protocol.ts | 32 +- .../services/embedded-mpv-frame-copy-spawn.ts | 7 +- ...d-mpv-frame-copy.adapter.linux-env.spec.ts | 14 +- .../embedded-mpv-frame-copy.adapter.spec.ts | 124 +++ ...ded-mpv-frame-copy.adapter.test-helpers.ts | 1 + .../embedded-mpv-frame-copy.adapter.ts | 53 +- ...edded-mpv-native.service.reconnect.spec.ts | 711 ++++++++++++++++++ .../embedded-mpv-native.service.spec.ts | 18 +- .../services/embedded-mpv-native.service.ts | 372 ++++++++- .../services/embedded-mpv-reconnect.spec.ts | 414 ++++++++++ .../app/services/embedded-mpv-reconnect.ts | 352 +++++++++ .../embedded-mpv-recording-tracker.spec.ts | 59 ++ .../embedded-mpv-recording-tracker.ts | 43 +- .../services/embedded-mpv-session-errors.ts | 20 + .../embedded-mpv-session-options-file.ts | 96 +++ .../services/embedded-mpv-session-options.ts | 34 + .../src/app/services/store.service.ts | 18 + .../app/settings/settings-form.utils.spec.ts | 76 +- .../src/app/settings/settings-form.utils.ts | 35 +- .../settings-playback-section.component.html | 101 ++- .../test-stubs/settings-test-harness.stub.ts | 2 + apps/web/src/assets/i18n/ar.json | 9 + apps/web/src/assets/i18n/ary.json | 9 + apps/web/src/assets/i18n/by.json | 9 + apps/web/src/assets/i18n/de.json | 9 + apps/web/src/assets/i18n/el.json | 9 + apps/web/src/assets/i18n/en.json | 9 + apps/web/src/assets/i18n/es.json | 9 + apps/web/src/assets/i18n/fr.json | 9 + apps/web/src/assets/i18n/hu.json | 9 + apps/web/src/assets/i18n/it.json | 9 + apps/web/src/assets/i18n/ja.json | 9 + apps/web/src/assets/i18n/ko.json | 9 + apps/web/src/assets/i18n/nl.json | 9 + apps/web/src/assets/i18n/pl.json | 9 + apps/web/src/assets/i18n/pt.json | 9 + apps/web/src/assets/i18n/ru.json | 9 + apps/web/src/assets/i18n/tr.json | 9 + apps/web/src/assets/i18n/zh.json | 9 + apps/web/src/assets/i18n/zhtw.json | 9 + docs/architecture/embedded-mpv-native.md | 137 ++++ .../src/lib/settings-store.service.spec.ts | 18 + .../src/lib/settings-store.service.ts | 15 + libs/shared/interfaces/src/index.ts | 1 + .../embedded-mpv-extra-options.util.spec.ts | 83 ++ .../lib/embedded-mpv-extra-options.util.ts | 155 ++++ .../src/lib/embedded-mpv-session.interface.ts | 23 +- .../lib/external-player-arguments.utils.ts | 5 +- .../interfaces/src/lib/settings.interface.ts | 17 + .../src/lib/redact-sensitive-data.spec.ts | 14 + .../logging/src/lib/redact-sensitive-data.ts | 53 +- .../embedded-mpv-controls.adapter.spec.ts | 26 + .../embedded-mpv-controls.adapter.ts | 34 +- .../embedded-mpv-player.component.html | 17 +- .../embedded-mpv-player.component.spec.ts | 63 ++ .../embedded-mpv-player.component.ts | 24 + 66 files changed, 3740 insertions(+), 101 deletions(-) create mode 100644 .changes/embedded-mpv-extra-options-reconnect.md create mode 100644 apps/electron-backend/native/src/embedded_mpv_extra_options.h create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-native.service.reconnect.spec.ts create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-reconnect.spec.ts create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-reconnect.ts create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-session-errors.ts create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-session-options-file.ts create mode 100644 apps/electron-backend/src/app/services/embedded-mpv-session-options.ts create mode 100644 libs/shared/interfaces/src/lib/embedded-mpv-extra-options.util.spec.ts create mode 100644 libs/shared/interfaces/src/lib/embedded-mpv-extra-options.util.ts diff --git a/.changes/embedded-mpv-extra-options-reconnect.md b/.changes/embedded-mpv-extra-options-reconnect.md new file mode 100644 index 000000000..8e5d60152 --- /dev/null +++ b/.changes/embedded-mpv-extra-options-reconnect.md @@ -0,0 +1,11 @@ +--- +type: feature +area: embedded-mpv +highlight: Embedded MPV reconnects dropped streams +--- + +The embedded MPV player now reloads a live stream that drops mid-playback on +its own, with increasing delays and an "attempt N of 6" line instead of a +dead error screen; a new Settings > Playback toggle turns this off. The same +section gains an advanced field for extra libmpv options (one key=value per +line) that applies on every engine, with a short network timeout on by default. diff --git a/CLAUDE.md b/CLAUDE.md index 0f8839d22..62bead2ba 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -187,7 +187,7 @@ Useful narrower flags: - `IPTVNATOR_TRACE_DB=1` traces DB worker requests and DB progress events - `IPTVNATOR_TRACE_SQL=1` traces SQLite statements in both main and worker connections - `IPTVNATOR_TRACE_WINDOW=1` traces BrowserWindow navigation/load lifecycle -- `IPTVNATOR_TRACE_PLAYER=1` traces external-player activity and bounded Embedded MPV runtime-probe stderr +- `IPTVNATOR_TRACE_PLAYER=1` traces external-player activity, bounded Embedded MPV runtime-probe stderr, and embedded MPV session status transitions (the input of the reconnect policy; never the stream URL) - `IPTVNATOR_TRACE_RENDERER_CONSOLE=1` mirrors renderer console logs into the Electron terminal - `IPTVNATOR_PERF_CAPTURE=1` enables development/test-only, redacted M3U and Xtream preload IPC request/completion markers plus count-only M3U acquire/parse/normalize, Xtream main network/JSON-transform/success-response-ready/cancel-dispatch, and renderer store phase capture; renderer wrappers emit only while the benchmark installs its Symbol hook, benchmark tooling sets the flag explicitly, and production launches must leave it unset - `IPTVNATOR_PERF_WORKER_PROFILING=1` enables development/test-only, request-scoped worker receive/work/response-post timestamps, thread CPU, event-loop utilization/delay, count-only playlist serialization/SQLite write/read/deserialization plus Xtream category/content/cache-clear/delete/in-source-search phase events, profiling-only worker cancel-receipt acknowledgements, valid-sample-counted isolate peak memory, and the database worker's idle-only one-shot post-GC heap probe; overlapping database requests are explicitly invalidated instead of misattributed, the performance benchmark sets the flag automatically, and production launches must leave it unset @@ -997,7 +997,7 @@ app as a real argument, so it is not an option. API. Radio's `