Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 7287da5b27 docs: update README and add AUR automation
- Add installation instructions (AUR, Flatpak, AppImage)
- Document all API keys (Last.fm, Discogs, Spotify, Tidal)
- Add playlist import feature documentation
- Update project structure
- Add PKGBUILD for qbz-bin AUR package
- Add workflow to auto-update AUR on release
- Update .env.example with Spotify/Tidal variables
2026-01-12 14:23:16 -06:00
vicrodh 1b6c895f62 fix(cast): route playback controls to cast devices 2026-01-12 14:14:32 -06:00
vicrodh 39f6907fc1 fix(cast): use target-local IP for media server 2026-01-12 13:56:33 -06:00
vicrodh 39acb0b59e fix(flatpak): use GNOME SDK 48 with manual Node/Rust install
- Switch to GNOME SDK 48 which includes webkit2gtk-4.1
- Install Node.js 20 LTS directly from tarball (no SDK extension needed)
- Install Rust via rustup for latest stable version
- Add flatpak build directories to .gitignore
2026-01-12 13:21:28 -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 32ac732b7d fix(flatpak): use rustup to install latest Rust in SDK 23.08
SDK 24.08 doesn't have javascriptcoregtk-4.1 (uses webkit 6.0).
SDK 23.08 has Rust 1.81 which doesn't support edition2024.
Solution: use SDK 23.08 with webkit2gtk 4.1 but install Rust via rustup.
2026-01-12 12:40:03 -06:00
vicrodh 6adb979e3d fix(flatpak): upgrade to SDK 24.08 for Rust 2024 edition support
The zbus 5.x crate requires Rust edition2024 which needs Rust 1.85+.
SDK 23.08 only has Rust 1.81. Upgrade to 24.08 which has a newer Rust.
Also upgrade node extension from node20 to node22.
2026-01-12 12:31:41 -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 7f3055ca02 fix(flatpak): use cargo build instead of tauri CLI
The flatpak SDK's tauri-cli version doesn't support --bundles none.
Use cargo build --release directly to build only the binary.
2026-01-12 12:25:36 -06:00
vicrodh 520370eedc fix(flatpak): remove invalid --allow-network flag from workflow
Network access is now enabled via build-args in the flatpak manifest.
2026-01-12 12:19:18 -06:00
vicrodh 5383a5fcee fix(flatpak): enable network access during build
Add build-args with --share=network to allow npm ci to fetch packages
during flatpak build process.
2026-01-12 12:15:14 -06:00
vicrodh 4229c5385a fix(flatpak): enable network access for npm during build 2026-01-12 12:04:04 -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 a591579c23 fix(ci): add libasound2-dev and libssl-dev for Linux build
alsa-sys crate requires ALSA development headers.
openssl-sys may need SSL headers too.
2026-01-12 11:24:09 -06:00
vicrodh 1b42ce0751 fix(ci): use --user flag for flatpak operations in CI
GitHub Actions runners don't allow system-wide flatpak operations.
Use --user flag for remote-add, install, and flatpak-builder.
2026-01-12 11:19:40 -06:00
vicrodh b8dac90c2a chore(release): sync version from tag 2026-01-12 11:14:15 -06:00
vicrodh 5eac9676de chore(packaging): add linux workflows and manifests 2026-01-12 11:14:15 -06:00
vicrodh ac35875351 docs: update roadmap and readme for casting completion
- Mark DLNA/Chromecast casting as complete in ROADMAP
- Note AirPlay as deferred (no Rust RAOP library)
- Add Network Casting section to README features
- Add cast/ module to project structure
- Update v1.0 launch status: all 6 items complete
2026-01-12 11:13:45 -06:00
vicrodh 7503ba4730 fix(settings): add scrollbar to SettingsView
- Add height: 100% and overflow-y: auto for scrolling
- Add consistent scrollbar styling
- Add proper padding for scrollbar area
2026-01-12 11:05:09 -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 9fda678b61 feat(artist): add live albums section 2026-01-12 10:52:00 -06:00
vicrodh 97193c8ce2 Hide AirPlay from UI until RAOP streaming is implemented
- Remove AirPlay tab from CastPicker (keep code for future)
- Disable AirPlay discovery/polling to reduce network traffic
- Add comprehensive technical brief at docs/AIRPLAY_IMPLEMENTATION_STATUS.md
  documenting what's complete, what's missing, and potential solutions

