// 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://api.veltron.net/music"; 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/aero/"; 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 );