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
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 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
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
- 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
The media server was starting at app launch and polling every 250ms
even when not using Chromecast/DLNA casting. Now it only starts when
the user actually tries to cast audio.
- Add loading="lazy" decoding="async" to images in AlbumCard, ArtistDetailView
- Convert AlbumCard hover from JS state to CSS :hover (fewer re-renders)
- Reduce IntersectionObserver thresholds from 4 to 1 in ArtistDetailView
- Reduce default audio cache from 500MB to 200MB
- Playback state polling: 1000ms when paused, 250ms when playing
- Audio thread timeout: 500ms when idle, 100ms when playing
- Lyrics interval: self-check to auto-stop when conditions not met
- Add cleanup return to lyrics in +page.svelte
- Add build-and-run.sh and monitor-resources.sh scripts
- Add OPTIMIZATION_PLAN.md documentation