Commit Graph
1152 Commits
Author SHA1 Message Date
vicrodh fe3db6397a fix(queue): show real queue total in Up Next counter (X of Y) 2026-01-23 10:49:40 -06:00
vicrodh 4ea105edd9 fix(queue): center spectrum animation, add infinite play banner, fix playlist context
- Center spectrum bars in album art with subtle glow effect
- Add dismissible banner when infinite play is enabled
- Add detailed tooltip for infinite play button
- Fix missing playback context when using Play All in playlists
2026-01-23 10:41:07 -06:00
vicrodh b73d4688e4 fix(queue): move infinite play toggle to footer next to save button 2026-01-23 10:30:48 -06:00
vicrodh 84c2261829 feat(queue): redesign QueuePanel with tabs, history, and infinite play
- Add Queue/History tabs with new layout
- Implement Now Playing card with spectrum animation
- Add History tab showing recently played tracks from backend
- Add Infinite Play toggle (persisted to localStorage)
- Relocate search to footer (expands left)
- Add Up Next counter (X/Y format)
- Implement 20-track pagination with load more
- Add proper i18n keys for new features
- Add new SVG icons (add-to-list, trash-list)
2026-01-23 10:28:16 -06:00
vicrodh e624d770b9 feat(player): redesign queue button position and icon
- Move queue button to far right of NowPlayingBar (after volume)
- Add vertical separator between volume control and queue button
- Replace ListMusic icon with custom queue-list SVG
- Add active state: play symbol changes to accent color when panel open
- Pass queueOpen prop to track panel visibility state
2026-01-23 10:20:39 -06:00
vicrodh 712c7be4f7 fix(player): add delay after engine stop to prevent sink contention
Add 50ms delay after stopping the previous playback engine to allow
the rodio Sink to fully release its reference to the OutputStreamHandle.
This prevents "resource busy" errors when rapidly switching tracks,
especially when selecting from search while radio is playing.
2026-01-23 10:17:58 -06:00
vicrodh 1641ab7c33 fix(queue): add album_id and artist_id to PlaylistDetailView queue builders 2026-01-23 03:58:20 -06:00
vicrodh 5eb1b392e8 fix(queue): add album_id and artist_id to all view queue builders
Complete propagation in all view components:
- HomeView: buildContinueQueueTracks
- FavoritesView: buildFavoritesQueueTracks
- SearchView: buildSearchQueueTracks
- LocalLibraryView: setQueueForLocalTracks (local=true, null IDs)
- ArtistDetailView: buildTopTracksQueue
2026-01-23 03:57:36 -06:00
vicrodh 1684df7752 fix(queue): complete album_id and artist_id propagation for track navigation
Ensure album_id and artist_id are passed through all queue track creation paths:
- trackActions.ts build functions (Qobuz, album, playlist, local tracks)
- Session persistence (both frontend and Rust backend)
- buildAlbumQueueTrack wrapper function
- Session restoration
2026-01-23 03:56:14 -06:00
vicrodh 2ea767f37c feat(radio): implement 50-track initial queue and auto-refill support
Radio improvements:
- Increase initial tracks from 15 to 50
- Add refill_radio_queue command (generates 20 more when queue low)
- Add get_queue_remaining command to check queue size
- Add create_infinite_radio command for "Keep Playing" feature
- Add InfiniteRadio autoplay mode based on last 5 tracks

Backend infrastructure ready for:
- Auto-refill when queue drops below 10 tracks
- Infinite playback when normal queue ends
2026-01-23 03:45:51 -06:00
vicrodh 619f8cca6d refactor(artist): move action buttons below photo, remove album count
Restructure artist header layout:
- Move favorite and radio buttons below the artist photo
- Remove album count line from header
- Artist name now left-aligned in its own row
- Create artist-image-column for photo + actions grouping
2026-01-23 03:19:49 -06:00
vicrodh 1cd05384fb fix(artist): align header content to top instead of center
Change artist info section to align content to top of the image
instead of vertically centering. This positions the artist name
closer to the photo. Also move margin from h1 to the row container
to fix alignment between name and action buttons.
2026-01-23 03:15:20 -06:00
vicrodh aabbe8ea67 fix(radio): pass album_id and artist_id for track navigation
Add album_id and artist_id fields to QueueTrack struct so that
radio tracks have proper navigation metadata. This enables
clicking artist/album in the main player to navigate correctly
when playing tracks from artist or track radio.

