From ab04031fcd1ef12c20e2de803a8b3814a0b31ff6 Mon Sep 17 00:00:00 2001 From: uimaxbai <61615730+uimaxbai@users.noreply.github.com> Date: Tue, 30 Dec 2025 17:27:29 +0000 Subject: [PATCH] add legacy stuff --- legacy/getie3.gif | Bin 0 -> 19773 bytes legacy/getnet3.gif | Bin 0 -> 7970 bytes legacy/index.html | 81 ++++++++++++ legacy/legacy.css | 98 +++++++++++++++ legacy/legacy.js | 304 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 483 insertions(+) create mode 100644 legacy/getie3.gif create mode 100644 legacy/getnet3.gif create mode 100644 legacy/index.html create mode 100644 legacy/legacy.css create mode 100644 legacy/legacy.js diff --git a/legacy/getie3.gif b/legacy/getie3.gif new file mode 100644 index 0000000000000000000000000000000000000000..19a7353773b8dde3a00d145aa06f3a1089881695 GIT binary patch literal 19773 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 literal 0 HcmV?d00001 diff --git a/legacy/index.html b/legacy/index.html new file mode 100644 index 0000000..bdde588 --- /dev/null +++ b/legacy/index.html @@ -0,0 +1,81 @@ + + + + Monochrome Legacy + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Monochrome Music
+ music +
+ Welcome to Monochrome Music Legacy Edition check out the latest hits new songs added daily under construction sign guestbook +
+
+
Menu
+
+ +
+ +
+
+ IE Logo

+ Netscape Logo

+ Free and open software +
+
+
+ +
+ + Status: Ready to play. + +

+ +
+ + +
+ Search Music: +
+ + +
+
+ +
+

Loading...

