feat: Helper to match language robustly (handles en vs en-US, srclang fallback)

This commit is contained in:
Yiannis Christodoulou 2025-09-18 10:29:50 +03:00
parent b95962cec8
commit 34bad434c8

View File

@ -392,7 +392,7 @@ class UserPreferences {
const savedLanguage = this.getPreference('subtitleLanguage'); const savedLanguage = this.getPreference('subtitleLanguage');
const enabled = this.getPreference('subtitleEnabled'); const enabled = this.getPreference('subtitleEnabled');
if (savedLanguage && enabled) { if (savedLanguage) {
// Set flag to prevent auto-save during restoration // Set flag to prevent auto-save during restoration
this.isRestoringSubtitles = true; this.isRestoringSubtitles = true;
console.log('isRestoringSubtitles', this.isRestoringSubtitles); console.log('isRestoringSubtitles', this.isRestoringSubtitles);
@ -418,11 +418,19 @@ class UserPreferences {
} }
} }
// Helper to match language robustly (handles en vs en-US, srclang fallback)
const matchesLang = (track, target) => {
const tl = String(track.language || track.srclang || '').toLowerCase();
const sl = String(target || '').toLowerCase();
if (!tl || !sl) return false;
return tl === sl || tl.startsWith(sl + '-') || sl.startsWith(tl + '-');
};
// Then enable the saved language // Then enable the saved language
let found = false; let found = false;
for (let i = 0; i < textTracks.length; i++) { for (let i = 0; i < textTracks.length; i++) {
const track = textTracks[i]; const track = textTracks[i];
if (track.kind === 'subtitles' && track.language === savedLanguage) { if (track.kind === 'subtitles' && matchesLang(track, savedLanguage)) {
track.mode = 'showing'; track.mode = 'showing';
console.log('✓ Applied saved subtitle language:', savedLanguage, track.label); console.log('✓ Applied saved subtitle language:', savedLanguage, track.label);
found = true; found = true;
@ -432,10 +440,35 @@ class UserPreferences {
// Update subtitle button visual state immediately // Update subtitle button visual state immediately
this.updateSubtitleButtonVisualState(player, true); this.updateSubtitleButtonVisualState(player, true);
// Ensure enabled flips to true after successful restore
this.setPreference('subtitleEnabled', true, true);
break; break;
} }
} }
// Fallback: if not found but enabled is true, enable the first available subtitles track
if (!found && enabled) {
for (let i = 0; i < textTracks.length; i++) {
const track = textTracks[i];
if (track.kind === 'subtitles') {
track.mode = 'showing';
console.log(
'Fallback ✓ Enabled first available subtitles track:',
track.label || track.language || track.srclang
);
// Save back the language we actually enabled for future precise matches
const langToSave = track.language || track.srclang || null;
if (langToSave) this.setPreference('subtitleLanguage', langToSave, true);
// Ensure enabled flips to true after successful restore
this.setPreference('subtitleEnabled', true, true);
this.updateSubtitleMenuUI(player, track);
this.updateSubtitleButtonVisualState(player, true);
found = true;
break;
}
}
}
// Clear the restoration flag after a longer delay to ensure all events have settled // Clear the restoration flag after a longer delay to ensure all events have settled
setTimeout(() => { setTimeout(() => {
this.isRestoringSubtitles = false; this.isRestoringSubtitles = false;
@ -455,6 +488,20 @@ class UserPreferences {
// Start attempting to apply subtitles immediately // Start attempting to apply subtitles immediately
attemptToApplySubtitles(); attemptToApplySubtitles();
// Also attempt when tracks are added/changed (iOS timing)
try {
const vEl =
(player.tech_ && player.tech_.el_) ||
(player.el && player.el().querySelector && player.el().querySelector('video'));
const ttList = vEl && vEl.textTracks;
if (ttList && typeof ttList.addEventListener === 'function') {
const onAddTrack = () => setTimeout(() => attemptToApplySubtitles(1), 50);
const onChange = () => setTimeout(() => attemptToApplySubtitles(1), 50);
ttList.addEventListener('addtrack', onAddTrack, { once: true });
ttList.addEventListener('change', onChange, { once: true });
}
} catch (e) {}
} else { } else {
// Ensure subtitles are off on load when not enabled // Ensure subtitles are off on load when not enabled
try { try {
@ -555,7 +602,9 @@ class UserPreferences {
customSettingsMenu.refreshSubtitlesSubmenu(); customSettingsMenu.refreshSubtitlesSubmenu();
} else if (attempt < 5) { } else if (attempt < 5) {
// Retry after a short delay if menu not found // Retry after a short delay if menu not found
console.log(`Custom settings menu not found, retrying in ${attempt * 200}ms... (attempt ${attempt})`); console.log(
`Custom settings menu not found, retrying in ${attempt * 200}ms... (attempt ${attempt})`
);
setTimeout(() => attemptUpdate(attempt + 1), attempt * 200); setTimeout(() => attemptUpdate(attempt + 1), attempt * 200);
} else { } else {
console.log('Custom settings menu not found after multiple attempts'); console.log('Custom settings menu not found after multiple attempts');