refactor: remember the sub track

handle both external and embedded
This commit is contained in:
Timothy Z. 2026-01-22 14:38:59 +02:00
parent 92d0644c9f
commit 67358359bf

View file

@ -90,10 +90,9 @@ const Player = ({ urlParams, queryParams }) => {
const nextVideoPopupDismissed = React.useRef(false);
const defaultSubtitlesSelected = React.useRef(false);
const lastSelectedSubtitleTrack = React.useRef(null);
const defaultAudioTrackSelected = React.useRef(false);
const [error, setError] = React.useState(null);
const [previousSubtitlesTrackId, setPreviousSubtitlesTrackId] = React.useState(null);
const isNavigating = React.useRef(false);
@ -256,11 +255,6 @@ const Player = ({ urlParams, queryParams }) => {
streamStateChanged({ subtitleDelay: delay });
}, [streamStateChanged]);
const onSubtitlesTrackSelected = React.useCallback((id) => {
video.setProp('selectedSubtitlesTrackId', id);
video.setProp('selectedExtraSubtitlesTrackId', null);
setPreviousSubtitlesTrackId(id);
}, []);
const onIncreaseSubtitlesDelay = React.useCallback(() => {
const delay = video.state.extraSubtitlesDelay + 250;
onExtraSubtitlesDelayChanged(delay);
@ -509,6 +503,14 @@ const Player = ({ urlParams, queryParams }) => {
}
}, [video.state.stream, player.streamState]);
React.useEffect(() => {
if (video.state.selectedSubtitlesTrackId !== null) {
lastSelectedSubtitleTrack.current = { id: video.state.selectedSubtitlesTrackId, embedded: true };
} else if (video.state.selectedExtraSubtitlesTrackId !== null) {
lastSelectedSubtitleTrack.current = { id: video.state.selectedExtraSubtitlesTrackId, embedded: false };
}
}, [video.state.selectedSubtitlesTrackId, video.state.selectedExtraSubtitlesTrackId]);
React.useEffect(() => {
defaultSubtitlesSelected.current = false;
defaultAudioTrackSelected.current = false;
@ -677,6 +679,37 @@ const Player = ({ urlParams, queryParams }) => {
combo === 1 ? onUpdateSubtitlesSize(-1) : onUpdateSubtitlesSize(1);
}, [onUpdateSubtitlesSize, onUpdateSubtitlesSize]);
onShortcut('toggleSubtitles', () => {
const hasEmbedded = video.state.selectedSubtitlesTrackId !== null;
const hasExtra = video.state.selectedExtraSubtitlesTrackId !== null;
const last = lastSelectedSubtitleTrack.current;
if (hasEmbedded || hasExtra) {
video.setSubtitlesTrack(null);
video.setExtraSubtitlesTrack(null);
return;
}
if (last) {
const tracks = last.embedded ? video.state.subtitlesTracks : video.state.extraSubtitlesTracks;
if (tracks?.some((t) => t.id === last.id)) {
last.embedded ? onSubtitlesTrackSelected(last.id) : onExtraSubtitlesTrackSelected(last.id);
return;
}
}
const embeddedMatch = findTrackByLang(video.state.subtitlesTracks || [], settings.subtitlesLanguage);
if (embeddedMatch) {
onSubtitlesTrackSelected(embeddedMatch.id);
return;
}
const extraMatch = findTrackByLang(video.state.extraSubtitlesTracks || [], settings.subtitlesLanguage);
if (extraMatch) {
onExtraSubtitlesTrackSelected(extraMatch.id);
}
}, [video.state.selectedSubtitlesTrackId, video.state.selectedExtraSubtitlesTrackId, video.state.subtitlesTracks, video.state.extraSubtitlesTracks, settings.subtitlesLanguage, onSubtitlesTrackSelected, onExtraSubtitlesTrackSelected]);
onShortcut('subtitlesMenu', () => {
closeMenus();
if (video.state?.subtitlesTracks?.length > 0 || video.state?.extraSubtitlesTracks?.length > 0) {