Changes:
- Add album_id/artist_id to Rust QueueTrack struct
- Update track_to_queue_track to extract IDs from Qobuz Track
- Add fields to frontend BackendQueueTrack interface
- Pass IDs in ArtistDetailView radio playback
- Pass IDs in playQueueTrack to playTrack service
2026-01-23 03:14:42 -06:00
vicrodh 8eed63deb0 fix(search): pause icon visibility in tracks tab
Replace Lucide Pause component with inline SVG wrapped in span.
The Lucide component's rendered SVG doesn't receive Svelte's scoped
CSS attribute, so the CSS rules for .pause-icon weren't applying.
Now consistent with the "All" tab implementation.
2026-01-23 03:03:46 -06:00
vicrodh 49914af083 fix: add missing Play and Pause icon imports in SearchView 2026-01-23 02:55:22 -06:00
vicrodh fcf1397cc0 fix: apply canonical names to album and track grouping by artist
Use canonical names (from Qobuz/Discogs) when grouping albums and
tracks by artist to merge variants like "Alice in Chains" and
"Alice In Chains" into a single group.

- groupAlbumsOptimized uses canonical names for artist key
- groupAlbums uses canonical names for sorting and grouping
- groupTracks uses canonical names for artist sorting and grouping
2026-01-23 02:17:47 -06:00
vicrodh dbde6378a9 fix: track alpha index navigation and horizontal scroll
- Use VirtualizedTrackList's scrollToGroup method instead of DOM queries
- Add overflow: hidden to track-sections and virtualized-container
- Fix navigation not working with virtualized lists
2026-01-23 02:16:04 -06:00
vicrodh b5bde8cdaa feat: extend VirtualizedTrackList for Favorites support
Add optional accessor functions and props to support different track
data structures (FavoriteTrack vs LocalTrack). Includes:
- Customizable track property accessors (id, number, title, artist, etc.)
- Download status/progress support
- Additional menu actions (share, download, go to album/artist)
- isLocal, hideFavorite, isFavoriteOverride options
2026-01-23 02:10:57 -06:00
vicrodh 4c6473ac3a fix: prevent duplicate group keys from slugify collisions
Use encodeURIComponent instead of slugify for group IDs to preserve
case sensitivity. This prevents collisions like "Aki" and "AKI" both
becoming "aki" which caused each_key_duplicate errors.
2026-01-23 02:10:50 -06:00
vicrodh d9fa302b3e perf: always use virtualization for all library tabs
- Remove non-virtualized fallbacks for albums, artists, and tracks
- Virtualization now based on max(albums, tracks) count
- Standardize BUFFER_ITEMS to 5 across all virtualized components
- Reduces code by ~280 lines of duplicate rendering logic
- Ensures consistent performance regardless of library size
2026-01-23 01:59:12 -06:00
vicrodh 9504294907 fix: remove track limit completely from library search
- Backend now supports limit=0 meaning "no limit"
- Frontend passes limit=0 to fetch all tracks
- Search now works across entire library regardless of size
- Virtualization handles rendering efficiently
2026-01-23 01:53:37 -06:00
vicrodh 3dc2e94002 fix: album grid gap and remove 1000 track cap
- Remove max-width constraint on album cards to fill grid cells
- Increase GRID_ROW_HEIGHT to 270px for better row spacing
- Remove 1000 track limit (now 100000) for large libraries
2026-01-23 01:50:32 -06:00
vicrodh 58badcc64b fix: improve app identification in task managers
Set GTK_APPLICATION_ID for proper WM_CLASS and add desktop template
with StartupWMClass for correct process identification on Linux.
Also add window label for Tauri window configuration.
2026-01-23 01:50:27 -06:00
vicrodh 967969e3c8 style: adjust album grid gaps (30px row, 22px column) 2026-01-23 01:36:23 -06:00
vicrodh 2edd544c23 fix: album grid layout to fill available width
Use CSS Grid with auto-fill instead of flexbox to eliminate the
persistent gap on the right side of the album grid.
2026-01-23 01:36:02 -06:00
vicrodh 66d6ffb6ed feat: add canonical artist name normalization
- Add canonical_name column to artist_images table (migration)
- Store canonical names from Qobuz when fetching artist images
- Display canonical names (properly capitalized) in artist views
- Group and sort artists by canonical name when available
- Source priority: Qobuz -> Discogs -> Metadata

