Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh a84cf97d36 feat(artist): independent sort filters per section, remove divider lines
- Add margin-bottom 2px to local-library-section in sidebar
- Make dividers transparent (keep spacing, remove visible line)
- Add independent sort dropdowns to: EPs & Singles, Live Albums,
  Compilations, Tributes & Covers, Others
- Each section maintains its own sort state
2026-01-24 00:19:49 -06:00
vicrodh d7805d12ee style(sidebar): consistent scrollbar, smaller toggle button
- Scrollbar always visible (subtle), overlay mode in both states
- margin-right: 1px for slight visual separation
- Collapsed icons: padding-left 1px to compensate and stay aligned
- Toggle button: 20px diameter (was 22px)
2026-01-24 00:11:26 -06:00
vicrodh 12a3393050 fix(sidebar): scrollbar position and hover reliability
- Hover on .sidebar (larger area, more reliable)
- Collapsed mode: margin-right 6px (away from toggle button)
- Removed padding-left that misaligned icons
2026-01-23 23:53:08 -06:00
vicrodh 25fd5da72d fix(sidebar): scrollbar hover on content area, align collapsed icons
- Scrollbar shows on .content hover (works for both modes)
- Collapsed playlist icons: padding-left 1px for alignment
2026-01-23 23:47:29 -06:00
vicrodh ab6cbfa414 style(sidebar): scrollbar hover on section, smaller toggle button
- Scrollbar shows on playlists-section hover (not just scrollbar area)
- Toggle button: 22px diameter (was 24px), right: -11px
2026-01-23 23:44:26 -06:00
vicrodh eebf766f1c fix(sidebar): scrollbar visibility on hover
- Add scrollbar-color for Firefox support
- Remove transition (not supported on scrollbar pseudo-elements)
2026-01-23 23:41:49 -06:00
vicrodh f3467706ce style(sidebar): hide scrollbar by default, align collapsed icons
- Scrollbar hidden by default, visible on hover
- Space reserved (4px width maintained)
- Moved 1px right (margin-right: 3px)
- Collapsed mode: margin-right 0 to align icons with rest of sidebar
2026-01-23 23:40:43 -06:00
vicrodh 153e820523 style(sidebar): move scrollbar 4px left with margin-right 2026-01-23 23:37:33 -06:00
vicrodh c028ac628f style(sidebar): darker toggle shadow, unified thin scrollbar
- Toggle shadow: -4px 0 12px with 0.75 alpha (falls on sidebar)
- Scrollbar: moved 2px left (padding-right: 2px)
- Both views now use same 4px thin scrollbar style
2026-01-23 23:36:13 -06:00
vicrodh f375ae23fe style(sidebar): solid toggle button with shadow
- Remove transparency, use solid bg-tertiary
- Reduce diameter from 28px to 24px (center preserved)
- Add drop shadow like context menu caret
2026-01-23 23:32:07 -06:00
vicrodh ada7b7b84c style(artist): remove solid backgrounds, Load More button, thin badges
- Remove solid background from Discography and all sections below
- Remove Load More button from Discography (initial display sufficient)
- Change badge font-weight to 100 (Thin) in AlbumCard and QualityBadge
- Use LINE Seed JP font family for badges
2026-01-23 23:29:09 -06:00
vicrodh e404048c5b fix(artist): bio truncation reactivity, adjust margins
- Observe parent container for resize (not clamped element)
- Double RAF ensures CSS applies before measurement
- top-tracks-section: margin-top 32px
- artist-header: margin-bottom 22px
2026-01-23 20:51:09 -06:00
vicrodh f19081ee1d feat(artist): smart 3-line bio truncation with resize detection
- Use CSS line-clamp for exactly 3 lines (reactive to container width)
- ResizeObserver detects window/container resizes
- Auto-hide Read more/Show less if text fits in 3 lines
- Works across all screen sizes (4K to HD)
2026-01-23 18:58:15 -06:00
vicrodh 30bb7bc980 fix(artist): spacing, hover glow, context menu homologation
- Change margin-top to padding-top for 10px spacing (avoids collapse)
- Add animated glow expansion on Play All button hover
- Match context menu styling to TrackMenu component
2026-01-23 18:52:50 -06:00
vicrodh dc0038fbfb style(artist): subtle glow on Play All, outline on context button 2026-01-23 18:47:49 -06:00
vicrodh 3f9d7e4de5 style(artist): polish Popular Tracks buttons and menu
- Add 10px top margin for spacing from jump-nav
- Play All button (44px) larger than context menu button (40px)
- Add backdrop to context menu for click-outside-to-close behavior
- Reduce icon size in smaller button (18px)
2026-01-23 18:47:06 -06:00
vicrodh 2f026fa181 feat(artist): redesign Popular Tracks section
- Remove solid background container
- Show 5 tracks by default with progressive loading (5 → 20 → 50)
- Add "Load More" link that disappears after 50 tracks
- Replace text Play All button with circular icon button
- Add context menu (...) with: Play Next, Play Later, Shuffle, Add to Playlist
- All actions apply to full track list (up to 50)
- Remove divider line before section
2026-01-23 18:43:53 -06:00
vicrodh 1185d307f5 style: opaque nav bars with subtle shadow
- Remove transparency from all sticky nav bars (fully opaque)
- Remove backdrop-filter blur (not needed with opaque bg)
- Add subtle box-shadow (4px) for content-fades-beneath effect
- Applied to Artist, Favorites, LocalLibrary, Settings views
2026-01-23 18:23:30 -06:00
vicrodh 75aeb9592f fix: remove main-content padding-left for edge-to-edge nav bars
- Removed padding-left: 20px from main-content
- Toggle button and jump-nav don't collide (different vertical positions)
- Updated all view nav bars with corrected margin/width calculations
- Nav bars now truly flush with sidebar edge
2026-01-23 18:21:49 -06:00
vicrodh 7c14a6835e fix: extend sticky nav bars edge-to-edge with sidebar
- ArtistDetailView: jump-nav now flush with sidebar (margin -44px left)
- FavoritesView: favorites-nav flush with sidebar
- LocalLibraryView: jump-nav flush with sidebar
- SettingsView: settings-nav flush with sidebar
- All navs compensate for both main-content and view padding
- Radio animation: faster floating messages (1.2s), infinite loop
2026-01-23 18:17:34 -06:00
vicrodh 87e4b7c356 style(artist): add floating text animation to radio loading
Step 2 of radio button animation:
- Add wrapper for positioning context
- Floating messages appear above button and fade upward
- Uses Svelte #key directive to re-trigger animation on message change
- Absolute positioning ensures no layout shift
2026-01-23 18:13:00 -06:00
vicrodh a1d5f8a137 style(artist): add rotating arcs animation to radio button
- Replace expanding button with rotating concentric arcs
- Outer arc: rotates clockwise at 1.2s
- Inner arc: rotates counter-clockwise at 1.8s
- Animation uses absolute positioning, doesn't affect layout
- Button maintains size during loading state
2026-01-23 18:11:56 -06:00
vicrodh 65716c9e07 style(artist): restructure header per design specs
- Move action buttons below Similar Artists section
- Remove images from Similar Artists (text-only with bullet separators)
- Remove solid background from biography
- Add thin font weight (300) to bio area
- Update Similar Artists to uppercase title with letter-spacing
2026-01-23 18:11:07 -06:00
vicrodh 008ef6e443 fix(artist): add data-track-id attribute for scroll-to-track
The scrollToTrack function queries for [data-track-id] but the
attribute was missing on track rows, preventing track focus from
context.
2026-01-23 17:20:23 -06:00
vicrodh edfb167393 i18n: add translations for sort options and artist sections
- Add sort translations: default, newest, oldest, titleAsc, titleDesc, artist
- Add missing artist section translations: tributes, others, playlists
- Both English and Spanish locales updated
2026-01-23 17:19:42 -06:00
vicrodh 5f30747ef5 style: add glass effect to LocalLibrary and Settings nav bars
- LocalLibraryView: fix jump-nav margins and add glass effect
- SettingsView: fix settings-nav margins and add glass effect
- Both: proper width calculations for full-width coverage
- Both: backdrop-filter blur for modern glass appearance
2026-01-23 17:17:11 -06:00
vicrodh 69b51ac9c1 style(favorites): add glass effect and fix nav width
- Add backdrop-filter blur to favorites-nav for glass effect
- Fix nav margins to match parent padding (24px left, 8px right)
- Add proper width calculation for full-width coverage
2026-01-23 17:16:13 -06:00
vicrodh cc6d14e24b fix(artist): jump-nav full width and consistent section headers
- Fix jump-nav to span 100% of content width with proper margins
- Make Popular Tracks section header consistent with other sections
- Add track count badge to Popular Tracks
- Remove unused section-header-row CSS
2026-01-23 17:14:54 -06:00
vicrodh 77e4619e7b fix(artist): add missing onAddAlbumToPlaylist to Others section
The Others section was missing the onAddAlbumToPlaylist prop that
other album sections have, making the context menu inconsistent.
2026-01-23 17:10:14 -06:00
vicrodh 89a9f2e130 style(artist): consistent section-header-left wrapper for all sections
Apply section-header-left wrapper to all remaining album sections
for consistent structure (EPs & Singles, Live Albums, Compilations,
Tributes & Covers, Others, Playlists).
2026-01-23 17:09:46 -06:00
vicrodh 1aeb3642c6 fix(artist): move sort dropdown to discography header
- Move album sort dropdown from jump-nav to Discography section header
- Align sort dropdown to right of section title
- Revert similar artists styling to original
- Sort now only applies to album sections below it
2026-01-23 17:06:18 -06:00
vicrodh d371711e59 style(artist): improve artist view visual design
- Add album counts to section headers (Discography, EPs & Singles, etc.)
- Add glass effect to sticky jump navigation bar
- Wrap discography sections in cards with rounded corners
- Improve similar artists section with chip-style buttons
- Add card styling to biography section
- Improve top tracks section with card background
- Better visual separation with gradient dividers
- Consistent spacing and typography updates
2026-01-23 16:54:43 -06:00
vicrodh e86734c9a7 fix(tray): restore window properly from tray menu
Add unminimize() call to show_hide menu handler to match left-click
behavior. Also add logging for debugging visibility state.
2026-01-23 16:49:33 -06:00
vicrodh 4aa76a0ed4 feat(artist): add album sorting in artist view
Add sort dropdown in artist detail view jump navigation with options:
- Default (API order)
- Newest First (by release year)
- Oldest First (by release year)
- Title (A-Z / Z-A)

