Commit Graph
7039 Commits
Author SHA1 Message Date
vicrodh 20c34caed0 feat: add download management section in Settings
- Download stats display (tracks count, size used)
- Storage limit dropdown (500MB to Unlimited)
- Clear downloads button
- Open folder button (sneaky feature)
2026-01-09 19:44:02 -06:00
vicrodh 7149cf5c4b feat: add download UI for offline listening
- DownloadButton component with status indicators
- TrackRow now shows download button on hover
- downloadState store for managing download states
- Tauri event listeners for download progress
- Integration with AlbumDetailView
2026-01-09 19:42:35 -06:00
vicrodh 45fb498b8b chore: move plan doc to qbz-nix-docs 2026-01-09 19:37:22 -06:00
vicrodh 3864fa8e4b feat: add download cache for offline listening
- SQLite-based index for tracking cached tracks
- Disk-based storage for audio files (~/.cache/qbz-nix/audio/)
- Download progress events via Tauri events
- LRU eviction with configurable cache size limit
- Integration with play_track for automatic local playback
- Open cache folder command for system file manager
2026-01-09 19:18:06 -06:00
vicrodh 5bf69bc877 fix(share): fall back to song.link url lookup 2026-01-09 19:05:12 -06:00
vicrodh 1ccb78ef52 fix: multiple UI and integration fixes
1. Credential storage fallback - when keyring (KWallet) unavailable,
   falls back to obfuscated file in config directory

2. Heart icon always visible - shows outlined when not favorite,
   filled when favorite, with hover states

3. Player favorite state - checks favorite status when track plays
   and updates the heart icon in NowPlayingBar

4. Song.link ISRC lookup - uses Spotify/Deezer search URLs with ISRC
   since Qobuz isn't directly supported by Odesli
