From bf6c05629b894908562fe93fb6f38728e4df6e98 Mon Sep 17 00:00:00 2001 From: Miles Wilson Date: Thu, 15 May 2025 15:47:09 -0400 Subject: Initial commit. --- player.js | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 player.js (limited to 'player.js') diff --git a/player.js b/player.js new file mode 100644 index 0000000..d26d284 --- /dev/null +++ b/player.js @@ -0,0 +1,147 @@ +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'; + }); +} \ No newline at end of file -- cgit v1.2.3