Commit Graph
464 Commits
Author SHA1 Message Date
vicrodh 9b8e1352eb Wire settings: account info, themes, and cache management
- Account section now shows real user name and subscription
- Logout button connected to logout handler
- Theme switching with persistence (Dark/Light/OLED Black/Warm)
- Theme loads on app startup from localStorage
- Cache stats display (size, max, track count)
- Clear cache functionality with disabled state
2026-01-09 11:10:41 -06:00
vicrodh ef8feebc45 Add system notifications for track changes
- Add notify-rust dependency for desktop notifications
- Create notification.rs commands module with show_track_notification and show_notification
- Register notification commands in lib.rs
- Wire up notifications in frontend for all playback scenarios:
  - Search results playback
  - Album track playback
  - Playlist track playback
  - Queue navigation and auto-advance
2026-01-09 11:04:03 -06:00
vicrodh bda4ea5b76 Add playlist and favorites commands, update sidebar
Backend:
- Add playlist.rs commands: get_user_playlists, get_playlist, search_playlists
- Add favorites.rs commands: get_favorites, add_favorite, remove_favorite
- Add API client methods: search_playlists, add_favorite, remove_favorite

Frontend:
- Remove Radio and New from sidebar (no API support)
- Sidebar now loads and displays user playlists dynamically
- Add playlist and favorites views (placeholder for now)
- Pass selectedPlaylistId and onPlaylistSelect to Sidebar
2026-01-09 10:49:43 -06:00
vicrodh dd2600feaa Add QBZ branding icons and logo
- Replace all Tauri icons with QBZ logo variants
- Update LoginView splash screen to use logo.png
- Add logo.png to static folder for web use
- Update favicon.png with QBZ icon
2026-01-09 10:35:24 -06:00
vicrodh 53e0fd0e10 Improve caching and UI sync
- Add skip operation guard to prevent concurrent track changes
- Implement aggressive prefetch (3 tracks ahead instead of 1)
- Add peek_upcoming method to queue for multi-track prefetch
2026-01-09 10:20:13 -06:00
vicrodh 5f7c0bb4fa Fix QueueManager deadlock: consolidate multiple mutexes into single state struct
- Replaced 7 separate Mutex fields with single InternalState struct
- Prevents deadlock when multiple locks acquired in different orders
- Same pattern as AudioCache fix
- Fixed borrow checker issue in add_track method
2026-01-09 10:14:25 -06:00
vicrodh 913b80e09a fix: resolve deadlock in audio cache with single mutex 2026-01-09 10:05:29 -06:00
vicrodh 28bd316c89 feat: implement audio caching with prefetch
- Add AudioCache module with LRU eviction (500MB default)
- Cache downloaded tracks in memory
- Prefetch next track in queue while current track plays
- Play from cache instantly when track is already cached
- Background prefetch task runs without blocking playback
2026-01-09 09:59:21 -06:00
vicrodh b5c853d945 feat: implement queue management system
- Add QueueManager in Rust backend with shuffle, repeat modes, and history
- Create queue Tauri commands (add, remove, next, previous, play_index, etc.)
- Wire Next/Previous buttons to backend queue
- Auto-advance to next track when current track ends
- Sync queue state with frontend QueuePanel
- Wire shuffle and repeat toggles to backend
- Add queue population when playing from album detail view
2026-01-09 09:46:17 -06:00
vicrodh 62e59f599a feat: add MPRIS media controls integration
Backend (Rust):
- Add souvlaki crate for MPRIS support on Linux
- Create media_controls module with MediaControlsManager
- Track metadata (title, artist, album, duration, cover)
- Playback state (playing/paused/stopped)
- Wire pause/resume/stop commands to update MPRIS
- Add set_media_metadata Tauri command

Frontend (Svelte):
- Call set_media_metadata when track starts playing
- Send track info to MPRIS for system integration

Now shows track info in system media controls and
supports media key events (logged for now).
2026-01-09 09:30:26 -06:00
vicrodh d1a13110ea feat: add real-time playback position sync and skip buttons
Backend (Rust):
- Add position tracking based on elapsed wall clock time
- SharedState now tracks playback start time and position at start
- get_state() returns real-time position instead of stale value
- Position automatically pauses/resumes with playback

Frontend (Svelte):
- Replace dumb setInterval timer with backend polling (500ms)
- Poll get_playback_state to sync position from Rust
- Add onSkipBack/onSkipForward handlers to NowPlayingBar
- Add onSkipBack/onSkipForward handlers to FullScreenNowPlaying
- Wire skip buttons to handlers (restart if >3s, otherwise previous)
- Add keyboard shortcuts: Ctrl+Left/Right for skip
2026-01-09 09:26:02 -06:00
vicrodh c454eeddbe fix: correct app secret extraction regex pattern
The regex pattern for extracting info/extras from the Qobuz bundle
was incorrect. The pattern now:
- Dynamically builds timezone alternatives from extracted seeds
- Capitalizes timezone names to match bundle format (e.g., "Berlin")
- Correctly parses the name:"\w+/Timezone" format
- Converts back to lowercase for seed lookup

This enables successful FLAC streaming from Qobuz.
2026-01-09 09:15:32 -06:00
vicrodh 3a0e3f26d5 fix: add missing CSS import and fix UI issues
- Add app.css import to +layout.svelte (fixes broken/light UI)
- Add logging for audio debugging
- Add image fallbacks for album and track artwork
- Fix sidebar/main-content layout (flex-shrink, min-width)
- Remove placeholder data from HomeView
- Add LoginView and SearchView components
- Update window title and branding to QBZ
2026-01-09 08:47:53 -06:00
vicrodh 8a094ef467 Initial project setup
- Tauri 2.0 + Svelte + TypeScript scaffolding
- Qobuz API client implementation (Rust)
  - Bundle token extraction
  - User authentication
  - Request signing (MD5 signatures)
  - Search/browse endpoints
  - Stream URL retrieval with quality fallback
- Tauri commands for frontend IPC
- Module stubs for player, queue, config
2026-01-08 22:35:34 -06:00