Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 7ed3dac7f5 fix(library): reduce artwork cache bloat with thumbnails
- metadata.rs now creates 500px thumbnails instead of copying full images
- Added cache management commands: library_get_cache_stats,
  library_clear_artwork_cache, library_clear_thumbnails_cache
- Thumbnails stored in ~/.local/share/qbz/thumbnails/ (was ~/.cache/qbz/artwork)
- Reduces cache size from GB to MB for large libraries
2026-01-28 11:24:19 -06:00
vicrodh a6fc264903 fix(playback): persist streaming quality setting
Quality was hardcoded to UltraHiRes in backend. Now:
- Frontend passes quality from localStorage to play_track command
- Backend parses quality string to Quality enum
- All prefetch and stream URL calls use the user's preferred quality
2026-01-28 11:24:11 -06:00
vicrodh 700dc07014 fix(library): improve artist consolidation and album matching
- Add all_artists field to LocalAlbum for accurate artist matching
- Consolidate duplicate artists with case differences (e.g., "Alice in Chains" / "Alice In Chains")
- Fix album count calculation to avoid double-counting
- Show Various Artists albums under contributing artists
- Handle multi-artist names (e.g., "A, B, C") with union matching
- Add cleanup missing files feature in settings maintenance section
- Improve settings UI with side-by-side Maintenance/Danger Zone layout
- Add status indicator during cleanup operations
2026-01-28 08:13:07 -06:00
vicrodh 8bf85a1c8a debug(library): add more logging to find similar artist albums 2026-01-28 03:04:12 -06:00
vicrodh 7327a3d060 fix(library): improve Qobuz badge display and add artist debug logging
- Remove background/border from Qobuz badge, show icon at full 24px
- Keep background only for local badge (HardDrive icon)
- Add console logging when selecting artist to debug mismatch:
  - Shows selected artist name (original and normalized)
  - Shows which albums match
  - Shows artist data from the artists array
2026-01-28 02:59:26 -06:00
vicrodh d559832ffe feat(library): add source filters and fix Qobuz badge icon
- Add Local and Offline cache filters to the filter panel
- Icons: HardDrive for local, Qobuz logo for offline cache
- Remove CSS filter from Qobuz badge icon (display as-is with proper size)
2026-01-28 02:54:05 -06:00
vicrodh 685606be5d fix(library): fix artist view alpha index scroll and multi-artist albums
- Fix alphabetical index scroll to work within the artist list container
- Add scroll reference binding to artist-list-scroll
- Fix group header ID (was duplicating prefix)
- Include multi-artist albums when selecting an artist:
  - Exact match on album artist
  - Partial match (artist name appears in album artist string)
  - Split by common separators (,&feat.ft.featuring, etc.)
2026-01-28 02:49:26 -06:00
vicrodh bd47c175ea feat(library): redesign artist view with two-column layout
- Move alphabetical index from vertical (right) to horizontal (top)
- Replace full-width grid with two-column layout:
  - Left: Single-column artist list with compact cards and scroll
  - Right: Selected artist's albums in a grid
- Hide group dropdown and view mode toggle (kept in code for future use)
- Click artist to select and show their albums (instead of navigating to Qobuz)
- Defaults to alphabetical grouping and grid view
2026-01-28 02:43:23 -06:00
vicrodh e8f0c96ccc feat(library): add source badge to album cards in Local Library
Albums now show a small badge indicating their source:
- HardDrive icon for local files (source='user')
- Qobuz logo for offline cached content (source='qobuz_download')

Badge appears in bottom-right corner of album artwork.
2026-01-28 02:40:00 -06:00
vicrodh e025882a9f fix(favorites): add type=button to favorite toggle and remove debug logs 2026-01-28 01:56:23 -06:00
vicrodh c87788f0f8 fix(flatpak): add version to metainfo.xml
Flatpak uses the <releases> section in metainfo.xml to display the
application version. Added a placeholder release entry and updated
the workflow to inject the actual version and date during build.
2026-01-27 20:54:45 -06:00
vicrodh efb305fe09 debug(favorites): add logging to track favorite toggle issue
Also adds type="button" to favorite button for consistency with other buttons.
2026-01-27 19:44:59 -06:00
vicrodh a483c766ab fix(offline): clean up empty folders when removing cached tracks
When deleting a cached track (individually, via clear all, or via LRU
eviction), the audio file was deleted but cover.jpg remained orphaned.