AirPlay discovery code is preserved and working - only the UI and
network calls are disabled. Can be re-enabled once RAOP sender is implemented.
2026-01-12 10:31:06 -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 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 2c40769c7d fix(miniplayer): size race condition and system title bar on restore
- Add 50ms delay after setMinSize before setSize to prevent race condition
- Remove setDecorations(true) on restore - app uses custom title bar (CSD)
- Keep decorations: false throughout miniplayer mode transitions
2026-01-12 09:09:41 -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 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 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 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 db1baa53ac docs: mark MiniPlayer as completed 2026-01-12 02:26:57 -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 3d56053d58 docs: mark tray icon as completed 2026-01-12 02:08:14 -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 6c8f4298d6 docs: mark session persistence as completed 2026-01-12 02:01:39 -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 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 a6960769e6 docs: update roadmap - playlist management complete, ML suggestions removed 2026-01-12 01:03:15 -06:00
vicrodh ccdebfbbce fix(artist): remove top gap for jump nav 2026-01-12 00:57:25 -06:00
vicrodh 95bae2e036 feat(artist): restyle jump nav 2026-01-12 00:50:25 -06:00
vicrodh 0e682e9ca6 feat(artist): add jump-to anchors 2026-01-12 00:45:17 -06:00
vicrodh 19028ab232 feat(artist): enhance artist view sections 2026-01-12 00:37:03 -06:00
vicrodh c7cd09f3ec feat(artist): expand artist models for new sections 2026-01-12 00:36:57 -06:00
vicrodh 4e2491a9a6 feat(artist): add artist detail and similar endpoints 2026-01-12 00:36:52 -06:00
vicrodh 74f659e1bf feat(collage): implement classic 2x2 grid layout instead of overlap 2026-01-12 00:29:12 -06:00
vicrodh 6748842a82 fix(collage): correct Svelte 5 derived syntax 2026-01-12 00:26:45 -06:00
vicrodh 57591ca1d7 fix(collage): use CSS classes instead of attribute selectors for count 2026-01-12 00:21:19 -06:00
vicrodh ae39399a45 refactor: remove ML suggestions, fix collage layout
- Remove suggested tracks feature (no similarity algorithm)
- Fix collage to show 3-4 covers properly in square format
- Covers now fill full height, cropped on sides as needed
2026-01-12 00:09:32 -06:00
vicrodh c53a86e317 fix(collage): square container with properly sized overlapping covers 2026-01-12 00:06:53 -06:00
vicrodh db39173467 fix(collage): enforce 1:1 aspect ratio for playlist artwork 2026-01-12 00:04:29 -06:00
vicrodh 4949f89b46 feat(playlist-manager): improved grid layout and search
- Fixed grid card layout with header row (drag handle left, edit right)
- Fixed 180px card width with 160px artwork
- Added playlist search bar for both list and grid views
- Replaced hide/show button with edit button (opens PlaylistModal)
- Clean separation of clickable content area
2026-01-11 23:55:57 -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 9812161826 fix: playlist artwork state reset + update roadmap
- Reset customArtworkPath when switching playlists (prevents wrong image)
- Fixed asset:// URL for custom playlist artwork display
- Updated ROADMAP.md with current implementation status
2026-01-11 23:31:50 -06:00
vicrodh 719915058b feat: add hi-res logo variants (gray, blue, mono) and use grayscale version
- Created hi-res-gray.svg: grayscale filter on original logo
- Created hi-res-blue.svg: metallic blue version matching app accent
- Created hi-res-mono.svg: simplified black/white version
- QualityBadge now uses grayscale version for cleaner look
2026-01-11 23:21:00 -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 a1fd30d971 fix(playlists): Fix modal backgrounds and artwork overlay
- Change PlaylistImportModal from glass effect to solid background
- Add z-index to collage artwork overlay to ensure visibility
2026-01-11 21:52:32 -06:00
vicrodh f517910a6b fix(playlists): UI improvements for playlist manager
- Upscale Qobuz image URLs to 600x600 for better quality
- Change import icon from Download to Import for clarity
- Move hidden badge to bottom-right of artwork
- Reduce playlist name font size in grid view
2026-01-11 21:50:36 -06:00
vicrodh 436f245931 fix(playlists): Improve playlist UI
- Use large album art instead of thumbnail for collage quality
- Move edit button to navigation row (same level as back button)
- Replace glass effect with solid background in PlaylistModal
2026-01-11 21:47:58 -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 5033befa1d feat(playlists): Add PlaylistManagerView page
- New view for managing playlists with full features
- Filter by All/Visible/Hidden
- Sort by Name/Recent/Play Count/Custom
- Toggle between grid and list view
- Drag reorder when in Custom sort mode
- Display play count stats
- Toggle visibility per playlist
- Uses PlaylistCollage for artwork
- Persists preferences in localStorage
2026-01-11 20:49:33 -06:00
vicrodh 4c76d9ca95 refactor(sidebar): Simplify playlists section, move features to manager page
- Remove filter, sort, view toggle from sidebar (will be in manager page)
- Remove grid view and collage from sidebar
- Add Settings button for playlist manager
- Show only visible playlists in sidebar
- Add onPlaylistManagerClick prop for navigation
- Clean up unused CSS
2026-01-11 20:47:16 -06:00
vicrodh 513ac9a8a0 feat(playlists): Update PlaylistDetailView with collage, stats, edit button
- Replace artwork section with PlaylistCollage component
- Add play count display in header info (with BarChart2 icon)
- Increment play count when "Play All" is clicked
- Add edit button that opens PlaylistModal
- Add handleEditSuccess and handleDelete callbacks
- Add onPlaylistUpdated and onPlaylistDeleted props
- Update Sidebar to use NavigationItem in list view (icons only)
- Keep PlaylistCollage in grid view only per user request
- Add badge and class props to NavigationItem component
2026-01-11 20:44:39 -06:00
vicrodh ec4df03455 feat(playlists): Add hidden toggle and delete to PlaylistModal
- Add hidden checkbox to toggle sidebar visibility in edit mode
- Add danger zone with delete button and confirmation
- Update handleUpdate to save hidden status locally
- Add handleDelete function with proper error handling
- Style danger zone with red theme for visibility
2026-01-11 20:39:12 -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 ed3cfe6b4f fix: queue panel scroll - add flex properties to glass-content
The GlassSurface's .glass-content wrapper wasn't set up for flex layout,
preventing the inner .content div from scrolling properly.

