Commit Graph
465 Commits
Author SHA1 Message Date
vicrodh 5f725195c2 fix: unify data paths to use qbz instead of qbz-nix
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
2026-01-14 23:49:30 -06:00
vicrodh 94e26cd593 fix(library): prevent duplicate entries for re-downloaded tracks
- 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
2026-01-14 23:32:55 -06:00
vicrodh 6ac622d69b fix(audio): use UltraHiRes quality for downloads and playback
- 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
2026-01-14 23:32:09 -06:00
vicrodh 2d82d74b7f fix(downloads): add cover art path to local library for Qobuz downloads
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
2026-01-14 23:20:36 -06:00
vicrodh 481b1d18d7 feat(downloads): add album cover art file alongside embedded artwork
Save cover.jpg in album directory for local library scanning
to properly display album art in grid/list views

cp
2026-01-14 23:12:40 -06:00
vicrodh b414301df3 feat: add automatic legacy download migration system
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
2026-01-14 23:10:25 -06:00
vicrodh f1dcd96e14 fix: complete database insertion for Qobuz downloads
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
2026-01-14 23:07:54 -06:00
vicrodh 0b72c3fba9 fix(downloads): add album grouping keys for proper library display
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
2026-01-14 22:51:03 -06:00
vicrodh 01be29133a feat(downloads): smart library integration with visibility toggle
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
2026-01-14 22:46:21 -06:00
vicrodh 49da0832b9 feat(downloads): add library integration to post-processing
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
2026-01-14 22:32:46 -06:00
vicrodh e12783a50e feat(downloads): implement complete post-processing pipeline
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
2026-01-14 22:31:21 -06:00
vicrodh f69a283b31 wip(downloads): identify missing post-processing pipeline
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
2026-01-14 22:28:59 -06:00
vicrodh 2cc47a80c4 feat(downloads): phase 5 complete - cleanup integration
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
2026-01-14 21:08:11 -06:00
vicrodh a890802d8c feat(downloads): phase 4 complete - library integration backend
Complete library integration for Qobuz downloads:
- Add conn() method to DownloadCacheDb for direct SQL access
- Implement insert_qobuz_download_direct with proper parameters
- Complete library_backfill_downloads command with Send-safe async
- Properly scope database locks to avoid Send trait issues
- Register library_backfill_downloads command in Tauri
- Add BackfillReport struct for migration tracking
- Query ready downloads directly from download_cache DB
- Insert downloads into library with source = 'qobuz_download'
- Check for existing tracks before insertion

Phase 4 backend complete. UI integration pending.

cp
2026-01-14 20:49:28 -06:00
vicrodh daa07ef9ce feat(downloads): phase 4 partial - library integration foundation
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
2026-01-14 20:17:44 -06:00
vicrodh b4ba435878 feat(downloads): phase 3 - metadata enhancement and FLAC tagging
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
2026-01-14 20:14:07 -06:00
vicrodh 1296ee4a4b feat(downloads): phase 2 - download path management
Add path validation and file moving capabilities:
- Create path_validator module with validation logic
- Check write permissions via test file
- Detect mount status with canonicalize check
- Implement move_downloads_to_new_path with report
- Add mount status cache (30s TTL)
- Add Tauri commands: check_mount, validate_path, move_downloads
- Recursive FLAC file collection for moving

Phase 2 of downloads-library integration plan.

cp
2026-01-14 20:10:25 -06:00
vicrodh 494d3d184e feat(downloads): phase 1 - database schema and settings store
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
2026-01-14 20:01:51 -06:00
vicrodh 3eb80c7840 feat(library): remove album limit and add album hide feature
- 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
2026-01-14 14:57:58 -06:00
vicrodh 2568862aa6 chore: bump version to 1.1.5 2026-01-14 08:29:42 -06:00
vicrodh 544b295fa1 fix(api): increase initial album fetch limit to 100
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
2026-01-14 08:17:20 -06:00
vicrodh b8e3bca6f8 feat(settings): separate toasts and system notifications toggles
- 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
2026-01-14 08:05:13 -06:00
vicrodh 3a7b05b859 feat(settings): add notifications toggle
Users can now disable toast notifications (buffering, track changes, etc.)
from Settings > Appearance. Error notifications are always shown.