Now the system removes the entire album folder if no audio files remain,
and recursively removes the artist folder if it also becomes empty.
2026-01-27 19:36:15 -06:00
vicrodh 655aaf4c88 fix(home): properly show offline cache status in Continue Listening
- Add getTrackOfflineCacheStatus prop to HomeView
- Pass downloadStatus and downloadProgress to TrackRow
- Use reactive cache status function that depends on downloadStateVersion

Tracks in Continue Listening now correctly show their cached state.
2026-01-27 19:24:23 -06:00
vicrodh 79a667fb50 fix(home): reactively update offline cache state in Continue Listening
Include downloadStateVersion in the each loop key to force re-render
when offline cache state changes, fixing tracks showing gray icons
even when cached.
2026-01-27 19:15:57 -06:00
vicrodh 4b975869df fix(offline): correct event names for cache completion
Frontend was listening for wrong event names:
- offline:cached → offline:caching_completed
- offline:cache_failed → offline:caching_failed

Also added "Open cache folder" button to Settings.
2026-01-27 19:01:08 -06:00
vicrodh 900df9307a refactor(suggestions): move preview to album art overlay
Move play button from action buttons to album art hover overlay,
matching the pattern used in ArtistDetailView popular tracks.
2026-01-27 17:56:31 -06:00
vicrodh 79e37cbf7a fix(suggestions): only show for owned playlists
Suggestions are for curating your own playlists, not for
playlists you're just browsing from other users.
2026-01-27 17:53:56 -06:00
vicrodh b4fe6c87b5 feat(suggestions): add track preview and clean up UI
- Add preview (play) button to suggested tracks
- Remove pagination info for cleaner UX ("Showing X of Y")
- Remove "Load more" links (auto-loads when cycling)
- Add onPreviewTrack callback to play suggested tracks
- Convert SuggestedTrack to DisplayTrack for playback
2026-01-27 17:47:04 -06:00
vicrodh fab1ff3003 fix(suggestions): wrap artist_id in Some for Option type 2026-01-27 17:13:03 -06:00
vicrodh 79c68d292e feat(suggestions): improve vector store and add cache management
- Add get_all_related_artists for direct relationship lookup
- Add get_related_artists helper method
- Add clear_all method to vector store for cache management
- Add clear_vector_store Tauri command
- Add Artist Vectors cache section to Settings view
- Use artist_info tuples (mbid, name) for better track searching
2026-01-27 16:54:11 -06:00
vicrodh 9a89074b5f feat(suggestions): add interactive navigation and track info modal
- Add artist_id field to SuggestedTrack for navigation
- Make artist names clickable to navigate to artist view
- Make album names clickable to navigate to album view
- Add TrackInfo button (info icon) to view track credits
- Integrate TrackInfoModal component with suggestions
- Update PlaylistDetailView to pass navigation callbacks
2026-01-27 16:53:56 -06:00
vicrodh 54315c2e4e fix(suggestions): fix deadlock in build_vector
The build_vector function was calling build_from_musicbrainz and
build_from_qobuz while holding the store lock. These functions also
try to acquire the store lock, causing a deadlock.

Fixed by saving the vectors from the first call and reusing them
for storage, instead of calling the functions again.
2026-01-27 14:42:10 -06:00
vicrodh 7e76fd6925 debug: add info-level logging to build_from_musicbrainz 2026-01-27 14:22:40 -06:00
vicrodh d90edc4feb debug(suggestions): add more logging to find deadlock 2026-01-27 13:40:17 -06:00
vicrodh 5f13617ae7 debug(suggestions): add logging to vector building
Added info-level logs to track:
- ensure_vector start/success/failure
- build_from_musicbrainz cache hit/API fetch
2026-01-27 13:35:18 -06:00
vicrodh 12d3c6b654 style: remove emojis from log messages 2026-01-27 13:26:57 -06:00
vicrodh b551df71c0 perf(suggestions): limit to top 5 artists and reduce rate limiting
Major optimizations:
- Extract only top 5 artists by track frequency instead of all artists
- Use faster rate limiter (200ms) when using MusicBrainz proxy
- Remove skip_vector_build since we now have manageable artist count