Added global styles for .queue-panel .glass-content:
- display: flex; flex-direction: column
- flex: 1; min-height: 0
- overflow: hidden (so child .content can scroll)
2026-01-11 19:51:12 -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 60fcc7253d fix: playlist track quality column alignment and CD Quality fallback
- TrackRow: Always render quality column to maintain consistent layout
- PlaylistDetailView: Show exact quality (24bit/96kHz) when available
- PlaylistDetailView: Fall back to 'Hi-Res' or 'CD Quality' label
- Prevents column shift when quality data is missing
2026-01-11 19:45:42 -06:00
vicrodh c06ef5541f fix: queue panel scroll detection with wheel event capture
- Added onwheel stopPropagation on .content to capture scroll events
- Scroll on .content (not .tracks) so entire queue area scrolls
- Thin 4px scrollbar visible when content overflows
- Scrollbar brightens on hover (0.15 → 0.25 → 0.4)
- overscroll-behavior: contain for isolation
2026-01-11 19:40:18 -06:00
vicrodh 411cc5176f fix: queue scroll now works on tracks list with thin auto-hide scrollbar
- Moved scroll from .content to .tracks container
- Added wheel event stopPropagation to prevent main content scroll
- Thin 4px scrollbar that brightens on hover
- overscroll-behavior: contain for scroll isolation
- Fixed flex layout so tracks list fills available space
2026-01-11 19:37:41 -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 24c8ee5cad fix(queue): scroll isolation and UX improvements
- Add overscroll-behavior: contain to prevent scroll chaining to main content
- Add visible fancy scrollbar (webkit) with hover effect
- Move search bar below Now Playing section for better UX
- Scroll now works independently when cursor is over queue panel
2026-01-11 19:12:03 -06:00
vicrodh f9cf4f06cd feat(ui): queue panel improvements and playlist album column
Queue Panel:
- Fix scroll by constraining panel between TitleBar and NowPlayingBar
- Add search bar to filter entire queue (not just first 20)
- Reduce font sizes by 1px for compact layout
- Reduce item height from 48px to 40px

TrackRow:
- Add album prop to display album column

PlaylistDetailView:
- Pass album data to TrackRow for album column display
2026-01-11 18:51:38 -06:00
vicrodh 4d2fdce1aa fix(ui): playlist navigation and title font sizes
- Fix clicking another playlist from sidebar while on playlist view
  (was not notifying listeners because view type hadn't changed)
- Use $effect to reload playlist data when playlistId prop changes
- Reduce playlist title from 48px to 24px
- Reduce album title from 26px to 24px
- Max font size is now 24px (same as home greeting)
2026-01-11 18:43:37 -06:00
vicrodh a9f80a15b0 docs: update roadmap - playlist import fully working 2026-01-11 18:41:00 -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 25fe2e363f docs: update roadmap with playlist import status 2026-01-11 17:43:17 -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 4b7e6b9c17 Add launch roadmap documentation
Document 6-point roadmap for v1.0 launch:
1. Session persistence (partial)
2. Device select/passthrough/exclusivity (done)
3. Tray icon (pending)
4. MiniPlayer (pending)
5. DLNA/AirCast (ChromeCast only)
6. Playlist management (pending)

Also documents completed features from recent sessions.
2026-01-11 17:04:16 -06:00
vicrodh 7bb2b20767 Show quality info on separate line in track notifications 2026-01-11 12:51:46 -06:00
vicrodh f9baecfbdb Pass bitDepth and samplingRate to playTrack in all handlers 2026-01-11 12:41:50 -06:00
vicrodh bc7e13d756 Improve track notifications with artwork and quality info 2026-01-11 12:38:21 -06:00