Commit Graph
454 Commits
Author SHA1 Message Date
vicrodh 78ff72e58a fix(dlna): use device-described control URLs 2026-01-12 14:33:07 -06:00
vicrodh 0acfb5343b fix(cast): keep Chromecast session alive 2026-01-12 14:26:12 -06:00
vicrodh 39f6907fc1 fix(cast): use target-local IP for media server 2026-01-12 13:56:33 -06:00
vicrodh c762e91437 fix(player): avoid symphonia track borrow 2026-01-12 13:14:10 -06:00
vicrodh be28ab1396 fix(library): allow local artwork paths 2026-01-12 13:05:04 -06:00
vicrodh 3f13212978 fix(player): decode alac via symphonia 2026-01-12 13:04:45 -06:00
vicrodh 0c456d4ae3 fix(player): avoid moved mp4 hint 2026-01-12 12:44:37 -06:00
vicrodh 9bcc4e2888 fix(asset): allow home paths for artwork 2026-01-12 12:30:37 -06:00
vicrodh a6e7a0ca6a fix(player): add mp4 decode fallback 2026-01-12 12:30:23 -06:00
vicrodh d2b219ea1d fix: CI workflow failures
Linux workflow:
- Remove xdg-portal feature from tauri-plugin-dialog to fix ashpd/zbus version incompatibility
- The ashpd 0.11.0 crate has breaking changes with zbus 5.x

Flatpak workflow:
- Use build-options.append-path instead of shell export to properly set PATH for SDK extensions
- This ensures npm/rust binaries are available in all build commands
2026-01-12 11:55:04 -06:00
vicrodh eefec87d91 feat: add API Keys settings section for user-provided credentials
- Add api_keys module with store for user-provided credentials (Spotify, Tidal, Discogs)
- Add commands to get/set/clear credentials for each provider
- Update providers to check user credentials first (priority: user > embedded > env)
- Add collapsible API Keys section to SettingsView
- Show status badges (Active, Custom, Not configured) for each provider
- Store user credentials in localStorage with backend sync
2026-01-12 11:52:18 -06:00
vicrodh 3e58803962 feat(build): embed API credentials at compile time
- Add option_env! for Discogs, Spotify, Tidal credentials
- Credentials embedded in binary during CI build
- Falls back to runtime env vars for development/user override
- Add secrets to GitHub Actions workflows for Linux and Flatpak builds
- Fix Linux build: add libasound2-dev, libssl-dev
- Fix Flatpak build: use --user flag for flatpak operations
2026-01-12 11:38:11 -06:00
vicrodh 21582315cc feat: wire save queue as playlist, disable AirPlay backend
- Add handleSaveQueueAsPlaylist() to collect queue track IDs
- Wire QueuePanel "Save as Playlist" button to open playlist modal
- Comment out AirPlay commands in lib.rs (RAOP not implemented)
- Comment out AirPlay state initialization
- Move documentation files to qbz-nix-docs/ directory

AirPlay research concluded no viable Rust RAOP library exists.
Feature deferred until custom implementation or library emerges.
See qbz-nix-docs/AIRPLAY_IMPLEMENTATION_STATUS.md for details.
2026-01-12 11:00:02 -06:00
vicrodh 1ac6d15551 Implement Chromecast frontend and DLNA AVTransport casting
Frontend:
- Add castStore for managing cast state (connect, disconnect, play, pause, etc)
- Update CastPicker to use castStore, show connected device banner with disconnect
- Wire isCastConnected to NowPlayingBar and ExpandedPlayer for visual indicator
- Modify playbackService to cast when connected instead of local playback

DLNA Backend:
- Implement full AVTransport SOAP client with:
  - SetAVTransportURI with DIDL-Lite metadata
  - Play, Pause, Stop, Seek actions
  - RenderingControl SetVolume
