Commit Graph
1599 Commits
Author SHA1 Message Date
vicrodh d8bd93374f feat(search): use Qobuz API most_popular field directly
Replace heuristic-based most popular detection with Qobuz's actual
most_popular field from the catalog/search endpoint.

- Add CATALOG_SEARCH endpoint path
- Make app_id() and get_http() public on QobuzClient
- Add MostPopularItem enum with tagged serialization (artists/albums/tracks)
- Update search_all to use catalog/search and parse most_popular field
- Update SearchView template to use allResults.most_popular with new types
- Add MostPopularItem type to searchState store
2026-02-01 01:33:17 -06:00
vicrodh aa16a9276b feat(search): Most Popular can now show artist, album, or track
The Most Popular result in search now intelligently determines
the best match based on query:
- Exact name match: artist > album > track
- Starts with match: artist > album > track
- Fallback: first artist, then album, then track

Added track card display for when a track is the most popular result.
2026-02-01 01:13:06 -06:00
vicrodh d5cbd32fce feat(library): add folder search filter in settings 2026-02-01 01:07:42 -06:00
vicrodh c025e7b8ae fix(library): make entire folder row clickable to toggle checkbox 2026-02-01 01:06:12 -06:00
vicrodh a55c85348d fix(settings): simplify subscription display to inline text with separator 2026-02-01 01:04:20 -06:00
vicrodh 46d91af88f fix(settings): center account card content with symmetric padding 2026-02-01 01:02:37 -06:00
vicrodh d650670ef3 fix(settings): improve streaming-only copy and account card alignment
- Update "Streaming Only" description to be less technical:
  "Disables temporary cache. Not recommended without a fast connection.
  Offline library tracks always play first."
- Fix account card vertical centering with explicit align-self on
  avatar, info container, and logout button
2026-02-01 00:53:33 -06:00
vicrodh c2fcdcec32 feat(settings): add Streaming Only toggle to audio settings
Adds UI toggle for streaming_only mode that skips L1/L2 cache writes.
When enabled, tracks are streamed fresh each time but offline cache
still works for downloaded tracks (local-first principle).
2026-02-01 00:39:12 -06:00
vicrodh b4944aa527 feat(audio): add streaming-only mode backend
Add streaming_only setting that skips L1+L2 cache writes while still
respecting offline cache (local-first). When enabled:
- download_and_stream() skips final cache.insert()
- Standard download path skips cache.insert()
- Offline cache continues to work normally

