- Add genre field to QobuzTrack.album type
- Add genre to compilation albums in qobuzAdapters
- Add getGenreLabel function to LabelView
- Add genre prop to AlbumDetailView artist albums
- Update +page.svelte artist albums mapping to include genre
Backend:
- Add search_type parameter to search_albums, search_tracks, search_artists
- Pass optional type filter to Qobuz API (Performer, Composer, Label, ReleaseName)
Frontend:
- Add SearchFilterType to search state management
- Add filter radio buttons in SearchView (visible when results exist)
- Remove redundant counts from tabs
- Add Clear filter button independent from Clear search
- Filters reset automatically when starting new search or clearing
Filters allow finding performers, composers, and labels that default
search misses (e.g., searching "Nicko McBrain" with Performer filter
shows Iron Maiden tracks)
- Add get_label API endpoint and Tauri command
- Create LabelView component with album grid, search, and infinite scroll
- Add clickable label links in AlbumDetailView, AlbumCreditsModal, and TrackInfoModal
- Add label_id to AlbumInfo and AlbumDetail types
- Add label to QobuzTrack album summary for track info display
MP3 and other lossy formats (aac, m4a, ogg, opus, wma) at CD-like
sample rates (44.1-48kHz) were incorrectly shown as "CD" quality
because bitDepth check came before format check.
Changes:
- Add format prop to QualityBadge, NowPlayingBar, ExpandedPlayer
- Add format field to PlayingTrack interface
- Check for lossy formats BEFORE checking bitDepth/samplingRate
- New 'mp3-cd' tier for lossy formats at CD sample rates
- Uses /mp3-cd.svg icon for this tier
Keep the onPerformerSearch infrastructure in TrackInfoModal and
AlbumCreditsModal but don't pass the prop. Performer names are
now plain text. Re-enable when MusicBrainz allows precise lookups.
Also fixes: sticky tabs in AlbumCreditsModal now work correctly.
Phase 7 quick wins (closes#17):
- Performer names in TrackInfoModal are now clickable
- Clicking a performer searches for their name in Qobuz
- SearchView auto-searches when opened with pre-filled query
- Credits/Review tabs in AlbumCreditsModal stay fixed when scrolling
- Add onTrackShowInfo to HomeView (Continue Listening tracks)
- Add onShowInfo to VirtualizedTrackList (for FavoritesView)
- Add onTrackShowInfo to FavoritesView and wire to VirtualizedTrackList
- Pass showTrackInfo to HomeView and FavoritesView in +page.svelte
- Add clickable artist name to TrackInfoModal header
- Artist link navigates to artist page and closes modal
- Add get_album_credits Tauri command with TrackCredits, AlbumCredits,
and AlbumInfo structs for consolidated album/track credits view
- Create AlbumCreditsModal component with two-column layout:
album info (artwork, metadata, quality badges) and collapsible
track list with performers and copyright
- Add Info button to AlbumDetailView header actions
- Integrate modal in +page.svelte with track play support
Phase 3 - Integration:
- Add onTrackShowInfo prop to TrackRow, AlbumDetailView,
PlaylistDetailView, SearchView
- Add TrackInfoModal to +page.svelte with state management
- Pass showTrackInfo callback from main page to all views
cc
When creating a new playlist from a track, the sidebar was showing 0 tracks
because the Qobuz API returns the playlist with tracks_count: 0 at creation
time (eventual consistency). The tracks are added after, but the sidebar
refresh might get stale data.
- Update newPlaylist.tracks_count after adding tracks in PlaylistModal
- Have handlePlaylistCreated update the sidebar with correct count
- Handle both Qobuz and local track cases
- Add onPlaylistsChanged callback to PlaylistManagerView
- Call it on: toggleHidden, toggleFavorite, reorder, edit, delete
- Connect callback to refresh sidebar playlists, settings, and local counts
- Also update PlaylistDetailView callbacks to refresh settings
- Add UPC field to Album models (Rust and TypeScript)
- Enhance share_album_songlink command to use iTunes lookup:
- First tries UPC lookup via iTunes API
- Falls back to Odesli API with UPC
- Then tries album title/artist search on iTunes
- Generates direct album.link/i/{id} URLs like tracks do
- Update frontend to use the backend command instead of
generating non-functional URL-based links
This mirrors the track sharing approach that uses ISRC/iTunes
lookup to generate working song.link URLs.
Odesli provides different domains for different content types:
- song.link for individual tracks
- album.link for albums
Updated album share functions and menu label accordingly.
Add --alpha-* CSS variables (4-95%) to app.css that adapt to theme:
- Dark themes: white-based rgba
- Light themes: black-based rgba (auto-inverts for proper contrast)
Mass-replaced 100+ instances of rgba(255,255,255,...) across 23 files
with var(--alpha-*) for consistent theming support.
This fixes borders, overlays, and UI elements being invisible or
having poor contrast in light themes.
- Removed padding-left: 20px from main-content
- Toggle button and jump-nav don't collide (different vertical positions)
- Updated all view nav bars with corrected margin/width calculations
- Nav bars now truly flush with sidebar edge
Remove "Use QBZ title bar" toggle since switching to system decorations
doesn't work reliably on Linux when the window was created without
decorations. Keep only "Hide title bar" option for tiling WM users.
Phase 1 implementation:
- Add titleBarStore.ts for managing title bar visibility
- "Use QBZ title bar" toggle (default ON) - switches between custom and system decorations
- "Remove title bar" toggle (default OFF) - hides title bar completely for tiling WM users
- Dynamically adjust layout heights when title bar is hidden
- Add i18n translations (en/es)
- Settings integrate with Tauri window.setDecorations() API
Pass sidebarExpanded prop to HomeView to dynamically position the
loading overlay based on sidebar width (280px expanded, 64px collapsed).
Added smooth transition for left position.
- Reduce toggle button size from 32px to 28px
- Hide scrollbar in collapsed mode to keep icons perfectly aligned
- Add bold first line to playlist tooltips when sidebar is collapsed
- Adjust main content padding (20px) for smaller button
- Move toggle button to sidebar edge (50% vertical, half inside/out)
- Add glass effect: rgba(255,255,255,0.08) + backdrop blur + border
- Use single chevron icons instead of double
- Hover: scale 1.1 + increased opacity
- Add left padding (22px) to main content for button clearance
- Fix playlist tooltips: show name + track count when sidebar is collapsed
- Add sidebarStore.ts for expanded/collapsed state with localStorage persistence
- Modify NavigationItem to support collapsed mode (icon-only with tooltip)
- Update Sidebar component with toggle button and collapsed styles
- Width transitions from 280px (expanded) to 64px (collapsed)
- Add i18n translations for collapse/expand actions (en/es)
- Create offlineCacheState.ts with compliant terminology
- Update all component imports and type references
- Add compatibility aliases for gradual migration
- Remove deprecated downloadState.ts
cc
- Update en.json and es.json with new terminology
- Change "Download" to "Make available offline"
- Change "Downloads" section to "Offline Library"
- Update notifications: cachingStarted, cachedForOffline, cachingFailed
- Update UI copy in SettingsView, TrackMenu, AlbumMenu
- Update toast messages in +page.svelte to use offline terminology
- Change DownloadButton tooltips to use offline language
cc
- Show format: (20 of 139, 135 left) for normal playback
- Show format: (20 of ∞) for infinite play or radio mode
- Remove Load More from Queue section (not needed)
- Add Load More to History section for tracks > 20
- Add isRadioMode prop to detect radio context
- Pass both queueTotalTracks and queueRemainingTracks
- Add Queue/History tabs with new layout
- Implement Now Playing card with spectrum animation
- Add History tab showing recently played tracks from backend
- Add Infinite Play toggle (persisted to localStorage)
- Relocate search to footer (expands left)
- Add Up Next counter (X/Y format)
- Implement 20-track pagination with load more
- Add proper i18n keys for new features
- Add new SVG icons (add-to-list, trash-list)
- Move queue button to far right of NowPlayingBar (after volume)
- Add vertical separator between volume control and queue button
- Replace ListMusic icon with custom queue-list SVG
- Add active state: play symbol changes to accent color when panel open
- Pass queueOpen prop to track panel visibility state
Ensure album_id and artist_id are passed through all queue track creation paths:
- trackActions.ts build functions (Qobuz, album, playlist, local tracks)
- Session persistence (both frontend and Rust backend)
- buildAlbumQueueTrack wrapper function
- Session restoration
Add album_id and artist_id fields to QueueTrack struct so that
radio tracks have proper navigation metadata. This enables
clicking artist/album in the main player to navigate correctly
when playing tracks from artist or track radio.
Changes:
- Add album_id/artist_id to Rust QueueTrack struct
- Update track_to_queue_track to extract IDs from Qobuz Track
- Add fields to frontend BackendQueueTrack interface
- Pass IDs in ArtistDetailView radio playback
- Pass IDs in playQueueTrack to playTrack service
- Fix radio playback initiation using onTrackPlay callback
- Fix sampling rate display for Qobuz tracks (already in kHz)
- Disable session restore to prevent local/Qobuz ID conflicts
- Added onTrackOpenFolder and onTrackReDownload to Props interface
- Pass download props to menuActions in TrackRow
- Only show Download options for Qobuz tracks (not local tracks)
- Wire up handlers in main app component
- Completes Download menu implementation across all views
- Added handleTrackOpenFolder, handleTrackReDownload, and checkTrackDownloaded handlers
- Imported openTrackFolder from downloadState.ts
- Connected all handlers to HomeView, AlbumDetailView, SearchView, and FavoritesView
- Download submenu now fully functional across all Qobuz track views