From 24ad0fed532682dd710ff0f49e7a9fc01f50e1d6 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Fri, 8 May 2026 16:16:09 -0400 Subject: [PATCH] video quality selector --- i18n/en.json | 1 + .../asset-viewer/VideoNativeViewer.svelte | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/i18n/en.json b/i18n/en.json index 78a7db26b2..2c8d53d8c3 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -2393,6 +2393,7 @@ "video": "Video", "video_hover_setting": "Play video thumbnail on hover", "video_hover_setting_description": "Play video thumbnail when mouse is hovering over item. Even when disabled, playback can be started by hovering over the play icon.", + "video_quality": "Video quality", "videos": "Videos", "videos_count": "{count, plural, one {# Video} other {# Videos}}", "videos_only": "Videos only", diff --git a/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte b/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte index 624a670ec3..29c4c01efc 100644 --- a/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte +++ b/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte @@ -34,6 +34,7 @@ import 'media-chrome/media-time-range'; import 'media-chrome/media-volume-range'; import 'media-chrome/menu/media-playback-rate-menu'; + import 'media-chrome/menu/media-rendition-menu'; import 'media-chrome/menu/media-settings-menu'; import 'media-chrome/menu/media-settings-menu-button'; import 'media-chrome/menu/media-settings-menu-item'; @@ -144,6 +145,19 @@ } }); + // Once ABR has picked an initial codec tier, drop the others. + // The player already avoids switching codecs, and removing the other codecs + // makes the quality selector cleaner with only resolution options. + api.once(Hls.Events.LEVEL_SWITCHED, (_event, data) => { + const chosenLevel = api.levels[data.level]; + for (let idx = api.levels.length - 1; idx >= 0; idx--) { + const { codecSet, videoRange } = api.levels[idx]; + if (codecSet !== chosenLevel.codecSet || videoRange !== chosenLevel.videoRange) { + api.removeLevel(idx); + } + } + }); + api.on(Hls.Events.FRAG_LOADED, () => (rebuildCount = 0)); api.on(Hls.Events.ERROR, (_, data) => { @@ -342,6 +356,16 @@ {$t('playback_speed')} + {#if featureFlagsManager.value.realtimeTranscoding} + + {$t('video_quality')} + + + + {/if} {/if}