This reduces storage usage for users who prefer pure streaming.
2026-02-01 00:37:26 -06:00
vicrodh eb9d9dbb15 fix: revert to hi-res-gray.svg (hi-res.svg has poor text contrast) 2026-02-01 00:16:36 -06:00
vicrodh 03cee3f9fc fix: add fixed-width icon container (24px) and use hi-res.svg instead of hi-res-gray.svg 2026-02-01 00:14:08 -06:00
vicrodh 8c7af66d05 fix: increase quality badge min-width to 136px for consistent sizing 2026-02-01 00:07:49 -06:00
vicrodh f8825d98dd fix: set fixed heights for quality badge (36px) and audio badges row (20px) to prevent size changes 2026-02-01 00:02:59 -06:00
vicrodh adc0742fdb fix: maintain consistent badge width by always reserving space for downgrade indicator 2026-01-31 23:58:47 -06:00
vicrodh eaf250383a fix: move loadStatus call to mouseenter handler to prevent re-render loop 2026-01-31 23:51:12 -06:00
vicrodh ae81b1c3c4 Fix quality setting and device name display issues (#34)
- Clear both L1 memory and L2 disk caches when quality setting changes
  This ensures cached tracks at wrong quality are removed
- Fix device name not showing in popup on first hover
  Now refreshes status on each hover instead of only when null
- Add quality downgrade indicator when stream quality is lower than
  track's original quality (shows yellow arrow with tooltip)
- Store original track quality values for comparison with actual stream
2026-01-31 23:46:02 -06:00
vicrodh 8b7e4dab27 feat: show actual stream quality in player UI
Issue #34 - Display actual stream quality, not track metadata

Backend changes:
- Add sample_rate and bit_depth to PlaybackEvent
- Add stream quality tracking to SharedState
- Extract bit_depth from FLAC/M4A headers in streaming path
- Player sets stream quality when decoding audio

Frontend changes:
- Update PlaybackEvent interface with new fields
- Update currentTrack with actual stream quality from backend

This allows the UI to show the actual quality being played (e.g., 44.1kHz
when streaming a 192kHz track at CD Quality) instead of the track's
maximum advertised quality.
2026-01-31 23:32:29 -06:00
vicrodh 38b7ea7aef fix: enforce streaming quality setting by clearing cache on change
Issue #34 - Max quality setting not respected

Changes:
- Remove 'Prefer Highest Available' toggle (was dead code, conflicted with quality dropdown)
- Clear playback cache (L1+L2) when streaming quality changes
- Show toast notification when cache is cleared
- Add description to streaming quality setting
- Update i18n for new messages (en/es)

This ensures the quality setting takes effect immediately, important for:
- Users with metered internet connections
- Users with hardware sample rate limitations (e.g., DACs limited to 96kHz)

The Qobuz API respects format_id and downsamples server-side, so this
change guarantees the correct quality is fetched for new streams.
2026-01-31 23:15:09 -06:00
vicrodh f83eed1076 debug: add quality logging to diagnose issue #34
- Log requested vs returned format_id and sample_rate in get_stream_url_with_fallback
- Log quality_str, parsed quality, and format_id in play_track and prefetch_track commands
- Add console.log in getStreamingQuality for frontend debugging

This will help diagnose why 192kHz is played despite lower quality settings.
2026-01-31 20:54:05 -06:00
vicrodh e1771db099 docs: update CONTRIBUTING.md to require PRs target pre-release
- Add branch workflow section explaining pre-release integration
- Clarify that all PRs must target pre-release, not main
- Update maintainer procedure for new workflow
- Add release procedure section
2026-01-31 20:08:03 -06:00
vicrodh 583bf8f774 Merge PR #35: Make release sort options on artist detail view sticky and global 2026-01-31 20:07:13 -06:00
vicrodh 011ee02ec9 Merge pre-release into feature/immersive-player
Resolved conflicts:
- src-tauri/src/api/client.rs: Keep TrackUnavailable error handling
- i18n files: Combined immersive player keys with trackUnavailable key
2026-01-31 17:19:03 -06:00
vicrodh 38b92bb8d8 chore: update package-lock.json after reinstall 2026-01-31 17:17:23 -06:00
vicrodh 6e55e36652 fix: use proper i18n keys in TrackReplacementModal
Added playlist-specific keys for search button, cancel, loading,
and preview instead of generic common.* keys that didn't exist.
2026-01-31 17:05:46 -06:00
vicrodh 90f24ff122 fix: pass onFindReplacement to TrackMenu from TrackRow
Added missing onFindReplacement to TrackMenuActions interface and
pass it through to TrackMenu component.
2026-01-31 17:02:04 -06:00
vicrodh 2ffd9df133 feat: add "Find available version" option for unavailable tracks
- Add TrackReplacementModal to search for replacement tracks
- Add onFindReplacement action to TrackMenu context menu
- Show replacement option only for owned playlists with unavailable tracks
- Replacement searches by track title + artist
- Shows quality info (bit depth, sample rate) to help user choose
- Supports preview playback before confirming
- Replace old track with new one in playlist

Also fix tooltip for unavailable tracks to show a complete message
instead of "is no longer available" (now shows "Track no longer
available in Qobuz library")
2026-01-31 16:45:23 -06:00
vicrodh faefc68381 fix: maintain column alignment for unavailable tracks
Add placeholders for favorite and download columns when hidden to
prevent column misalignment in unavailable tracks.
2026-01-31 16:36:46 -06:00
vicrodh d46a08465c feat: unavailable track handling with icon in track number column
- Add isUnavailable prop to TrackRow to show AlertCircle instead of track number
- Show unavailable icon only for user's own playlists (not Qobuz official playlists)
- Gray out unavailable tracks in both owned and non-owned playlists
- Remove all interactions for unavailable tracks in non-owned playlists
- Keep only "remove from playlist" option for unavailable tracks in owned playlists
- Create unavailableTracksStore for persisting unavailable track IDs to localStorage
- Load unavailable tracks on app startup in bootstrap.ts
- Auto-mark tracks as unavailable when playback fails with TrackUnavailable error
2026-01-31 16:20:23 -06:00
vicrodh 503e86eeb4 feat: gray out unavailable tracks with info icon in playlist view
- Add streamable field to PlaylistTrack and DisplayTrack interfaces
- Add isTrackRemovedFromQobuz() check for tracks with streamable: false
- Show red AlertCircle icon for unavailable tracks
- Gray out and apply grayscale filter to unavailable track rows
- Limit menu actions to only 'Remove from Playlist' for removed tracks
- Hide favorite and download buttons for removed tracks
- Keep wrapper interactive for context menu access
2026-01-31 16:15:04 -06:00
vicrodh e68c3128b6 feat: auto-skip unavailable tracks with user-friendly error
Backend:
- Add TrackUnavailable error type for tracks removed from Qobuz
- Validate stream URL response - detect missing URL with restrictions
- Add SampleRestrictedByRightHolders to restriction check
- Return specific error when track is unavailable vs quality unavailable

Frontend:
- Detect track unavailable errors in playTrack()
- Show friendly toast: Track title is no longer available
- Auto-skip to next track in queue after 500ms delay
- Add i18n translations (en/es) for trackUnavailable message
2026-01-31 16:10:26 -06:00
vicrodh 1483c05913 Fix: Validate stream URL response before making HEAD request
- Add validation to check if URL is empty before returning StreamUrl
- Add debug logging for JSON response keys
- Return proper error instead of silently using empty URL
- This prevents 'builder error' from HEAD request to empty URL
2026-01-31 15:58:36 -06:00
vicrodh 5ecf9ce24f Fix intermittent HEAD request builder error in streaming playback
- Use lazy_static to create a single reusable HTTP client instead of
  creating a new client for each stream info request
- Add retry logic (3 attempts with 100ms delay) to handle transient
  network/TLS initialization failures
- This fixes 'Failed HEAD request: builder error' toasts that required
  pressing play button twice
2026-01-31 15:54:57 -06:00
vicrodh 3fa34b0594 Fix @const placement in SuggestionsPanel
Move {@const} to be direct child of {#each} block as required by Svelte 5
2026-01-31 15:49:21 -06:00
vicrodh c1877cde75 Fix visual size matching for icons in SuggestionsPanel
- Adjust badge icons: QBZ 17px (was 22px), Qobuz 20px (was 18px)
  QBZ fills its viewBox completely while Qobuz has whitespace,
  so QBZ needs to be smaller to appear visually equal

- Adjust glyph icons: Playlist 32px (was 28px), Radio 26px (was 24px)
  Playlist SVG only fills ~77% of its 20x20 viewBox, needs larger
  pixel size to match Lucide Radio which fills its box completely
2026-01-31 14:55:15 -06:00
vicrodh 14f0cae1c1 feat(suggestions): major UX overhaul with popular tracks fallback
Backend:
- Add get_artist_tracks command for fetching artist's popular tracks

Frontend:
- Fallback to artist's popular tracks when tracks_appears_on is sparse
- Remove card hover movement, only image moves up on hover
- Add hover overlay with (add to queue) (play) (play next) buttons
- Use playlist.svg icon for playlist cards and glyph
- Radio glyph shown by default, replaced by action buttons on hover
- Fix icon sizes: QBZ (22px) vs Qobuz (18px) for visual balance
- Track playlist.svg asset
2026-01-31 14:48:26 -06:00
vicrodh d7c0af6297 fix(suggestions): relax deduplication to keep more variety
- Change from aggressive title normalization to exact title match only
- Keeps different versions (Remaster, Live, etc.) as valid options
- Add debug logging for sparse recommendation data
- This should fix the "only one recommendation" issue for some artists
2026-01-31 14:10:18 -06:00
vicrodh bcbd8ce27f fix(suggestions): fix CPU spike and improve card UX
- Fix $derived to $derived.by for complex logic (was causing CPU spike)
- Remove badge backgrounds from QBZ and Qobuz icons
- Move info icon (i) to top-left corner of radio card
- Add play button to radio card
- Increase badge icon sizes for visibility
2026-01-31 14:08:21 -06:00
vicrodh 1361f257f9 feat(suggestions): improve UX with deduplication, icons, and radio collage
- Dedupe recommended tracks by normalized title (filters remasters/editions)
- Use actual QBZ logo SVG instead of text "Q"
- Add playlist icon and "Playlist" label for clarity
- Add diamond-style collage layout for Song Radio card
- Pass currentArtwork for radio collage images
- Clean up unused error-text CSS in LyricsPanel
2026-01-31 13:59:05 -06:00
vicrodh 9c35c22567 fix: pass artistId to ImmersivePlayer for SuggestionsPanel
The SuggestionsPanel was showing "No track selected" because artistId
was not being passed from the page to ImmersivePlayer component.
2026-01-31 13:49:31 -06:00
vicrodh c0242356a1 fix(lyrics): show user-friendly message when lyrics unavailable
Replace technical error 'LRCLIB search request failed...' with
'No lyrics available' in both LyricsPanel and LyricsFocusPanel.
2026-01-31 12:31:02 -06:00
vicrodh 3228a6c76c fix(suggestions): use correct qobuz-logo-filled.svg path 2026-01-31 12:24:53 -06:00
vicrodh e479705803 feat(immersive): implement Suggestions panel with artist playlists and radio
Layout:
- Top section: Artist curated playlists (from Qobuz) + Song Radio card (QBZ)
- Bottom section: Recommended tracks from artist's discography

Features:
- Artist playlists fetched via get_artist_detail (includes curated playlists)
- Song Radio card with experimental badge and tooltip
- Recommended tracks shuffled from artist's tracks_appears_on
- Single API call per artist (efficient loading)
- Loading state with spinner, empty state handling
- Play buttons with hover effects

Technical:
- Uses existing create_track_radio command for radio generation
- Tracks loadedArtistId to prevent duplicate requests
- Added translations for songRadio, radioExperimental, recommendedTracks
2026-01-31 12:22:39 -06:00
vicrodh 2058fab287 fix(immersive): prevent multiple unnecessary track info requests
- Track loadedTrackId to avoid re-fetching same track
- Only request when trackId actually changes from loaded one
- Clear state only when track ends (trackId becomes null)
- Remove broken common.loading translation (spinner is enough)
2026-01-31 11:19:03 -06:00
vicrodh fe274c466d feat(immersive): replace Credits panel with Track Info panel
- Create TrackInfoPanel with full track metadata and credits
- Display: duration, quality, ISRC, label, and all performer credits
- Uses same backend as TrackInfoModal (get_track_info command)
- Rename tab from 'Credits' to 'Track Info' (player.trackInfo)
- Update keyboard shortcut from 'C' to 'T' for Track Info tab
- Fix actions.clearQueue -> player.clearQueue translation key
- Add i18n translations for trackInfo in EN/ES
- Delete old placeholder CreditsPanel
2026-01-31 11:12:25 -06:00
vicrodh 282fffc6a4 perf(immersive): improve background quality while maintaining low CPU
- Increase canvas size from 8x8 to 64x64 to reduce visible pixelation
- Add small CSS blur(40px) to smooth the result
- Key: blur(40px) on 64x64 is much cheaper than blur(120px) on full image
- Adjusted brightness slightly darker (0.55x) for better text contrast
2026-01-31 11:06:23 -06:00
vicrodh f012ba33f4 perf(immersive): fix critical CPU usage issue in background blur
Performance problem:
- WebKitWebProcess consuming 97% CPU on one core
- Cause: CSS filter: blur(120px) on large image is extremely expensive
  in WebKit/GTK which cannot GPU-accelerate this operation

Solution:
- Replace CSS blur with Canvas-based tiny thumbnail approach
- Draw image to 8x8 canvas, apply color adjustments, scale up via CSS
- Natural pixelation creates blur-like effect with ZERO CPU cost
- Remove backdrop-filter: blur() from header elements (use solid bg)

Also fixed:
- Change Mic icon to Mic2 to match rest of app
- Add missing i18n translations for player.credits and player.suggestions
2026-01-31 11:01:34 -06:00
Joel C 40cd8ddb70 Make release sort options on artist detail view sticky and global
This way the selected options are applied to all artists,
and persisted after app restart.
2026-01-31 17:12:27 +01:00
vicrodh 4d5a78ff24 refactor(immersive): clean up controls and improve split view layout
- Remove track info (artwork, title, artist) from ImmersiveControls bottom bar
- Add track title and artist below album artwork in split view mode
- Change Lyrics Focus icon from MessageSquareText to Mic (microphone)
- Remove unused compact mode from ImmersiveControls
- Simplify props and cleanup CSS
2026-01-30 23:11:06 -06:00
vicrodh 0fc0723804 refactor(immersive): remove visualizer feature entirely
- Remove VisualizerPanel component
- Remove visualizer-focus display mode
- Remove visualizer tab from split view
- Remove enableVisualizer prop
- Remove keyboard shortcut 5 and v for visualizer
- Clean up unused imports and CSS
2026-01-30 22:32:33 -06:00
vicrodh 14ed60bb94 Revert "feat(immersive): full-screen visualizer with multiple modes"
This reverts commit d13278785d.
2026-01-30 22:29:27 -06:00