From d74eca943c685edca19c89d2b364dea8e703558c Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Thu, 8 Jan 2026 18:11:48 +0100 Subject: [PATCH 1/6] Fix public user playlist 404 error on download and play --- js/app.js | 12 ++++++++++-- js/events.js | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/js/app.js b/js/app.js index 56d5840..ddef513 100644 --- a/js/app.js +++ b/js/app.js @@ -301,10 +301,18 @@ document.addEventListener('DOMContentLoaded', async () => { try { let playlist, tracks; - const userPlaylist = await db.getPlaylist(playlistId); + let userPlaylist = await db.getPlaylist(playlistId); + + if (!userPlaylist) { + try { + userPlaylist = await syncManager.getPublicPlaylist(playlistId); + } catch (e) { + // Not a public playlist + } + } if (userPlaylist) { - playlist = { ...userPlaylist, title: userPlaylist.name }; + playlist = { ...userPlaylist, title: userPlaylist.name || userPlaylist.title }; tracks = userPlaylist.tracks || []; } else { const data = await api.getPlaylist(playlistId); diff --git a/js/events.js b/js/events.js index e6dd7c2..94ad436 100644 --- a/js/events.js +++ b/js/events.js @@ -399,8 +399,15 @@ export async function handleTrackAction(action, item, player, api, lyricsManager const data = await api.getPlaylist(item.uuid); tracks = data.tracks; } else if (type === 'user-playlist') { - const playlist = await db.getPlaylist(item.id); - tracks = playlist ? playlist.tracks : []; + let playlist = await db.getPlaylist(item.id); + if (!playlist) { + try { + playlist = await syncManager.getPublicPlaylist(item.id); + } catch (e) { + // Ignore + } + } + tracks = playlist ? playlist.tracks : (item.tracks || []); } if (tracks.length > 0) { From 44acd814cc36ac483eb369296830e77b6fa85ca0 Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Thu, 8 Jan 2026 20:12:13 +0100 Subject: [PATCH 2/6] Set sleep timer button color to primary when active --- js/player.js | 55 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/js/player.js b/js/player.js index 84773af..50ca852 100644 --- a/js/player.js +++ b/js/player.js @@ -574,35 +574,44 @@ export class Player { updateSleepTimerUI() { const timerBtn = document.getElementById('sleep-timer-btn'); - if (!timerBtn) return; - - if (this.isSleepTimerActive()) { - const remaining = this.getSleepTimerRemaining(); - if (remaining > 0) { - const minutes = Math.floor(remaining / 60); - const seconds = remaining % 60; - timerBtn.innerHTML = `${minutes}:${seconds.toString().padStart(2, '0')}`; - timerBtn.title = `Sleep Timer: ${minutes}:${seconds.toString().padStart(2, '0')} remaining`; - timerBtn.classList.add('active'); + const timerBtnDesktop = document.getElementById('sleep-timer-btn-desktop'); + + const updateBtn = (btn) => { + if (!btn) return; + if (this.isSleepTimerActive()) { + const remaining = this.getSleepTimerRemaining(); + if (remaining > 0) { + const minutes = Math.floor(remaining / 60); + const seconds = remaining % 60; + btn.innerHTML = `${minutes}:${seconds.toString().padStart(2, '0')}`; + btn.title = `Sleep Timer: ${minutes}:${seconds.toString().padStart(2, '0')} remaining`; + btn.classList.add('active'); + btn.style.color = 'var(--primary)'; + } else { + btn.innerHTML = ` + + + + + `; + btn.title = 'Sleep Timer'; + btn.classList.remove('active'); + btn.style.color = ''; + } } else { - timerBtn.innerHTML = ` + btn.innerHTML = ` `; - timerBtn.title = 'Sleep Timer'; - timerBtn.classList.remove('active'); + btn.title = 'Sleep Timer'; + btn.classList.remove('active'); + btn.style.color = ''; } - } else { - timerBtn.innerHTML = ` - - - - - `; - timerBtn.title = 'Sleep Timer'; - timerBtn.classList.remove('active'); - } + }; + + updateBtn(timerBtn); + updateBtn(timerBtnDesktop); } } From 8d53cf5a383f12766f49ba46f10520fc0234010c Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Thu, 8 Jan 2026 20:13:12 +0100 Subject: [PATCH 3/6] Update Create Playlist button color to primary --- index.html | 11 ++++------- styles.css | 7 +++++++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 0690418..0777111 100644 --- a/index.html +++ b/index.html @@ -250,13 +250,10 @@
-
-

My Playlists

-
- - -
-
+
+

My Playlists

+ +
diff --git a/styles.css b/styles.css index dc192bb..37c853e 100644 --- a/styles.css +++ b/styles.css @@ -3850,3 +3850,10 @@ img:not([src]), img[src=''] { } } + +.library-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-md); +} From 4549cc6d9af4f55643d512972fc0dea5ea08c1d0 Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Thu, 8 Jan 2026 20:28:54 +0100 Subject: [PATCH 4/6] Hide add to playlist and lyrics buttons in playbar when no song is selected --- index.html | 6 +++--- js/ui.js | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 0777111..08f03b5 100644 --- a/index.html +++ b/index.html @@ -811,7 +811,7 @@
- - -