From e76447975b3eb9e18a75a0f10aa6397f14503cff Mon Sep 17 00:00:00 2001 From: Lars Emig Date: Thu, 10 Sep 2026 21:33:41 +0200 Subject: [PATCH] feat(playback): stream-info popover in the player overlay (#1578) --- .changes/player-stream-info-popover.md | 11 + .github/workflows/e2e-tests.yaml | 4 +- AGENTS.md | 16 + CLAUDE.md | 15 + ...d-mpv-frame-copy-packaged-fixtures.spec.ts | 19 +- ...bedded-mpv-frame-copy-packaged-fixtures.ts | 36 ++- .../embedded-mpv-frame-copy-packaged.e2e.ts | 143 ++++++++- .../src/stream-info.e2e.ts | 96 ++++++ .../native/helper/mpv_frame_helper.cpp | 169 ++++++++++- .../native/src/embedded_mpv.mm | 266 ++++++++++++++++ .../native/src/embedded_mpv_wid_common.h | 206 ++++++++++++- .../embedded-mpv-frame-copy.adapter.spec.ts | 52 ++++ .../embedded-mpv-native-source.spec.ts | 155 +++++++++- .../embedded-mpv-native.service.spec.ts | 38 +++ .../services/embedded-mpv-native.service.ts | 5 + apps/web/src/assets/i18n/ar.json | 15 +- apps/web/src/assets/i18n/ary.json | 15 +- apps/web/src/assets/i18n/by.json | 15 +- apps/web/src/assets/i18n/de.json | 15 +- apps/web/src/assets/i18n/el.json | 15 +- apps/web/src/assets/i18n/en.json | 15 +- apps/web/src/assets/i18n/es.json | 15 +- apps/web/src/assets/i18n/fr.json | 15 +- apps/web/src/assets/i18n/hu.json | 15 +- apps/web/src/assets/i18n/it.json | 15 +- apps/web/src/assets/i18n/ja.json | 15 +- apps/web/src/assets/i18n/ko.json | 15 +- apps/web/src/assets/i18n/nl.json | 15 +- apps/web/src/assets/i18n/pl.json | 15 +- apps/web/src/assets/i18n/pt.json | 15 +- apps/web/src/assets/i18n/ru.json | 15 +- apps/web/src/assets/i18n/tr.json | 15 +- apps/web/src/assets/i18n/zh.json | 15 +- apps/web/src/assets/i18n/zhtw.json | 15 +- docs/architecture/embedded-mpv-native.md | 83 +++++ docs/architecture/player-controls-contract.md | 101 ++++++- .../src/lib/embedded-mpv-session.interface.ts | 28 ++ .../embedded-mpv-controls.adapter.spec.ts | 17 ++ .../embedded-mpv-controls.adapter.ts | 14 + .../embedded-mpv-stream-stats.spec.ts | 120 ++++++++ .../embedded-mpv-stream-stats.ts | 60 ++++ .../controls-chrome-interactions.ts | 116 +++++++ .../player-controls/controls-format.utils.ts | 26 ++ .../controls-menu-state.spec.ts | 6 + .../player-controls/controls-menu-state.ts | 9 +- .../controls-stream-stats.spec.ts | 158 ++++++++++ .../player-controls/controls-stream-stats.ts | 70 +++++ .../playback/src/lib/player-controls/index.ts | 4 + .../player-controls-defaults.ts | 1 + .../player-controls.component.html | 84 ++++- ...yer-controls.component.media-title.spec.ts | 19 ++ .../player-controls.component.scss | 133 +++++++- .../player-controls.component.spec.ts | 8 +- ...yer-controls.component.stream-info.spec.ts | 222 ++++++++++++++ .../player-controls.component.ts | 122 +++----- .../player-controls/player-controls.model.ts | 9 + .../player-stream-stats.model.ts | 76 +++++ .../player-controls/positive-number.util.ts | 15 + .../stream-stats-format.utils.spec.ts | 286 ++++++++++++++++++ .../stream-stats-format.utils.ts | 273 +++++++++++++++++ .../stream-stats.spec-helpers.ts | 32 ++ .../web-video-controls.adapter.ts | 22 ++ .../web-video-stream-stats.spec.ts | 280 +++++++++++++++++ .../player-controls/web-video-stream-stats.ts | 161 ++++++++++ .../lib/shaka-engine/shaka-module.types.ts | 10 + .../vjs-player/vjs-player-controls.bridge.ts | 1 + .../lib/vjs-player/vjs-quality-levels.spec.ts | 38 +++ .../src/lib/vjs-player/vjs-quality-levels.ts | 28 ++ .../web-video-support/quality-level-labels.ts | 22 +- .../web-video-source-controls.bridge.ts | 5 + .../web-video-source-stats.spec.ts | 246 +++++++++++++++ .../web-video-source-stats.ts | 97 ++++++ 72 files changed, 4355 insertions(+), 163 deletions(-) create mode 100644 .changes/player-stream-info-popover.md create mode 100644 apps/electron-backend-e2e/src/stream-info.e2e.ts create mode 100644 libs/ui/playback/src/lib/embedded-mpv-player/embedded-mpv-stream-stats.spec.ts create mode 100644 libs/ui/playback/src/lib/embedded-mpv-player/embedded-mpv-stream-stats.ts create mode 100644 libs/ui/playback/src/lib/player-controls/controls-chrome-interactions.ts create mode 100644 libs/ui/playback/src/lib/player-controls/controls-stream-stats.spec.ts create mode 100644 libs/ui/playback/src/lib/player-controls/controls-stream-stats.ts create mode 100644 libs/ui/playback/src/lib/player-controls/player-controls.component.stream-info.spec.ts create mode 100644 libs/ui/playback/src/lib/player-controls/player-stream-stats.model.ts create mode 100644 libs/ui/playback/src/lib/player-controls/positive-number.util.ts create mode 100644 libs/ui/playback/src/lib/player-controls/stream-stats-format.utils.spec.ts create mode 100644 libs/ui/playback/src/lib/player-controls/stream-stats-format.utils.ts create mode 100644 libs/ui/playback/src/lib/player-controls/stream-stats.spec-helpers.ts create mode 100644 libs/ui/playback/src/lib/player-controls/web-video-stream-stats.spec.ts create mode 100644 libs/ui/playback/src/lib/player-controls/web-video-stream-stats.ts create mode 100644 libs/ui/playback/src/lib/web-video-support/web-video-source-stats.spec.ts create mode 100644 libs/ui/playback/src/lib/web-video-support/web-video-source-stats.ts diff --git a/.changes/player-stream-info-popover.md b/.changes/player-stream-info-popover.md new file mode 100644 index 000000000..9c1ed8b46 --- /dev/null +++ b/.changes/player-stream-info-popover.md @@ -0,0 +1,11 @@ +--- +type: feature +area: playback +highlight: See what a stream really is while it plays +--- + +The player overlay now shows stream information: resolution, playback and source +frame rates, stream and codec bitrates, audio details, buffer and dropped frames. +Available in built-in web players and experimental frame-copy Embedded MPV. +Unknown or unavailable values stay hidden; measured frame rates reflect dropped frames and +stalls. diff --git a/.github/workflows/e2e-tests.yaml b/.github/workflows/e2e-tests.yaml index 426b3933e..b2f4e2582 100644 --- a/.github/workflows/e2e-tests.yaml +++ b/.github/workflows/e2e-tests.yaml @@ -39,7 +39,9 @@ jobs: electron-e2e-tests: name: Electron E2E on ${{ matrix.os }} runs-on: ${{ matrix.os }} - timeout-minutes: 45 + # macOS's sequential Electron suite exceeded 45m while still passing + # tests; retain the full suite with room for setup and retries. + timeout-minutes: ${{ matrix.os == 'macos-latest' && 60 || 45 }} env: IPTVNATOR_ALLOW_PRIVATE_NETWORK_URLS: '1' NX_SKIP_NX_CACHE: true diff --git a/AGENTS.md b/AGENTS.md index f77d9febe..98999d336 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -383,6 +383,22 @@ Key files: ## Shared Player Controls +- Stream info popover: an `info` button in the top-right corner of the shared + controls overlay shows live stream data — resolution + aspect ratio, measured + frame rate, video/audio codec and bitrate, audio channels and sample rate, + container, buffer, and dropped frames. Rendered only when the engine reports + something (`capabilities.streamStats`), sampled once a second and only while + the popover is open. Web engines read the `