+
+
+
+ + + diff --git a/legacy/legacy.css b/legacy/legacy.css new file mode 100644 index 0000000..095f2e0 --- /dev/null +++ b/legacy/legacy.css @@ -0,0 +1,98 @@ +/* Retro 90s Styling */ +body { + background-color: #c0c0c0; + font-family: "Times New Roman", Times, serif; + color: #000000; + margin: 0; + padding: 0; + background-image: url("assets/bg_texture.gif"); /* Fallback if not found is just grey */ +} + +a { + color: #000000; + text-decoration: underline; +} + +a:visited { + color: #444444; +} + +a:active { + color: #666666; +} + +h1, +h2, +h3 { + font-family: Arial, Helvetica, sans-serif; + margin-top: 5px; + margin-bottom: 5px; +} + +table { + border-collapse: collapse; /* Not strictly 90s but makes it cleaner */ +} + +.beveled-box { + border-top: 2px solid #ffffff; + border-left: 2px solid #ffffff; + border-right: 2px solid #808080; + border-bottom: 2px solid #808080; + background-color: #c0c0c0; + padding: 5px; +} + +.inset-box { + border-top: 2px solid #808080; + border-left: 2px solid #808080; + border-right: 2px solid #ffffff; + border-bottom: 2px solid #ffffff; + background-color: #ffffff; + padding: 2px; +} + +.marquee-container { + background-color: #000000; + color: #ffffff; + font-weight: bold; + font-family: "Courier New", Courier, monospace; + padding: 2px; + overflow: hidden; + white-space: nowrap; +} + +.sidebar-link { + display: block; + margin-bottom: 10px; +} + +.track-row td { + padding: 2px 5px; + border: 1px solid #808080; +} + +.controls { + text-align: center; + padding: 10px; + background-color: #a0a0a0; + border: 2px outset #ffffff; +} + +button { + background-color: #c0c0c0; + border-top: 2px solid #ffffff; + border-left: 2px solid #ffffff; + border-right: 2px solid #000000; + border-bottom: 2px solid #000000; + padding: 2px 10px; + font-family: Arial, sans-serif; + font-size: 12px; + cursor: pointer; +} + +button:active { + border-top: 2px solid #000000; + border-left: 2px solid #000000; + border-right: 2px solid #ffffff; + border-bottom: 2px solid #ffffff; +} diff --git a/legacy/legacy.js b/legacy/legacy.js new file mode 100644 index 0000000..1c5da55 --- /dev/null +++ b/legacy/legacy.js @@ -0,0 +1,304 @@ +// strictly ES5/Legacy JS +(function () { + var currentApiUrl = ""; // Will be set from instances.json + var isHttpFallback = false; + var FALLBACK_INSTANCES = [ + "https://triton.squid.wtf", + "https://wolf.qqdl.site", + "https://maus.qqdl.site", + "https://vogel.qqdl.site", + "https://katze.qqdl.site", + "https://hund.qqdl.site", + "https://tidal.kinoplus.online", + "https://tidal-api.binimum.org", + ]; + var audioPlayer; + var currentTrackInfo; + + window.onload = function () { + audioPlayer = document.getElementById("audio-player"); + currentTrackInfo = document.getElementById("now-playing-info"); + + fetchInstances(function (url) { + currentApiUrl = url; + loadRecentTracks(); + }); + + // Simple event delegation if we wanted, but explicit bindings are safer for old browsers + var btnHome = document.getElementById("btn-home"); + if (btnHome) { + btnHome.onclick = function () { + loadRecentTracks(); + return false; + }; + } + // Search button removed, using persistent form now + + var searchForm = document.getElementById("search-form"); + searchForm.onsubmit = function () { + var query = document.getElementById("search-input").value; + performSearch(query); + return false; + }; + }; + + function loadRecentTracks() { + setContent("Loading recent tracks..."); + apiRequest( + "/search/?s=a&limit=20", + function (data) { + if (data && data.data && data.data.items) { + renderTracks(data.data.items, "Recently Added / Popular"); + } else { + setContent("No recent tracks found."); + } + }, + function (err) { + setContent("Error loading tracks: " + err); + } + ); + } + + function fetchInstances(callback) { + var xhr = createXHR(); + xhr.open("GET", "instances.json", true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status >= 200 && xhr.status < 300) { + try { + var instances = JSON.parse(xhr.responseText); + if (instances && instances.length > 0) { + var randomUrl = + instances[Math.floor(Math.random() * instances.length)]; + // Remove trailing slash if present + if (randomUrl.charAt(randomUrl.length - 1) === "/") { + randomUrl = randomUrl.substring(0, randomUrl.length - 1); + } + callback(randomUrl); + } else { + useFallback(callback); + } + } catch (e) { + useFallback(callback); + } + } else { + useFallback(callback); + } + } + }; + xhr.onerror = function () { + useFallback(callback); + }; + xhr.send(); + } + + function useFallback(callback) { + var randomUrl = + FALLBACK_INSTANCES[Math.floor(Math.random() * FALLBACK_INSTANCES.length)]; + callback(randomUrl); + } + + function performSearch(query) { + var resultsDiv = document.getElementById("search-results"); + if (!resultsDiv) { + setContent('

Searching...
'); + resultsDiv = document.getElementById("search-results"); + } else { + resultsDiv.innerHTML = "Searching..."; + } + + apiRequest( + "/search/?s=" + encodeURIComponent(query) + "&limit=25", + function (data) { + var tracks = (data && data.data && data.data.items) ? data.data.items : []; + if (tracks.length === 0) { + resultsDiv.innerHTML = "No results found."; + return; + } + // Manually render table string to avoid complex DOM manipulation + var html = + ''; + html += + ''; + + for (var i = 0; i < tracks.length; i++) { + var t = tracks[i]; + var safeTitle = escapeHtml(t.title); + var safeArtist = escapeHtml(t.artist.name); + var safeAlbum = escapeHtml(t.album.title); + + html += ''; + html += + '"; + html += ""; + html += ""; + html += ""; + html += ""; + } + html += "
PlayTitleArtistAlbum
" + safeTitle + "" + safeArtist + "" + safeAlbum + "
"; + + resultsDiv.innerHTML = html; + }, + function (err) { + resultsDiv.innerHTML = "Error: " + err; + } + ); + } + + function renderTracks(tracks, title) { + var html = "

" + title + "

"; + html += ''; + html += + ''; + + for (var i = 0; i < tracks.length; i++) { + var t = tracks[i]; + var safeTitle = escapeHtml(t.title); + var safeArtist = escapeHtml(t.artist.name); + var safeAlbum = escapeHtml(t.album.title); + + html += ''; + html += + '"; + html += ""; + html += ""; + html += ""; + html += ""; + } + html += "
PlayTitleArtistAlbum
" + safeTitle + "" + safeArtist + "" + safeAlbum + "
"; + + setContent(html); + } + + // Global player function + window.playTrack = function (id) { + apiRequest( + "/track/?id=" + id + "&quality=HIGH", + function (data) { + if (data && data.data && data.data.manifest) { + try { + // Manifest is Base64 encoded JSON + var manifestStr = base64Decode(data.data.manifest); + var manifest = JSON.parse(manifestStr); + if (manifest.urls && manifest.urls.length > 0) { + audioPlayer.src = manifest.urls[0]; + audioPlayer.play(); + + if (currentTrackInfo) { + // We don't get full track info in playback response easily without another call or passing it, + // but for legacy we might accept just "Now Playing..." or maybe we pass it? + // For now simplicity: + currentTrackInfo.innerHTML = "Now Playing..."; + } + } else { + alert("No stream URLs found in manifest."); + } + } catch (e) { + alert("Error parsing playback manifest: " + e.message); + } + } else { + alert("Invalid track data received."); + } + }, + function (err) { + alert("Error playing track: " + err); + } + ); + }; + + function setContent(html) { + var content = document.getElementById("main-content"); + content.innerHTML = html; + } + + function apiRequest(endpoint, success, error) { + var xhr = createXHR(); + // Use fallback HTTP if needed logic + var finalUrl = currentApiUrl; + if (isHttpFallback && finalUrl.indexOf("https://") === 0) { + finalUrl = "http://" + finalUrl.substring(8); + } + + xhr.open("GET", finalUrl + endpoint, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status >= 200 && xhr.status < 300) { + try { + var data = JSON.parse(xhr.responseText); + success(data); + } catch (e) { + error("JSON Parse Error"); + } + } else { + // If failed and not yet fallback, try fallback + if(!isHttpFallback) { + isHttpFallback = true; + apiRequest(endpoint, success, error); + } else { + error("HTTP " + xhr.status); + } + } + } + }; + xhr.onerror = function () { + if(!isHttpFallback) { + isHttpFallback = true; + apiRequest(endpoint, success, error); + } else { + error("Network Error"); + } + }; + xhr.send(); + } + + function escapeHtml(text) { + if (!text) return ""; + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } + + function createXHR() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } + // IE5/6 support + try { + return new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) {} + try { + return new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e) {} + alert("Your browser does not support AJAX!"); + return null; + } + + function base64Decode(str) { + if (window.atob) { + return window.atob(str); + } + // Polyfill for IE + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var output = ""; + str = String(str).replace(/=+$/, ''); + if (str.length % 4 == 1) { + throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); + } + for ( + var bc = 0, bs = 0, buffer, i = 0; + buffer = str.charAt(i++); + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + buffer = chars.indexOf(buffer); + } + return output; + } +})();