Sorting applies to all album sections: albums, EPs/singles, live albums,
compilations, tributes, and others.
2026-01-23 16:45:24 -06:00
vicrodh d8d87c8955 feat(favorites): add album sorting options
Add sort dropdown for favorite albums with options:
- Default (API order)
- Newest First (by release date)
- Oldest First (by release date)
- Title (A-Z / Z-A)
- Artist

Sort preference is persisted to localStorage.
2026-01-23 16:41:51 -06:00
vicrodh 077aa01356 feat(settings): add system tray settings
Add tray icon configuration options:
- Enable/disable tray icon (requires restart)
- Minimize to tray: hide window when clicking minimize
- Close to tray: hide window instead of quitting

Rust backend: TraySettingsState with SQLite persistence
Frontend: SettingsView tray subsection with toggles

Related to #15 (title bar settings)
2026-01-23 16:38:17 -06:00
vicrodh 3fb597f3fb fix(settings): simplify title bar settings to hide-only option
Remove "Use QBZ title bar" toggle since switching to system decorations
doesn't work reliably on Linux when the window was created without
decorations. Keep only "Hide title bar" option for tiling WM users.
2026-01-23 16:28:50 -06:00
vicrodh 150513179d fix(ui): make titlebar window buttons clickable
cx
2026-01-23 16:22:08 -06:00
vicrodh 3ac957ddda feat(settings): add title bar configuration
Phase 1 implementation:
- Add titleBarStore.ts for managing title bar visibility
- "Use QBZ title bar" toggle (default ON) - switches between custom and system decorations
- "Remove title bar" toggle (default OFF) - hides title bar completely for tiling WM users
- Dynamically adjust layout heights when title bar is hidden
- Add i18n translations (en/es)
- Settings integrate with Tauri window.setDecorations() API
2026-01-23 16:16:20 -06:00
vicrodh 921639041c fix(ui): make HomeView loading overlay respect sidebar state
Pass sidebarExpanded prop to HomeView to dynamically position the
loading overlay based on sidebar width (280px expanded, 64px collapsed).
Added smooth transition for left position.
2026-01-23 16:10:43 -06:00
vicrodh b5ee10afa1 fix(ui): use overlay scrollbar in collapsed sidebar
Replace hidden scrollbar with thin overlay scrollbar (4px) that floats
over content without displacing icons. Subtle appearance with
rgba(255,255,255,0.15) thumb.
2026-01-23 16:02:07 -06:00
vicrodh 3568cea956 fix(ui): refine sidebar toggle and collapsed mode
- Reduce toggle button size from 32px to 28px
- Hide scrollbar in collapsed mode to keep icons perfectly aligned
- Add bold first line to playlist tooltips when sidebar is collapsed
- Adjust main content padding (20px) for smaller button
2026-01-23 16:00:10 -06:00
vicrodh a7f0310682 fix(ui): improve sidebar toggle button position and tooltips
- Move toggle button to sidebar edge (50% vertical, half inside/out)
- Add glass effect: rgba(255,255,255,0.08) + backdrop blur + border
- Use single chevron icons instead of double
- Hover: scale 1.1 + increased opacity
- Add left padding (22px) to main content for button clearance
- Fix playlist tooltips: show name + track count when sidebar is collapsed
2026-01-23 15:45:41 -06:00
vicrodh 63fc930f91 style: change font to LINE Seed JP
Replace Inter font with LINE Seed JP (Google Font) for a cleaner look
similar to QobuzSans. Easy to revert if not approved.
2026-01-23 15:32:22 -06:00
vicrodh d0177096af feat(ui): add collapsible sidebar
- Add sidebarStore.ts for expanded/collapsed state with localStorage persistence
- Modify NavigationItem to support collapsed mode (icon-only with tooltip)
- Update Sidebar component with toggle button and collapsed styles
- Width transitions from 280px (expanded) to 64px (collapsed)
- Add i18n translations for collapse/expand actions (en/es)
2026-01-23 15:31:49 -06:00
vicrodh 6d5d264778 refactor(backend): rename module and APIs for compliance
- Renamed download_cache module to offline_cache
- Updated Tauri command names (e.g., cache_track_for_offline)
- Updated event names (offline:caching_started, etc.)
- Updated library database function names
- Updated frontend invoke calls to use new command names
2026-01-23 12:14:39 -06:00
vicrodh 84a2164079 refactor(stores): rename store to offlineCacheState
- Create offlineCacheState.ts with compliant terminology
- Update all component imports and type references
- Add compatibility aliases for gradual migration
- Remove deprecated downloadState.ts

