document.addEventListener('DOMContentLoaded', function() {
const audio = document.getElementById('spinitronAudioPlayer');
const playButton = document.getElementById('spinitronPlayButton');
let updateInterval;
let statusInterval;
let currentSpinId = null;
let currentEndTime = null;
// Update metadata from the API
function updateMetadata() {
try {
const response = await fetch(spinitronConfig.endpoint);
const data = await response.json();
if (data.status === 'ok') {
// Update song metadata links
const songTitle = document.getElementById('spinitronSongTitle');
songTitle.textContent = data.spin_data.song || '-';
songTitle.href = `https://spinitron.com/WVAU/spin/${data.spin_data.id}`;
const artistLink = document.getElementById('spinitronArtist');
artistLink.textContent = data.spin_data.artist || '-';
artistLink.href = `https://spinitron.com/WVAU/artist/${encodeURIComponent(data.spin_data.artist)}`;
const releaseLink = document.getElementById('spinitronRelease');
releaseLink.textContent = data.spin_data.release || '-';
releaseLink.href = `https://spinitron.com/WVAU/release/${encodeURIComponent(data.spin_data.release)}`;
// Update show metadata links
const showTitle = document.getElementById('spinitronShowTitle');
showTitle.textContent = data.playlist_data.title || '-';
showTitle.href = `https://spinitron.com/WVAU/playlist/${data.playlist_data.id}`;
const episodeLink = document.getElementById('spinitronEpisode');
episodeLink.textContent = data.playlist_data.episode_name || '-';
episodeLink.href = `https://spinitron.com/WVAU/playlist/${data.playlist_data.id}`;
}
} catch (error) {
console.error('Error fetching metadata:', error);
}
}
// Update the "NOW PLAYING" / "LAST PLAYED" status labels
function updateStatusLabels() {
if (!currentEndTime) return;
const now = Date.now();
const endTime = currentEndTime.getTime();
const secondsSinceEnd = (now - endTime) / 1000;
const labels = document.querySelectorAll('.spinitron-now-playing');
labels.forEach(label => {
if (secondsSinceEnd > 60) {
label.textContent = 'LAST PLAYED (?)';
label.style.color = '#ff4444';
} else if (secondsSinceEnd > 30) {
label.textContent = 'LAST PLAYED';
label.style.color = '#ffa500';
} else {
label.textContent = 'NOW PLAYING';
label.style.color = '#888';
}
});
}
// Toggle audio playback
function togglePlayback() {
if (audio.paused) {
audio.play().catch(error => console.error('Audio playback failed:', error));
playButton.innerHTML = '⏸ Pause';
updateMetadata();
updateInterval = setInterval(updateMetadata, spinitronConfig.cacheDuration);
} else {
audio.pause();
playButton.innerHTML = '▶ Play';
clearInterval(updateInterval);
}
}
// Initial metadata check
updateMetadata();
// Event listeners
playButton.addEventListener('click', togglePlayback);
// Handle audio ending
audio.addEventListener('ended', () => {
playButton.innerHTML = '▶ Play';
clearInterval(updateInterval);
});
// Auto-update metadata when tab becomes visible
document.addEventListener('visibilitychange', () => {
if (!document.hidden) {
updateMetadata();
updateStatusLabels();
}
});
});
// Recently Played Marquee Updates
async function updateRecentlyPlayed() {
try {
const response = await fetch(spinitronConfig.endpoint);
const data = await response.json();
if (data.status === 'ok' && data.spin_data) {
const spin = data.spin_data;
const playlist = data.playlist_data;
const template = document.getElementById('recent-spin-template').innerHTML;
const container = document.getElementById('recent-spin-container');
const recentSpinHtml = template
.replace(/{time}/g, new Date(spin.start).toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }).toLowerCase())
.replace(/{song}/g, spin.song || 'Unknown Song')
.replace(/{artist}/g, spin.artist || 'Unknown Artist')
.replace(/{release}/g, spin.release || 'Unknown Release')
.replace(/{spin_id}/g, spin.id)
.replace(/{artist_id}/g, encodeURIComponent(spin.artist))
.replace(/{release_id}/g, encodeURIComponent(spin.release));
container.innerHTML = recentSpinHtml;
}
} catch (error) {
console.error('Error updating recently played:', error);
}
}
// Start updating the recently played marquee
if (document.getElementById('spin-recent')) {
updateRecentlyPlayed(); // Initial update
setInterval(updateRecentlyPlayed, spinitronConfig.cacheDuration); // Periodic updates
}
// Pause on hover
const ticker = document.getElementById('ticker');
if (ticker) {
ticker.addEventListener('mouseenter', () => {
ticker.style.animationPlayState = 'paused';
});
ticker.addEventListener('mouseleave', () => {
ticker.style.animationPlayState = 'running';
});
}