const input = document.getElementById("channelInput"); const linkInput = document.getElementById("channelLinkInput"); const addBtn = document.getElementById("addBtn"); const list = document.getElementById("channelList"); const debugToggle = document.getElementById("debugToggle"); const resetBtn = document.getElementById("resetBtn"); const DEFAULTS = { whitelist: [], debug: false }; function loadChannels() { chrome.storage.local.get(DEFAULTS, ({ whitelist, debug }) => { list.innerHTML = ""; debugToggle.checked = Boolean(debug); const entries = normalizeWhitelist(whitelist); entries.forEach((entry, index) => { const li = document.createElement("li"); const text = entry.handle ? `${entry.name} (@${entry.handle})` : entry.name; li.textContent = text; const remove = document.createElement("button"); remove.textContent = "x"; remove.onclick = () => removeChannel(index); li.appendChild(remove); list.appendChild(li); }); }); } function addChannel() { const name = input.value.trim(); const link = linkInput.value.trim(); if (!name || !link) return; const handle = normalizeHandle(link); if (!handle) return; chrome.storage.local.get(DEFAULTS, ({ whitelist }) => { const entries = normalizeWhitelist(whitelist); entries.push({ name, handle }); chrome.storage.local.set({ whitelist: entries }, loadChannels); }); input.value = ""; linkInput.value = ""; } function normalizeWhitelist(whitelist) { return (whitelist || []).map(item => { if (typeof item === "string") { return { name: item, handle: "" }; } return { name: item.name || "", handle: item.handle || "" }; }); } function removeChannel(index) { chrome.storage.local.get(DEFAULTS, ({ whitelist }) => { const entries = normalizeWhitelist(whitelist); entries.splice(index, 1); chrome.storage.local.set({ whitelist: entries }, loadChannels); }); } function setDebug(enabled) { chrome.storage.local.set({ debug: Boolean(enabled) }); } function resetDefaults() { chrome.storage.local.set(DEFAULTS, loadChannels); } function normalizeHandle(value) { const atMatch = value.match(/@([^/?#]+)/); if (atMatch) return atMatch[1].trim(); const clean = value.replace(/^https?:\/\//i, "").trim(); const urlMatch = clean.match(/youtube\.com\/@([^/?#]+)/i); if (urlMatch) return urlMatch[1].trim(); return ""; } addBtn.onclick = addChannel; debugToggle.onchange = e => setDebug(e.target.checked); resetBtn.onclick = resetDefaults; loadChannels();