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>
51 lines
1.4 KiB
JavaScript
51 lines
1.4 KiB
JavaScript
// 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");
|
|
}
|
|
}
|
|
})();
|