commit 4f7af6d768569de055c5910f4ff420048d7d625d Author: yesBad Date: Sun Sep 28 10:47:26 2025 +0300 init working diff --git a/background.js b/background.js new file mode 100644 index 0000000..257c4c5 --- /dev/null +++ b/background.js @@ -0,0 +1,2 @@ +// Empty for now, but required for manifest v3 service_worker. +// Can be used later for global state or context menu. diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..5a0a22c --- /dev/null +++ b/manifest.json @@ -0,0 +1,17 @@ +{ + "manifest_version": 3, + "name": "YT Volume Slider", + "version": "1.0", + "description": "very fancy, very nice", + "permissions": [ + "activeTab", + "scripting" + ], + "action": { + "default_popup": "popup.html", + "default_title": "Volume Slider" + }, + "background": { + "service_worker": "background.js" + } +} \ No newline at end of file diff --git a/page_script.js b/page_script.js new file mode 100644 index 0000000..9d90b15 --- /dev/null +++ b/page_script.js @@ -0,0 +1,29 @@ +// page_script.js - runs inside the page context + +chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { + if (msg.action === "setVolume") { + const player = document.querySelector(".html5-video-player"); + if (player && typeof player.setVolume === "function") { + player.setVolume(msg.volume); + } else { + const video = document.querySelector("video"); + if (video) video.volume = Math.max(0, Math.min(1, msg.volume / 100)); + } + sendResponse({ ok: true }); + } + + if (msg.action === "getVolume") { + let v = null; + const player = document.querySelector(".html5-video-player"); + if (player && typeof player.getVolume === "function") { + v = player.getVolume(); + } else { + const video = document.querySelector("video"); + if (video && typeof video.volume === "number") { + v = Math.round(video.volume * 100); + } + } + sendResponse({ volume: v }); + } + return true; // async safe +}); diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..d6d1184 --- /dev/null +++ b/popup.html @@ -0,0 +1,18 @@ + + + + + Volume Slider + + + + + + + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..880cfd0 --- /dev/null +++ b/popup.js @@ -0,0 +1,40 @@ +const slider = document.getElementById("slider"); +const val = document.getElementById("val"); + +slider.addEventListener("input", () => { + val.textContent = slider.value; +}); + +slider.addEventListener("change", async () => { + const volume = Number(slider.value); + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + if (!tab?.id) return; + + // Ensure page_script.js is injected + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + files: ["page_script.js"], + }); + + // Send message to the injected page script + chrome.tabs.sendMessage(tab.id, { action: "setVolume", volume }); +}); + +// Initialize with current volume +(async function init() { + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + if (!tab?.id) return; + + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + files: ["page_script.js"], + }); + + chrome.tabs.sendMessage(tab.id, { action: "getVolume" }, (response) => { + if (chrome.runtime.lastError) return; // ignore if no response + if (response && typeof response.volume === "number") { + slider.value = response.volume; + val.textContent = response.volume; + } + }); +})();