commit ec216264b12f8b3a8504e66d5a13f908634e3ecd Author: Tronax Date: Thu May 14 00:10:32 2026 +0200 First Commit, Code by Claude 4.7 Opus diff --git a/content.js b/content.js new file mode 100644 index 0000000..ae04667 --- /dev/null +++ b/content.js @@ -0,0 +1,47 @@ +let gainNode = null; +let audioCtx = null; +let sourceMap = new WeakMap(); + +function setVolume(percent) { + const factor = percent / 100; + document.querySelectorAll('video, audio').forEach(el => { + if (!sourceMap.has(el)) { + if (!audioCtx) { + audioCtx = new AudioContext(); + } + try { + const src = audioCtx.createMediaElementSource(el); + const gain = audioCtx.createGain(); + src.connect(gain); + gain.connect(audioCtx.destination); + sourceMap.set(el, gain); + } catch (e) { + // Element bereits in einem anderen Context + return; + } + } + sourceMap.get(el).gain.value = factor; + }); +} + +// Beim Laden: gespeicherten Wert anwenden +chrome.storage.local.get('volume', ({ volume }) => { + if (volume !== undefined) setVolume(volume); +}); + +// Auf Nachrichten vom Popup hören +chrome.runtime.onMessage.addListener(({ volume }) => { + if (volume !== undefined) setVolume(volume); +}); + +// Neue Media-Elemente automatisch erfassen +const observer = new MutationObserver(() => { + chrome.storage.local.get('volume', ({ volume }) => { + if (volume !== undefined && volume !== 100) { + setVolume(volume); + } + }); +}); +observer.observe(document.body, { + childList: true, subtree: true +}); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..1db0585 --- /dev/null +++ b/manifest.json @@ -0,0 +1,17 @@ +{ + "manifest_version": 3, + "name": "Volume Booster", + "version": "1.0", + "description": "Boost audio up to 600%", + "permissions": ["activeTab", "storage"], + "action": { + "default_popup": "popup.html", + "default_title": "Volume Booster" + }, + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"] + } + ] +} diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..3b5998d --- /dev/null +++ b/popup.html @@ -0,0 +1,69 @@ + + + + + + + +

VOLUME BOOSTER

+
+ 100% +
+ +
+ 0% + 200% + 400% + 600% +
+ + + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..90a065f --- /dev/null +++ b/popup.js @@ -0,0 +1,38 @@ +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 }); + } + ); +});