pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix quality switching bug

Pas 6331e69a 2f90617e

+46 -12
+19 -8
src/components/player/atoms/settings/QualityView.tsx
··· 40 40 export function QualityView({ id }: { id: string }) { 41 41 const router = useOverlayRouter(id); 42 42 const isIosHls = useIsIosHls(); 43 + const sourceType = usePlayerStore((s) => s.source?.type); 43 44 const availableQualities = usePlayerStore((s) => s.qualities); 44 45 const currentQuality = usePlayerStore((s) => s.currentQuality); 45 46 const switchQuality = usePlayerStore((s) => s.switchQuality); ··· 50 51 const setLastChosenQuality = useQualityStore((s) => s.setLastChosenQuality); 51 52 const autoQuality = useQualityStore((s) => s.quality.automaticQuality); 52 53 54 + // Auto quality only makes sense for HLS sources 55 + const supportsAutoQuality = sourceType === "hls"; 56 + 53 57 const change = useCallback( 54 58 (q: SourceQuality) => { 55 59 setLastChosenQuality(q); 56 - setAutomaticQuality(false); 60 + // Don't disable auto quality when manually selecting a quality 61 + // Keep auto quality enabled by default unless user explicitly toggles it 57 62 switchQuality(q); 58 63 router.close(); 59 64 }, 60 - [router, switchQuality, setLastChosenQuality, setAutomaticQuality], 65 + [router, switchQuality, setLastChosenQuality], 61 66 ); 62 67 63 68 const changeAutomatic = useCallback(() => { ··· 90 95 {qualityToString(v)} 91 96 </SelectableLink> 92 97 ))} 93 - <Menu.Divider /> 94 - <Menu.Link 95 - rightSide={<Toggle onClick={changeAutomatic} enabled={autoQuality} />} 96 - > 97 - {t("player.menus.quality.automaticLabel")} 98 - </Menu.Link> 98 + {supportsAutoQuality && ( 99 + <> 100 + <Menu.Divider /> 101 + <Menu.Link 102 + rightSide={ 103 + <Toggle onClick={changeAutomatic} enabled={autoQuality} /> 104 + } 105 + > 106 + {t("player.menus.quality.automaticLabel")} 107 + </Menu.Link> 108 + </> 109 + )} 99 110 <Menu.SmallText> 100 111 <Trans 101 112 i18nKey={
+18 -3
src/components/player/display/base.ts
··· 313 313 const quality = hlsLevelToQuality(hls.levels[hls.currentLevel]); 314 314 emit("changedquality", quality); 315 315 } else { 316 - // When automatic quality is disabled, re-lock to preferred quality 317 - // This prevents HLS.js from switching levels unexpectedly 318 - setupQualityForHls(); 316 + // When automatic quality is disabled, check if current level matches preferred quality 317 + const currentQuality = hlsLevelToQuality( 318 + hls.levels[hls.currentLevel], 319 + ); 320 + const preferredQualityLevel = getPreferredQuality( 321 + hlsLevelsToQualities(hls.levels), 322 + { 323 + lastChosenQuality: preferenceQuality, 324 + automaticQuality: false, 325 + }, 326 + ); 327 + // Only re-lock if the current level doesn't match our preferred quality 328 + if (currentQuality !== preferredQualityLevel) { 329 + setupQualityForHls(); 330 + } else { 331 + // Emit the quality change since we're now at the correct level 332 + emit("changedquality", currentQuality); 333 + } 319 334 } 320 335 }); 321 336 hls.on(Hls.Events.SUBTITLE_TRACK_LOADED, () => {
+9 -1
src/stores/player/utils/qualities.ts
··· 99 99 const availableQualities = Object.entries(source.qualities) 100 100 .filter((entry) => (entry[1].url.length ?? 0) > 0) 101 101 .map((entry) => entry[0]) as SourceQuality[]; 102 - const quality = getPreferredQuality(availableQualities, qualityPreferences); 102 + // For file sources (MP4), always use manual quality selection since they don't support switching 103 + const manualQualityPreferences = { 104 + ...qualityPreferences, 105 + automaticQuality: false, 106 + }; 107 + const quality = getPreferredQuality( 108 + availableQualities, 109 + manualQualityPreferences, 110 + ); 103 111 if (quality) { 104 112 const stream = source.qualities[quality]; 105 113 if (stream) {