Commit Graph
561 Commits
Author SHA1 Message Date
vicrodh 73d2bd114a feat(ui): show now-playing indicator in album and playlist rows 2026-01-12 15:56:08 -06:00
vicrodh 7a142b8d3e fix(ui): refresh sidebar playlist visibility 2026-01-12 15:39:08 -06:00
vicrodh 1b6c895f62 fix(cast): route playback controls to cast devices 2026-01-12 14:14:32 -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 d515ac905f refactor(miniplayer): remove pin button, shadow, make artwork clickable
- Remove pin button and related code (didn't work properly)
- Remove shadow from miniplayer frame
- Remove padding/border-radius for cleaner look
- Make artwork clickable (for future view mode switching)
- Move drag handler to top-section, artwork has pointer cursor
2026-01-12 09:30:04 -06:00
vicrodh e4483b4afa fix(session): fetch track details on restore for album/artist links
- Fetch full track info from Qobuz API when restoring session
- Populate albumId and artistId for working album/artist links
- Show correct quality badge (bitDepth/sampleRate) instead of placeholder
- Fallback to cached data if API call fails
2026-01-12 09:16:16 -06:00
vicrodh e93144e5ef feat(toast): buffering toast with shimmer effect, persistent until loaded
- Add 'buffering' toast type that doesn't auto-hide
- Add shimmer animation to "Buffering" text
- Add spinning loader icon for buffering state
- Toast shows "Buffering... [track name]" format
- Dismiss buffering toast when track loads or on error
- Remove callback pattern, use toastStore directly in services

fix(artwork): show empty placeholder when no artwork available

- NowPlayingBar shows empty placeholder instead of Play icon
- Miniplayer shows empty placeholder instead of Play icon
- Prevents showing incorrect CD placeholder on session restore
2026-01-12 09:06:58 -06:00
vicrodh 434f8d8a67 refactor(miniplayer): new layout matching user mockup
- Top section: artwork (square) + track info with restore button
- Track info shows "Artist — Album" format
- Full-width seek bar in middle
- Bottom: media controls left, window controls right (queue, pin)
2026-01-12 08:59:50 -06:00
vicrodh 5ebbcaca0b fix(miniplayer): restore button, resizable window, smaller cover art
- Move drag handler to artwork-section and track-info only, not parent
- Buttons in window-controls and controls-row now receive clicks
- Enable window resizing in miniplayer mode
- Reduce cover art width from 180px to 110px (~60% of original)
2026-01-12 08:49:53 -06:00
vicrodh 0aeb4fbbcc fix: MiniPlayer size 400x200, queue state null check, UI adjustments
- Changed dimensions to 400x200
- Reduced shadow area padding from 8px to 4px
- Added 6px margin around album art
- Fixed TypeError on qState.tracks.length with null checks
- Increased font sizes and control button sizes for larger window
2026-01-12 08:45:57 -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 2278d9b90e fix: MiniPlayer restore using localStorage and add 4px margin frame
- Use localStorage to persist original window state across navigation
- Add 4px margin frame around the player with rounded corners
- Darker background (#0f0f12) visible in the margin
- Box shadow for depth effect
2026-01-12 08:31:22 -06:00
vicrodh 0146852870 fix: MiniPlayer layout background color 2026-01-12 08:19:41 -06:00
vicrodh 86af410ab0 fix: MiniPlayer restore button, seekbar updates, and UI improvements
- Removed isMiniplayerMode guards that prevented restore
- Added startPolling/stopPolling for seekbar to update properly
- Removed border-radius to fix white corners issue
- Added queue button with track count badge
- Simplified CSS to solid background color
2026-01-12 08:19:27 -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 79b030f8ee feat: add MiniPlayer floating window
- Create miniplayerService.ts for window management
- Add /miniplayer route with compact player UI
- Sync playback state from main window via events
- MiniPlayer features:
  - Draggable window (decorations disabled)
  - Always-on-top toggle (pin button)
  - Album art, track title, artist
  - Play/Pause, Next, Previous controls
  - Progress bar
  - Close button (hides window)
- Add PictureInPicture2 button to NowPlayingBar
- State synced via emitTo('miniplayer', ...) events
2026-01-12 02:26:29 -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 fb0bd2b9cd fix: reliable session persistence during playback
- Enable debouncedSavePosition() during playback state updates
  (saves position every 5 seconds while playing)
- Flush position save immediately when pausing
- Add periodic full session save every 30 seconds during playback
- Persist volume changes to session immediately
- Persist shuffle/repeat mode changes to session immediately

This fixes the race condition where async saves in beforeunload
wouldn't complete before app close. Now we save frequently enough
that the worst case is losing only 5-30 seconds of progress.
2026-01-12 02:01:09 -06:00
vicrodh 19028ab232 feat(artist): enhance artist view sections 2026-01-12 00:37:03 -06:00
vicrodh bd578d8123 fix: z-index for menus/tooltips, sidebar dropdown, hi-res SVG icon
- Fix z-index across all menus and tooltips (10000+) to prevent overlap issues
- Redesign sidebar playlist header with dropdown menu: Sort by, Refresh, Import, Manage
- Add playlist tooltip on hover showing track count (lazy-loads artists)
- Fix submenu navigation with delayed close for better UX
- Replace hi-res PNG with SVG icon in QualityBadge
- Fix scrollbar spacing (8px from window edge) in main content
- Fix Svelte state_unsafe_mutation error in sidebar tooltip loading
2026-01-11 22:48:54 -06:00
vicrodh f4fe4b01c9 fix(ui): Standardize scrollbar across all views
- Add consistent scrollbar styling to all view components
- Scrollbar is visible (subtle) by default, brighter on hover
- Position scrollbar 8px from right edge
- Each view now handles its own scroll container
2026-01-11 22:08:57 -06:00
vicrodh 8f60a42d7f fix(ui): Import modal and scrollbar improvements
- Set min-height for import modal to prevent layout shift
- Fix Qobuz logo color to match text (white)
- Invert Tidal logo when active for visibility on dark background
- Reduce spacing between platform icons
- Refresh sidebar on playlist edit/delete from detail view
- Custom scrollbar: closer to edge, hidden until hover/scroll
2026-01-11 22:01:14 -06:00
vicrodh b18bd2eac2 feat(playlists): Wire PlaylistManagerView to main page
Add 'playlist-manager' to ViewType and connect it to Sidebar navigation
2026-01-11 20:53:31 -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 7affd2bf13 Fix Hi-Res quality badge showing as CD when playing from playlists
Root cause: Queue tracks were being built without quality fields (hires,
bit_depth, sample_rate) in multiple views. When auto-advancing or skipping
tracks, the playerStore would have undefined quality data, causing
QualityBadge to default to CD tier.

Fixed by:
- Adding quality fields to queue track builders in PlaylistDetailView,
  FavoritesView, ArtistDetailView, and LocalLibraryView
- Replacing all 'CD Quality' fallbacks with '-' placeholder in +page.svelte
- Adding bitDepth/samplingRate fields to ArtistDetailView DisplayTrack
2026-01-11 19:57:40 -06:00
vicrodh 1ae0073dff fix: use '-' placeholder for unknown quality instead of 'CD Quality'
- PlaylistDetailView: Show '-' when quality data is unavailable
- handleDisplayTrackPlay: Use '-' fallback, added TODO for streaming update
- handleDisplayTrackDownload: Consistent quality fallback logic
- TrackRow: Always render quality column (previous commit)

This prevents showing potentially incorrect 'CD Quality' labels.
Quality should be updated when actual streaming info is available.
2026-01-11 19:49:17 -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 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 f9baecfbdb Pass bitDepth and samplingRate to playTrack in all handlers 2026-01-11 12:41:50 -06:00
vicrodh dd758d3523 Fix session restore and audio badges visibility
Session restore:
- Add pendingSessionRestore state to playerStore
- When restored track is played, load from Qobuz first
- Seek to saved position after track loads

Audio badges:
- Always show DAC/EXC badges (very muted when off)
- Adjust margins and sizing for better alignment
2026-01-11 11:19:34 -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 3f114e11da Improve TitleBar: fix drag/controls and modernize design
- Use startDragging() API for reliable window dragging
- Create dedicated drag-region div for consistent drag behavior
- Double-click to maximize/restore
- Cleaner Discord/Spotify-inspired minimal design
- Reduce height to 32px for more content space
- Use Maximize2/Minimize2 icons for clearer visual feedback
- Fix button event handlers with proper async/await
2026-01-11 02:59:27 -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 5926bd6fd5 feat(about): replace user avatar with app logo and add About modal
- Replace avatar with app logo (72x72 icon)
- Add hover glow effect on logo without layout shift
- Click logo opens About modal with:
  - App description and links (GitHub, website)
  - Version, license, build info
  - Library/API attributions (Qobuz, Tauri, Svelte, etc.)
  - Author credit and signature message
2026-01-11 02:37:56 -06:00
vicrodh 1b90a45212 refactor(favorites): centralize track favorites in favoritesStore
- Create favoritesStore.ts for centralized favorites state management
- Refactor TrackRow to be self-sufficient with internal favorites handling
- TrackRow now subscribes to store and toggles favorites internally
- Remove redundant favoriteTrackIds state from AlbumDetailView and PlaylistDetailView
- Remove manual onAddFavorite prop drilling from all views
- Add trackId prop to TrackRow for store lookup (optional for local tracks)
- Add hideFavorite prop for local tracks that don't have Qobuz IDs
- Load favorites once on app init in +page.svelte
2026-01-11 02:08:14 -06:00
vicrodh d86db5745e feat: add Home customization with greeting and section ordering
- Add homeSettingsStore for persistent settings (localStorage)
- Create reusable Modal component with overlay
- Create HomeSettingsModal for customizing home layout
- Add time-based greeting (Good morning/afternoon/evening/night)
- Support custom greeting text with {name} placeholder
- Allow reordering and toggling visibility of sections
- Show Qobuz badge for editorial sections (New Releases, Press Awards)
- Add settings icon in home header using home-gear.svg
2026-01-11 00:40:23 -06:00
vicrodh bb996a4002 feat: improve HomeView with multiple fixes
- Reduce album card size by 10% (180px -> 162px)
- Move quality badge below artist name with subtle styling
- Fix Spanish texts to English for consistency
- Add missing onTrackPlay and onArtistClick handlers
- Implement progressive loading for faster home render
- Use fast reco_get_home query instead of ML-based one
2026-01-11 00:20:52 -06:00
vicrodh 8b46660c99 fix: handle song-card links for local tracks
When playing a local track:
- Album link navigates to local library view
- Artist link shows toast (no Qobuz artist ID available)
2026-01-10 23:56:40 -06:00
vicrodh 73ef1f91db feat: album/playlist header menu and UI consistency
Album/Playlist Menu:
- Remove + and Download buttons from headers
- Add AlbumMenu component with: Play Next, Play Later, Share (Qobuz/song.link), Download
- Implement queue handlers (handleAddAlbumToQueueNext, handleAddAlbumToQueueLater)
- Implement share handlers (shareAlbumQobuzLink, shareAlbumSonglink)
- Apply same menu to PlaylistDetailView

Button consistency (no more pills):
- AlbumDetailView: border-radius 20px → 8px
- PlaylistDetailView: border-radius 24px → 8px
- ArtistDetailView: border-radius 20px → 8px
- FavoritesView: border-radius 20px → 8px
- LocalLibraryView: border-radius 24px/20px → 8px

UserCard simplified (previous commit)
2026-01-10 23:54:25 -06:00
vicrodh 266b5e2029 fix: add proper bottom margin to NowPlayingBar
- Increase height to 104px (+8px)
- Increase bottom padding to 26px
- Remove divider separators
- Update all viewport height calculations
2026-01-10 23:31:59 -06:00
vicrodh 16c5336898 fix: increase NowPlayingBar height to 96px
- More bottom margin for controls row (padding 10px top, 14px bottom)
- Update all viewport height calculations to match
2026-01-10 23:24:50 -06:00
vicrodh c66fe100b5 fix: NowPlayingBar song-card improvements
- Add album prop and click handlers (onArtistClick, onAlbumClick)
- Fix controls-row padding (equal top/bottom: 8px)
- QualityBadge: use gray colors instead of white with alpha
2026-01-10 23:24:17 -06:00
vicrodh 609d88719e feat: redesign NowPlayingBar (88px) and update QualityBadge opacity
- Redesign NowPlayingBar with new layout: seekbar at top, controls/song card/volume below
- Increase NowPlayingBar height from 80px to 88px
- Update all height calculations to match (Sidebar, LyricsSidebar, main-content)
- Set QualityBadge text opacity to 85%
- Add static icons for quality badges (cd.svg, mp3.svg, logo-hires.png)
2026-01-10 23:18:24 -06:00
vicrodh 8f77e01578 Rename FullScreenNowPlaying to ExpandedPlayer + add lyrics
ExpandedPlayer:
- Renamed from FullScreenNowPlaying for clearer nomenclature
- Added lyrics panel on right side (Cider-style blend)
- Blurred album art background with gradient overlay
- All buttons now have tooltips
- Horizontal layout: artwork+controls left, lyrics right
- Responsive breakpoints for smaller screens

FocusMode:
- Centered main layout (max-width: 1400px)
- Fixed empty space on right side

Nomenclature:
- NowPlayingBar: Bottom bar (always visible)
- ExpandedPlayer: Expanded view (click artwork)
- FocusMode: Immersive lyrics view (from ExpandedPlayer)
2026-01-10 11:26:41 -06:00
vicrodh c75a19f98f feat(reco): train scores automatically after login 2026-01-10 08:16:09 -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 340fb2a72a feat(lyrics): smoother transitions and static lyrics at top
- Reduced transition durations from 300-400ms to 120-150ms
- Changed easing to ease-out for snappier feel
- Added will-change for GPU acceleration
- Non-synced lyrics now display at container top (no spacers)
- Added isSynced prop to all lyrics components
2026-01-10 07:37:04 -06:00
vicrodh 0676989c71 feat(lyrics): add auto-scroll, karaoke effects, and FocusMode integration
- LyricsLines: improved auto-scroll with prevActiveIndex tracking
- LyricsLines: added immersive mode for larger text in FocusMode
- LyricsLines: enhanced opacity fading and text-shadow for active line
- FocusMode: redesigned with blurred artwork background like Cider
- FocusMode: integrated lyrics panel on right side with proper styling
- FocusMode: added bottom bar with track info, controls, and progress
- +page.svelte: wire lyrics props to FocusMode component
- +page.svelte: start lyrics updates when either sidebar or FocusMode open
2026-01-10 07:02:22 -06:00
vicrodh c32f25ab5e fix: restore explicit height on .main-content to fix rendering 2026-01-10 06:55:32 -06:00