- Add dlna_play_track command that fetches stream, downloads audio, and serves via media server
- Share media server between Chromecast and DLNA
2026-01-12 10:11:09 -06:00
vicrodh a4c09041a4 Add ALSA error auto-recovery with startup retry
- Add stream_error flag to SharedState for tracking audio errors
- Add startup retry logic (5 attempts, 500ms delay) for audio init
- Auto-reinit audio device when sink creation fails 3+ times
- Handles PipeWire/ALSA not ready at app launch scenario
2026-01-12 09:42:40 -06:00
vicrodh b186119221 fix: MiniPlayer size - setMinSize before setSize to bypass 800x600 minimum
- Added core:window:allow-set-min-size permission
- Call setMinSize(300x140) before setSize to allow smaller window
- Restore original minSize (800x600) when exiting miniplayer
- Added more console logs for debugging
2026-01-12 08:40:30 -06:00
vicrodh dc2c4237e6 fix: MiniPlayer button clicks, 300px width, 8px margin, transparency
- Stop event propagation on all buttons to prevent drag capture
- Reduce window size to 300x140px
- Increase margin to 8px
- Enable window transparency in tauri.conf.json
- Compact UI for smaller size (smaller artwork, tighter controls)
2026-01-12 08:36:01 -06:00
vicrodh 645fe8bb4e fix: Add missing window permissions for MiniPlayer resize operations 2026-01-12 07:51:42 -06:00
vicrodh 6d41741f76 feat: Redesign MiniPlayer to replace main window temporarily
- MiniPlayer now resizes the main window instead of creating a separate floating window
- Cider-inspired UI with large album art, track info, full playback controls
- Progress bar with current/remaining time display
- Shuffle, repeat, volume controls integrated
- Pin/restore buttons to control always-on-top and return to main view
- Fixed tray icon to use transparent PNG from static/icons
2026-01-12 07:28:14 -06:00
vicrodh 0a3ced23bf fix: add webview permissions for MiniPlayer window creation 2026-01-12 07:19:22 -06:00
vicrodh 06fa565d84 feat: add system tray icon with playback controls
- Add tray-icon feature to Tauri dependencies
- Create tray.rs module with full tray implementation
- Tray menu: Play/Pause, Next, Previous, Show/Hide, Quit
- Left-click toggles window visibility
- Double-click always shows and focuses window
- Right-click shows context menu
- Frontend listens for tray:play_pause, tray:next, tray:previous events
- Tray icon uses app default icon with "QBZ - Music Player" tooltip
2026-01-12 02:07:51 -06:00
vicrodh c43867d403 feat: cross-platform audio device listing and Mac Easter egg
- Add conditional compilation for get_pipewire_sinks():
  - Linux: Uses pactl to get PipeWire/PulseAudio sinks with volume info
  - macOS/Windows: Uses cpal to enumerate audio devices (no volume)
- AboutModal: Detect platform and show macOS or Linux label
- Easter egg: Tux penguin is 64px on Mac (asserts dominance)
2026-01-12 01:25:59 -06:00
vicrodh 8257e8866b feat: platform-specific dialog plugin (xdg-portal on Linux only) 2026-01-12 01:22:44 -06:00
vicrodh 4e2491a9a6 feat(artist): add artist detail and similar endpoints 2026-01-12 00:36:52 -06:00
vicrodh 83afac8b37 feat: add ML-based playlist suggestions
- Add get_playlist_suggestions backend command using reco_store scores
- Add Suggested Tracks expandable section in PlaylistDetailView
- Track dismissals persisted in localStorage per playlist
- Add button to add suggestions directly to playlist
- Boost favorite tracks 1.5x in suggestion ranking
2026-01-11 23:50:48 -06:00
vicrodh 3fb9ee1381 feat(playlists): Add playlist management - filter, sort, view modes, collage artwork
- Add PlaylistCollage component with Qobuz-style overlapping covers
- Add playlist_settings columns (hidden, position) with migration
- Add playlist_stats table for play count tracking
- Add backend commands for playlist management:
  - playlist_get_all_settings, playlist_set_hidden
  - playlist_set_position, playlist_reorder
  - playlist_get_stats, playlist_get_all_stats
  - playlist_increment_play_count
