move all prefs from sync to local storage (audio, filter, autosync, etc.)

This commit is contained in:
Timo
2026-06-08 21:07:34 +02:00
parent bf48d1889b
commit 08ce689f4c
5 changed files with 69 additions and 53 deletions
+8 -3
View File
@@ -61,7 +61,7 @@ function mergeAudioSettings(settings = {}) {
function debounceSave() { function debounceSave() {
if (saveTimer) clearTimeout(saveTimer); if (saveTimer) clearTimeout(saveTimer);
saveTimer = setTimeout(() => { saveTimer = setTimeout(() => {
chrome.storage.sync.set({ audioSettings: currentSettings }); chrome.storage.local.set({ audioSettings: currentSettings });
}, 40); }, 40);
} }
@@ -126,12 +126,17 @@ function setCustomParam(param, value) {
} }
async function init() { async function init() {
let audioData = (await chrome.storage.local.get(['audioSettings'])).audioSettings;
const syncData = await chrome.storage.sync.get(['audioSettings', 'locale']); 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(); const lang = syncData.locale || getSystemLanguage();
await loadLocale(lang); await loadLocale(lang);
translateDOM(); translateDOM();
currentSettings = mergeAudioSettings(syncData.audioSettings); currentSettings = mergeAudioSettings(audioData);
render(); render();
} }
@@ -174,7 +179,7 @@ elements.controlRows.forEach(row => {
}); });
chrome.storage.onChanged.addListener((changes, area) => { chrome.storage.onChanged.addListener((changes, area) => {
if (area !== 'sync' || !changes.audioSettings) return; if (area !== 'local' || !changes.audioSettings) return;
currentSettings = mergeAudioSettings(changes.audioSettings.newValue); currentSettings = mergeAudioSettings(changes.audioSettings.newValue);
render(); render();
}); });
+12 -5
View File
@@ -591,7 +591,7 @@ function updateBadgeStatus() {
} }
function showNotification(senderName, action) { function showNotification(senderName, action) {
chrome.storage.sync.get(['browserNotifications', 'locale'], async (settings) => { chrome.storage.local.get(['browserNotifications', 'locale'], async (settings) => {
if (!settings.browserNotifications) return; if (!settings.browserNotifications) return;
const lang = settings.locale || getSystemLanguage(); const lang = settings.locale || getSystemLanguage();
@@ -764,7 +764,7 @@ function handleServerEvent(event, data) {
isConnecting = false; isConnecting = false;
broadcastConnectionStatus('disconnected'); broadcastConnectionStatus('disconnected');
addLog(`Server Error: ${data.message}`, 'error'); 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(); const lang = settings.locale || getSystemLanguage();
await loadLocale(lang); await loadLocale(lang);
chrome.notifications.create(`error_${Date.now()}`, { chrome.notifications.create(`error_${Date.now()}`, {
@@ -1096,7 +1096,7 @@ function cancelEpisodeLobby(reason) {
}; };
// Chrome notification on failure (per Q2: only notify on failure) // 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; if (!settings.browserNotifications) return;
const lang = settings.locale || getSystemLanguage(); const lang = settings.locale || getSystemLanguage();
@@ -1299,7 +1299,14 @@ function resetAudioProcessingInTab(tabId) {
async function applyAudioSettingsToTab(tabId) { async function applyAudioSettingsToTab(tabId) {
if (!tabId) return; 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, { chrome.tabs.sendMessage(tabId, {
action: 'APPLY_AUDIO_SETTINGS', action: 'APPLY_AUDIO_SETTINGS',
settings: data.audioSettings settings: data.audioSettings
@@ -1661,7 +1668,7 @@ async function handleAsyncMessage(message, sender, sendResponse) {
} }
// Check setting // Check setting
const epSettings = await chrome.storage.sync.get(['autoSyncNextEpisode']); const epSettings = await chrome.storage.local.get(['autoSyncNextEpisode']);
if (epSettings.autoSyncNextEpisode === false) { if (epSettings.autoSyncNextEpisode === false) {
addLog(`Episode change detected ("${newTitle}") but Auto-Sync is disabled.`, 'info'); addLog(`Episode change detected ("${newTitle}") but Auto-Sync is disabled.`, 'info');
sendResponse({ status: 'disabled' }); sendResponse({ status: 'disabled' });
+20 -3
View File
@@ -66,14 +66,31 @@
let _audioProcessingAllowed = true; let _audioProcessingAllowed = true;
// Cache the autoSyncNextEpisode setting // Cache the autoSyncNextEpisode setting
chrome.storage.sync.get(['autoSyncNextEpisode', 'audioSettings'], (data) => { chrome.storage.local.get(['autoSyncNextEpisode', 'audioSettings'], (data) => {
_autoSyncEnabled = data.autoSyncNextEpisode !== false; // default: enabled 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); _audioSettings = mergeAudioSettings(data.audioSettings);
const video = findVideo(); const video = findVideo();
if (video && _audioProcessingAllowed) applyAudioSettings(video, _audioSettings); if (video && _audioProcessingAllowed) applyAudioSettings(video, _audioSettings);
}); });
chrome.storage.onChanged.addListener((changes, area) => { chrome.storage.onChanged.addListener((changes, area) => {
if (area === 'sync' && changes.autoSyncNextEpisode) { if (area === 'local' && changes.autoSyncNextEpisode) {
_autoSyncEnabled = changes.autoSyncNextEpisode.newValue !== false; _autoSyncEnabled = changes.autoSyncNextEpisode.newValue !== false;
} }
}); });
+25 -42
View File
@@ -172,31 +172,24 @@ function setRoomRefreshCooldown() {
// --- Initialization --- // --- Initialization ---
async function init() { async function init() {
// Load per-device settings (local) + synced preferences (sync) const localData = await chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings']);
const [localData, syncData] = await Promise.all([ // Migrate preferences from sync → local for existing users
chrome.storage.local.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username']), const oldSync = await chrome.storage.sync.get(['serverUrl', 'useCustomServer', 'roomId', 'password', 'username', 'filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings']);
chrome.storage.sync.get(['filterNoise', 'autoSyncNextEpisode', 'forceSyncMode', 'browserNotifications', 'autoCopyInvite', 'locale', 'audioSettings', 'dismissedHints']) 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) {
// Migrate from sync → local for existing users toMigrate[key] = oldSync[key];
const hadLocalData = !!(localData.username || localData.roomId); localData[key] = oldSync[key];
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;
} }
} }
if (Object.keys(toMigrate).length) {
await chrome.storage.local.set(toMigrate);
}
let activeLang = syncData.locale; let activeLang = localData.locale;
if (!activeLang) { if (!activeLang) {
activeLang = getSystemLanguage(); activeLang = getSystemLanguage();
chrome.storage.sync.set({ locale: activeLang }); chrome.storage.local.set({ locale: activeLang });
} }
await loadLocale(activeLang); await loadLocale(activeLang);
@@ -209,26 +202,16 @@ async function init() {
username = generateUsername(); username = generateUsername();
await chrome.storage.local.set({ username }); 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.serverUrl.value = localData.serverUrl || '';
elements.roomId.value = localData.roomId || ''; elements.roomId.value = localData.roomId || '';
elements.password.value = localData.password || ''; elements.password.value = localData.password || '';
elements.username.value = username; elements.username.value = username;
if (elements.filterNoise) elements.filterNoise.checked = syncData.filterNoise !== false; if (elements.filterNoise) elements.filterNoise.checked = localData.filterNoise !== false;
if (elements.autoSyncNextEpisode) elements.autoSyncNextEpisode.checked = syncData.autoSyncNextEpisode !== false; if (elements.autoSyncNextEpisode) elements.autoSyncNextEpisode.checked = localData.autoSyncNextEpisode !== false;
if (elements.forceSyncMode) elements.forceSyncMode.value = syncData.forceSyncMode || 'jump-to-others'; if (elements.forceSyncMode) elements.forceSyncMode.value = localData.forceSyncMode || 'jump-to-others';
if (elements.browserNotifications) elements.browserNotifications.checked = syncData.browserNotifications === true; if (elements.browserNotifications) elements.browserNotifications.checked = localData.browserNotifications === true;
if (elements.autoCopyInvite) elements.autoCopyInvite.checked = syncData.autoCopyInvite !== false; if (elements.autoCopyInvite) elements.autoCopyInvite.checked = localData.autoCopyInvite !== false;
// Set Version Info // Set Version Info
const versionTxt = `v${chrome.runtime.getManifest().version}`; const versionTxt = `v${chrome.runtime.getManifest().version}`;
@@ -668,7 +651,7 @@ async function populateTabs(providedPeers = null, providedTargetTabId = null) {
const token = {}; const token = {};
populateTabsToken = token; populateTabsToken = token;
const data = await chrome.storage.sync.get(['filterNoise']); const data = await chrome.storage.local.get(['filterNoise']);
const isFilterActive = data.filterNoise !== false; const isFilterActive = data.filterNoise !== false;
let currentTargetTabId = providedTargetTabId; let currentTargetTabId = providedTargetTabId;
@@ -1007,22 +990,22 @@ elements.serverOfficial.addEventListener('click', () => setServerMode(false));
elements.serverCustom.addEventListener('click', () => setServerMode(true)); elements.serverCustom.addEventListener('click', () => setServerMode(true));
elements.filterNoise.addEventListener('change', () => { elements.filterNoise.addEventListener('change', () => {
chrome.storage.sync.set({ filterNoise: elements.filterNoise.checked }, () => { chrome.storage.local.set({ filterNoise: elements.filterNoise.checked }, () => {
populateTabs(); populateTabs();
}); });
}); });
elements.autoSyncNextEpisode.addEventListener('change', () => { elements.autoSyncNextEpisode.addEventListener('change', () => {
chrome.storage.sync.set({ autoSyncNextEpisode: elements.autoSyncNextEpisode.checked }); chrome.storage.local.set({ autoSyncNextEpisode: elements.autoSyncNextEpisode.checked });
}); });
elements.browserNotifications.addEventListener('change', () => { elements.browserNotifications.addEventListener('change', () => {
chrome.storage.sync.set({ browserNotifications: elements.browserNotifications.checked }); chrome.storage.local.set({ browserNotifications: elements.browserNotifications.checked });
}); });
if (elements.autoCopyInvite) { if (elements.autoCopyInvite) {
elements.autoCopyInvite.addEventListener('change', () => { 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', () => { elements.forceSyncMode.addEventListener('change', () => {
chrome.storage.sync.set({ forceSyncMode: elements.forceSyncMode.value }); chrome.storage.local.set({ forceSyncMode: elements.forceSyncMode.value });
}); });
elements.serverUrl.addEventListener('input', () => { elements.serverUrl.addEventListener('input', () => {
@@ -1053,7 +1036,7 @@ elements.username.addEventListener('change', () => {
if (elements.langSelector) { if (elements.langSelector) {
elements.langSelector.addEventListener('change', async () => { elements.langSelector.addEventListener('change', async () => {
const selectedLang = elements.langSelector.value; const selectedLang = elements.langSelector.value;
await chrome.storage.sync.set({ locale: selectedLang }); await chrome.storage.local.set({ locale: selectedLang });
await loadLocale(selectedLang); await loadLocale(selectedLang);
translateDOM(); translateDOM();
configureFooterLinks(); configureFooterLinks();
+4
View File
@@ -50,6 +50,10 @@ const sandbox = {
get: async () => ({}), get: async () => ({}),
set: () => {}, set: () => {},
}, },
local: {
get: async () => ({}),
set: () => {},
},
onChanged: { onChanged: {
addListener: () => {} addListener: () => {}
} }