Expected load time: ~5-8 seconds for first load with 5 artists
vs previous: 50+ seconds with 50 artists
2026-01-27 13:20:16 -06:00
vicrodh 7506d69e53 fix(suggestions): hide section entirely when no suggestions available
Instead of showing 'No suggestions available' message, the entire
suggestions section is now hidden when there are no results.
Better UX - less frustrating for users.
2026-01-27 12:47:36 -06:00
vicrodh a49cdf483a perf(suggestions): skip MusicBrainz API calls when skip_vector_build=true
When skip_vector_build is enabled, also skip network calls for MBID
resolution of uncached artists. This prevents rate limiting (429) errors
that were causing 55+ second delays on initial load.

Tradeoff: First load with empty cache may have no results, but
subsequent loads will be instant using cached data.
2026-01-27 12:31:51 -06:00
vicrodh ff9e11db5c perf(suggestions): add skip_vector_build option for faster initial load
- Add skip_vector_build config option to SuggestionConfig
- When true, skips ensure_vector calls (which can be very slow)
- Uses only cached/existing vectors for similarity search
- Frontend now uses skip_vector_build=true for initial load

- Add timestamped logging helper in frontend component
2026-01-27 12:23:05 -06:00
vicrodh ba5ca133f4 fix(suggestions): simplify effect to prevent re-render issues
Replace cleanup-based effect with simpler lastLoadedPlaylistId tracking.
Avoids setting state in cleanup function which could cause render issues.
2026-01-27 12:18:03 -06:00
vicrodh 541c93f06d fix(suggestions): fix config deserialization and effect loop
- Add #[serde(default)] to SuggestionConfig to allow partial config
  from frontend (fixes "missing field max_artists" error)

- Fix effect loop in PlaylistSuggestions.svelte:
  - Add loadingInitiated flag to prevent re-triggering
  - Add cleanup effect when playlistId changes
  - Prevent concurrent loading attempts
2026-01-27 12:07:08 -06:00
vicrodh 1560cd4e3d debug(suggestions): add detailed timing logs for debugging
Frontend logging:
- Log when effect triggers with artist count
- Log when backend call starts/finishes with timing
- Log result details (tracks, artists counts)

Backend logging (playlist_suggestions.rs):
- Log MBID resolution with cache hits/misses/failures
- Log config values
- Log engine call timing

Engine logging (suggestions.rs):
- Step 1: ensure_vector timing per artist
- Step 2: playlist vector computation
- Step 3: find_nearest timing
- Step 4: track search timing per artist
- Early exit when pool size reached
2026-01-27 12:02:31 -06:00
vicrodh e9a5dfcb80 perf(suggestions): optimize loading with backend MBID resolution
- Move MBID resolution from frontend to backend
  - Eliminates multiple sequential IPC calls
  - Uses MusicBrainz cache for faster resolution
  - Logs resolution progress for debugging

- Implement progressive loading in UI
  - Initial load: 18 tracks (3 pages)
  - "Load more" expands to 60 tracks on demand
  - Better feedback during loading states

- Fix refresh button styling
  - Remove background while spinning
  - Update title based on available actions

- Add "Load more" link in pagination area
2026-01-27 11:58:54 -06:00
vicrodh f0aa539849 feat(ui): add playlist suggestions component and service
- Create PlaylistSuggestions.svelte component with:
  - Pool management (60 tracks, show 6 at a time)
  - Pagination/rotation on refresh
  - Loading, empty, and error states
  - Add (+) and dismiss (-) track actions
  - Album art display
  - Reason tooltip support (dev mode)

