Add YouTube Music now-playing server, OBS overlay, and browser extension

Node.js server on port 9095 receives now-playing data via POST and broadcasts
to connected WebSocket clients. Includes a Firefox/Chrome extension that scrapes
YouTube Music's player bar every 3s, an OBS-ready transparent overlay with
animated equalizer bars, and an image proxy to bypass CDN restrictions in OBS.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 11:55:04 -07:00
co-authored by Claude Opus 4.6
parent 74bbf4e9b6
commit e36c4d1a74
9 changed files with 1563 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
// YTMusic Now Playing - Popup Script
(function () {
"use strict";
const DEFAULT_SERVER_URL = "http://localhost:9095";
const serverUrlInput = document.getElementById("serverUrl");
const saveBtn = document.getElementById("save");
const statusEl = document.getElementById("status");
function setStatus(message, type) {
statusEl.textContent = message;
statusEl.className = `status-${type}`;
}
// Load saved URL on popup open
chrome.storage.sync.get({ serverUrl: DEFAULT_SERVER_URL }, (result) => {
serverUrlInput.value = result.serverUrl;
checkConnection(result.serverUrl);
});
// Save button handler
saveBtn.addEventListener("click", () => {
const url = serverUrlInput.value.trim().replace(/\/+$/, "");
if (!url) {
setStatus("Please enter a valid URL.", "err");
return;
}
chrome.storage.sync.set({ serverUrl: url }, () => {
setStatus("Saved!", "ok");
checkConnection(url);
});
});
// Check connection to the server
async function checkConnection(url) {
try {
const response = await fetch(`${url}/api/now-playing`, {
method: "GET",
});
if (response.ok) {
setStatus("Connected to server.", "ok");
} else {
setStatus(`Server returned ${response.status}.`, "err");
}
} catch (err) {
setStatus("Cannot reach server.", "err");
}
}
})();