- Quality badge now has dark background with white text in Light theme
- Fixed parameter name in artist image upload (customImagePath)
- Improved visibility on both AlbumCard and QualityBadge components
cp
- Fix Dropdown selected option contrast in Light and Warm themes
- Improve QualityBadge border contrast in Light theme (AlbumCard and NowPlayingBar)
- Add custom artist image upload button in LocalLibrary (visible only when settings panel is open)
- Position upload button at top-right of artist card, consistent with other edit buttons
cp
- Queue button in NowPlayingBar now acts as toggle (open/close)
- Queue sidebar uses theme-aware background instead of glassmorphic effect
- Dropdown hover and selected states now use CSS variables for theme support
- Fixes contrast issues in Light and Warm themes
cp
Artist biographies were being cached per locale but not refreshed
when user changed language settings. Now automatically clears artist
cache when language is changed to force refetch in new language.
cp
- Add loadCachedArtistImages() to load from database
- Add fetchMissingArtistImages() with Qobuz + Discogs fallback
- Add discogs_search_artist command for artist lookups
- Artist images now persist between sessions
- Discogs used as fallback when Qobuz has no image
cp
- Modify cached_artists table to include locale in primary key
- Update get_artist and set_artist methods to consider locale
- Add get_locale() method to QobuzClient for cache key generation
- Ensure artist descriptions respect language settings
cp
- Remove broken AddToPlaylistModal component import
- Use existing PlaylistModal infrastructure from parent component
- Pass onTrackAddToPlaylist callback from +page.svelte to LocalLibraryView
- Follow existing pattern used in AlbumDetailView and other views
cp
- Add locale field to QobuzClient for API language preference
- Pass lang parameter to Qobuz artist detail endpoints
- Create set_api_locale command to update client locale
- Sync API locale with UI i18n settings automatically
- Render artist biography HTML tags properly using @html
- Fix syntax error in FavoritesView (missing comma)
cp
Added maximum_bit_depth and maximum_sampling_rate fields to FavoriteAlbum interface.
Implemented getQualityLabel function to display proper quality info (e.g., 24bit/192kHz) instead of generic Hi-Res label.
Applied to both album and track views in Favorites.
cp
- Increase initial artist albums fetch from 500 to 1000
- Increase load more albums batch from 50 to 200
- Increase top tracks display from 5 to 20
- Prefer full biography content over summary
- Increase bio truncate threshold from 500 to 800 characters
cp
- Move item limits inline with section toggles in home settings modal
- Remove separate limits section for cleaner, more compact layout
- Add add-to-playlist functionality to now playing bar Plus button
- Wire up AddToPlaylistModal to current playing track
cp
- Increased artist album limit from 100 to 500
- Added Others category for compilations/greatest hits
- Added configurable Home section limits in settings
- Added grouping toggle for LocalLibrary albums and tracks
cp
- Add albumGroupingEnabled and trackGroupingEnabled states
- Add Off option to grouping dropdown menus
- Conditionally render group headers and alpha index based on grouping state
- Match UX behavior from Favorites view
cp
- Increase artist detail album fetch from 100 to 500
- Increase bio truncation from 300 to 500 chars
- Add Others category for greatest hits/anthologies
- Add configurable limits for Home sections
- Update HomeSettingsModal with limits grid UI
cp
Add downloadStateVersion prop to AlbumCard component to make download
status reactive in all grid views. This fixes the issue where the
download menu submenu would not appear in Home, Search, and Artist
Detail views even when albums were fully downloaded.
cp
- Force Map reactivity by re-assigning after .set()
- Add missing downloadStateVersion effect in SearchView
- Ensures download menu updates across all grid views
cp
Load download status for all albums when they are first loaded
in grid views (Home, Search, Artist Detail, Favorites) so the
'Download Album' menu shows correct state immediately.
cp
- Update SearchView, ArtistDetailView, and FavoritesView
- Add download status tracking to all views with AlbumCards
- Display Open Folder and Re-download options when album is fully downloaded
- All grid overlays now show download status consistently
cp
- Add backend command to check if album is fully downloaded
- Add frontend functions to check album download status
- Pass download handlers to HomeView
- Update HomeView AlbumCards with download status props
cp
- Add submenu to album download option when album is fully downloaded
- New options: Open containing folder and Re-download album
- Backend command to open album folder in file manager
- Helper function to check if album is fully downloaded
- Works in both AlbumCard overlay and AlbumDetailView menus
cp
Implement user-consent migration system for legacy numeric-named FLAC files:
- Create MigrationModal component with progress tracking
- Auto-detect legacy downloads on settings mount
- Show modal with migration details and consent dialog
- Real-time progress updates via Tauri events
- Display success/failure stats after migration
- Refresh library and stats after completion
cc
Changes all application data paths from qbz-nix to qbz:
- Cache directory: ~/.cache/qbz-nix -> ~/.cache/qbz
- Config directory: ~/.config/qbz-nix -> ~/.config/qbz
- Data directory: ~/.local/share/qbz-nix -> ~/.local/share/qbz
This fixes path inconsistencies between development and production builds
and resolves asset protocol permission issues with downloaded album artwork.
cp
- Remove existing qobuz_track_id entry before inserting new one
- Ensures clean database state when re-downloading same track
- Prevents artwork and metadata confusion from duplicates
cp
- Changed download quality from HiRes to UltraHiRes to support 24-bit/192kHz
- Updated playback streaming to use UltraHiRes for highest quality
- Added debug logging for artwork path storage and retrieval
- Quality fallback will still work for lower subscription tiers
cp
Downloaded albums now properly display cover art in local library by
passing artwork_path when inserting tracks to database. Cover art is
saved as cover.jpg in album directory during post-processing.
cp
Migration service for users with old numeric FLAC files:
- Detect legacy downloads (123456.flac in tracks/ folder)
- Fetch complete metadata from Qobuz API
- Apply FLAC tags and embed artwork
- Organize files into Artist/Album/Track structure
- Insert to library DB with proper grouping keys
- Delete legacy files after successful migration
- Progress tracking via events
Commands:
- detect_legacy_downloads: Check if migration needed
- start_legacy_migration: Start background migration task
Events:
- migration:progress: Real-time status updates
- migration:complete: Final report with success/failure counts
Architecture:
- Non-destructive (keeps originals until success)
- Async with progress callback
- Error recovery (continues on failures)
- Proper cleanup after success
Next steps:
- Add UI banner in Settings when legacy files detected
- Show migration progress dialog
- Display results after completion
cp
Critical bug fix:
- insert_qobuz_download_with_grouping() was missing required NOT NULL fields
- Added file_size_bytes, last_modified, indexed_at to INSERT
- Extract bit_depth and sample_rate from FLAC file properties
- Proper type conversion for bit_depth (u8 -> u32)
Root cause:
- INSERT statement incomplete vs schema requirements
- Silent failure in post_process_track()
- Downloaded tracks organized correctly but never inserted to library DB
- Local Library view empty despite toggle ON
Now working:
- Download completes successfully
- FLAC tags and artwork embedded
- Files organized as Artist/Album/Track.flac
- Track inserted to local_tracks with source='qobuz_download'
- Albums appear in Local Library when toggle ON
cp
Critical fix for downloads not appearing in library:
Problem: Downloads inserted without album_group_key/album_group_title
Result: Albums not grouped/displayed in Local Library UI
Solution:
1. Create insert_qobuz_download_with_grouping() method
2. Pass all metadata: album_artist, track_number, year, etc.
3. Generate album_group_key: 'album|album_artist'
4. Set album_group_title for proper display
Now downloads will:
- Group correctly by album in Local Library
- Show proper album artist (not track artist)
- Display track numbers and year
- Appear in UI when toggle is ON
cp
Implement intelligent library insertion:
- Downloads ALWAYS inserted to library DB (persistence)
- Visibility controlled by toggle in Settings
- Downloads NOT added to scan folders (separate from local files)
Backend changes:
1. Simplified post_process_track to always insert
2. Created get_albums_with_filter() method
3. Added source filter: exclude 'qobuz_download' when toggle off
4. Wire download_settings_state to library_get_albums command
5. Read show_in_library setting and pass to DB query
Database filtering:
- When toggle ON: show all albums (local + downloads)
- When toggle OFF: filter out source='qobuz_download'
- Hidden albums filter still works independently
Design benefits:
- Downloads folder never scanned by Local Library
- Tracks always in DB for potential future features
- Clean separation: local files vs Qobuz downloads
- Toggle only affects UI visibility, not data persistence
cp
Complete the downloads-library integration:
- Add library_db parameter to post_process_track()
- Accept show_in_library flag
- Insert processed tracks into local library automatically
- Pass library_state to download_track command
- Clone library_db for async task
Post-processing pipeline now:
1. Download → mark complete
2. Fetch metadata from Qobuz
3. Write FLAC tags with all metadata
4. Download and embed artwork
5. Organize to Artist/Album/Track.flac structure
6. Update download cache DB with new path
7. **Insert into local library if show_in_library enabled**
8. Emit processed event
Files are now:
- Properly tagged with metadata
- Organized in artist/album folders
- Available in Local Library (if toggle on)
- Ready for playback with artwork
cp
Wire up Phase 3 functionality to download completion:
- Add post_process_track() function with full pipeline
- Fetch complete metadata from Qobuz API
- Write FLAC tags with all metadata fields
- Embed artwork from Qobuz
- Organize files into Artist/Album/Track structure
- Update database with new organized path
- Emit download:processed event for UI
Post-processing now runs automatically after download:
1. Download completes → mark_complete()
2. Fetch metadata from Qobuz API
3. Write tags to FLAC file
4. Download and embed artwork
5. Move file to: <root>/<Artist>/<Album>/NN - Title.flac
6. Update database with new path
7. Emit processed event
Files now properly organized with full metadata!
cp
Problem identified: Downloads complete but do not trigger:
1. Metadata enhancement from Qobuz API
2. FLAC tag writing
3. File organization (artist/album structure)
4. Library insertion
Current state:
- Files saved as {track_id}.flac in tracks/ folder
- No metadata embedded
- Not added to local library
- Phase 3 code exists but not wired to download completion
Next steps:
- Wire post-processing to download completion
- Or create manual command to process existing downloads
- Ensure proper state passing (settings, library)
cp
Merge two separate Downloads sections into one unified section:
- Combine configuration (folder picker, library toggle)
- Combine statistics (track count, storage size)
- Combine actions (clear, open folder)
- Remove duplicate Downloads Section (Offline Storage)
- Use consistent labels without translations for new items
- Single cohesive Downloads section with all functionality
Now Downloads section contains:
- Download Folder configuration with Change button
- Downloaded Tracks statistics
- Show in Local Library toggle
- Clear Downloads button
- Open Folder button
cp
Add UI for configuring download folder location in Settings:
- Add downloadRoot state variable
- Add Downloads section in Settings with folder picker
- Move show_in_library toggle to Downloads section
- Add handleChangeDownloadFolder() function with dialog picker
- Validate path before applying
- Prompt to move existing downloads on path change
- Display current download folder path
- Use @tauri-apps/plugin-dialog for folder selection
- Fix property name (readyTracks vs ready_tracks)
Users can now configure where downloads are stored and
optionally move existing downloads to new location.
cp
Add library cleanup integration for download cache:
- Add remove_qobuz_download() method to LibraryDatabase
- Add remove_all_qobuz_downloads() method to LibraryDatabase
- Update remove_downloaded_track command to also remove from library
- Update clear_download_cache command to remove all from library
- Properly scope database locks to avoid deadlocks
- Log removal count when clearing all downloads
When downloads are removed from cache, they are automatically
removed from the local library to maintain consistency.
Phase 5 complete.
cp
Move download visibility toggle from LocalLibrary settings to general Settings view:
- Add showQobuzDownloadsInLibrary state in SettingsView
- Add loadDownloadSettings() function
- Add handleShowDownloadsChange() function
- Add toggle in Library section of Settings
- Remove toggle from LocalLibrary settings panel
- Remove toggleShowQobuzDownloads function from LocalLibrary
- Remove showQobuzDownloads state from LocalLibrary
- Restore settings-actions original flex layout
Qobuz downloads are now controlled from Settings > Library section,
not from LocalLibrary settings. LocalLibrary only handles hide/show
of individual albums.
cp
Add UI integration for Qobuz downloads in Local Library:
- Add showQobuzDownloads state variable
- Load download settings on library data load
- Add toggleShowQobuzDownloads function
- Add toggle setting in Library Settings panel
- Add .toggle-setting styles for checkbox
- Reload library after toggling setting
- Update settings-actions layout to column flex
Phase 4 complete with backend + UI integration.
Users can now toggle Qobuz downloads visibility in library.
cp
Add foundation for Qobuz downloads in local library:
- Extend get_albums to filter by source (user vs qobuz_download)
- Add include_qobuz_downloads parameter from download settings
- Create library_backfill_downloads command with report
- Add track_exists_by_qobuz_id method
- Add insert_qobuz_download method (WIP - needs file path resolution)
- BackfillReport struct for tracking migration
Phase 4 in progress - needs completion for file path handling and
UI integration. Will continue in next session.
cp
Add complete metadata handling for downloaded tracks:
- Create metadata.rs module with CompleteTrackMetadata struct
- Implement fetch_complete_metadata from Qobuz API
- Add write_flac_tags using lofty crate (Vorbis comments)
- Implement embed_artwork with MIME type detection
- Add sanitize_filename for ASCII-safe names
- Create organize_download with artist/album structure
- Handle filename conflicts with counter
- Add update_file_path and update_artwork_path to DB
- Parse year from release_date_original format
Phase 3 of downloads-library integration plan.
cp
Add foundation for Qobuz downloads integration:
- Create DownloadSettings store (download_root, show_in_library)
- Add migration for local_tracks: source and qobuz_track_id columns
- Add database indices for source and qobuz_track_id
- Register Tauri commands for download settings
- Commands: get/set download_settings, validate_download_root
Phase 1 of downloads-library integration plan.
cp
- Remove separate DEV_API_KEYS.md file
- Add compile-time env var explanation in README
- Document npm run dev:tauri command usage
- Explain why .env must be sourced before build
cp
- Create dev-with-env.sh script to load .env before build
- Add npm run dev:tauri command that uses the script
- Document why .env must be loaded before compilation
- Explain compile-time vs runtime environment variables
The issue: option_env!() reads vars at compile time, but .env
loads at runtime. Solution: source .env before cargo build.
cp
- Add double confirmation dialog for clear library action
- Improve confirmation messages with clear warnings
- Move clear library button to separate danger zone section
- Use smaller danger button style (12px font, 6px padding)
- Add danger zone header with red warning label
- Separate dangerous action from regular settings visually
- Add error alert if clear operation fails
This prevents accidental library clearing which requires full rescan.
cp
- Replace folder list with compact table view (max 150px height)
- Add checkbox selection for multiple folders
- Replace per-row delete buttons with single remove action
- Add folder actions toolbar with + and - buttons
- Implement multi-folder removal with confirmation
- Reduce row height to 36px for more compact display
- Add scroll with custom styling for overflow
- Selected rows highlight with blue background
cp
- Remove hide button from album row list view
- Add edit button (pencil icon) in album detail header
- Create album edit modal with hide toggle
- Add nav-row layout matching PlaylistDetailView style
- Modal styling consistent with existing PlaylistModal
- Album title editing placeholder (coming soon)
cp
- Remove 100 album cap from library_get_albums query
- Add album_settings table with hidden flag per album
- Add commands to hide/show albums
- Add UI toggle in settings to view hidden albums
- Add hide button to album list view
- Update LocalLibraryView to support hidden albums view
cp
- Remove Compact Mode toggle (feature was not implemented)
- Remove Storage Limit dropdown from Downloads (always 2GB, not functional)
- Connect language dropdown to svelte-i18n system
- Language setting now properly persists and changes app locale
- Add comprehensive translations for en and es locales
- Settings view now uses $t() for all translatable strings
- Support for Auto language detection based on browser locale
- Add Library section in Settings with toggle for artist images
- Check localStorage setting before fetching images
- Enabled by default, persists user preference
- Replace X icon with ArrowLeft for back button consistency
- Fetch Qobuz artist images for local artists (best-effort matching)
- Add circular artist image thumbnails in artist grid
- Fall back to microphone icon when no match found
When loading artist details, the API now fetches 100 albums instead of 50.
This ensures each album type section (Discography, EPs & Singles, Live Albums, etc.)
has enough albums loaded initially, preventing the issue where only 2 albums
appeared in each section with the rest requiring additional loading.
cc
Mouse back/forward buttons now work in local library view.
Changes:
- Add 'library-album' ViewType to navigation store
- Add selectLocalAlbum(), clearLocalAlbum(), getSelectedLocalAlbumId()
- LocalLibraryView subscribes to navigation state changes
- Album clicks use selectLocalAlbum() for proper history tracking
- Back button uses navGoBack() to navigate properly
- Tab changes navigate back to 'library' when viewing album
- +page.svelte shows LocalLibraryView for both 'library' and 'library-album'
cc
- Split "Notifications" setting into "In-app Toasts" and "System Notifications"
- In-app toasts control the toast messages within the app
- System notifications control desktop notifications on track change
- Both settings persist to localStorage and load on app startup
- Migrates old 'qbz-notifications-enabled' key to new 'qbz-toasts-enabled'
feat(library): add stop scanning button
- Add library_stop_scan command in Rust backend
- Add cancel flag (AtomicBool) to LibraryState
- Check cancel flag during scan loop for both CUE and audio files
- Add "Cancelled" status to ScanStatus enum
- Add stop button in LocalLibraryView scan progress UI
- Button appears red on hover for clear visibility
cc
- Replace harsh white light theme with Alucard (soft cream tones inspired by Dracula inverted)
- Replace all hardcoded colors in NowPlayingBar.svelte with CSS variables
- Now responds properly to theme changes (dark, light, OLED, warm)