mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-10 09:28:53 -05:00
feat: Helper to match language robustly (handles en vs en-US, srclang fallback)
This commit is contained in:
parent
b95962cec8
commit
34bad434c8
@ -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');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user