This ensures "Alice in chains" displays as "Alice In Chains" based on
Qobuz's authoritative naming.
2026-01-23 01:35:55 -06:00
vicrodh 223cf481f1 fix: prevent API flooding in artist image fetching
- Add guard to prevent concurrent executions
- Make requests sequential (1 per second) instead of parallel batches
- Limit to 50 artists per session
- Disable Discogs fallback (caused rate limiting issues)
- Add abort flag on component destroy
- Update state less frequently (every 5 artists)
2026-01-23 01:27:45 -06:00
vicrodh eec512a3f9 fix: address UI and performance issues in LocalLibrary
- Fix asset protocol scope for thumbnails in tauri.conf.json
- Homologate artist view controls to match album controls pattern
- Make artist grouping optional with dropdown (Off, A-Z)
- Change grid/list to single toggle button for artists
- Allow 3 lines for artist names in grid view
- Fix album card width to prevent title overflow
- Add throttling to artist image fetch to avoid rate limiting
2026-01-23 01:20:55 -06:00
vicrodh 16817b72b8 feat(thumbnails): integrate thumbnail service in LocalLibrary 2026-01-23 01:09:51 -06:00
vicrodh fc03bee9b1 feat(thumbnails): add backend thumbnail generation system 2026-01-23 01:07:16 -06:00
vicrodh 12011577d7 feat(artists): add virtualized list view component 2026-01-23 01:02:13 -06:00
vicrodh a3ecbe6617 feat(artists): add virtualization with grouping, alpha index, and list view 2026-01-23 01:00:58 -06:00
vicrodh 496255744a fix(virtualization): add proper height for virtualized track list container 2026-01-23 00:38:03 -06:00
vicrodh 73f36d5e23 perf(library): memoize track grouping computation 2026-01-23 00:36:38 -06:00
vicrodh bb2cb56f5a feat(library): add virtualized track list component 2026-01-23 00:35:17 -06:00
vicrodh af4c51daae perf(library): integrate virtualized artist grid 2026-01-23 00:31:58 -06:00
vicrodh 3ec201f330 perf(virtualization): use binary search for visible items O(log n) 2026-01-23 00:29:02 -06:00
vicrodh c8b3531ef1 perf(library): memoize album filtering and grouping
- Create derived state `filteredAndGroupedAlbums` that caches results
- Add `matchesAlbumSearchFast` inline function to reduce overhead
- Add `groupAlbumsOptimized` that avoids unnecessary array copies
- Sort albums within groups instead of pre-sorting entire array
- Remove inline computation in template, use memoized results

This prevents repeated filtering and grouping on every render cycle.

Part of #13 - LocalLibrary performance optimization
2026-01-23 00:23:30 -06:00
vicrodh ae1f892e02 perf(library): add debounce for artist search (150ms) 2026-01-23 00:22:04 -06:00
vicrodh e1495d578f perf(AlbumCard): remove per-card ResizeObserver for large libraries
Previously each AlbumCard created a ResizeObserver on mount to detect
text overflow for the ticker/marquee effect. With 10,000 cards, this
meant 10,000+ active observers causing significant overhead.

