From 08ce689f4cc8b273ddf93538445dc8151341267a Mon Sep 17 00:00:00 2001 From: Timo <6156589+Shik3i@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:07:34 +0200 Subject: [PATCH] move all prefs from sync to local storage (audio, filter, autosync, etc.) --- extension/audio-options.js | 11 ++++-- extension/background.js | 17 ++++++--- extension/content.js | 23 +++++++++-- extension/popup.js | 67 ++++++++++++--------------------- scripts/test-audio-settings.mjs | 4 ++ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/extension/audio-options.js b/extension/audio-options.js index ed72a4a..a45d4fa 100644 --- a/extension/audio-options.js +++ b/extension/audio-options.js @@ -61,7 +61,7 @@ function mergeAudioSettings(settings = {}) { function debounceSave() { if (saveTimer) clearTimeout(saveTimer); saveTimer = setTimeout(() => { - chrome.storage.sync.set({ audioSettings: currentSettings }); + chrome.storage.local.set({ audioSettings: currentSettings }); }, 40); } @@ -126,12 +126,17 @@ function setCustomParam(param, value) { } async function init() { + let audioData = (await chrome.storage.local.get(['audioSettings'])).audioSettings; const syncData = await chrome.storage.sync.get(['audioSettings', 'locale']); + if (!audioData && syncData.audioSettings) { + audioData = syncData.audioSettings; + await chrome.storage.local.set({ audioSettings: audioData }); + } const lang = syncData.locale || getSystemLanguage(); await loadLocale(lang); translateDOM(); - currentSettings = mergeAudioSettings(syncData.audioSettings); + currentSettings = mergeAudioSettings(audioData); render(); } @@ -174,7 +179,7 @@ elements.controlRows.forEach(row => { }); chrome.storage.onChanged.addListener((changes, area) => { - if (area !== 'sync' || !changes.audioSettings) return; + if (area !== 'local' || !changes.audioSettings) return; currentSettings = mergeAudioSettings(changes.audioSettings.newValue); render(); }); diff --git a/extension/background.js b/extension/background.js index 547f270..eff941f 100644 --- a/extension/background.js +++ b/extension/background.js @@ -591,7 +591,7 @@ function updateBadgeStatus() { } function showNotification(senderName, action) { - chrome.storage.sync.get(['browserNotifications', 'locale'], async (settings) => { + chrome.storage.local.get(['browserNotifications', 'locale'], async (settings) => { if (!settings.browserNotifications) return; const lang = settings.locale || getSystemLanguage(); @@ -764,7 +764,7 @@ function handleServerEvent(event, data) { isConnecting = false; broadcastConnectionStatus('disconnected'); addLog(`Server Error: ${data.message}`, 'error'); - chrome.storage.sync.get(['locale'], async (settings) => { + chrome.storage.local.get(['locale'], async (settings) => { const lang = settings.locale || getSystemLanguage(); await loadLocale(lang); chrome.notifications.create(`error_${Date.now()}`, { @@ -1096,7 +1096,7 @@ function cancelEpisodeLobby(reason) { }; // Chrome notification on failure (per Q2: only notify on failure) - chrome.storage.sync.get(['browserNotifications', 'locale'], async (settings) => { + chrome.storage.local.get(['browserNotifications', 'locale'], async (settings) => { if (!settings.browserNotifications) return; const lang = settings.locale || getSystemLanguage(); @@ -1299,7 +1299,14 @@ function resetAudioProcessingInTab(tabId) { async function applyAudioSettingsToTab(tabId) { if (!tabId) return; - const data = await chrome.storage.sync.get(['audioSettings']); + let data = (await chrome.storage.local.get(['audioSettings'])); + if (!data.audioSettings) { + const syncData = await chrome.storage.sync.get(['audioSettings']); + if (syncData.audioSettings) { + data = syncData; + await chrome.storage.local.set({ audioSettings: syncData.audioSettings }); + } + } chrome.tabs.sendMessage(tabId, { action: 'APPLY_AUDIO_SETTINGS', settings: data.audioSettings @@ -1661,7 +1668,7 @@ async function handleAsyncMessage(message, sender, sendResponse) { } // Check setting - const epSettings = await chrome.storage.sync.get(['autoSyncNextEpisode']); + const epSettings = await chrome.storage.local.get(['autoSyncNextEpisode']); if (epSettings.autoSyncNextEpisode === false) { addLog(`Episode change detected ("${newTitle}") but Auto-Sync is disabled.`, 'info'); sendResponse({ status: 'disabled' }); diff --git a/extension/content.js b/extension/content.js index f4c9021..0fb6e5b 100644 --- a/extension/content.js +++ b/extension/content.js @@ -66,14 +66,31 @@ let _audioProcessingAllowed = true; // Cache the autoSyncNextEpisode setting - chrome.storage.sync.get(['autoSyncNextEpisode', 'audioSettings'], (data) => { - _autoSyncEnabled = data.autoSyncNextEpisode !== false; // default: enabled + chrome.storage.local.get(['autoSyncNextEpisode', 'audioSettings'], (data) => { + if (data.autoSyncNextEpisode === undefined || data.audioSettings === undefined) { + chrome.storage.sync.get(['autoSyncNextEpisode', 'audioSettings'], (syncData) => { + const migrate = {}; + if (data.autoSyncNextEpisode === undefined && syncData.autoSyncNextEpisode !== undefined) { + migrate.autoSyncNextEpisode = syncData.autoSyncNextEpisode; + } + if (data.audioSettings === undefined && syncData.audioSettings !== undefined) { + migrate.audioSettings = syncData.audioSettings; + } + if (Object.keys(migrate).length) chrome.storage.local.set(migrate); + _autoSyncEnabled = syncData.autoSyncNextEpisode !== false; + _audioSettings = mergeAudioSettings(syncData.audioSettings); + const v = findVideo(); + if (v && _audioProcessingAllowed) applyAudioSettings(v, _audioSettings); + }); + return; + } + _autoSyncEnabled = data.autoSyncNextEpisode !== false; _audioSettings = mergeAudioSettings(data.audioSettings); const video = findVideo(); if (video && _audioProcessingAllowed) applyAudioSettings(video, _audioSettings); }); chrome.storage.onChanged.addListener((changes, area) => { - if (area === 'sync' && changes.autoSyncNextEpisode) { + if (area === 'local' && changes.autoSyncNextEpisode) { _autoSyncEnabled = changes.autoSyncNextEpisode.newValue !== false; } }); diff --git a/extension/popup.js b/extension/popup.js index cbf0819..6c6c630 100644 --- a/extension/popup.js +++ b/extension/popup.js @@ -172,31 +172,24 @@ function setRoomRefreshCooldown() { // --- Initialization --- async function init() { - // Load per-device settings (local) + synced preferences (sync) - const [localData, syncData] = await Promise.all([ - chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username']), - chrome.storage.sync.get(['filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings', 'dismissedHints']) - ]); - - // Migrate from sync → local for existing users - const hadLocalData = !!(localData.username || localData.roomId); - let syncHadData = false; - if (!hadLocalData) { - const oldSync = await chrome.storage.sync.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username']); - syncHadData = !!(oldSync.username || oldSync.roomId); - if (syncHadData) { - localData.serverUrl = oldSync.serverUrl; - localData.useCustomServer = oldSync.useCustomServer; - localData.roomId = oldSync.roomId; - localData.password = oldSync.password; - localData.username = oldSync.username; + const localData = await chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings']); + // Migrate preferences from sync → local for existing users + const oldSync = await chrome.storage.sync.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings']); + const toMigrate = {}; + for (const key of ['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings']) { + if (localData[key] === undefined && oldSync[key] !== undefined) { + toMigrate[key] = oldSync[key]; + localData[key] = oldSync[key]; } } + if (Object.keys(toMigrate).length) { + await chrome.storage.local.set(toMigrate); + } - let activeLang = syncData.locale; + let activeLang = localData.locale; if (!activeLang) { activeLang = getSystemLanguage(); - chrome.storage.sync.set({ locale: activeLang }); + chrome.storage.local.set({ locale: activeLang }); } await loadLocale(activeLang); @@ -209,26 +202,16 @@ async function init() { username = generateUsername(); await chrome.storage.local.set({ username }); } - if (syncHadData) { - // Persist migrated room data to local (one-time migration) - await chrome.storage.local.set({ - serverUrl: localData.serverUrl || '', - useCustomServer: localData.useCustomServer || false, - roomId: localData.roomId || '', - password: localData.password || '', - username - }); - } elements.serverUrl.value = localData.serverUrl || ''; elements.roomId.value = localData.roomId || ''; elements.password.value = localData.password || ''; elements.username.value = username; - if (elements.filterNoise) elements.filterNoise.checked = syncData.filterNoise !== false; - if (elements.autoSyncNextEpisode) elements.autoSyncNextEpisode.checked = syncData.autoSyncNextEpisode !== false; - if (elements.forceSyncMode) elements.forceSyncMode.value = syncData.forceSyncMode || 'jump-to-others'; - if (elements.browserNotifications) elements.browserNotifications.checked = syncData.browserNotifications === true; - if (elements.autoCopyInvite) elements.autoCopyInvite.checked = syncData.autoCopyInvite !== false; + if (elements.filterNoise) elements.filterNoise.checked = localData.filterNoise !== false; + if (elements.autoSyncNextEpisode) elements.autoSyncNextEpisode.checked = localData.autoSyncNextEpisode !== false; + if (elements.forceSyncMode) elements.forceSyncMode.value = localData.forceSyncMode || 'jump-to-others'; + if (elements.browserNotifications) elements.browserNotifications.checked = localData.browserNotifications === true; + if (elements.autoCopyInvite) elements.autoCopyInvite.checked = localData.autoCopyInvite !== false; // Set Version Info const versionTxt = `v${chrome.runtime.getManifest().version}`; @@ -668,7 +651,7 @@ async function populateTabs(providedPeers = null, providedTargetTabId = null) { const token = {}; populateTabsToken = token; - const data = await chrome.storage.sync.get(['filterNoise']); + const data = await chrome.storage.local.get(['filterNoise']); const isFilterActive = data.filterNoise !== false; let currentTargetTabId = providedTargetTabId; @@ -1007,22 +990,22 @@ elements.serverOfficial.addEventListener('click', () => setServerMode(false)); elements.serverCustom.addEventListener('click', () => setServerMode(true)); elements.filterNoise.addEventListener('change', () => { - chrome.storage.sync.set({ filterNoise: elements.filterNoise.checked }, () => { + chrome.storage.local.set({ filterNoise: elements.filterNoise.checked }, () => { populateTabs(); }); }); elements.autoSyncNextEpisode.addEventListener('change', () => { - chrome.storage.sync.set({ autoSyncNextEpisode: elements.autoSyncNextEpisode.checked }); + chrome.storage.local.set({ autoSyncNextEpisode: elements.autoSyncNextEpisode.checked }); }); elements.browserNotifications.addEventListener('change', () => { - chrome.storage.sync.set({ browserNotifications: elements.browserNotifications.checked }); + chrome.storage.local.set({ browserNotifications: elements.browserNotifications.checked }); }); if (elements.autoCopyInvite) { elements.autoCopyInvite.addEventListener('change', () => { - chrome.storage.sync.set({ autoCopyInvite: elements.autoCopyInvite.checked }); + chrome.storage.local.set({ autoCopyInvite: elements.autoCopyInvite.checked }); }); } @@ -1039,7 +1022,7 @@ chrome.storage.onChanged.addListener((changes, area) => { }); elements.forceSyncMode.addEventListener('change', () => { - chrome.storage.sync.set({ forceSyncMode: elements.forceSyncMode.value }); + chrome.storage.local.set({ forceSyncMode: elements.forceSyncMode.value }); }); elements.serverUrl.addEventListener('input', () => { @@ -1053,7 +1036,7 @@ elements.username.addEventListener('change', () => { if (elements.langSelector) { elements.langSelector.addEventListener('change', async () => { const selectedLang = elements.langSelector.value; - await chrome.storage.sync.set({ locale: selectedLang }); + await chrome.storage.local.set({ locale: selectedLang }); await loadLocale(selectedLang); translateDOM(); configureFooterLinks(); diff --git a/scripts/test-audio-settings.mjs b/scripts/test-audio-settings.mjs index 710f601..1b5c473 100644 --- a/scripts/test-audio-settings.mjs +++ b/scripts/test-audio-settings.mjs @@ -50,6 +50,10 @@ const sandbox = { get: async () => ({}), set: () => {}, }, + local: { + get: async () => ({}), + set: () => {}, + }, onChanged: { addListener: () => {} }