- Create playlistSuggestionsService.ts with:
  - MBID resolution from artist names (batched)
  - TypeScript types for SuggestedTrack, SuggestionResult
  - localStorage helpers for dismissed tracks
  - Qobuz album art URL generation

- Integrate into PlaylistDetailView:
  - Show suggestions at bottom of playlist track list
  - Extract unique artists from playlist for suggestions
  - Add track to playlist via add_tracks_to_playlist command
  - Hide when searching
2026-01-27 11:48:48 -06:00
vicrodh cadb346e32 feat(suggestions): add vector-based playlist suggestions engine
- Add suggestions.rs with SuggestionsEngine for generating suggestions
- Add SuggestionConfig with configurable parameters
- Add SuggestedTrack and SuggestionResult types
- Integrate with MusicBrainz relationships and Qobuz track search
- Add Tauri commands: get_playlist_suggestions_v2, get_vector_store_stats
- Add cleanup_vector_store command for maintenance
- Add Serialize to StoreStats for IPC
- Register ArtistVectorStoreState in app initialization
- 23 tests passing
2026-01-27 11:38:56 -06:00
vicrodh f3dcb6ebf2 feat(vectors): add vector builder with MB and Qobuz sources
- Add weights.rs with configurable RelationshipWeights
- Add builder.rs with ArtistVectorBuilder for constructing vectors
- Integrate MusicBrainz relationships (members, groups, collaborators)
- Integrate Qobuz similar artists API
- Add ensure_vector() with TTL for lazy building
- Add resolve_qobuz_to_mbid() for ID resolution via name search
- 21 tests passing (sparse_vector, store, weights, builder)
2026-01-27 11:30:06 -06:00
vicrodh 1d2e28c1a8 feat(vectors): add sparse vector foundation for playlist suggestions
Phase 1 of playlist-suggestions feature:
- SparseVector: memory-efficient vector with math operations
  - set/get with sorted indices for O(log n) access
  - add, sub, scale, dot product, magnitude
  - normalize, cosine_similarity, top_k_similar
- ArtistVectorStore: SQLite persistence
  - artist_index table: MBID to integer index mapping
  - vector_entries table: sparse representation (one row per non-zero)
  - vector_metadata table: track freshness with TTL
  - find_nearest: cosine similarity search with exclusion
- 17 unit tests all passing
2026-01-27 11:19:55 -06:00
vicrodh c1aaa87f8e Update README with v1.1.7 features: MusicBrainz, ListenBrainz, tag editor, musician pages 2026-01-27 05:45:11 -06:00
vicrodh 2121c910d1 Fix ARM64 workflow: only trigger on tags, not on push to main 2026-01-27 05:04:30 -06:00
vicrodh 4f3f57f424 Release v1.1.7 2026-01-27 04:58:49 -06:00
vicrodh b3117cc7c2 Bump version to 1.1.7 2026-01-27 04:58:28 -06:00
vicrodh c5c6ddc721 Fix ArtistNetwork sidebar height to fit content area
- Use top/bottom positioning instead of calculated height
- top: 32px (below title bar), bottom: 104px (above player)
- Add adjustment for when title bar is hidden (top: 0)
- Sidebar now always fits within visible content area
2026-01-27 04:54:18 -06:00
vicrodh 81ffc120ad Improve PlaylistModal layout and dropdown visibility
- Make "Adding n tracks" inline with "Choose playlist" label
- Add min-height 400px for addTrack mode modal
- Fix dropdown being clipped by modal: overflow visible + z-index 10001
- Dropdown can now extend outside modal boundaries
2026-01-27 04:49:20 -06:00
vicrodh c190fe79b0 Add searchable playlist dropdown and fix button text contrast
PlaylistModal changes:
- Replace native select with custom searchable dropdown
- Show max 8 playlists at a time with scroll indicator
- Add search/autocomplete functionality
- Support keyboard navigation (arrows, enter, escape)

