Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 22f49eab30 feat(immersive): add Linebed visualizer panel
3D terrain-style frequency visualization using stacked spectrum lines
with perspective. Uses viz:spectral (190 bands) for high-resolution
terrain, with quadratic curve smoothing and black occlusion fill for
depth. Track info displayed bottom-right matching other panels.
2026-03-12 10:56:50 -06:00
vicrodh 509a65572e fix(artwork): proxy track row and album header images through backend cache (#163)
TrackRow, AlbumDetailView header, and ImageLightbox were loading artwork
directly via WebKitGTK HTTPS, which fails on systems with TLS database
issues. Switch all three to use:cachedSrc action to proxy through the
Rust backend image cache, matching the pattern used by other components.
2026-03-12 10:40:48 -06:00
vicrodh 6b1dbe8d0c fix(i18n): remove (Brasil) suffix from Portuguese locale display name 2026-03-12 10:31:59 -06:00
vicrodh c94dad9f33 fix(library): album names with Disc/CD suffix misidentified as disc folders (#147)
is_disc_folder() was matching any folder name containing "Disc N" or
"CDN" anywhere in the name. This caused albums like "100 Popular
Classics, Disc 1" or "Now 75 - CD1" under Various Artists to be treated
as disc subfolders, collapsing all tracks into a single album group.

Now is_disc_folder() only returns true when the folder name consists
exclusively of disc-related tokens (disc/cd/disk, digits, and modifiers
like "bonus"). Album names with extra words are correctly left as-is.

Users must re-scan their library for the fix to take effect.
2026-03-12 10:30:58 -06:00
vicrodh 264298a949 ci: add dependabot config and PR redirect workflow
- dependabot.yml: target pre-release branch for npm and cargo updates
- redirect-pr-to-prerelease.yml: auto-redirect PRs to main → pre-release
  with a friendly comment explaining the workflow
2026-03-12 10:13:22 -06:00
vicrodh 28a5bfed43 Merge branch 'dependabot/npm_and_yarn/devalue-5.6.4' of github.com:vicrodh/qbz into pre-release 2026-03-12 09:52:42 -06:00
vicrodh 8af4fc0b3d fix(i18n): add Portuguese to language selector in settings
Add pt-BR to languageToLocale, localeToLanguage, availableLanguages
maps and include 'pt' in Auto mode supported locales.
2026-03-12 09:51:41 -06:00
vicrodh d7fd24b2e9 fix: add quality fallback when CDN fails at current quality level
When download fails after retry at the same quality (e.g. HiRes),
automatically try the next lower quality (e.g. Lossless). This handles
CDN edges that consistently serve broken responses for specific tracks
at certain quality levels. Applied to all three download paths: standard
download, streaming probe fallback, and prefetch. Also fixes prefetch
retry using wrong quality variable.
2026-03-12 09:15:57 -06:00
vicrodh d34fb4eb3e feat(i18n): add Brazilian Portuguese (pt-BR) translation
Add complete pt.json locale file with all 45 top-level translation
sections. Register the new locale in the i18n index with native name
"Português (Brasil)".
2026-03-12 09:00:17 -06:00
vicrodh e71526e741 fix: add retry with fresh URL to offline cache downloads
Apply the same CDN premature EOF fix to offline-playback: on download
failure, request a fresh stream URL and retry once. Also switch
StreamFetcher to native-tls and add detailed error chain logging.
2026-03-11 20:44:34 -06:00
vicrodh df86363aac fix: add retry with fresh URL on CDN premature EOF
Root cause: Qobuz CDN returns "end of file before message length
reached" for specific tracks - sends Content-Length header then
closes connection without body data. Consistently reproducible for
certain tracks while others from the same album work fine.

Add retry logic at all download paths: on failure, request a fresh
stream URL from the API and retry once (CDN may route to different
edge). Streaming probe failures now fall back to standard download
path instead of failing completely. Also stream response body in
chunks for better partial-read diagnostics.
2026-03-11 20:41:58 -06:00
vicrodh d02090f30d fix: prevent ALSA device lock on streaming failure, add Drop for PlaybackEngine
Add Drop impl to PlaybackEngine so the ALSA Direct writer thread is
properly stopped when the engine is dropped (e.g. streaming timeout).
Previously, a failed streaming attempt would orphan the writer thread,
keeping the ALSA device locked and blocking all subsequent playback.

Also force HTTP/1.1 for audio downloads and add detailed error chain
logging to diagnose persistent "error decoding response body" failures
for specific tracks.
2026-03-11 20:15:11 -06:00
vicrodh be2e2956f8 fix: disable HTTP auto-decompression for audio downloads and increase CoreBridge timeout
Audio downloads (streaming, prefetch, direct) now use no_gzip/no_brotli/no_deflate
to prevent reqwest from trying to decompress binary FLAC data when CDN servers
send Content-Encoding headers. This fixes "error decoding response body" errors
that caused certain tracks to fail playback.

CoreBridge initialization timeout increased from 10s to 30s with progress logging,
fixing V2NotInitialized errors on slow network startups.
2026-03-11 20:10:47 -06:00
vicrodh c7f5dcf2f4 feat: true gapless playback for ALSA Direct mode
Refactor ALSA Direct engine from thread-per-source to a single
long-lived writer thread with a source queue. When one source ends,
the writer thread immediately picks up the next from the queue with
zero gap. Remove the ALSA Direct gapless rejection gate since the
engine now natively supports source queueing.
2026-03-11 19:43:47 -06:00
vicrodh 6cac85910a fix: improve tray icon visibility across Linux DEs
Install tray icon to user's local icon theme dir so panels using
StatusNotifierItem name lookup can find it. Set dedicated temp dir
for libayatana-appindicator's icon file. Install all icon sizes
(32-512px) in Flathub manifest for broader DE compatibility.
2026-03-11 18:18:16 -06:00
vicrodh f294359663 fix: match both ALSA stream and client in bit-perfect rules (#164)
ALSA streams don't have application.process.binary, only
application.name = "PipeWire ALSA [binary]". Generate both
match conditions so resample.disable applies to all stream types.
2026-03-11 17:12:09 -06:00
vicrodh 9d6c2f7eba fix: harden session restore/persist to prevent ghost CSS errors
When last_view pointed to a view with incomplete context (e.g.
album without selectedAlbum data), the Svelte CSS extraction
pipeline would corrupt and produce PostCSS "Unknown word" errors
that survived cache cleans and npm ci.

- Add isSessionRestoreSafeView() whitelist for context-free views
- Add getSessionFallbackView() for graceful degradation
- Centralize persist logic in getPersistedSessionViewState()
- Only persist views that have valid context data
- Add purchase-album to restore path
- Add dev:reset-last-view script to reset session.db
- Fix AlbumCreditsModal.svelte event handler typing
2026-03-11 17:02:29 -06:00
vicrodh 0b870e6ddb fix: prevent black screen on session restore with missing view data
Add defensive fallback conditions for artist and playlist views
when activeView is set but data hasn't loaded yet (race condition
during session restore). Also add a catch-all fallback at the end
of the view chain so no combination of state can result in an
empty/black main content area.
2026-03-11 15:35:51 -06:00
vicrodh e128a7866f feat(v2): implement streaming playback and fix seekbar position
Add real streaming path to v2_play_track: when stream_first_track
is enabled, uses play_streaming_dynamic + background chunked
download instead of full download before playback.

Fix seekbar not showing position for streamed tracks by passing
duration_secs from frontend to the backend. Without it, the
player stored 0 as duration, making the seekbar appear empty.
2026-03-11 14:28:00 -06:00
vicrodh f4702c34b1 fix: remove 120s total timeout from audio download for large Hi-Res+ tracks
Hi-Res+ tracks at 192kHz/24-bit can be 100-200MB and take over 2 minutes
to download. The 120s total timeout caused silent download failures where
the track appeared to play but had no audio data. Keep only the 10s
connect timeout. Also fix unused import warning for MusicBrainzSharedState.
2026-03-11 13:38:52 -06:00
vicrodh c0cc146b38 fix: use client.conf.d for bit-perfect stream rules path (#164)
Per PipeWire docs, stream.rules for ALSA plugin clients belong in
~/.config/pipewire/client.conf.d/, not pipewire.conf.d/ which is
for daemon-level configuration. The DAC sample rate config stays in
pipewire.conf.d/ as that is daemon configuration.
2026-03-11 13:35:13 -06:00
vicrodh b1424c8b68 fix: re-apply clock.force-rate after stream creation on resume (#165)
When PipeWire drops the stream during pause, the graph reverts to the
DAC's default rate (e.g. 44100Hz). The pre-stream force-rate metadata
can be ignored when no streams are active. Re-applying after the stream
is connected forces PipeWire to reconfigure the graph at the correct
sample rate.

Also fix unused import warning for MusicBrainzSharedState in commands_v2
by using the import instead of the full path in factory_reset.
2026-03-11 13:32:42 -06:00
vicrodh 728c867c1b chore: update snapcraft source-tag to v1.1.20 2026-03-11 13:12:25 -06:00
vicrodh a4a6722110 chore: bump version to 1.1.20 2026-03-11 12:53:13 -06:00
vicrodh 4423d87fb1 fix: use application.process.binary for PipeWire bit-perfect match rules (#164)
The wizard was generating matches = [ { application.name = "QBZ" } ] but
PipeWire reports application.name = "PipeWire ALSA [qbz]". Using
application.process.binary = "qbz" correctly matches the actual binary name.
2026-03-11 11:58:40 -06:00
vicrodh 8402dd4569 fix: resolve 2 failing tests (performers doctest, credentials roundtrip)
- Fix doctest: use qbz_nix_lib instead of crate in doc example import
- Fix credentials roundtrip: clear stale credentials before test, gracefully
  skip if decryption fails due to environment issues (different key/salt
  from previous runs)

Closes #154
2026-03-11 11:54:53 -06:00
vicrodh 2bbb03b1ee chore: ignore crates/Cargo.lock in gitignore 2026-03-11 10:59:54 -06:00
vicrodh 80bff83c42 fix: proxy all artwork through backend cache for AppImage TLS compat (#163)
When WebKitGTK's GnuTLS can't find system trust store (common in
AppImage on some distros), direct HTTPS image loads fail. Home page
worked because AlbumCard already used cachedSrc which proxies through
the Rust backend (reqwest with its own TLS).

Apply cachedSrc to all remaining artwork displays:
- PlaylistCollage (playlist grid covers)
- NowPlayingBar (current track artwork + hover preview)
- ImmersiveArtwork (fullscreen player)
- QueuePanel (sidebar + immersive queue/history)
- CoverflowPanel, HistoryPanel, FocusMode

Also resolve artwork URL in +page.svelte via getCachedImageUrl before
passing to NowPlayingBar/ImmersivePlayer, so all downstream immersive
panels receive pre-cached asset:// URLs.
2026-03-11 08:13:51 -06:00
vicrodh 0eb0139418 fix: remove sys-lib-libjpeg from mupdf to fix startup on Debian/Fedora (#161, #162)
Ubuntu ships libjpeg8 (libjpeg.so.8) while Debian sid and Fedora ship
libjpeg62-turbo (libjpeg.so.62). Building with sys-lib-libjpeg on Ubuntu
hardcodes a dependency on libjpeg.so.8, breaking startup on other distros.

Let mupdf vendor its own libjpeg (statically linked) instead.
2026-03-11 08:01:25 -06:00
vicrodh c7ab0ba129 fix: track number display for compilations and box sets (#147)
- Add filename-based track number inference as fallback when tags lack track_number
- Detect degenerate track numbering (all tracks same number) and use index fallback
- Flatten single-track-per-disc box sets into sequential numbering
- Replace fragile SELECT * with explicit column list in track queries
2026-03-10 15:08:10 -06:00
vicrodh 66595ca293 fix: use async lock in V2 cache init to prevent blocking_lock panic
init_cache_at was using blocking_lock() but is called from async
activate_session context, causing runtime panic on startup.
2026-03-10 14:43:43 -06:00
vicrodh 168cd6005c refactor: replace remaining legacy model types with V2 crate types
ResolvedMusician, MusicianConfidence, MusicianAppearances,
AlbumAppearance now imported from qbz_integrations::musicbrainz
2026-03-10 14:42:00 -06:00
vicrodh c6c48df7bb fix: migrate all V2 commands from legacy to V2 states and caches
- v2_musicbrainz_set_enabled: persist to V2 MusicBrainz cache (fixes #106)
- v2_listenbrainz_set_enabled: persist to V2 ListenBrainz cache
- v2_listenbrainz_connect/disconnect: remove legacy state dependency
- v2_listenbrainz_queue_listen/flush_queue: use V2 ListenBrainz cache
- v2_musicbrainz_get_cache_stats/clear_cache: use V2 MusicBrainz cache
- v2_remote_metadata_search/get_album: use V2 MusicBrainz client
- v2_musicbrainz_get_artist_relationships: use V2 client + V2 cache
- v2_musicbrainz_get_artist_metadata: use V2 client + V2 cache
- v2_get_discovery_artists: use V2 client
- v2_discover_artists_by_location: use V2 client + V2 cache
- v2_get_playlist_suggestions: use V2 client + V2 cache
- ArtistVectorBuilder: migrated to V2 MusicBrainz types
- session_lifecycle: deactivate_session now tears down V2 caches
- genre_normalization/location_discovery: switched to V2 types
- factory_reset: added V2 state teardown
- Legacy MusicBrainzSharedState only used in factory_reset teardown
2026-03-10 14:39:37 -06:00
vicrodh f473065c21 feat: port full MusicBrainz API to V2 crate + add cache persistence
V2 MusicBrainz client now has all methods from legacy:
- search_recording, get_artist_with_relations, get_artist_tags
- search_artists_by_tag, search_artists_by_tag_and_area
- search_release_by_barcode, search_releases_extended
- get_release_with_tracks, browse_artists_by_area
- search_area, get_area_with_relations, resolve_parent_subdivision

V2 MusicBrainz cache now has:
- Settings persistence (is_enabled/set_enabled)
- All legacy cache tables (relations, metadata, scene, qobuz_validation)
- clear_all, cleanup_expired, get_stats

V2 ListenBrainz cache adds:
- mark_listens_sent (batch), get_queue_count, clear_queue

V2 state wrappers (integrations_v2.rs) now include:
- Cache field on both MusicBrainzV2State and ListenBrainzV2State
- init_cache_at, init_from_cache, teardown methods
- ListenBrainzV2State credentials auto-persist to V2 cache

V2 models include all types from legacy (ArtistRelationships,
ArtistMetadata, LocationDiscoveryResponse, ResolvedMusician, etc.)
2026-03-10 14:14:45 -06:00
vicrodh f660f9b068 fix: reduce spacing between Home sections from 60px to 30px 2026-03-10 13:28:21 -06:00
vicrodh 2b4316655b fix: Search Albums grid overlap from mismatched card/gap dimensions
ALBUM_CARD_WIDTH 180->210 to match AlbumCard size='large' (210px).
ALBUM_GAP_X 14->22 to match CSS gap. ALBUM_CARD_HEIGHT 290->310
to fit 210px artwork + text + quality badge.
2026-03-10 13:26:22 -06:00
vicrodh 911d378be2 fix: add ARIA roles to TitleBarNav interactive divs 2026-03-10 13:08:33 -06:00
vicrodh 93f6ebec28 fix: replace monospace font with app font across UI components
Mono font only kept in Settings > Dev > Logs (LogsModal),
command blocks, and keyboard shortcut keys. All other UI
elements (durations, metadata, badges) now use --font-sans.
2026-03-10 11:37:06 -06:00
vicrodh e1086a247b fix: reduce excessive top padding across all views from 24px to 8px
Homologate top spacing in all view containers and back buttons.
Container padding-top: 24px -> 8px, back-btn margin-top: 24px -> 8px.
2026-03-10 11:33:52 -06:00
vicrodh 99d02c4477 feat: per-item titlebar nav toggles, purchases dropdown, error fix, layout tuning
- Refactor titlebar nav to per-item toggles (Discover, Favorites, Library, Purchases)
- Add Purchases dropdown with Albums/Tracks items
- Fix "Browse Library" label to "Local Library" using $t('library.title')
- Fix Purchases "TypeError: Load failed" to show friendly i18n message
- Increase titlebar height to 44px (+2px padding-top, +2px element height)
- Nav buttons 26px -> 28px, search input 28px -> 30px
- Reduce sidebar top padding from 12px to 6px
- Update height calculations for new titlebar size
2026-03-10 11:17:34 -06:00
vicrodh a288517d03 fix: Discover dropdown navigates to Home tabs instead of separate views
The Discover dropdown items (Home, Editor's Picks, For You) now
correctly navigate to the three tabs of the Home/Discover view
using navigateTo('home', tabId) instead of navigating to unrelated
discover-* view pages.
2026-03-10 10:56:39 -06:00
vicrodh 9c03a85a33 feat: add edge margin to nav buttons and show/hide window controls setting
Nav buttons get 8px padding on the edge side (matching folder spacing).
New opt-out toggle to hide window control buttons (min/max/close) for
window manager users who want the titlebar for nav and search only.
2026-03-10 10:54:50 -06:00
vicrodh 1871b0db1d feat: add navigation buttons (Discover, Favorites, Library) to titlebar
Opt-in setting (off by default) that moves Discover, Favorites, and
Local Library from the sidebar to the custom titlebar. Includes
dropdown menus for Discover and Favorites sub-items. Navigation
button position defaults to opposite of window controls but is
user-configurable. Items are hidden from sidebar when shown in
titlebar.
2026-03-10 10:36:47 -06:00
vicrodh c534ec3390 improve DailyQ/WeeklyQ error when listening history is insufficient
Show a friendly message instead of a generic API error when
the user has no recent listening history to seed suggestions.
Adds insufficientHistory i18n key to all 4 locales.

Closes #158
2026-03-10 10:20:55 -06:00
vicrodh 2249ef8969 fix: detect Chromecast track end by state transition, not idle_reason
When a track finishes on Chromecast, the media session may clear
entries entirely, returning IDLE with idle_reason=null instead of
FINISHED. Detect end-of-track by the PLAYING->IDLE transition
instead, matching the DLNA approach.
2026-03-10 10:08:43 -06:00
vicrodh 8377956cb7 catch GTK init panic and show recovery instructions 2026-03-10 08:51:15 -06:00
vicrodh 2b75c7816b chore: update flake.nix to 1.1.19 and snapcraft source-tag to v1.1.19 2026-03-10 04:17:10 -06:00
vicrodh 808529b57a fix: favorites artists alpha index now scrolls virtualized grid/list correctly 2026-03-10 04:12:00 -06:00
vicrodh ac41832a62 fix: remove unused CSS selectors and button nesting warnings in Home/ForYou tabs 2026-03-10 03:43:20 -06:00
vicrodh 60f738901e fix: add padding and shadow to app icon for Flathub guidelines compliance 2026-03-10 03:34:30 -06:00
vicrodh 863bfc6d82 fix: shorten Flathub summary to <35 chars, update 1.1.19 release notes 2026-03-10 03:28:14 -06:00
vicrodh dd8c994d01 fix: remove deprecated pulseaudio plug from snap, update codename to Limpiando la casa 2026-03-10 03:19:24 -06:00
vicrodh a3bc2cf204 docs: add Scene Discovery and Discovery Tabs to 1.1.19 release notes 2026-03-10 03:03:38 -06:00
vicrodh 71bd97fe83 add flake.nix for NixOS users
Reference Nix flake based on the nixpkgs packaging PR (#498106).
Provides package build and dev shell with all dependencies.
2026-03-10 02:56:03 -06:00
vicrodh f8bbef41aa fix tests for NixOS sandbox compatibility
- credentials: skip encryption/roundtrip tests when config dir is not
  writable (NixOS sandbox has no HOME)
- fft_processor: relax last-bar frequency assertion from 15000 to 10000
  (with 16 bars, max t=15/16 only reaches ~13kHz)

Fixes #154
2026-03-10 02:54:18 -06:00
vicrodh 2ec36934cf fix APT install instructions: add gpg --dearmor for Ubuntu/Mint compat
Fixes #153 - GPG key needs dearmoring on Ubuntu-based distros like
Linux Mint where apt doesn't handle armored keys directly.
2026-03-10 02:47:09 -06:00
vicrodh 819c1ab03e add static assets: compass icon and radio card shadow overlay 2026-03-10 01:50:27 -06:00
vicrodh 00780fd336 Merge branch 'feature/scene-discover' into pre-release 2026-03-10 01:49:51 -06:00
vicrodh e01bffd24b fix sticky header gap by removing top padding from home-view
Match ArtistDetailView pattern: zero top padding on scroll container,
padding-top moved to home-header instead. Sticky header now sits flush
at the top edge with no gap.
2026-03-10 01:49:00 -06:00
vicrodh aac2b9b76d add sticky compact header on scroll with tab navigation and genre filter
Greeting fades out on scroll, replaced by a fixed compact bar with
tab buttons and genre filter pinned to top of scroll area.
2026-03-10 01:39:51 -06:00
vicrodh 1b471675f2 homologate artist card styles in ForYouTab and add Qobuz Radio Station label
Update follow-artist-card and artist-card CSS to match HomeView's Discover
card style (210px, bg-secondary, border, 12px radius, 140px image, hover).
Add "Qobuz Radio Station" subtitle to spotlight radio card.
2026-03-10 01:37:46 -06:00
vicrodh 4a8e85b098 fix: move settings gear before genre filter for consistent positioning 2026-03-10 01:30:33 -06:00
vicrodh ffbe7474ac fix: greeting inline with header, genre filter on all tabs, enlarge filter
- Greeting back inline on the left of the header row
- Genre filter visible on all 3 tabs (shared state)
- Settings gear only on home tab
- Genre filter button enlarged to match tab bar size (13px, 7px 14px)
2026-03-10 01:30:21 -06:00
vicrodh 72700a9ee7 feat: center tab bar, tab navigation history, persist last tab
- Center button group in content area, independent of greeting
- Increase tab button size (padding 7px 16px, font 13px)
- Each tab is an independent history entry (back/forward works)
- Persist last used tab in localStorage across restarts
- Context navigation returns to correct home tab (forYou/editorPicks)
- Rename sidebar Home to Discover in all 4 locales
2026-03-10 01:29:23 -06:00
vicrodh 569e06308e fix: rename sidebar Home to Discover in all locales 2026-03-10 01:20:31 -06:00
vicrodh a97c542e3d fix: top tracks card artist image square 130px with shadow overlay 2026-03-10 01:19:08 -06:00
vicrodh 0e31723f5c fix: update sidebar compass icon to match new compass.svg 2026-03-10 01:18:23 -06:00
vicrodh 21f1b04a6f fix: spotlight card row polish
- Play button in hero now triggers top tracks (not radio)
- Spotlight actions vertically aligned
- TOP TRACKS card: artist image centered (100px circle)
- Playlist image: object-fit contain (shows full rectangular image)
- Radio card: removed "and more" subtitle
- Added nav arrows to spotlight content row
- HorizontalScrollRow items aligned to top
2026-03-10 01:17:17 -06:00
vicrodh b36f393abe feat: replace spotlight track list with card row (Top Tracks, Radio, Playlists, Albums)
Spotlight section now shows a horizontal scroll row with nav arrows:
- TOP TRACKS card: white bg, black text, loads all top tracks to queue
- RADIO card: homologated to Radio Stations style with color extraction
- Playlist cards: from artist's Qobuz playlists (if any)
- Up to 6 album cards from artist releases (albums, live, EPs)

Removes the old track list and standalone radio card layout.
2026-03-10 01:10:47 -06:00
vicrodh 667e6bb8be fix: spotlight buttons use album header action-btn-circle style 2026-03-10 00:58:43 -06:00
vicrodh 21d7bfb589 fix: replace pill-shaped follow button with rounded-corner rect 2026-03-10 00:55:11 -06:00
vicrodh f7e0c617e9 fix: remove monospace font from seekbar timers 2026-03-10 00:50:45 -06:00
vicrodh 4ff814a489 feat: radio card dark gradient, lightest-tone RADIO text, spotlight radio auto-play
- Add dark bottom gradient to radio card visual for RADIO text contrast
- Extract lightest color from album art for RADIO text, with bright white
  fallback for very dark covers (brightness < 60)
- Update handleSpotlightRadio to call startRadioPlayback for auto-play
2026-03-10 00:46:50 -06:00
vicrodh 6ed95304de fix: match Your Mixes card gap to album/radio card spacing (22px) 2026-03-10 00:37:05 -06:00
vicrodh 7d51d1991a feat: match radio card size to AlbumCard, diversify radio seeds
- Radio card now 210x210px (same as AlbumCard large), art 130x130px
- Radio stations now mix 3 recent + 3 favorites + 3 top-artist albums
  (9 total, shuffled, no duplicates) instead of mirroring recently played
- Build radio stations once when data arrives to avoid re-shuffling
2026-03-10 00:36:29 -06:00
vicrodh 172318b49d fix: radio card art to 110px, add nav arrows to scroll sections
- Reduce radio album art to 110x110px
- Wrap Radio Stations, Rediscover your Library, and Artists to Follow
  in HorizontalScrollRow for < > navigation buttons
- Remove redundant custom scroll row CSS
2026-03-10 00:30:20 -06:00
vicrodh c8cee326c2 feat: redesign Radio Station cards to match iOS reference
- Shrink album art to 114px centered within 180px card
- Extract dominant color from artwork for card background
- Add AlbumCard-style hover overlay with play button and blur
- Nicer animated spinner during radio creation
- Fix RADIO label centering with padding-left matching letter-spacing
- Remove redundant title overlay (already shown below card)
2026-03-10 00:26:42 -06:00
vicrodh e6e0b18f83 fix: start playback after radio queue creation
All three radio commands (album, artist, track) were setting the queue
but not triggering playback. Add bridge.play_index(0) after set_queue.
2026-03-10 00:26:13 -06:00
vicrodh e108b91f6b feat: replace Home icon with compass SVG in sidebar
Use the custom compass SVG provided for the sidebar navigation icon,
replacing the lucide Home icon. Uses fill=currentColor for theme support.
2026-03-10 00:08:48 -06:00
vicrodh 9780948ca8 feat: add Essentials [Genre] section to For You tab
Add v2_reco_get_top_genres command that queries the user's most-played
genres from reco_events. Frontend loads top genre and fetches
ideal-discography featured albums filtered by that genre.
2026-03-10 00:05:25 -06:00
vicrodh ff109e5c64 feat: add Similar to and Rediscover your Library sections to For You tab
Wire v2_get_album_suggestions and v2_reco_get_forgotten_favorites backend
commands into ForYouTab. Similar to picks a random recent album as seed.
Rediscover shows favorites not played in the last 30 days.
2026-03-09 23:52:53 -06:00
vicrodh b34b809ad5 feat: add album suggestions and forgotten favorites backend commands
Add v2_get_album_suggestions (album/suggest endpoint with blacklist filtering)
and v2_reco_get_forgotten_favorites (favorites not played in N days) for the
For You tab's Similar to and Rediscover your Library sections.
2026-03-09 23:50:45 -06:00
vicrodh 61b1bba8d9 feat: add Artists to Follow and Spotlight sections to For You tab
Artists to Follow: fetches similar artists from user's top artists,
filters out already-followed, shows circular images with Follow button
that triggers toggleArtistFavorite.

Spotlight: picks random top artist, loads artist page data, shows
hero image with play/profile buttons, top 5 tracks, and artist radio
card with shadow overlay.
2026-03-09 23:40:24 -06:00
vicrodh 35c4d5a435 feat: implement For You tab Phase 1 with mixes, radio, and reused sections
Create ForYouTab.svelte component with:
- Your Mixes (DailyQ, WeeklyQ, FavQ, TopQ)
- Radio Stations from recent albums with shadow overlay
- Continue Listening tracks
- Recently Played albums
- Your Top Artists
- Favorite Albums

Add i18n keys for all For You sections in 4 locales.
Wire ForYouTab into HomeView replacing placeholder.
2026-03-09 23:31:43 -06:00
vicrodh 93e2955dfa fix: use correct i18n keys for tab button labels
Tab buttons were using home.editorPicks ("Albums of the Week") and
home.forYou (missing key) instead of home.tabEditorPicks and
home.tabForYou.
2026-03-09 23:00:52 -06:00
vicrodh 5e71fbc9ed feat: implement Editor's Picks tab with editorial content sections
Shows newReleases, editorPicks, qobuzissimes, pressAwards, mostStreamed,
essentialDiscography, and qobuzPlaylists in fixed order without home
customization controls. Removed isSectionVisible guards from data
fetching so editorial data is always available across tabs.
2026-03-09 22:56:43 -06:00
vicrodh 34be0aa323 feat: add Home/Editor's Picks/For You tab navigation to HomeView
Add tab button group inline with greeting header. Existing home content
shows only on Home tab. Editor's Picks and For You tabs have placeholders.
i18n keys added to all 4 locales.
2026-03-09 22:50:41 -06:00
vicrodh af4c0655cf fix: apply custom artist images in ArtistsByLocationView and FavoritesView ungrouped grid
- ArtistsByLocationView: resolve custom images via resolveArtistImage in candidatesToFavoriteArtists
- FavoritesView: ungrouped grid was missing withCustomImages wrapper
2026-03-09 21:49:04 -06:00
vicrodh 93d4c34b87 fix: reduce vertical gap between artist rows from 22px to 11px 2026-03-09 21:43:47 -06:00
vicrodh 0ee16c6652 fix: remove load-more counter since genre filter makes counts inaccurate 2026-03-09 21:43:00 -06:00
vicrodh 4536e4e5d2 feat: overhaul ArtistsByLocationView - hero/compact header, genre popup, albums count, inline load-more
- Hero header (140px flag) scrolls with content, compact sticky header appears on scroll-past
- Genre filter popup matches GenreFilterPopup style: dark cards, check-circles, title bar, clear footer
- Add qobuz_albums_count to LocationCandidate and display on artist cards
- Move load-more from fixed bottom to inline footer inside virtual scroll
- Add header/footer snippet props and scroll-past detection to VirtualizedFavoritesArtistGrid
- Increase CARD_HEIGHT from 230 to 250 to accommodate albums count line
2026-03-09 21:25:22 -06:00
vicrodh 878e0341ba fix: remove duplicate titlebar double-click maximize handler
The titlebar has -webkit-app-region: drag which natively handles
double-click-to-maximize via Tauri. The JS ondblclick handler was
firing in addition to the native one, causing maximize then
immediate restore.
2026-03-09 20:55:02 -06:00
vicrodh 23f4373962 fix: add title tooltip to truncated artist names in favorites grid 2026-03-09 20:12:39 -06:00
vicrodh c229631390 fix: favorites album grid overlap and artist grid spacing
Remove flex-wrap from album grid rows (virtualizer handles row
splitting). Increase artist card height to 230px to prevent row
overlap, truncate artist names to single line with ellipsis.
2026-03-09 20:11:33 -06:00
vicrodh 4b6978048c feat: adjust card sizes to 210px and gaps to 22px 2026-03-09 20:01:59 -06:00
vicrodh 2552fb6fd8 feat: increase album card size from 180px to 200px
Update AlbumCard large from 180->200, standard from 162->180.
Increase grid gaps from 14px to 20px across all views.
Update all skeleton/placeholder sizes and virtualized grid constants.
2026-03-09 19:55:22 -06:00
vicrodh 8eb055d06e fix: use 230px images for album cards instead of 600px
Prioritize image.small (230px) over image.large (600px) for all
AlbumCard artwork and queue track thumbnails. Hero/detail views
retain 600px via getQobuzImageForSize(image, 'large').
2026-03-09 19:51:31 -06:00
vicrodh 12fec1979f feat: re-enable all scene discovery caches
- Metadata cache (artist location/genres, 30-day TTL)
- Scene cache (full discovery response for first page, 30-day TTL)
- Qobuz validation cache (per-artist name match, 30-day TTL)

Second visit to same scene loads instantly from cache.
2026-03-09 19:15:14 -06:00
vicrodh 6fb141f2ff feat: inline progress bar for load-more in scene discovery
When loading more results, the button is replaced by a compact
progress bar with percentage, reusing the same backend progress
events as the initial load.
2026-03-09 17:35:51 -06:00
vicrodh faa68d1079 feat: real progress bar and improved loading state for scene discovery
Backend emits 'scene-discovery-progress' events with phase, progress
percentage, and detail. Frontend listens and shows a real progress bar
(0-40% MB search, 40-95% Qobuz validation, 100% done).

Loading state: hides header, cycles icons (Music/Globe/Network) at
1.5s intervals in a 96px pulse circle, shows progress bar with
percentage text.
2026-03-09 17:29:14 -06:00