Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh cf2447f4b2 fix(qconnect): stop deriving remote shuffle locally
cx
2026-03-13 23:07:22 -06:00
vicrodh af7652c86b fix(qconnect): wait for authoritative shuffle queue
cx
2026-03-13 22:54:27 -06:00
vicrodh 19b4182dd6 fix(qconnect): render connect queue in remote shuffle order
cx
2026-03-13 22:45:56 -06:00
vicrodh 4312bf0524 fix(qconnect): refresh queue store from backend events
cx
2026-03-13 20:51:44 -06:00
vicrodh 1fc7a0a1a3 fix(qconnect): materialize remote shuffle atomically
cx
2026-03-13 20:43:56 -06:00
vicrodh b28fd39737 fix(qconnect): trust remote shuffle order
cx
2026-03-13 20:35:56 -06:00
vicrodh 09c6d8f1f8 fix(qconnect): route shuffle and repeat through runtime
cx
2026-03-13 20:28:11 -06:00
vicrodh 2efa1b0809 fix(qconnect): route clear queue through runtime
cx
2026-03-13 20:00:57 -06:00
vicrodh f72a4db7be chore(qconnect): checkpoint stable handoff state
cx
2026-03-13 19:52:12 -06:00
vicrodh d3d0fe491a fix(qconnect): stream local handoff playback
cx
2026-03-13 18:52:30 -06:00
vicrodh f18bd10aa4 fix(qconnect): complete active-renderer pending on session ack
cx
2026-03-13 18:50:04 -06:00
vicrodh 0a9064aa24 fix(qconnect): keep local renderer queue ids in interval reports
cx
2026-03-13 17:38:52 -06:00
vicrodh de29f1e2e0 chore(qconnect): checkpoint current poc state
cx
2026-03-13 17:28:05 -06:00
vicrodh 6d20360dc3 fix(qconnect): prefer session cursor for active renderer snapshot
cx
2026-03-13 15:07:50 -06:00
vicrodh fcadb85e65 fix(qconnect): unblock rapid transport controls and stop local audio on handoff
cx
2026-03-13 13:19:53 -06:00
vicrodh 017aa9a6b1 fix(qconnect): sync remote renderer into qbz ui
cx
2026-03-13 12:51:33 -06:00
vicrodh 65a0d523bb fix(qconnect): track active remote renderer state for skip and seekbar
cx
2026-03-13 11:55:48 -06:00
vicrodh 4098c18d89 fix(qconnect): clear pending active-renderer action on ack
cx
2026-03-13 11:08:28 -06:00
vicrodh 0da98aab8c fix(qconnect): hand off queue-start playback to remote renderer
cx
2026-03-13 10:45:37 -06:00
vicrodh 145974c292 fix(qconnect): harden renderer handoff identity
cx
2026-03-13 10:20:54 -06:00
vicrodh 3c688f129e fix(qconnect): backendize remote skip handoff
cx
2026-03-13 09:59:19 -06:00
vicrodh 4629e776f1 fix(qconnect): hand off play toggle to active renderer
cx
2026-03-12 23:49:33 -06:00
vicrodh c83aedac75 fix(qconnect): align renderer state with official queue semantics
cx
2026-03-12 23:10:31 -06:00
vicrodh e748ab6616 fix(qconnect): treat omitted cloud queue ids as zero
cx
2026-03-12 20:56:56 -06:00
vicrodh 6cdacd0c29 fix(qconnect): report queue drift after inserts
cx
2026-03-12 20:33:42 -06:00
vicrodh a46c5a016f fix(qconnect): anchor play next to local current track
cx
2026-03-12 20:17:02 -06:00
vicrodh 1d28730456 fix(qconnect): report resolved queue ids on track transitions
cx
2026-03-12 20:06:20 -06:00
vicrodh a2c4017607 fix(qconnect): treat remote queue tracks as qobuz playback
cx
2026-03-12 19:48:17 -06:00
vicrodh d3c2d4c6ca fix(qconnect): align queue load payload and inbound diagnostics
cx
2026-03-12 19:31:27 -06:00
vicrodh 2d643a9bfa fix(qconnect): suppress stale renderer drift during queue loads
cx
2026-03-12 17:45:09 -06:00
vicrodh bb110f3654 fix(qconnect): unify queue replacement through shared helper
cx
2026-03-12 17:36:18 -06:00
vicrodh 674fff996b refactor(qconnect): extract runtime helpers from page\n\ncx 2026-03-12 17:21:50 -06:00
vicrodh c026fce2ca fix(qconnect): avoid stale local report drift
cx
2026-03-12 17:08:18 -06:00
vicrodh 5cb4574e37 fix(qconnect): instrument runtime and anchor play next
cx
2026-03-12 15:54:52 -06:00
vicrodh 441b74ac91 test(qconnect): lock seekbar workaround behavior
cx
2026-03-12 15:32:49 -06:00
vicrodh 02155f54fe merge(pre-release): sync qconnect-poc-v3 with latest local integration state
cx
2026-03-12 15:23:32 -06:00
vicrodh 104e38e630 fix(nav): Discover menu items now navigate to correct home tab
navigateTo() was passing the tab id to the navigation store but never
setting the local homeTab state that HomeView reads. Editor's Picks
and For You always landed on Tab-Home.
2026-03-12 15:06:57 -06:00
vicrodh ee0f8034e1 chore: add test-results to gitignore 2026-03-12 14:16:59 -06:00
vicrodh d0a39770e3 fix(linebed): rebalance spectral terrain mapping
cx
2026-03-12 14:08:05 -06:00
vicrodh 72ce0946d9 fix(spectral-ribbon): update FFT label to 4096 in stream info header 2026-03-12 13:05:53 -06:00
vicrodh 12c6e2e47b fix(spectral-ribbon): update NUM_BANDS 190 → 512 to match backend
Backend now sends 512 spectral bands (from 4096-point FFT).
SpectralRibbon was still expecting 190, causing the length check
to fail and silently discard all spectral data.
2026-03-12 13:03:15 -06:00
vicrodh 4268e6a39f feat(linebed): add FPS control to settings, default 60fps
Add linebed to the per-panel FPS settings dropdown in Settings.
Add per-panel default override system to fpsConfig so linebed
defaults to 60fps while other panels stay at 15fps.
Translations already existed in all 5 locale files.
2026-03-12 12:59:24 -06:00
vicrodh 93b7e4ab7f fix(linebed): wider trapezoid base, narrower top
Back width 48% → 32%, front width 72% → 88%. More pronounced
trapezoid shape with wider bottom area as requested.
2026-03-12 12:56:12 -06:00
vicrodh 2432c606b0 fix(linebed): tall rectangle perspective, 200 lines top to bottom
Terrain extends vertically from 12% to 88% of canvas height (76%
spread). Width contained: back 48%, front 72%. 200 lines fill
the tall rectangle with visible spacing between them.
2026-03-12 12:54:47 -06:00
vicrodh 06e868db5d fix(linebed): high viewpoint, crop treble, shorter peaks
Three issues from user feedback:

1. Right side empty: 512 log bands span 20Hz-20kHz but musicvid only
   goes to ~1752Hz. Now display first 350 bands (~3.5kHz), cutting
   the dead treble zone that wasted 60% of visual width.

2. Viewpoint too low: terrain vertical spread reduced to 33% of height
   (was 54%), centered on canvas. This simulates a much higher camera
   looking down at the table rather than crouching at table level.

3. Mountains too tall: maxAmplitude 0.35 → 0.18. Peaks should be
   modest bumps on the terrain surface, not towering spikes.

Also reduced to 150 lines for more visible spacing between them.
2026-03-12 12:50:17 -06:00
vicrodh 20c2abadcf fix(linebed): table perspective, visible back edge, distributed peaks
User feedback with annotated screenshot identified three issues:

1. Perspective (red): Was infinite conveyor belt (back 20%, front 105%).
   Now table shape: back 50%, front 82%, contained within canvas.

2. Peak distribution (green): Exponential 6/3 with per-frame normalization
   crushed everything except loudest bin. Reduced to 3.5/1.8 so moderate
   peaks stay visible across the full spectrum width.

3. Back edge (blue): Opacity faded to 0.06 at back, hiding where lines
   begin. Now 0.45 minimum — all lines clearly visible including back edge.

Also: thinner uniform lines, moderate amplitude (0.35 vs 0.55).
2026-03-12 12:42:47 -06:00
vicrodh 31311eec25 feat(linebed): 200 lines at 60fps for 3D mountain depth
The 3D mountain effect in musicvid comes from many temporally-close
lines stacking in perspective. At 15fps with 120 lines, adjacent lines
differed too much — no "body" to the mountains.

- NUM_LINES 120 → 200 (match musicvid)
- Remove frame throttle, render at full rAF rate (~60fps)
  so adjacent lines are ~17ms apart, creating solid ridges
- Perspective: backY 0.25, frontY 0.98, depth power 1.8
  packs back lines tightly (2-3px apart) for solid terrain surface