Button contrast fix:
- Add --btn-primary-text CSS variable per theme
- Use dark text on light accent colors (Warm, Nord, Dracula, etc.)
- Use light text on dark accent colors (Adwaita, default)
2026-01-27 04:46:10 -06:00
vicrodh 561f7487d0 Add Flatpak welcome modal and sequential modal priority system
- Add FlatpakWelcomeModal component shown once for Flatpak users
- Add persistence for Flatpak welcome shown state (updates.db)
- Implement sequential modal priority: Flatpak > What's new > Update available
- Add Flatpak section to Settings navigation (only when running in Flatpak)
- Clean up duplicate Flatpak section and invalid style block in SettingsView
- Add copyable command styling for Flatpak section
2026-01-27 04:37:17 -06:00
vicrodh 4ff21312b2 Add TOC navigation to WhatsNewModal for large changelogs 2026-01-27 04:00:09 -06:00
vicrodh b664a5afd0 Change defaults: streaming ON, check for updates OFF 2026-01-27 03:59:32 -06:00
vicrodh 9621814555 Fix WhatsNewModal: reduce section headings to 14px, add extra padding top/bottom 2026-01-27 03:19:18 -06:00
vicrodh 5f78b7deb2 Reduce WhatsNewModal font sizes: main items 14px to 12px, nested 13px to 11px 2026-01-27 03:14:04 -06:00
vicrodh e7887d9d73 Fix WhatsNewModal: use whats-new-content class with !important overrides, adjust modal size 2026-01-27 03:11:44 -06:00
vicrodh 411cdaedaf Fix WhatsNewModal styling: darker secondary items and proper bullet indentation 2026-01-27 03:06:57 -06:00
vicrodh 54740ee225 feat(updates): add update checks and what's new modal
cx
2026-01-27 02:59:46 -06:00
vicrodh f84c27b5ee feat(ui): implement global FloatingMenu system for menu exclusivity
- Add floatingMenuStore.ts with global menu state management
- Only one floating menu can be open at a time across the entire app
- Standardize inactivity timeout to 2 seconds for all menus

Updated components:
- TrackMenu: integrate with global store, reduce timeout from 5s to 2s
- AlbumMenu: integrate with global store, add inactivity timeout
- Sidebar: integrate dropdown, context menu, and folder popover
- PlaylistManagerView: integrate filter and sort dropdowns
- Dropdown.svelte: integrate generic dropdown component

The global store ensures that opening any menu (context menu,
dropdown, popover) automatically closes all other open menus.
2026-01-27 00:10:13 -06:00
vicrodh 19756092a4 fix(buttons): use text-primary for btn-primary foreground color 2026-01-26 23:43:20 -06:00
vicrodh 15c0258937 fix(modals): add missing btn base class and update acknowledgments
- Fix modal footer buttons missing 'btn' base class in:
  - PlaylistModal (New/Edit playlist, Add to playlist)
  - PlaylistImportModal (Import playlist)
  - FolderSettingsModal (Library folder settings)
  - Sidebar (New folder inline modal)
- Remove incorrect QobuzLegalNotice from PlaylistImportModal
- Add MusicBrainz and lyrics providers to AboutModal acknowledgments:
  - MusicBrainz (music metadata)
  - LRCLIB (synced lyrics)
  - lyrics.ovh (lyrics API)
2026-01-26 22:16:31 -06:00
vicrodh e1ea1671d2 fix(playlist): correct playing indicator and homologate reorder UI
- Fix playing indicator to consider isPlaybackActive (not just activeTrackId)
- Track now shows as playing only when actually playing, not when paused
- Change reorder controls from vertical to horizontal layout
- Homologate UI with PlaylistManagerView (buttons beside drag handle)

cc
2026-01-26 21:53:05 -06:00
vicrodh f918fd2b01 feat(playlist): add batch selection and move for custom order
- Add checkbox selection for tracks in custom order mode
- Add batch controls bar with Select All, Clear, Move Up/Down
- Implement moveSelectedUp/Down to move multiple tracks as group
- Refactor PlaylistManagerView to use savePlaylistOrder helper
- Add CSS styles for batch controls and checkboxes