- Update Sidebar with filter dropdown (All/Visible/Hidden)
- Add sort dropdown (Name/Recent/Custom)
- Add view toggle between list and grid modes
- Fix TypeScript errors in +page.svelte and TitleBar.svelte
2026-01-11 20:37:23 -06:00
vicrodh 70f03a1003 fix: quality badge accuracy and queue drag-to-reorder
Quality Badge Fix:
- Extended BackendQueueTrack with hires, bit_depth, sample_rate fields
- Updated all queue track builder functions to pass quality data
- Fixed quality badge showing CD instead of Hi-Res for playlist tracks
- Extended session persistence to save/restore quality info

Queue Drag-to-Reorder:
- Added move_track function to Rust QueueManager
- Added move_queue_track Tauri command
- Implemented HTML5 drag-and-drop in QueuePanel
- Visual feedback with drag-over indicator and dragging opacity
- Disabled drag when search filter is active
- Prevented text selection during drag operations
2026-01-11 19:28:34 -06:00
vicrodh 00a7c97322 fix(playlist-import): fix Tidal API rate limiting and chunk size
- Add 200ms delay between API calls to avoid 429 Too Many Requests
- Reduce chunk size from 50 to 20 (Tidal API limit for filter[id])
- Improve error messages to include response body for debugging
2026-01-11 18:40:45 -06:00
vicrodh 22cf6d9051 feat(playlist-import): integrate Codex playlist import feature
Cherry-pick and integrate playlist import from playlist-import-impl branch:
- Add playlist_import Rust module with providers (Spotify, Apple, Tidal, Deezer)
- Add track matching algorithm (ISRC first, then fuzzy matching)
- Add PlaylistImportModal.svelte with progress log UI
- Wire up import button in Sidebar
- Add modal state management in uiStore
- Register Tauri commands for preview and execute

Original implementation by Codex, integrated manually due to branch divergence.
2026-01-11 17:42:52 -06:00
vicrodh 7bb2b20767 Show quality info on separate line in track notifications 2026-01-11 12:51:46 -06:00
vicrodh bc7e13d756 Improve track notifications with artwork and quality info 2026-01-11 12:38:21 -06:00
vicrodh 0eb0b2ec1f Add audio device reinit for proper exclusive mode release 2026-01-11 11:47:47 -06:00
vicrodh b6b019e659 Add PipeWire device names via pactl and fix badge margins 2026-01-11 11:37:45 -06:00
vicrodh 3fd3d25bdc Add device validation before using saved audio device
- Validate device has supported output configs before using
- Fall back to default if saved device is invalid
- Reduces polling frequency to 10 seconds
2026-01-11 11:10:02 -06:00
vicrodh f6b2b07f5d Fix cover art and badge margins, add audio error detection
UI:
- Cover art now has 2px margin vs song-card edges
- Quality badges have 2px margin on right side

Audio:
- Track consecutive sink failures to detect broken streams
- Stop playback gracefully after 3 failures
2026-01-11 11:08:25 -06:00
vicrodh dd9d5558fa Add audio output badges and pretty device names
- Add AudioOutputBadges component showing DAC/Exclusive mode status
- Badges are reactive to actual player state, not just settings
- Add device tooltip on hover showing current output device
- Create audioDeviceNames helper for ALSA name to friendly name mapping
- Use pretty names in Settings dropdown while storing raw names
- Add get_audio_output_status backend command
- Store current device name in player SharedState
2026-01-11 11:00:31 -06:00
vicrodh c80f2d9583 Wire audio device selection from settings to player
- Player::new() now accepts optional device name
- Uses OutputStream::try_from_device() for specific device
- AppState reads saved device from audio settings on startup
- SettingsView loads/saves audio settings to backend
- Changes take effect on app restart
2026-01-11 03:54:56 -06:00
vicrodh 29079458cf Add audio settings storage and commands
Backend:
- Create config/audio_settings.rs with SQLite persistence
- Store output_device, exclusive_mode, dac_passthrough, sample_rate
- Add Tauri commands: get_audio_settings, set_audio_*
- Register state and commands in lib.rs

Note: Player modification to USE these settings is pending.
See HANDOFF.md for implementation details.
2026-01-11 03:46:21 -06:00
vicrodh ddc9497286 Implement session persistence between app restarts
Backend (Rust):
- Create session_store module with SQLite database
- Store queue tracks, current index, position, volume, shuffle/repeat
- Add Tauri commands: save_session_state, load_session_state, etc.
- Use WAL mode for better concurrent access