cc
2026-01-14 04:41:13 -06:00
vicrodh 827c033e6c chore: bump version to 1.1.3 2026-01-14 03:14:01 -06:00
vicrodh 05ef074e4f feat(ui): add HiDPI zoom controls and hotkeys 2026-01-14 02:44:27 -06:00
vicrodh 540844de9f feat(downloads): limit concurrent downloads to 3 2026-01-14 02:42:22 -06:00
vicrodh d4716af0d2 feat(library): allow mp3 in local library 2026-01-14 01:47:34 -06:00
vicrodh 48c7649609 fix(queue): enforce play-next insertion at queue head 2026-01-14 01:44:01 -06:00
vicrodh c188b09a4d feat(library): improve artwork discovery and disc inference 2026-01-13 23:23:06 -06:00
vicrodh 72d265e086 fix: use std::fs::read instead of Image::from_path 2026-01-13 22:24:28 -06:00
vicrodh 6c7b42973c fix(flatpak): add tray icon and MPRIS permissions
- Add --filesystem=xdg-run/tray-icon:create for tray icon visibility
- Add --own-name=org.mpris.MediaPlayer2.qbz_nix for MPRIS registration
- Install additional icon sizes (32x32, symbolic)
- Add Flatpak detection to load icon from file path
2026-01-13 22:14:53 -06:00
vicrodh e6e86c29f7 chore(release): bump version to 1.1.2 2026-01-13 18:05:15 -06:00
vicrodh b3eacf7113 fix(rodio): avoid fixed ALSA buffer size 2026-01-13 17:56:30 -06:00
vicrodh a86dc5bcba fix: restore playback buffering and mpris controls 2026-01-13 15:06:49 -06:00
vicrodh 3e3cc4746d chore(release): bump version to 1.1.0 2026-01-13 12:06:11 -06:00
vicrodh e58b2aa9b4 fix(library): migrate album group index safely 2026-01-13 10:41:47 -06:00
vicrodh cdf55e1d34 fix(library): dedupe local tracks and propagate artwork 2026-01-13 10:31:12 -06:00
vicrodh b22dd9e7e4 feat(library): group multi-disc albums by folder 2026-01-13 10:19:12 -06:00
vicrodh 78170b4c88 fix(tauri): allow local library paths in asset scope 2026-01-13 09:41:01 -06:00
vicrodh 3bb6ab1264 fix(library): cache folder artwork and apply to cue tracks 2026-01-13 09:40:45 -06:00
vicrodh 4f16ec044b fix(library): normalize tag fields 2026-01-13 09:18:41 -06:00
vicrodh 0de536b1a0 feat(library): smarter folder art and metadata fallbacks 2026-01-13 09:14:02 -06:00
vicrodh 166571566a perf(rodio): set fixed ALSA buffer size on linux 2026-01-13 08:38:24 -06:00
vicrodh f2c1fce6da perf(player): reduce sink empty polling frequency 2026-01-13 01:18:40 -06:00
vicrodh c68c943a95 perf(rodio): reduce periodic control polling 2026-01-13 01:17:35 -06:00
vicrodh bdd6776188 perf(alsa): increase buffer/period to reduce wakeups 2026-01-13 01:17:07 -06:00
vicrodh 52379b1718 fix(player): normalize pause deadline assignments 2026-01-13 01:00:22 -06:00
vicrodh e927a61505 fix(app): set TMPDIR and resolve pause deadline compile errors 2026-01-13 00:55:32 -06:00
vicrodh aacf8a7dc1 fix(player): correct pause suspend deadline assignment 2026-01-13 00:37:06 -06:00
vicrodh 333ae44d5a fix(player): resume path compile fixes 2026-01-13 00:32:32 -06:00