Changes:
- Remove ResizeObserver creation in onMount
- Measure overflow only on first mouseenter/focus event
- Reset measurement state when title/artist props change
- Ticker effect still works but only activates when user hovers

This significantly reduces CPU and memory overhead for large album
grids while preserving the visual effect when users interact with cards.

Part of #13 - LocalLibrary performance optimization
2026-01-23 00:15:58 -06:00
vicrodh da653d48fc perf(library): add debounce for album search and memoize artwork URLs
- Add 150ms debounce for album search to prevent filtering on every
  keystroke (matches track search behavior)
- Memoize getArtworkUrl() with Map cache to avoid repeated
  convertFileSrc() calls for the same artwork path
- Clear debounce timer and state when search is closed

Part of #13 - LocalLibrary performance optimization
2026-01-23 00:15:16 -06:00
vicrodh 6de6dbc400 fix(virtualization): improve grid layout for virtualized rows 2026-01-23 00:04:28 -06:00
vicrodh ff91eaf204 fix(library): update virtualization state when albums load 2026-01-23 00:04:04 -06:00
vicrodh a74cc28f1e feat(library): add virtualized album list component
Implement VirtualizedAlbumList.svelte for rendering large album
collections efficiently:

- Only renders items visible in viewport + buffer
- Supports both grid and list view modes
- Handles grouped albums with headers
- Alpha index integration for quick navigation
- Absolute positioning with calculated heights
- ResizeObserver for dynamic container sizing

Integration with LocalLibraryView:
- Import and use virtualization store settings
- Conditionally render virtualized vs standard list
- Performance mode activates when album count exceeds threshold
- Subscribe to performance settings changes

CSS additions:
- Virtualized container with proper height calculation
- Smooth scrolling support

Part of #13 - LocalLibrary performance optimization
2026-01-23 00:03:44 -06:00
vicrodh b86effe4e9 perf(library): optimize artists and search queries
Extend SQL-based filtering to artists and search:
- Add get_artists_with_filter() method that filters source and
  network folders directly in SQL
- Replace library_get_artists N+1 loop that was calling
  db.search(artist.name, 10000) for EACH artist
- Add search_with_filter() method for optimized track search
- Replace library_search post-query filtering with SQL predicates

These changes eliminate thousands of redundant database queries
when browsing large libraries with network folders or Qobuz downloads.

Part of #13 - LocalLibrary performance optimization
2026-01-22 23:56:42 -06:00
vicrodh befe93e619 perf(library): fix N+1 query and reduce logging overhead
Backend performance improvements for large libraries:
- Change per-album INFO logging to DEBUG level (was logging every
  album during deserialization, causing 10k+ log lines)
- Add get_albums_with_full_filter() method that filters network
  folders directly in SQL instead of N+1 query pattern
- Replace library_get_albums N+1 loop with single SQL query
  (was doing 1 + N queries for N albums when excluding network folders)

Frontend infrastructure:
- Add libraryPerformanceStore.ts with feature flags for:
  - virtualizationEnabled (default: true)
  - thumbnailsEnabled (default: false, for future use)
  - optimizedNetworkFilter (default: true)
  - albumSearchDebounceMs (default: 150)
  - performanceModeThreshold (default: 500 albums)
  - forcePerformanceMode (default: false)

Part of #13 - LocalLibrary performance optimization
2026-01-22 23:55:16 -06:00
vicrodh 4c4b35bce9 merge: PR #18 add album to playlist 2026-01-22 23:21:56 -06:00
vicrodh 45d31159d0 docs: clarify internal vs external branch naming
cx
2026-01-22 23:20:50 -06:00
vicrodh 7d7614e338 docs: add contributing and PR workflow
cx
2026-01-22 23:14:11 -06:00
vicrodh 1fdd4d9711 Merge PR #18: add album to playlist 2026-01-22 23:12:19 -06:00