From 6331e69a2f655589d5d2d65d5ecc325c61986830 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 8 Jan 2026 13:19:21 -0700 Subject: [PATCH] fix quality switching bug --- .../player/atoms/settings/QualityView.tsx | 27 +++++++++++++------ src/components/player/display/base.ts | 21 ++++++++++++--- src/stores/player/utils/qualities.ts | 10 ++++++- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/components/player/atoms/settings/QualityView.tsx b/src/components/player/atoms/settings/QualityView.tsx index 0250c8ea..689c43ed 100644 --- a/src/components/player/atoms/settings/QualityView.tsx +++ b/src/components/player/atoms/settings/QualityView.tsx @@ -40,6 +40,7 @@ function useIsIosHls() { export function QualityView({ id }: { id: string }) { const router = useOverlayRouter(id); const isIosHls = useIsIosHls(); + const sourceType = usePlayerStore((s) => s.source?.type); const availableQualities = usePlayerStore((s) => s.qualities); const currentQuality = usePlayerStore((s) => s.currentQuality); const switchQuality = usePlayerStore((s) => s.switchQuality); @@ -50,14 +51,18 @@ export function QualityView({ id }: { id: string }) { const setLastChosenQuality = useQualityStore((s) => s.setLastChosenQuality); const autoQuality = useQualityStore((s) => s.quality.automaticQuality); + // Auto quality only makes sense for HLS sources + const supportsAutoQuality = sourceType === "hls"; + const change = useCallback( (q: SourceQuality) => { setLastChosenQuality(q); - setAutomaticQuality(false); + // Don't disable auto quality when manually selecting a quality + // Keep auto quality enabled by default unless user explicitly toggles it switchQuality(q); router.close(); }, - [router, switchQuality, setLastChosenQuality, setAutomaticQuality], + [router, switchQuality, setLastChosenQuality], ); const changeAutomatic = useCallback(() => { @@ -90,12 +95,18 @@ export function QualityView({ id }: { id: string }) { {qualityToString(v)} ))} - - } - > - {t("player.menus.quality.automaticLabel")} - + {supportsAutoQuality && ( + <> + + + } + > + {t("player.menus.quality.automaticLabel")} + + + )} { diff --git a/src/stores/player/utils/qualities.ts b/src/stores/player/utils/qualities.ts index c9df244c..125cdef6 100644 --- a/src/stores/player/utils/qualities.ts +++ b/src/stores/player/utils/qualities.ts @@ -99,7 +99,15 @@ export function selectQuality( const availableQualities = Object.entries(source.qualities) .filter((entry) => (entry[1].url.length ?? 0) > 0) .map((entry) => entry[0]) as SourceQuality[]; - const quality = getPreferredQuality(availableQualities, qualityPreferences); + // For file sources (MP4), always use manual quality selection since they don't support switching + const manualQualityPreferences = { + ...qualityPreferences, + automaticQuality: false, + }; + const quality = getPreferredQuality( + availableQualities, + manualQualityPreferences, + ); if (quality) { const stream = source.qualities[quality]; if (stream) {