cc
2026-01-26 21:41:43 -06:00
vicrodh 5b80d639e0 feat(playlists): add arrow buttons for reordering in playlist manager
- Add ChevronUp/ChevronDown buttons alongside drag handle in custom mode
- Implement movePlaylistUp/movePlaylistDown functions
- Extract savePlaylistOrder helper for code reuse
- Support both grid and list view layouts
- Add CSS styles for reorder controls

cc
2026-01-26 21:36:00 -06:00
vicrodh 892d2e2b68 feat(playlist): add drag and drop for custom track reordering
- Add drag state tracking (draggedTrackIdx, dragOverIdx)
- Implement drag event handlers (start, over, leave, end, drop)
- Make track rows draggable in custom order mode
- Add visual feedback styles for dragging

cc
2026-01-26 21:33:40 -06:00
vicrodh 53b8605c3b feat(playlist): implement custom order UI with move controls
- Add custom order state management in PlaylistDetailView
- Load custom order when entering custom sort mode
- Initialize custom order from current tracks if not exists
- Add move up/down buttons for track reordering
- Update sorting logic to use customOrderMap
- Add CSS styles for reorder controls

cc
2026-01-26 21:28:24 -06:00
vicrodh 426584aa59 feat(backend): add custom track order persistence for playlists
- Create playlist_track_custom_order table for storing user-defined track positions
- Add database functions: get, init, set, move track, has, clear custom order
- Add Tauri commands for frontend access
- Migration-safe for existing databases

cc
2026-01-26 21:25:25 -06:00
vicrodh ee2fbedb6e feat(playlist): add Label, Added Recently, and Custom Order sort options
- Extend DisplayTrack interface with label, addedIndex, customPosition fields
- Add PlaylistTrack.album.label type for record label data
- Add three new sort options: Added Recently, Label, Custom Order
- Implement sorting logic for new options
- Label sorting places tracks without label (local) at the end
- Added Recently uses original index as proxy for date added

cc
2026-01-26 21:22:26 -06:00
vicrodh 0f2c47ff92 feat(AlbumCard): add showGenre prop to hide genre overlay
- Add showGenre prop (default true) to AlbumCard
- Make genre prop optional
- Hide genre and favorite button in LocalLibrary albums
- VirtualizedAlbumList passes showGenre={false}, showFavorite={false}
- Add spacer to keep Play button centered when favorite is hidden
2026-01-26 21:00:28 -06:00
vicrodh 65adf352b6 feat(TagEditor): show real-time progress when writing tags
Backend:
- Emit 'library:tag_write_progress' events with current/total count
- Progress updates as each file is written

Frontend:
- Listen for progress events during direct write mode
- Save button shows "Writing X of Y..." dynamically
- Cleanup listener on completion or error
2026-01-26 20:46:38 -06:00
vicrodh f1ff7d4698 feat(TagEditor): add spinner to Save button during file writes
- Show spinner-inline animation on Save button while saving
- Different text: "Writing tags..." for direct mode, "Saving..." for sidecar
- Provides visual feedback during potentially slow file operations
2026-01-26 20:41:30 -06:00
vicrodh 186a249c45 fix(TagEditor): use selected result object instead of just ID
- Store full RemoteAlbumSearchResult instead of provider_id only
- Apply uses provider from selected result, not from dropdown
- Prevents mismatch when user changes provider after searching
2026-01-26 20:31:59 -06:00
vicrodh e0d2439f56 fix: correct Discogs adapter to use extended search result
- Remove duplicate discogs_release_to_search_result function
- Use existing discogs_extended_to_search_result which properly maps:
  year, country, label, catno, format
- MusicBrainz already maps label_info with catalog_number
2026-01-26 20:30:11 -06:00
vicrodh fd08dc8f2c feat(TagEditor): add track count and descriptive result status
Backend:
- Add media/track-count fields to MusicBrainz ReleaseResult model
- Extract track_count and format from search results

Frontend:
- Show "{n} results" or "No results, try different search"
- Auto-expand results panel when search returns data
- Track hasSearched state for proper status display
2026-01-26 20:14:33 -06:00
vicrodh 2c8efa64c7 feat(TagEditor): horizontal scroll cards for remote results
- Results now scroll horizontally with snap behavior
- Each card is 50% width (min 200px) showing:
  - Title (up to 2 lines)
  - Artist
  - Details pills: year, track count, country, format
  - Label + catalog number at bottom