Frontend (TypeScript):
- Create sessionService.ts with save/load functions
- Restore session after login (queue, track info, volume, modes)
- Save session on beforeunload and visibility change
- Clear session on logout
- Debounced position saving during playback

Users can now close the app and resume where they left off.
2026-01-11 03:37:49 -06:00
vicrodh d9a850302b Add window permissions for CSD controls (Tauri 2.0) 2026-01-11 03:02:37 -06:00
vicrodh 96dc524c92 Implement Client-Side Decorations (CSD) with custom title bar
- Disable native window decorations in tauri.conf.json
- Create TitleBar component with minimize/maximize/close controls
- Add drag region for window movement
- Integrate TitleBar into main layout and LoginView
- Adjust content heights to account for 36px title bar
- Prepare for future mini player implementation
2026-01-11 02:56:17 -06:00
vicrodh 57bfc0eb48 Fix About modal links and improve Linux integration
- Use Tauri opener plugin for all external links in About modal
- Convert anchor tags to buttons with openUrl() for proper browser opening
- Add GTK_USE_PORTAL=1 for native file dialogs on Linux (KDE Plasma)
- Add Tux.svg and mexico-flag.svg for About modal signature
2026-01-11 02:53:03 -06:00
vicrodh 1a2a9ee728 feat(cache): add SQLite-based API cache for albums, tracks, and artists
- Create api_cache module with TTL-based expiration (24h default)
- Cache get_album, get_track, and get_artist responses
- Check cache before API calls, store results after fetch
- Reduces API calls and speeds up Recently Played loading
2026-01-11 02:17:43 -06:00
vicrodh 5499add37d fix(home): use hybrid approach for Continue Listening to show recent plays immediately
Instead of relying solely on pre-computed scores (trained on login),
now merge the 4 most recent plays with scored items. This ensures
newly played tracks appear at the top without waiting for retraining.
2026-01-11 02:17:37 -06:00
vicrodh 6f8dc41a98 feat: add Qobuz featured albums (New Releases, Press Awards)
- Add album/getFeatured endpoint to API
- Create get_featured_albums Tauri command
- Add New Releases and Press Awards sections to HomeView
- Featured albums load first for faster perceived performance
2026-01-11 00:25:57 -06:00
vicrodh f4e8d68538 feat(home): add recommendation store and data-driven home
Backend:
- Add reco_store module with SQLite-backed event storage
- Add reco_log_event, reco_get_home commands
- Add ML-lite scoring: reco_train_scores, reco_get_home_ml
- Score decay based on event age (configurable half-life)

Frontend:
- Add recoService.ts for event logging
- Log play/favorite/playlist_add events
- Add albumId/artistId to PlayingTrack for tracking
- Rework HomeView to fetch recommendations from reco_store
- Display recently played, continue listening, top artists, favorites

Integrated from home-reco and home-reco-ml branches
2026-01-10 08:10:34 -06:00
vicrodh ab705db9cd fix(lyrics): add User-Agent header and debug logging to LRCLIB requests
LRCLIB API may require User-Agent header. Added debug logging to
see raw response and parsing results.
2026-01-10 07:24:26 -06:00
vicrodh 6b2466a976 fix(lyrics): prefer synced lyrics from LRCLIB search
When /api/get returns results without synced lyrics, now also
tries /api/search to find a version with synced LRC timestamps
2026-01-10 07:18:59 -06:00
vicrodh 80ff8afa3a feat: integrate lyrics module with UI
- Add lyricsStore for frontend state management with LRC parsing
- Wire LyricsSidebar to main layout with toggle button in NowPlayingBar
- Fix Rust compile errors (add Clone to LrclibItem, remove unused import)
- Add lyrics active line tracking with binary search
- Auto-start/stop lyrics updates based on playback state
2026-01-10 06:31:12 -06:00
vicrodh 489d73496a feat(lyrics): add backend cache and provider chain 2026-01-10 06:19:31 -06:00