184 lines
5.6 KiB
JavaScript
184 lines
5.6 KiB
JavaScript
<<<<<<< HEAD
|
|
const slider = document.getElementById('slider');
|
|
const display = document.getElementById('display');
|
|
const reset = document.getElementById('reset');
|
|
|
|
// Gespeicherten Wert laden
|
|
chrome.storage.local.get('volume', ({ volume }) => {
|
|
const val = volume ?? 100;
|
|
slider.value = val;
|
|
display.textContent = val;
|
|
});
|
|
|
|
// Schieberegler bewegen
|
|
slider.addEventListener('input', () => {
|
|
const val = parseInt(slider.value);
|
|
display.textContent = val;
|
|
chrome.storage.local.set({ volume: val });
|
|
|
|
// Aktiven Tab anweisen
|
|
chrome.tabs.query(
|
|
{ active: true, currentWindow: true },
|
|
([tab]) => {
|
|
chrome.tabs.sendMessage(tab.id, { volume: val });
|
|
}
|
|
);
|
|
});
|
|
|
|
// Zurücksetzen auf 100%
|
|
reset.addEventListener('click', () => {
|
|
slider.value = 100;
|
|
display.textContent = 100;
|
|
chrome.storage.local.set({ volume: 100 });
|
|
chrome.tabs.query(
|
|
{ active: true, currentWindow: true },
|
|
([tab]) => {
|
|
chrome.tabs.sendMessage(tab.id, { volume: 100 });
|
|
}
|
|
);
|
|
});
|
|
=======
|
|
// ============================================================
|
|
// Volume Booster — Popup Logic
|
|
// ============================================================
|
|
|
|
const slider = document.getElementById("slider");
|
|
const readout = document.getElementById("readoutValue");
|
|
const readoutBox = document.querySelector(".readout");
|
|
const badge = document.getElementById("statusBadge");
|
|
const siteLabel = document.getElementById("siteLabel");
|
|
const note = document.getElementById("note");
|
|
const btnUp = document.getElementById("btnUp");
|
|
const btnDown = document.getElementById("btnDown");
|
|
const btnMute = document.getElementById("btnMute");
|
|
const presets = document.querySelectorAll(".preset");
|
|
|
|
const STEP = 10; // Schrittweite in %
|
|
const MAX = 600;
|
|
let currentTab = null;
|
|
let lastBeforeMute = 100; // Wert vor dem Stummschalten
|
|
|
|
// ---- Tab ermitteln ----
|
|
async function init() {
|
|
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
|
|
currentTab = tab;
|
|
|
|
if (tab && tab.url) {
|
|
try {
|
|
siteLabel.textContent = new URL(tab.url).hostname;
|
|
} catch {
|
|
siteLabel.textContent = "aktiver Tab";
|
|
}
|
|
}
|
|
|
|
// Gespeicherten Wert für diesen Tab laden
|
|
const key = "vol_" + tab.id;
|
|
const stored = await chrome.storage.session.get(key);
|
|
const value = stored[key] != null ? stored[key] : 100;
|
|
|
|
applyUI(value);
|
|
// Falls vorher schon ein Boost lief: Zustand vom Worker holen
|
|
chrome.runtime.sendMessage({ type: "GET_STATE", tabId: tab.id }, (res) => {
|
|
if (res && res.ok && res.boosting) {
|
|
applyUI(Math.round(res.value * 100));
|
|
}
|
|
});
|
|
}
|
|
|
|
// ---- UI aktualisieren ----
|
|
function applyUI(value) {
|
|
value = Math.max(0, Math.min(MAX, value));
|
|
slider.value = value;
|
|
readout.textContent = value;
|
|
badge.textContent = value + "%";
|
|
|
|
const boosting = value > 100;
|
|
readoutBox.classList.toggle("boosting", boosting);
|
|
badge.classList.toggle("boosting", boosting);
|
|
|
|
btnMute.classList.toggle("active", value === 0);
|
|
|
|
presets.forEach((p) => {
|
|
p.classList.toggle("active", Number(p.dataset.v) === value);
|
|
});
|
|
}
|
|
|
|
// ---- Lautstärke setzen + an Worker senden ----
|
|
function setVolume(value) {
|
|
value = Math.max(0, Math.min(MAX, value));
|
|
applyUI(value);
|
|
|
|
if (!currentTab) return;
|
|
const key = "vol_" + currentTab.id;
|
|
chrome.storage.session.set({ [key]: value });
|
|
|
|
chrome.runtime.sendMessage(
|
|
{ type: "SET_VOLUME", tabId: currentTab.id, value: value / 100 },
|
|
(res) => {
|
|
if (res && res.ok) {
|
|
note.classList.remove("error");
|
|
note.textContent =
|
|
value > 100
|
|
? "Ton wird verstärkt — bei Verzerrung etwas zurückdrehen."
|
|
: value === 0
|
|
? "Tab ist stummgeschaltet."
|
|
: "Normale Lautstärke (kein Boost aktiv).";
|
|
} else {
|
|
note.classList.add("error");
|
|
const err = ((res && res.error) || "").toLowerCase();
|
|
if (err.includes("cannot be captured") || err.includes("invalid tab")) {
|
|
note.textContent =
|
|
"Dieser Tab kann nicht verstärkt werden (z. B. chrome:// oder Web Store).";
|
|
} else if (err.includes("activetab") || err.includes("permission")) {
|
|
note.textContent =
|
|
"Keine Berechtigung — Popup einmal schließen und neu öffnen.";
|
|
} else if (!res) {
|
|
note.textContent =
|
|
"Keine Antwort — Extension auf chrome://extensions neu laden.";
|
|
} else {
|
|
note.textContent = "Fehler beim Aktivieren — Seite ggf. neu laden.";
|
|
}
|
|
// Slider auf 100 zurück, da kein Boost aktiv ist
|
|
applyUI(100);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
// ---- Events ----
|
|
slider.addEventListener("input", () => {
|
|
applyUI(Number(slider.value));
|
|
});
|
|
slider.addEventListener("change", () => {
|
|
setVolume(Number(slider.value));
|
|
});
|
|
|
|
btnUp.addEventListener("click", () =>
|
|
setVolume(Number(slider.value) + STEP)
|
|
);
|
|
btnDown.addEventListener("click", () =>
|
|
setVolume(Number(slider.value) - STEP)
|
|
);
|
|
|
|
btnMute.addEventListener("click", () => {
|
|
const v = Number(slider.value);
|
|
if (v === 0) {
|
|
setVolume(lastBeforeMute || 100);
|
|
} else {
|
|
lastBeforeMute = v;
|
|
setVolume(0);
|
|
}
|
|
});
|
|
|
|
presets.forEach((p) => {
|
|
p.addEventListener("click", () => setVolume(Number(p.dataset.v)));
|
|
});
|
|
|
|
// Tastatur: Pfeile hoch/runter
|
|
document.addEventListener("keydown", (e) => {
|
|
if (e.key === "ArrowUp") { e.preventDefault(); setVolume(Number(slider.value) + STEP); }
|
|
if (e.key === "ArrowDown") { e.preventDefault(); setVolume(Number(slider.value) - STEP); }
|
|
});
|
|
|
|
init();
|
|
>>>>>>> 2056a0d (First Commit, Code by Claude 4.7 Opus)
|