cc
2026-01-23 11:57:53 -06:00
vicrodh 393589862d docs(readme): align terminology for compliance
- Update Legal/Branding section with compliant language
- Remove reference to external tools
- Clarify offline library as temporary playback cache

cc
2026-01-23 11:50:51 -06:00
vicrodh 0f025ae5ef refactor(i18n): replace download terminology with offline library
- Update en.json and es.json with new terminology
- Change "Download" to "Make available offline"
- Change "Downloads" section to "Offline Library"
- Update notifications: cachingStarted, cachedForOffline, cachingFailed
- Update UI copy in SettingsView, TrackMenu, AlbumMenu
- Update toast messages in +page.svelte to use offline terminology
- Change DownloadButton tooltips to use offline language

cc
2026-01-23 11:50:17 -06:00
vicrodh cab7b0f952 fix(queue): match playing indicator style with TrackRow (accent color + shadow) 2026-01-23 11:29:20 -06:00
vicrodh 1f614c5750 fix(queue): update remaining count in real-time when tracks advance 2026-01-23 11:14:13 -06:00
vicrodh 9501a4b909 fix(queue): improve Up Next counter with total, remaining, and infinite modes
- Show format: (20 of 139, 135 left) for normal playback
- Show format: (20 of ∞) for infinite play or radio mode
- Remove Load More from Queue section (not needed)
- Add Load More to History section for tracks > 20
- Add isRadioMode prop to detect radio context
- Pass both queueTotalTracks and queueRemainingTracks
2026-01-23 11:01:08 -06:00
vicrodh e200dfd3eb fix(queue): show actual remaining tracks and ∞ when infinite play active 2026-01-23 10:53:40 -06:00
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