VELTRON.NET/javascript/nav-music.js
MattTheTekie fe3651c68a Fixes
2026-05-04 19:53:39 -04:00

195 lines
4.7 KiB
JavaScript

// Volume adjustment for audio elements
document.querySelectorAll("audio").forEach((audio) => {
audio.volume = 0.5;
});
// Shuffle Playlist (Fisher-Yates)
function fisherYatesShuffle(songs) {
for (let i = songs.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[songs[i], songs[j]] = [songs[j], songs[i]];
}
return songs;
}
// Load the JSON file containing music data directly from chat.veltron.net
async function loadMusicData() {
const targetUrl = "https://cdn.veltron.net/aero/data/music.json";
const response = await fetch(targetUrl);
if (!response.ok) {
console.error("Failed to fetch music data:", response.statusText);
return [];
}
const data = await response.json();
// Get the "frutigerAeroBliss" section from the JSON
const section = data.ols.find(
(item) => item["@id"] === "frutigerAeroBliss"
);
if (!section) {
console.error('Section "frutigerAeroBliss" not found.');
return [];
}
// Base domain only — preserve subfolders from data-src-mp3
const baseUrl = "https://cdn.veltron.net";
const playlist = section.li.map((item) => {
const rawPath = item.a["@data-src-mp3"] || "";
// Remove leading slash if present, preserve nested folders like music/maplememory/song.mp3
const normalizedPath = rawPath.replace(/^\/+/, "");
return {
title: item.a.title || "Unknown Title",
// Full path keeps subfolders instead of only filename
url: baseUrl + normalizedPath,
background: item.a["@data-background"] || "",
artist: item.a["@data-artist"] || "",
spotifyLink: item.a["@data-spotify"] || "",
youtubeLink: item.a["@data-youtube"] || "",
};
});
return fisherYatesShuffle(playlist);
}
// Define Music Player
const NAV_MUSIC = document.getElementById("navMusic");
const BUTTON_PLAY = document.getElementById("navMusicPlay");
const BUTTON_PAUSE = document.getElementById("navMusicPause");
const BUTTON_PREVIOUS = document.getElementById("navMusicPrevious");
const BUTTON_NEXT = document.getElementById("navMusicNext");
const CURRENT_SONG_INFO = document.getElementById("currentSongInfo");
let songs = [];
let currentIndex = 0;
let currentTime = 0;
let isPlaying = false;
// Save state
function saveState() {
sessionStorage.setItem("isPlaying", isPlaying);
}
// Load state
function loadState() {
const savedIsPlaying = sessionStorage.getItem("isPlaying");
if (savedIsPlaying !== null) {
isPlaying = savedIsPlaying === "true";
}
}
// Load song
function loadSong(index) {
if (index < 0 || index >= songs.length) return;
NAV_MUSIC.src = songs[index].url;
CURRENT_SONG_INFO.innerText = `Featured song: ${songs[index].title}`;
NAV_MUSIC.load();
}
// Update buttons
function updateButtonStates() {
if (isPlaying) {
BUTTON_PLAY.classList.add("active");
BUTTON_PAUSE.classList.remove("active");
} else {
BUTTON_PAUSE.classList.add("active");
BUTTON_PLAY.classList.remove("active");
}
}
// Play
BUTTON_PLAY.addEventListener("click", function () {
isPlaying = true;
NAV_MUSIC.play();
updateButtonStates();
saveState();
});
// Pause
BUTTON_PAUSE.addEventListener("click", function () {
isPlaying = false;
NAV_MUSIC.pause();
updateButtonStates();
saveState();
});
// Previous
BUTTON_PREVIOUS.addEventListener("click", function () {
currentIndex = currentIndex === 0 ? songs.length - 1 : currentIndex - 1;
currentTime = 0;
loadSong(currentIndex);
if (isPlaying) {
NAV_MUSIC.play();
}
updateButtonStates();
saveState();
});
// Next
BUTTON_NEXT.addEventListener("click", function () {
currentIndex = (currentIndex + 1) % songs.length;
currentTime = 0;
loadSong(currentIndex);
if (isPlaying) {
NAV_MUSIC.play();
}
updateButtonStates();
saveState();
});
// Autoplay next
NAV_MUSIC.addEventListener("ended", function () {
currentIndex = (currentIndex + 1) % songs.length;
currentTime = 0;
loadSong(currentIndex);
if (isPlaying) {
NAV_MUSIC.play();
}
saveState();
});
// Initial load
window.addEventListener("load", async () => {
songs = await loadMusicData();
if (songs.length > 0) {
loadState();
loadSong(currentIndex);
if (isPlaying) {
NAV_MUSIC.play();
}
updateButtonStates();
}
});
// Pause all other audio elements
document.addEventListener(
"play",
function (e) {
const audios = document.getElementsByTagName("audio");
for (let i = 0; i < audios.length; i++) {
if (audios[i] !== e.target) {
audios[i].pause();
}
}
},
true
);