Commit Graph
1417 Commits
Author SHA1 Message Date
vicrodh 859818b4b5 fix(search): add bottom margin to quality badge and fix ticker animation
- Added 1px bottom padding to quality badge
- Reset overflow measurement when most_popular content changes
- Ticker animation now properly triggers on new search results
2026-02-01 03:18:57 -06:00
vicrodh b0b1d3ea5e fix(search): reduce album art to 142px to fit quality badge inside card 2026-02-01 03:17:06 -06:00
vicrodh 4182d7645c feat(search): add border to quality badge and ticker animation for long titles
- Quality badge now has border (alpha-15) and background (alpha-10)
- Added 5px top margin for separation
- Title and subtitle now use ticker animation on hover for long text
- Animation matches AlbumCard behavior (scroll left then back)
2026-02-01 03:13:31 -06:00
vicrodh 01fe3cfdf5 refactor(search): redesign Most Popular album/track cards
- Card now has background like artist-card (bg-secondary, rounded)
- Artwork reduced to 148x148 with 6px padding around
- Quality badge moved to bottom of card (outside artwork)
- Genre only visible on hover overlay with slide-in animation
- Text centered and sized down for consistency
2026-02-01 03:07:49 -06:00
vicrodh 5b7a169e93 feat(search): move quality badge to bottom-right, add genre badge top-left
- Quality badge now at bottom-right with lighter background (0.55 opacity)
- Genre badge at top-left for albums (tracks don't have genre data)
- Both badges use consistent styling with blur backdrop
2026-02-01 03:01:55 -06:00
vicrodh 8c9a27afbb feat(search): add quality badge to Most Popular album/track cards
- Shows compact QualityBadge (e.g. "24bit/96kHz", "CD Quality")
- Positioned at top-right corner of artwork
- Semi-transparent background with blur for readability
2026-02-01 02:59:45 -06:00
vicrodh 5e83c1df47 fix(search): use portal pattern for Most Popular dropdown menu
- Dropdown now renders in document body (escapes stacking context)
- z-index: 99999 matches TrackMenu
- Styling matches TrackMenu (font-size 12px, padding 8px 12px)
- Fixed positioning calculates viewport bounds correctly
2026-02-01 02:54:54 -06:00
vicrodh d9af56192d feat(search): add overlay card UI for Most Popular tracks and albums
- New popular-card with square image, title, and subtitle
- Hover overlay with heart, play, and menu buttons
- Dropdown menu with play controls and navigation options
- Track cards show "Go to album", album cards show "Go to artist"
- Artists still use the existing circular card design
2026-02-01 02:46:29 -06:00
vicrodh f699cf0e63 fix(search): resolve notification loops causing multiple API requests
- Make auth_token() public for catalog/search endpoint authentication
- Fix setSearchQuery to skip notification when value unchanged
- Fix setSearchState to only notify listeners when query actually changed
- Add title case transformation for better most_popular API results
- Add stale result detection to ignore outdated search responses
- Preserve most_popular when API returns inconsistent results
- Clean up debug logging
2026-02-01 02:41:55 -06:00
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 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
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 3926209b0d fix(auth): persist ToS acceptance in Rust/SQLite backend
ToS acceptance was stored in localStorage which gets cleared on app
updates, causing users to re-login frequently. Now stores ToS state
in SQLite (~/.local/share/qbz/legal_settings.db) which survives
updates.

- Add legal_settings.rs with SQLite storage for ToS acceptance
- Update qobuzLegalStore.ts to use Rust invoke commands
- LoginView now loads ToS from Rust before auto-login check
- Migration from localStorage for existing users

Closes #31
2026-01-30 14:49:39 -06:00
vicrodh fe7816f6c6 feat(audio): add S/PDIF (iec958:) devices to bit-perfect category
Digital outputs like S/PDIF transmit audio as-is without DA/AD conversion,
making them bit-perfect by nature. Now iec958: devices get the BP badge.

Updated group label to "Bit-perfect (Hardware / Digital)" to reflect
both direct hardware access (hw:) and digital outputs (iec958:).
2026-01-30 11:55:31 -06:00
vicrodh 5b03af41bc feat(audio): add alsa-utils help modal with distro-specific install commands
- Add check_alsa_utils_installed and get_linux_distro Tauri commands
- Detect Linux distribution from /etc/os-release
- Show appropriate package manager command for each distro
- Add (?) help icon next to ALSA Direct device dropdown in Settings
- Modal explains why alsa-utils is needed for bit-perfect detection
- Updated PKGBUILDs to list alsa-utils as optdepend
2026-01-30 11:43:34 -06:00
vicrodh 2838b25738 Replace 'Downloading' with 'Caching' in logs 2026-01-30 11:37:55 -06:00
vicrodh f67b13e27e Add grouped device dropdown for PipeWire with USB/HDMI categorization
Backend changes:
- Add device_bus and is_hardware fields to AudioDevice
- Parse PipeWire Flags (HARDWARE) and device.bus property from pactl output

Frontend changes:
- DeviceDropdown now supports both ALSA and PipeWire backends
- ALSA grouping: Defaults, Bit-perfect, Plugin Hardware, Other
- PipeWire grouping: Defaults, USB Audio (BP capable), HDMI/DisplayPort, Other HW, Virtual
- BP badge shown for USB Audio devices in PipeWire mode
2026-01-30 11:18:09 -06:00
vicrodh 0ccdd9981f Add supported sample rates detection and display for ALSA devices
Backend changes:
- Add supported_sample_rates field to AudioDevice struct
- Detect common audio sample rates (44.1, 48, 88.2, 96, 176.4, 192, 352.8, 384 kHz)
- Use CPAL's supported_output_configs() to check rate support for hw: devices

Frontend changes:
- Display sample rates as subtitle in DeviceDropdown (e.g., "44.1, 48, 96, 192 kHz")
- Only shown for bit-perfect devices where detection is available
- Search not sensitive to sample rates field (per user request)
2026-01-30 11:11:05 -06:00
vicrodh 91fa7c7f5f Add grouped device dropdown for ALSA Direct audio output selection
- New DeviceDropdown component with grouped options:
  - Defaults (System Default, default ALSA)
  - Bit-perfect (Auto-detected) - hw:X,Y devices with BP badge
  - Plugin Hardware - plughw:X,Y devices
  - Other Outputs - remaining devices
- Only shows for ALSA Direct backend, other backends use regular dropdown
- Pure UI change, no backend modifications
2026-01-30 11:01:16 -06:00
vicrodh df8bdb7ac0 Add ticker animation for artist names and sorting to album sections in Favorites browse view
- Artist names in sidepanel now animate with ticker effect on hover when text overflows
- Each album section (Discography, EPs & Singles, Live Albums) now has a sort dropdown
- Sort options: Default, Newest, Oldest, A-Z, Z-A
- Use sorted arrays for rendering instead of raw grouped arrays
2026-01-30 10:17:06 -06:00
vicrodh 8840da39a5 feat(favorites): show Discography, EPs & Singles, and Live Albums in browse view
- Group albums by category: Discography, EPs & Singles, Live Albums
- Exclude tributes and compilations (others) from display
- Each section has its own header that scrolls with content
- Updated footer: "To view compilations and other content, go to..."
- All content scrolls together (sections + footer)
2026-01-30 09:53:31 -06:00
vicrodh bf836a6bfb fix(favorites): remove redundant artist count from sidepanel column 2026-01-30 09:10:21 -06:00
vicrodh efe0f7143b fix(favorites): full height layout and remove horizontal scrollbar
- Add no-outer-scroll class when sidepanel mode is active
- Set up proper flex container hierarchy for full height:
  - .favorites-view becomes flex column container
  - .content gets flex: 1 with min-height: 0
  - ViewTransition wrapper gets flex: 1 via :global selector
- Fix negative margins to match parent padding (was -32px, now -8px/-18px)
- Reduce artist column width to 240px (matches LocalLibrary)
- Fix album column right padding to 8px
2026-01-30 09:07:52 -06:00