Commit Graph
7005 Commits
Author SHA1 Message Date
vicrodh e98ea146e3 refactor: extract authentication state into authStore
- Create authStore.ts for managing login state and user info
- Implement setLoggedIn and setLoggedOut actions
- Update +page.svelte to use store subscription
- Simplify handleLoginSuccess and handleLogout handlers
2026-01-10 04:30:11 -06:00
vicrodh 6edfb5db06 refactor: extract UI/overlay states into uiStore
- Create uiStore.ts for overlay and modal visibility states
- Centralize queue panel, fullscreen, focus mode, cast picker states
- Add playlist modal state management with mode and track IDs
- Implement handleEscapeKey for prioritized overlay closing
- Update +page.svelte to use store subscription and functions
2026-01-10 04:28:34 -06:00
vicrodh 0e8371d900 refactor: extract toast notifications into toastStore
- Create toastStore.ts with centralized toast state management
- Add auto-hide functionality with configurable durations per type
- Update +page.svelte to use store subscription instead of local state
- Maintains existing toast behavior with improved separation of concerns
2026-01-10 04:25:45 -06:00
vicrodh 95488014a6 feat: implement functional seek in audio player
- Add Seek command to AudioCommand enum
- Store audio data in audio thread for re-seeking
- Use rodio's skip_duration to seek to desired position
- Preserve play/pause state after seeking
- Update playback timer to account for seek position
2026-01-10 04:21:56 -06:00
vicrodh baa656a508 feat: add local library tracks to Qobuz playlists
- Create AddToPlaylistModal component for selecting playlists
- Update PlaylistDetailView to merge local and Qobuz tracks
- Add visual indicator (HardDrive icon) for local tracks
- Show notice that local tracks are device-specific
- Add "Add to Playlist" option in Local Library track menu
- Connect local track play handlers for playlists
- Hide download button for local tracks in playlists
2026-01-10 04:01:44 -06:00
vicrodh 93a6e9545a feat: hide download button for local library tracks 2026-01-10 03:50:29 -06:00
vicrodh 16939e02f4 fix: use asset:// protocol for local library artwork in players 2026-01-10 03:48:54 -06:00
vicrodh fbfa067b94 feat(cast): add multi-protocol support for Chromecast, DLNA, and AirPlay
- Update CastPicker to show protocol tabs with device counts
- Register DLNA and AirPlay state and commands in lib.rs
- Add Deserialize derive to DlnaMetadata and AirPlayMetadata
- Fix capabilities file (remove unavailable fs permissions)
- Remove unused IpAddr import in media_server.rs
2026-01-10 03:41:11 -06:00
vicrodh 762df3e122 fix: Last.fm scrobbling and LocalLibrary cover art
- Restore Last.fm session on app startup (not just when visiting Settings)
- Fix LocalLibrary artwork: use asset://localhost/ instead of file://
- Add fs:allow-read capability for asset protocol
- Enable assetProtocol in tauri.conf.json
2026-01-10 03:36:31 -06:00
vicrodh 2bf9856179 feat(favorites): add download button and search to all tabs
- Add download functionality to FavoritesView tracks tab
- Add search input for each tab (tracks, albums, artists)
- Filter displayed items based on search query
- Show "no results" message when search has no matches
- Display filtered/total counts in toolbar
- Use buildDisplayTrack helper for cleaner code
2026-01-09 20:20:27 -06:00
vicrodh 5a07408acf fix(download): persist download state across views
- Add downloadStateVersion prop to trigger reactivity in child components
- Use version in each block keys to force re-evaluation when state changes
- Ensures download status persists whether track was downloaded from
  album view or playlist view
2026-01-09 20:11:39 -06:00
vicrodh 6de37c296b feat(download): add download button to playlist view and album download button
- Add download functionality to PlaylistDetailView (track-by-track)
- Add handleDisplayTrackDownload handler for playlist tracks
- Add "Download Album" button to AlbumDetailView header actions
- handleDownloadAlbum queues all non-downloaded tracks for download
2026-01-09 20:02:59 -06:00
vicrodh 97951b2189 fix: use file storage as primary for credentials (more reliable in dev) 2026-01-09 19:53:02 -06:00
vicrodh 087fbbd567 fix: verify keyring save and fallback if verification fails 2026-01-09 19:48:36 -06:00
vicrodh 1aaf360bd5 fix: add logging to credential checking for debugging 2026-01-09 19:47:24 -06:00
vicrodh 9111165ee9 fix(share): fall back to song.link direct url 2026-01-09 19:44:46 -06:00
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