- Cards have better visual hierarchy with background
- More metadata visible to identify editions/re-releases
2026-01-26 20:04:35 -06:00
vicrodh 62defcffc0 feat(TagEditor): compact UI for smaller screens
- Reduce track row height (44px → 36px) and cell padding
- Input focus: underline indicator instead of pill style
- Remote section: inline header with provider/search/chevron
- Results: 2-column grid layout, max-height 140px
- Simplify result items (title, artist, year+country)
- Reduce overall gaps and spacing
- Show results count badge on chevron toggle
2026-01-26 19:58:45 -06:00
vicrodh b5698fbf88 fix: resolve 500 error from invalid JSX and wrong import
- Remove invalid React/JSX component (CopyableCommand) from SettingsView
- Replace JSX usage with proper Svelte 5 markup
- Fix import: use openUrl instead of open from plugin-opener
2026-01-26 19:40:25 -06:00
vicrodh 328fb77464 fix(TagEditor): remove stray indentation from style tag
The style tag was indented with 2 spaces, causing PostCSS to fail
parsing (it saw JavaScript as CSS). Svelte requires the style tag
to be at root level with no indentation.
2026-01-26 19:29:41 -06:00
vicrodh dddb4d4fd1 fix: resolve type mismatches and add Phase 6 polish
- Fix RemoteTrackMetadata field types (disc_number, track_number as u8)
- Fix RemoteAlbumMetadata fields (genres, tracks as Vec, disc_count as u8)
- Fix cache method calls (async, proper signatures)
- Fix error variant construction (ProviderUnavailable, InvalidProviderId)
- Add track count mismatch warning in UI
- Add rate limit error message handling
- Add 'Open in browser' button for selected result
2026-01-26 18:55:05 -06:00
vicrodh 9dd63e106b feat(TagEditor): add remote metadata lookup UI
Phase 5 of service integration:
- Add MusicBrainz/Discogs provider selector
- Add search functionality with results display
- Add apply-to-form button to populate fields
- Include track-level metadata application
- Collapsible panel to keep UI clean
2026-01-26 18:48:46 -06:00
vicrodh 6d20baf914 feat: add remote metadata service and Tauri commands
Phase 4 of service integration:
- Add provider adapters (MusicBrainz, Discogs to unified DTOs)
- Add RemoteMetadataState with search_albums and get_album_metadata
- Create remote_metadata commands module with Tauri handlers
- Wire up state and commands in lib.rs

Available commands:
- remote_metadata_search: Search albums on MusicBrainz or Discogs
- remote_metadata_get_album: Get full album metadata with tracks
- remote_metadata_cache_stats: Get cache statistics
- remote_metadata_clear_cache: Clear the in-memory cache
2026-01-26 18:46:29 -06:00
vicrodh 25e877181a discogs: add search_releases and get_release_metadata methods
Phase 3 of service integration:
- Add DiscogsReleaseMetadata struct with full album info
- Add DiscogsArtist, DiscogsLabel, DiscogsTrack structs
- Add DiscogsSearchResultExtended for detailed search results
- Add search_releases() for release search with extended metadata
- Add get_release_metadata() for full release with tracklist
2026-01-26 18:42:41 -06:00
vicrodh b8340ad6c7 musicbrainz: add get_release_with_tracks with media/tracks support
- Add ReleaseFullResponse model with media, tracks, and tags
- Add Medium, MediumTrack, TrackRecording, Tag models
- Add get_release_with_tracks() for fetching full release details
- Add search_releases_extended() with configurable limit and catalog number
- Export new types from module
2026-01-26 18:39:47 -06:00
vicrodh 70df504af3 library: add remote_metadata module structure and unified DTOs
- Add RemoteProvider enum (MusicBrainz, Discogs)
- Add RemoteAlbumSearchResult for lightweight search results
- Add RemoteAlbumMetadata for full metadata with tracks
- Add RemoteTrackMetadata for track info
- Add RemoteMetadataCache with TTL-based expiration
- Add adapter functions for MusicBrainz and Discogs
- Add Discogs position/duration parsing utilities
2026-01-26 18:37:45 -06:00
vicrodh 50d765509d fix(TagEditor): remove Tracklist label, tone down album path display 2026-01-26 18:27:25 -06:00
vicrodh d3e046d8ef fix(LocalLibrary): restore scroll in album detail view
The virtualized-active class was being applied even when viewing album
detail, causing overflow:hidden to block scrolling. Added !selectedAlbum
check to only apply virtualized mode for list views.
2026-01-26 18:24:31 -06:00
vicrodh 79ebd66856 refactor(PlaylistDetailView): use danger CSS variables for clear artwork button 2026-01-26 18:20:48 -06:00
vicrodh 590fea538c refactor: replace hardcoded colors with CSS variables
- FocusMode: replace #000, white with theme variables
- miniplayer: replace #6366f1, #fff, #818cf8 with accent/text variables
- AlbumDetailView: replace #666666 with --text-muted
- LoginView: use --danger and --warning variables for error/timeout boxes
- PlaylistModal: use .icon-inline utility class

