diff --git a/js/app.js b/js/app.js index adf8779..0374553 100644 --- a/js/app.js +++ b/js/app.js @@ -837,7 +837,74 @@ document.addEventListener('DOMContentLoaded', async () => { if (e.target.closest('#shuffle-artist-btn')) { const btn = e.target.closest('#shuffle-artist-btn'); if (btn.disabled) return; - document.getElementById('play-artist-radio-btn')?.click(); + const artistId = window.location.pathname.split('/')[2]; + if (!artistId) return; + + btn.disabled = true; + const originalHTML = btn.innerHTML; + btn.innerHTML = + 'Shuffling...'; + + try { + const artist = await api.getArtist(artistId); + const allReleases = [...(artist.albums || []), ...(artist.eps || [])]; + const trackSet = new Set(); + const allTracks = []; + + // Fetch full artist discography tracks (albums + EPs), deduped by track ID. + const chunkSize = 8; + for (let i = 0; i < allReleases.length; i += chunkSize) { + const chunk = allReleases.slice(i, i + chunkSize); + await Promise.all( + chunk.map(async (album) => { + try { + const { tracks } = await api.getAlbum(album.id); + tracks.forEach((track) => { + if (!trackSet.has(track.id)) { + trackSet.add(track.id); + allTracks.push(track); + } + }); + } catch (err) { + console.warn(`Failed to fetch tracks for album ${album.title}:`, err); + } + }) + ); + } + + // Fallback to artist top tracks if discography fetch yields nothing. + if (allTracks.length === 0 && Array.isArray(artist.tracks)) { + artist.tracks.forEach((track) => { + if (!trackSet.has(track.id)) { + trackSet.add(track.id); + allTracks.push(track); + } + }); + } + + if (allTracks.length === 0) { + throw new Error('No tracks found for this artist'); + } + + const shuffledTracks = [...allTracks].sort(() => Math.random() - 0.5); + player.setQueue(shuffledTracks, 0); + const shuffleBtn = document.getElementById('shuffle-btn'); + if (shuffleBtn) shuffleBtn.classList.remove('active'); + player.shuffleActive = false; + player.playTrackFromQueue(); + + const { showNotification } = await loadDownloadsModule(); + showNotification('Shuffling artist discography'); + } catch (error) { + console.error('Failed to shuffle artist tracks:', error); + const { showNotification } = await loadDownloadsModule(); + showNotification('Failed to shuffle artist tracks'); + } finally { + if (document.body.contains(btn)) { + btn.disabled = false; + btn.innerHTML = originalHTML; + } + } } if (e.target.closest('#download-mix-btn')) { const btn = e.target.closest('#download-mix-btn');