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')}
+
+
+
+ {$t('video_quality')}
+
+
+ {/if}
{/if}