fix: Force save subtitle preference in local storage

This commit is contained in:
Yiannis Christodoulou 2025-07-14 04:38:53 +03:00
parent 73e679cdd3
commit 13f80a526a

View File

@ -61,18 +61,27 @@ class UserPreferences {
* Set specific preference value * Set specific preference value
* @param {string} key - Preference key * @param {string} key - Preference key
* @param {*} value - Preference value * @param {*} value - Preference value
* @param {boolean} forceSet - Force set even if auto-save is disabled
*/ */
setPreference(key, value) { setPreference(key, value, forceSet = false) {
// Add special logging for subtitle language changes // Add special logging for subtitle language changes
if (key === 'subtitleLanguage') { if (key === 'subtitleLanguage') {
console.log( console.log(
`🔄 Setting subtitleLanguage: ${value} (restoring: ${this.isRestoringSubtitles}, autoSaveDisabled: ${this.subtitleAutoSaveDisabled})` `🔄 Setting subtitleLanguage: ${value} (restoring: ${this.isRestoringSubtitles}, autoSaveDisabled: ${this.subtitleAutoSaveDisabled}, forceSet: ${forceSet})`
); );
// Block subtitle language changes during restoration or if disabled // Block subtitle language changes during restoration, but allow forced sets
if (this.isRestoringSubtitles || this.subtitleAutoSaveDisabled) { if (this.isRestoringSubtitles) {
console.log('🚫 BLOCKED: Subtitle language change during restoration or auto-save disabled'); console.log('🚫 BLOCKED: Subtitle language change during restoration');
return; // Don't save during restoration or if disabled return; // Don't save during restoration
}
// Allow forced sets even if auto-save is disabled (for direct user clicks)
if (this.subtitleAutoSaveDisabled && !forceSet) {
console.log(
'🚫 BLOCKED: Subtitle language change during auto-save disabled period (use forceSet=true to override)'
);
return; // Don't save if disabled unless forced
} }
console.trace('Subtitle preference change stack trace'); console.trace('Subtitle preference change stack trace');
@ -103,11 +112,11 @@ class UserPreferences {
this.subtitleAutoSaveDisabled = true; this.subtitleAutoSaveDisabled = true;
console.log('🔒 Subtitle auto-save DISABLED during initial load'); console.log('🔒 Subtitle auto-save DISABLED during initial load');
// Re-enable after 10 seconds to ensure everything has settled // Re-enable after 3 seconds to ensure everything has settled
setTimeout(() => { setTimeout(() => {
this.subtitleAutoSaveDisabled = false; this.subtitleAutoSaveDisabled = false;
console.log('🔓 Subtitle auto-save RE-ENABLED after initial load period'); console.log('🔓 Subtitle auto-save RE-ENABLED after initial load period');
}, 10000); }, 3000);
// Apply volume and mute state // Apply volume and mute state
if (typeof prefs.volume === 'number' && prefs.volume >= 0 && prefs.volume <= 1) { if (typeof prefs.volume === 'number' && prefs.volume >= 0 && prefs.volume <= 1) {
@ -270,7 +279,7 @@ class UserPreferences {
// Extract language from the clicked item // Extract language from the clicked item
setTimeout(() => { setTimeout(() => {
this.detectActiveSubtitleFromDOM(player); this.detectActiveSubtitleFromDOM(player, true); // Force set for user clicks
}, 200); }, 200);
} }
@ -278,7 +287,7 @@ class UserPreferences {
if (target.closest('.vjs-menu-item') && target.textContent.toLowerCase().includes('off')) { if (target.closest('.vjs-menu-item') && target.textContent.toLowerCase().includes('off')) {
console.log('Captions off clicked via DOM listener'); console.log('Captions off clicked via DOM listener');
setTimeout(() => { setTimeout(() => {
this.setPreference('subtitleLanguage', null); this.setPreference('subtitleLanguage', null, true); // Force set for user clicks
}, 200); }, 200);
} }
}); });
@ -291,8 +300,9 @@ class UserPreferences {
/** /**
* Detect active subtitle from DOM and text tracks * Detect active subtitle from DOM and text tracks
* @param {Object} player - Video.js player instance * @param {Object} player - Video.js player instance
* @param {boolean} forceSet - Force set even if auto-save is disabled
*/ */
detectActiveSubtitleFromDOM(player) { detectActiveSubtitleFromDOM(player, forceSet = false) {
// Skip saving if we're currently restoring subtitles // Skip saving if we're currently restoring subtitles
if (this.isRestoringSubtitles) { if (this.isRestoringSubtitles) {
console.log('Skipping DOM subtitle save - currently restoring preferences'); console.log('Skipping DOM subtitle save - currently restoring preferences');
@ -311,7 +321,7 @@ class UserPreferences {
} }
} }
this.setPreference('subtitleLanguage', activeLanguage); this.setPreference('subtitleLanguage', activeLanguage, forceSet);
} }
/** /**
@ -342,10 +352,10 @@ class UserPreferences {
setTimeout(() => { setTimeout(() => {
if (track.mode === 'showing') { if (track.mode === 'showing') {
console.log('Saving subtitle preference:', track.language); console.log('Saving subtitle preference:', track.language);
this.setPreference('subtitleLanguage', track.language); this.setPreference('subtitleLanguage', track.language, true); // Force set for user clicks
} else { } else {
console.log('Subtitle disabled, saving null'); console.log('Subtitle disabled, saving null');
this.setPreference('subtitleLanguage', null); this.setPreference('subtitleLanguage', null, true); // Force set for user clicks
} }
}, 100); }, 100);
}; };
@ -359,7 +369,7 @@ class UserPreferences {
setTimeout(() => { setTimeout(() => {
console.log('Saving subtitle preference: null (off)'); console.log('Saving subtitle preference: null (off)');
this.setPreference('subtitleLanguage', null); this.setPreference('subtitleLanguage', null, true); // Force set for user clicks
}, 100); }, 100);
}; };
} }
@ -382,6 +392,7 @@ class UserPreferences {
if (savedLanguage) { 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);
// Multiple attempts with increasing delays to ensure text tracks are loaded // Multiple attempts with increasing delays to ensure text tracks are loaded
const attemptToApplySubtitles = (attempt = 1) => { const attemptToApplySubtitles = (attempt = 1) => {
@ -423,7 +434,7 @@ class UserPreferences {
setTimeout(() => { setTimeout(() => {
this.isRestoringSubtitles = false; this.isRestoringSubtitles = false;
console.log('✅ Subtitle restoration complete, auto-save re-enabled'); console.log('✅ Subtitle restoration complete, auto-save re-enabled');
}, 3000); // Increased to 3 seconds }, 600); // Increased to 3 seconds
// If not found and we haven't tried too many times, try again // If not found and we haven't tried too many times, try again
if (!found && attempt < 5) { if (!found && attempt < 5) {