2026-03-12 12:34:16 -06:00
vicrodh d4fa3cd28f feat(linebed): 4096-point FFT, 512 bands, linear scaling
Backend:
- FFT size 1024 → 4096 (10.7 Hz bin resolution vs 43 Hz before)
- Spectral bands 190 → 512 (closer to musicvid's 1024)
- Remove pow(0.55) compression, use linear scaling (rms * 25)
  so frontend exponential transform has full dynamic range
- Reduce temporal smoothing 0.80 → 0.30 for responsive peaks

Frontend:
- Remove power-law redistribution (backend bands already log-scaled,
  was applying double perceptual weighting causing uniform plateaus)
- Restore 9-point 3-pass smoothing (now proportional: 9/512 = 1.76%
  vs musicvid's 9/1024 = 0.88%)
- NUM_BANDS matches new backend count (512)
2026-03-12 12:27:40 -06:00
vicrodh f7521e7fd1 fix(linebed): scale smoothing and power-law for 190-bin resolution
musicvid.org uses 1024 visual bins from 647 FFT bins — 5.4x our
resolution. The 9-point 3-pass smoothing spread each peak to ~25 bins
(13% of our width), creating fat mountains. And power-law 2.5 stretched
33 bass bins to 50% width, creating uniform plateaus the exponential
can't sharpen.

Fix: smoothing 5-point 2-pass (peaks spread ~9 bins = 4.7% width),
power-law 1.5 (67 bass bins to 50% width, more frequency diversity).
2026-03-12 12:21:39 -06:00
vicrodh a1a67160c8 feat(linebed): match musicvid.org spectrum pipeline and perspective
Complete rewrite of spectrum processing to match musicvid.org settings:
- Variable exponential transform (exponents 3-6 across spectrum) replaces
  flat 0.8 exponent. This crushes low values and preserves only peaks,
  creating sharp spikes instead of fat mountains.
- Normalize spectrum to [0,1] before exponential (required for correctness)
- Head margin transform (7 bins, weight 0.7, decay 1.6) replaces edge taper
- Temporal smoothing matched to 0.03 (was 0.05)
- Steeper perspective angle: backY 0.12, depth power 1.35 (was 1.7),
  maxAmplitude 0.55 (was 0.45) for more top-down viewing
2026-03-12 12:15:28 -06:00
vicrodh 2b7763c4b6 feat(linebed): add power-law frequency redistribution and edge tapering
Implement transformToVisualBins() with power 2.5 exponent from
musicvid.org to spread bass energy across full visual width instead
of clustering in the first ~30 bins. Add edge tapering (10 bands)
to eliminate staircase/square artifact at spectrum boundaries.
2026-03-12 12:03:09 -06:00
vicrodh 817c9363c4 fix(linebed): centered perspective, 120 lines, responsive peaks
Based on frame analysis of musicvid.org's actual LineBed rendering:
- Revert isometric angle to centered symmetric trapezoid perspective
  (vanishing point at center-top, NOT upper-right offset)
- Increase to 120 lines for denser terrain surface
- Lower temporal smoothing from 0.35 to 0.05 (musicvid uses 0.03)
  for much more responsive, detailed peaks
- Push snapshots every frame instead of every 2nd for fluid scroll
- Wider front lines (110% canvas width) for edge-to-edge coverage
- Higher amplitude (0.45 * height) for dramatic mountain peaks
2026-03-12 11:48:39 -06:00
vicrodh e68425c45a feat(linebed): isometric perspective matching musicvid.org camera angle
Replace centered symmetric perspective with angled isometric view:
- Vanishing point at upper-right (75%, 8%) matching camera(-80,150,-10)
- Lines converge from lower-left toward upper-right vanishing point
- Front line extends beyond left edge for full-width coverage
- Non-linear depth curve (pow 1.8) for realistic compression
- Eliminates the "square" artifact from symmetric convergence
2026-03-12 11:41:09 -06:00
vicrodh 1380ca93d8 fix(linebed): reverse data flow direction to match musicvid.org
New spectrum data now appears at the BACK (top/horizon) and scrolls
toward the FRONT (bottom/viewer), creating the "audio flowing from
far away toward you" effect. Previously data flowed bottom-to-top
which looked like the terrain was moving away from the viewer.

Also slightly increased amplitude scaling for more dramatic peaks.
2026-03-12 11:36:59 -06:00
vicrodh 8cc04c2730 improve linebed visualizer: denser terrain, full spectrum, musicvid.org processing
- Increase to 80 lines (from 35) for denser terrain appearance
- Use all 190 spectral bands instead of subsampling every 2nd
- Add 3-pass 9-point moving average smoothing (musicvid.org algorithm)
- Add exponential transform (pow 0.8) for peak emphasis
- Non-linear perspective compression (pow 1.6) for depth effect
- Widen canvas coverage (95% front, 18% back)
- Increase amplitude scaling (0.4x bed height)
- Extract buildSpectrumPath() to eliminate duplicated path code
2026-03-12 11:17:43 -06:00
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