Added
- Playlist Management (requested by @adirav02): Full playlist management feature:
- Playlists overview page (
/playlists): card grid showing all server playlists with cover collage, song count and duration. Inline "New Playlist" creation (Enter to confirm, Escape to cancel). Two-click delete confirmation directly on the card. - Playlist detail page (
/playlists/:id): hero area with 2×2 album cover collage and blurred background (matching Album Detail style), full tracklist with drag-and-drop reordering, star ratings, codec labels, per-row delete button, and context menu. - Song search: "Add Songs" button opens an inline search panel with debounced server search, thumbnail, artist · album info, and a round add button (accent on hover). Duplicate songs already in the playlist are filtered from results.
- Suggestions: "Suggested Songs" section below the tracklist loads similar songs via
getSimilarSongs2based on the first artist in the playlist. Refresh button to load a new batch. Same tracklist layout as search results. - Context menu — Add to Playlist: "Add to Playlist" submenu available on all song/album/queue-item context menus. Playlists sorted by most recently used. "New Playlist" inline create at the top of the submenu. Submenu flips left when near the right viewport edge.
- Sidebar: Playlists navigation entry added between Favorites and Statistics.
- Recently used playlist tracking:
playlistStore(persisted) tracks the last 50 used playlist IDs for the context menu sort order.
- Playlists overview page (
Fixed
- Resampling — first track played at native sample rate (reported by @sorensiimSalling):
current_sample_ratewas initialized to44100, causing every track to be resampled down to 44.1 kHz on playback start. Initializing to0disables resampling until the actual track rate is known. - Resampling — no application-level resampling for any track:
target_rateinaudio_playandaudio_chain_nextis now always0. Previously, tracks after the first were resampled to match the first track's sample rate. Rodio handles conversion to the output device rate internally; every track now plays at its native sample rate. - Playlist hero background flickering: The blurred hero background in Playlist Detail flickered on every render because
buildCoverArtUrl()generates a new random salt on every call, causinguseCachedUrlto re-trigger in a loop. The fetch URL and cache key are nowuseMemo-stabilised. - Input focus double border: The playlist name and song search inputs used a
search-inputclass that had no CSS definition, falling back to browser defaults. The global:focus-visiblerule then added a second outline on top of the browser's own focus ring. Switched to the.inputclass which setsoutline: noneand usesborder-color+ glow on focus.
Changed
- Playlist search panel: Redesigned with
surface-2background,radius-lg, slide-down open animation, 36 px thumbnails, artist · album subtitle line, and a round icon add-button (accent colour on hover) replacing the genericbtn-surfacebutton.