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');