**Section toggles left-aligned**
- Replace QToolButton with flat QPushButton for all section headers;
QPushButton properly respects text-align: left in stylesheets
**Pagination via "Load More" button**
- QTreeWidget expands to fit all items so the scrollbar-based infinite
scroll never triggered; replaced with an explicit "Load more…" button
that appears when has_more is true and emits loadMoreRequested
**Favourite button reflects actual state**
- MainWindow preloads fav artist IDs on session restore (getFavArtists)
and caches them in m_favArtistIds
- ArtistView receives the full set via setFavArtistIds() and checks
it on every setArtist() call so the button starts gold if already faved
- Toggling updates the local cache immediately for back/forward nav
**Playback error → queue advances**
- player_loop now sets track_finished on Err (was only set on Ok(None)),
so the toolbar's onTrackFinished handler advances to the next track
instead of stalling on an unplayable track
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
**Artist portrait**
- Fix CDN URL: images.portrait.{hash,format} →
https://static.qobuz.com/images/artists/covers/large/{hash}.{format}
**Section alignment**
- Qt::ToolButtonTextOnly on all section toggles so text is truly left-aligned
**Auth 401 race condition**
- qobuz_backend_set_token now uses blocking_lock() instead of spawning an
async task, guaranteeing the token is set before any subsequent API call
**Pagination (infinite scroll)**
- Release sections load 50 at a time (was 500)
- ArtistSection tracks has_more + loaded count; scrolling to the bottom
emits loadMoreRequested → ArtistView calls getArtistReleases(offset=N)
- AlbumListView gains addAlbums() for append; setReleases routes to
setAlbums (offset=0) or appendAlbums (offset>0)
**Back/Forward navigation**
- MainToolBar exposes Back/Forward QActions (go-previous/go-next icons)
- MainWindow keeps a NavPage vector + index; pushNav() on every album/artist
navigation; goBack/goForward re-navigate without pushing history
**Context menu on now-playing label**
- Right-click on track label in toolbar → "Go to Album" / "Go to Artist"
- MainToolBar stores current track; emits albumRequested/artistRequested
signals wired to MainWindow's existing handlers
**Artist favourites button**
- ♡ Favourite / ♥ Favourited toggle in artist header
- Calls new addFavArtist / removeFavArtist (Rust + Qt backend wiring)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of relying on the limited preview in artist/page, fire a
separate artist/getReleasesList request per release type (album,
epSingle, live, compilation) in parallel when loading an artist.
Each result updates its section independently as it arrives, so the
page populates progressively without a single large request.
Also fixes the artist name in the status bar (was reading wrong field).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Adds extra=topTracks to artist/page API request
- Embeds a List::Tracks widget at the top of ArtistView showing
the artist's most popular tracks, with Play and Shuffle buttons
- Bubbles playTrackRequested through MainContent up to MainWindow
- Also adds the viz PCM ring buffer FFI infrastructure (for future
spectrum widget) to the Rust backend
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch artist view to artist/page API (proper sections: Albums, Singles & EPs,
Live, Compilations; version in titles like "Deluxe")
- Fix artist sections categorization using releases[].type from artist/page
- Add getUser() backend call; fetch on session restore when userId=0 to fix
playlist ownership (Remove from playlist / Delete playlist were missing)
- Fix multi-disc double-click / Play Now queue start index (disc headers were
counted in row index but excluded from currentTracksJson)
- Hide redundant Album column when viewing an album
- Make artist name in context header clickable (navigates to artist page)
- Fix gap between title and artist name in context header (addStretch)
- Fix queue panel track titles to include version field
- Fix album list to show version in title column
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix playlist art: API returns images/images150/images300 arrays, not
image_rectangle; update Rust model and Qt header to use images300 →
images150 → images with fallback
- Add Play (▶) and Shuffle (⇄) buttons to the album/playlist header;
Play starts from track 1, Shuffle enables shuffle mode and plays from
a randomised position
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add TrackContextHeader widget: shows album art (fetched via NAM),
title, subtitle (artist/description), and metadata (year · tracks · duration)
above the track list when an album or playlist is opened
- Hide header for favorite tracks and search results
- Store user ID in AppSettings on login
- Only show "Delete playlist" for playlists the user owns
- "Add to playlist" submenu only lists owned playlists
- "Remove from this playlist" only appears when viewing an owned playlist
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fav albums: now shows a sortable list (title/artist/year/tracks);
double-click opens the album
- Fav artists: now shows a sortable list; double-click opens the artist
- Artist detail page: name, biography summary, and their album list
- Rust ArtistDto gains albums field; get_artist fixed to extra=albums only
- Volume popup minimum width set so "100%" label is never clipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lightweight Qt6 desktop client for Qobuz with a Rust audio backend
(Symphonia/CPAL via staticlib FFI). Mirrors the spotify-qt layout:
toolbar with playback controls, library/context docks on the left,
tabbed search side panel on the right, queue panel, now-playing dock.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>