Add to app.css:
- Warning color variables (--warning, --warning-bg, --warning-border)
- .icon-inline and .badge-warning utility classes
2026-01-26 18:20:06 -06:00
vicrodh 8ae4f62401 refactor(ExpandedPlayer): replace hardcoded colors with CSS variables 2026-01-26 18:16:23 -06:00
vicrodh fcda0ddf36 refactor: centralize button styles in app.css
- Add global .btn, .btn-primary, .btn-secondary, .btn-danger, .btn-ghost classes
- Add --danger color CSS variables for multi-theme support
- Add .btn-sm and .btn-lg size modifiers
- Refactor all modals and views to use global button classes
- Remove 260+ lines of duplicated button CSS across components

Files updated:
- FavoritesEditModal, FolderEditModal, FolderSettingsModal
- LocalLibraryTagEditorModal, MigrationModal, PlaylistImportModal
- PlaylistModal, Sidebar, LocalLibraryView, PlaylistManagerView
2026-01-26 18:02:58 -06:00
vicrodh 1751a83499 fix(ui): align metadata footer buttons with app style
cx
2026-01-26 17:45:08 -06:00
vicrodh c09a4233db fix(ui): align metadata editor footer buttons and spacing
cx
2026-01-26 17:42:34 -06:00
vicrodh 138f4388b7 fix(ui): ensure 5-row tracklist scroll and footer alignment
cx
2026-01-26 17:34:52 -06:00
vicrodh 6b107a8c57 fix(ui): stabilize metadata editor table and footer
cx
2026-01-26 17:19:51 -06:00
vicrodh be605dacf4 refactor(ui): polish metadata editor table and footer
cx
2026-01-26 17:05:51 -06:00
vicrodh 9889303a13 fix(ui): improve tracklist table and footer controls
cx
2026-01-26 16:55:01 -06:00
vicrodh 333c53002e fix(ui): tabular tracklist with vertical snap
cx
2026-01-26 16:49:13 -06:00
vicrodh 3ca9fe48af fix(ui): compute total discs without const tag
cx
2026-01-26 16:43:08 -06:00
vicrodh c63290b483 refactor(ui): update local metadata editor layout
cx
2026-01-26 16:40:32 -06:00
vicrodh cf41862c50 fix(ui): size local tag editor modal inputs
cx
2026-01-26 16:31:10 -06:00
vicrodh 13ee849604 fix(ui): ensure modals overlay sidebar and player
cx
2026-01-26 15:44:33 -06:00
vicrodh 4bc4bb0132 fix(ui): hide Discogs panel until fetch
cx
2026-01-26 15:36:39 -06:00
vicrodh 885b5f73b5 refactor(ui): align album artwork labels and grid
cx
2026-01-26 15:31:09 -06:00
vicrodh db45369b0a fix(ui): match Discogs cover size to preview
cx
2026-01-26 15:14:44 -06:00