2026-01-09 19:00:12 -06:00
vicrodh 657682fc5e fix(share): use Qobuz track URL for song.link instead of ISRC
Odesli API doesn't support direct ISRC lookup. Changed to use
Qobuz track URL (https://open.qobuz.com/track/{id}) which Odesli
can properly resolve to song.link.
2026-01-09 18:50:30 -06:00
vicrodh 2efa107aa7 fix(lastfm): handle subscriber field as integer from API
Last.fm returns subscriber as 0/1 integer, not boolean.
Added custom deserializer to convert integer to bool.
2026-01-09 18:44:45 -06:00
vicrodh 9d3304879a docs: add CLAUDE.md with critical CSS warning
Document the main-content flex issue that has broken the app
multiple times to prevent future occurrences.
2026-01-09 18:40:35 -06:00
vicrodh 2c4e6cf983 fix: revert main-content CSS changes that caused content collapse
The display: flex; flex-direction: column; caused child views to
collapse to zero height. Reverted to original CSS.
2026-01-09 18:39:53 -06:00
vicrodh fae1bd7eec fix: add fallback view and improve main-content CSS
- Add fallback rendering when activeView doesn't match any condition
- Add min-height and flex layout to main-content for better visibility
2026-01-09 18:35:53 -06:00
vicrodh ad32e8ab75 feat(cast): add CastPicker UI component and wire up cast buttons
- Add CastPicker.svelte component for device discovery and selection
- Update onCast callbacks in NowPlayingBar and FullScreenNowPlaying
- Replace 'Coming Soon' toast with functional device picker modal
2026-01-09 18:28:16 -06:00
vicrodh 8b10a47a03 Enable Chromecast casting with thread-safe architecture
- Add ChromecastHandle with dedicated thread for rust_cast operations
- Fix thread safety issue (rust_cast uses Rc, not Arc) using channels
- Enable rupnp full_device_spec feature for DLNA discovery
- Fix media_server response type consistency
- Register all cast commands in lib.rs
- Add Deserialize to MediaMetadata for Tauri command args
2026-01-09 18:24:55 -06:00
vicrodh 2e0aaa4296 Fix Last.fm .env variable naming and add debug logging
- Support both LAST_FM_* and LASTFM_* naming conventions
- Match .env.example variable names (LAST_FM_API_KEY, LAST_FM_API_SHARED_SECRET)
- Add detailed logging for auth.getSession to help troubleshoot failures
- Include raw response in error messages for debugging
2026-01-09 18:12:15 -06:00
vicrodh f07fc51651 Fix favorite state detection - correct API response structure
Qobuz API returns { albums: { items: [...] }, tracks: { items: [...] } }
not { items: [...] } directly. Updated AlbumDetailView and
PlaylistDetailView to correctly access nested structure.
2026-01-09 18:10:14 -06:00
vicrodh 8f26ce7df7 Add Cast button to NowPlayingBar and FullScreenNowPlaying
- Add Cast icon from lucide-svelte
- Add onCast callback prop to both components
- Show "Casting coming soon" toast when clicked
- Backend cast module is disabled pending fixes
2026-01-09 18:01:56 -06:00
vicrodh 334f05b870 Add favorite heart indicator to tracks in track lists
- Add isFavorite prop to TrackRow component
- Show filled heart icon for favorited tracks
- Fetch favorite tracks on mount in AlbumDetailView
- Fetch favorite tracks on mount in PlaylistDetailView
- Always show heart in FavoritesView tracks (already favorited)
2026-01-09 17:59:28 -06:00
vicrodh 1fc7664cef Add quality badges (CD, HiRes, MAX) to replace dot indicators
- Create QualityBadge component with tier detection
- CD badge shows disc icon for 16-bit lossless
- HR badge for 24-bit Hi-Res audio
- MAX badge for 24-bit >96kHz Hi-Res+
- Update NowPlayingBar and FullScreenNowPlaying to use badges
- Pass bitDepth and samplingRate props through components
2026-01-09 17:56:37 -06:00
vicrodh d6ca09cda3 feat: UI improvements for menus and favorites
- Remove blue circle from fullscreen play button (match other controls)
- Add icons to TrackMenu items (Play, ListPlus, Heart, Share2, Disc3, User)
- Check album favorite status on mount in AlbumDetailView
- Improve control button styling with flexbox alignment
2026-01-09 17:52:40 -06:00
vicrodh e8c6f7372f fix: add clipboard write permission to capabilities 2026-01-09 17:43:04 -06:00
vicrodh 145186a06a feat: add casting module scaffolding (disabled)
Import Chromecast, AirPlay, and DLNA casting scaffolding from separate
branches. The module is currently disabled due to:

- Thread safety issues: rust_cast uses Rc internally (not Send)
- API compatibility: rupnp methods have changed

The scaffolding includes:
- Chromecast: mDNS discovery, device connection, media server
- AirPlay: Discovery scaffolding (RAOP playback pending)
- DLNA/UPnP: SSDP discovery scaffolding (playback pending)

To enable casting in the future:
1. Fix rust_cast thread safety (or use spawn_blocking)
2. Update rupnp API calls for current version
3. Add Deserialize derive to metadata types
4. Uncomment cast module in lib.rs
5. Wire up commands in invoke_handler
2026-01-09 17:40:26 -06:00
vicrodh e908d334c1 fix: use Tauri clipboard plugin for reliable share links
- Add tauri-plugin-clipboard-manager for reliable clipboard access
- Replace browser clipboard API with Tauri plugin
- Improve error messages in share functions to be more specific
- Add loading indicator for Song.link fetch
2026-01-09 17:35:18 -06:00
vicrodh 31549828e6 fix(track-menu): keep menus in view 2026-01-09 17:18:52 -06:00
vicrodh e9151b6c55 feat(tracks): add share and queue actions menu 2026-01-09 17:15:55 -06:00
vicrodh cf584aa1b2 fix(playlists): include tracks in playlist fetch 2026-01-09 16:44:37 -06:00
vicrodh db0113ee02 feat(search): add clear button and alt navigation 2026-01-09 16:38:57 -06:00
vicrodh b6a3f2127b feat(search): preserve results and support mouse navigation 2026-01-09 16:34:56 -06:00
vicrodh fbb0b10be3 feat: artist top tracks and play button simplification
- Remove blue circle from play/pause, now uses same style as other controls
- Add Popular Tracks section to ArtistDetailView with Play All
- Search tracks by artist name and filter results
- Connect onTrackPlay to play tracks from artist view
2026-01-09 16:23:16 -06:00
vicrodh 5d5566102c fix: sidebar reorganization and play button icon
- Move Favorites to its own section outside Playlists
- Add collapsible chevron to Playlists section
- Fix play/pause button with explicit fill and color props
2026-01-09 16:20:24 -06:00
vicrodh 15fe8ac3fe feat: connect artist view from search and favorites
- Add onArtistClick prop to SearchView and FavoritesView
- Convert artist cards to buttons with click handlers
- Wire up handleArtistClick in main page
2026-01-09 15:38:04 -06:00
vicrodh 905825177c fix: play button icon, playlist modal styling, and JSON parsing
- Fix play button by removing fill props and using CSS to style svg
- Add custom dropdown arrow and dark theme styling for select element
- Add #[serde(default)] to many model fields to handle missing data
- Add Default implementations for Artist, PlaylistOwner, ImageSet
2026-01-09 15:35:35 -06:00
vicrodh fa1ce98fc0 feat: add collapsible Local Library section in Sidebar
- Add chevron toggle to Local Library header
- Content collapses/expands on click
- Matches styling of other sidebar sections
2026-01-09 15:11:58 -06:00
vicrodh ffadf70c8b fix: track list layout and HomeView content rendering
- Add explicit flex-direction: row and width: 100% to TrackRow
- Add missing .track-list and .tracks container styles in AlbumDetailView
- Add gap: 16px to table header to match TrackRow alignment
- Add box-sizing: border-box for consistent sizing
2026-01-09 15:11:07 -06:00
vicrodh 12a53a63d1 fix: adjust main-content height for proper layout 2026-01-09 15:06:33 -06:00
vicrodh 490cd2f9ea fix: constrain search button height to prevent square expansion 2026-01-09 14:59:00 -06:00
vicrodh cdc06d8759 fix: multiple UX improvements and bug fixes
Playlist & Favorites:
- Fix playlist loading error (missing field `id` in JSON parsing)
- Add serde defaults for Track and PlaylistOwner optional fields
- Fix track favorites toggle to actually call backend API
- Add "Add to playlist" button on track rows in album view

Sidebar UI improvements:
- Increase sidebar width to 280px
- Reduce text size and margins throughout
- Normalize all icons to 14px (matching + and refresh buttons)
- Add text overflow with ellipsis and tooltip for playlist names

User card:
- Make user card more compact (smaller avatar, fonts, icons)
- Add collapsible toggle - when collapsed shows mini QBZ logo + username

Queue & Playback:
- Fix next_track spam when queue has only one song (queueEnded flag)

Other fixes:
- Fix TrackRow prop types (remove invalid hires, bitDepth, samplingRate props)
- Fix FavoritesView and PlaylistDetailView component prop types
- Add diagnostic logging to credential persistence
2026-01-09 14:55:53 -06:00
vicrodh 6eed045404 feat(auth): add secure credential persistence using system keyring
- Add keyring crate for secure credential storage (KWallet/GNOME Keyring)
- Create credentials module with save/load/clear functions
- Add auto_login command that uses saved credentials
- Add "Remember me" checkbox to login form (default: checked)
- Auto-login on app startup if credentials are saved
- Clear credentials from keyring on logout
- Show dynamic status during initialization (connecting, checking, logging in)
2026-01-09 14:37:49 -06:00
vicrodh 541f46e430 feat(integrations): add Discogs artwork fetch and fix Last.fm env loading
- Add Discogs API client for fetching missing album artwork
- Add UI button in Local Library settings to fetch missing artwork
- Load .env file at runtime using dotenvy for development
- Fix Last.fm to check runtime env vars as fallback to compile-time
- Use XDG Portal for dialog plugin (cross-desktop compatibility)
- Update README and .env.example with Discogs configuration
2026-01-09 14:30:35 -06:00
vicrodh f6dbf2ee2a feat(library): extract and display album artwork
- Extract embedded artwork from audio files during scan
- Save extracted artwork to cache directory (~/.cache/qbz/artwork)
- Fallback to folder artwork (cover.jpg, folder.jpg, front.jpg, etc.)
- Add get_artwork_cache_dir helper function
- Artwork now displays in album cards and detail views
2026-01-09 14:07:09 -06:00
vicrodh e8a61a45ce feat(library): improve local library UX and audio metrics
- Move Local Library section below Playlists in sidebar (Qobuz is main B.U.)
- Replace text input with native XDG folder picker dialog
- Add bit_depth and sample_rate to LocalAlbum model
- Display rich audio specs in album detail view (format, bit depth, sample rate, channels)
- Show format quality badge on album cards (e.g. "FLAC 24/96")
- Add Hi-Res visual indicator for 24-bit or >48kHz content
2026-01-09 14:05:17 -06:00
vicrodh b0a64b9caa feat: add tauri-plugin-dialog for file picker 2026-01-09 13:56:10 -06:00
vicrodh daaef7f0b1 fix: resolve Svelte component directive error and clarify README 2026-01-09 13:54:44 -06:00
vicrodh f7ca1a9557 feat(playlists): add local playlist enhancements
- Add playlist settings table for storing local-only features per playlist
- Add playlist local tracks table for mixing local tracks into Qobuz playlists
- Implement search within playlist (filters by title, artist, album)
- Add custom sorting (by title, artist, album, duration, ascending/descending)
- Add custom artwork selection with file picker
- Create .env.example for Last.fm credentials setup
- Update README with environment configuration instructions
2026-01-09 13:51:54 -06:00
vicrodh 24f551b571 feat(playlists): add playlist management UI
- Create PlaylistModal component for create/edit/add tracks
- Add "New Playlist" button to Sidebar
- Add refresh button for playlists in Sidebar
- Wire playlist creation modal into main page
- Support creating playlists and adding tracks to existing playlists
2026-01-09 13:41:46 -06:00
vicrodh caca535cc0 feat(playlists): add Qobuz playlist management API
- Add create_playlist API method and command
- Add delete_playlist API method and command
- Add add_tracks_to_playlist API method and command
- Add remove_tracks_from_playlist API method and command
- Add update_playlist API method and command
- Register all new commands in invoke_handler
2026-01-09 13:39:02 -06:00
vicrodh fb105948ac docs: update README branding and add LICENSE 2026-01-09 13:36:09 -06:00
vicrodh 768a267e86 chore: remove internal docs (moved to qbz-nix-docs) 2026-01-09 13:36:05 -06:00
vicrodh 80556e219f feat(library): add local library frontend UI
- Create LocalLibraryView component with albums, artists, tracks tabs
- Add folder management (add/remove library folders)
- Add library scan progress indicator
- Add album detail view with track list
- Integrate local track playback with queue system
- Track local vs Qobuz tracks for proper skip/advance behavior
- Update Sidebar with simplified Library navigation
2026-01-09 13:36:00 -06:00
vicrodh 20e4d1b0ed docs: refresh README positioning and features 2026-01-09 13:30:11 -06:00
vicrodh bcfd9bbf48 docs: add Codex prompt for Chromecast integration 2026-01-09 13:27:24 -06:00