Commit Graph
212 Commits
Author SHA1 Message Date
vicrodh 527d63ca2c fix: migrate log upload from 0x0.st to dpaste.org
0x0.st disabled uploads. Switch to dpaste.org with 15-day expiry.
Use form POST instead of multipart, update all 5 locale files.

cc
2026-03-31 16:43:28 -06:00
victorrhgap 38258ec99e fix(i18n): post-merge corrections for PR #226
- Fix French text leaked into en.json (actions.radio.startArtistRadio)
- Fix capitalized key "Mono" -> "mono" in en/es/fr (matched source code)
- Translate missing refreshMetadata in es.json
- Translate missing showActiveAlbums in fr.json
- Fix typo "Artistas anterior" -> "Artistas anteriores" in es.json
- Add all new PR #226 keys to de.json and pt.json

cc
2026-03-30 13:21:26 -06:00
victorrhgap 904502c57c feat(ui): add degraded service indicator for Qobuz server issues
Track 504/server errors and show orange warning triangle in
NowPlayingBar when Qobuz is having issues. Auto-clears after
10 minutes without errors. Shows status in Settings too.

cc
2026-03-25 16:54:04 -06:00
victorrhgap cf2df33bc4 feat(offline): add manual network check button
Make NowPlayingBar offline indicator clickable to force immediate
network check. Add Check Now button in Settings offline section.

cc
2026-03-25 16:46:53 -06:00
victorrhgap 283302f6d2 feat(i18n): add quality fallback modal and settings translations
All 5 locales: en, es, de, fr, pt.

cc
2026-03-25 15:22:58 -06:00
victorrhgap da32afffee Merge pull request #208 from GwendalBeaumont/refactor/external/i18n-interpolation
refactor(i18n): replace hardcoded strings in SearchView, PlaylistDetailView, AlbumMenu

cc
2026-03-25 13:08:09 -06:00
victorrhgap b826f88fad feat(hifi-wizard): non-systemd support and verify step fix
- Add Gentoo/OpenRC and Void/runit to distro selector
- All systemctl commands now adapt to selected distro init system
- Verify step warns user to close wizard before testing
- Status/restart/rollback commands are distro-aware

cc
2026-03-24 18:48:41 -06:00
victorrhgap 7f952b11ac feat: add system diagnostics panel to Developer Mode
Tabular view comparing saved vs runtime settings for audio,
graphics, and environment variables. Collapsible sections with
match/mismatch indicators and export to clipboard.

cc
2026-03-24 17:55:35 -06:00
Gwendal Beaumont 38f4d20c6c refactor(SearchView): replace hard-coded strings 2026-03-24 09:22:02 +01:00
vicrodh fb74f318a1 fix: restore offline mode — use last known user profile
Three bugs prevented offline mode from working after V2 migration:

1. activate_offline_session used user_id=0 (empty profile) instead of
   the last known user_id, so the user's library/settings were invisible

2. setManualOffline was called BEFORE activate_offline_session, but it
   requires the offline store to be initialized (which happens during
   session activation). Reordered: activate session first, then set
   manual offline.

3. LoginView called setManualOffline directly instead of delegating to
   the parent's handleStartOffline which has the correct order.

Also added "noPreviousSession" i18n message for users who never logged
in — they need to create a profile first before offline mode works.

cc
2026-03-21 11:01:25 -06:00
vicrodh 9cdd1521b9 feat: add no-telemetry note to MusicBrainz integration description
MusicBrainz is a one-way pull — QBZ fetches public data but never
sends user data back. Added this clarification to the help text in
all 5 locales and to the wiki Integrations page.

cc
2026-03-19 14:13:00 -06:00
vicrodh a985be3134 feat: add Documentation link to sidebar gear menu
Opens https://github.com/vicrodh/qbz/wiki in browser.
Also updated Report Issue URL to use .yml template.

cc
2026-03-19 14:09:26 -06:00
vicrodh 50b9ecb85e feat: add (?) help tooltips to bit-perfect audio settings (#166)
Exclusive Mode, DAC Passthrough, and Force Bit-Perfect now have (?)
help icons that show detailed explanations on hover:
- What backend each setting requires (ALSA Direct vs PipeWire)
- What PipeWire properties they affect (clock.force-rate, quantum)
- How they relate to each other (dependency chain)
- What happens without them (resampling to default rate)

i18n help texts added to all 5 locales.

cc
2026-03-19 12:53:04 -06:00
vicrodh 697c31053b feat: add Favorites/Following sub-tabs in Favorites > Playlists (#172)
Separates playlists into two sub-tabs:
- Favorites: playlists marked with the heart icon (local QBZ feature)
- Following: playlists subscribed on Qobuz (owner.id != current user)

The Following tab shows playlists from getUserPlaylists where the
owner is not the current user, matching Qobuz's subscription model.

i18n keys added to all 5 locales.

cc
2026-03-19 12:00:08 -06:00
vicrodh 1ad16338fa feat: add Qobuz playlist follow/unfollow (#172)
Discovered undocumented Qobuz API endpoints from bundle analysis:
- POST /playlist/subscribe { playlist_id }
- POST /playlist/unsubscribe { playlist_id }

This is the native "follow playlist" feature that syncs across all
Qobuz clients, separate from QBZ's existing "Copy to Library" (local
copy) and "Favorite" (local flag) features.

Added:
- subscribe_playlist/unsubscribe_playlist in both qbz-qobuz and legacy client
- v2_qobuz_subscribe_playlist / v2_qobuz_unsubscribe_playlist commands
- Bookmark toggle button in PlaylistDetailView (next to Copy button)
- i18n keys in all 5 locales

cc
2026-03-19 11:36:56 -06:00
vicrodh 8a8c709c1b feat: lock volume at 100% when ALSA Direct hw: is active
With ALSA Direct hw: there is no software mixer — volume must be
controlled at the DAC/hardware level. Software volume attenuation
would reduce bit depth and defeat the purpose of bit-perfect playback.

Backend: v2_set_volume forces volume to 1.0 when backend=Alsa+plugin=Hw
Frontend: volume slider disabled (grayed out at 100%), mute/step buttons
hidden, handleVolumeChange and handleToggleMute return early.
Settings callbacks notify +page.svelte when backend/plugin changes to
update the lock state in real-time.

i18n: volumeLockedHw tooltip added to all 5 locales.

cc
2026-03-19 00:10:59 -06:00
vicrodh bf91822b4d feat: add QConnect dev toggle and device name settings
Developer Mode: toggle to show/hide QConnect dev panel button in
the player bar (hidden by default, persisted in localStorage).

Integrations: editable device name input for Qobuz Connect with
default "Qbz - {hostname}". Backend commands v2_qconnect_get/set
_device_name and v2_get_hostname. Custom name is used during the
WS bootstrap handshake.

cc
2026-03-18 21:31:11 -06:00
vicrodh 2953b86062 feat: add QconnectBadge as full-height badge in song card
Place QConnect badge as direct child of badges-group with 3px gap
matching DAC/EXC spacing. Two-row vertical layout: icon on top,
Qobuz/Connect text below. Wire props from +page.svelte to both
NowPlayingBar instances. Add qconnect i18n keys to de/fr/pt locales.

cc
2026-03-18 21:03:56 -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 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 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 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 569e06308e fix: rename sidebar Home to Discover in all locales 2026-03-10 01:20:31 -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 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 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 b20f5cd20e feat: show resolved subdivision in artist sidebar instead of birth city
Resolve city to top-level subdivision at metadata time so the artist
sidebar shows "United Kingdom, England" instead of "United Kingdom,
Brixton". Label changed from "Born in"/"Founded in" to "From" to
match the broader regional context of scene discovery.
2026-03-09 13:36:17 -06:00
vicrodh 694fd8dd9b feat: rewrite discovery to use genre+area Lucene search instead of blind browse
The browse API returns ALL artists from an area alphabetically with no
genre filtering. For LA that's 15K+ random artists. Now we search
tag:"thrash metal" AND beginarea:"Los Angeles" for each genre, giving
genre-relevant results directly from MusicBrainz.

Also adds dynamic loading messages that cycle through discovery steps
and temporarily disables all scene/validation caching for tuning.
2026-03-09 12:55:17 -06:00
vicrodh 4fc012e21c feat: add origin section to ArtistNetwork sidebar
Shows Founded/Born date and Founded in/Born in location from
MusicBrainz metadata. Location is a clickable link that will
navigate to the artistsByLocation scene discovery view.

Metadata fetched in parallel with relationships, cached 30 days.
Section hidden when MusicBrainz is disabled. Translations added
for en, es, de, fr.
2026-03-09 12:11:34 -06:00
vicrodh a07ee71090 feat: tag-scoped thumbs down for discovery recommendations
Add dismissal system for "You May Also Like" discovery artists. Dismissals
are scoped to the genre tag used for the search, so dismissing AC/DC from
electronic recommendations won't affect metal recommendations.

- New discovery_dismissals table in reco DB (tag + normalized artist name)
- v2_dismiss_discovery_artist command persists dismissal per tag
- Discovery pipeline filters dismissed artists for both primary and secondary tags
- Backend returns 8 results (frontend shows 6, keeps 2 reserves)
- Thumbs-down button appears on hover, instantly replaces with reserve
- Returns primaryTag in DiscoveryResponse for frontend dismiss context
2026-03-08 22:49:06 -06:00
vicrodh e13fa48707 feat(immersive): show modal on performance auto-degrade with dismiss option
Replace toast notification with a proper modal dialog when the
performance watchdog degrades background mode. Modal includes a
"Don't show again" checkbox that persists to localStorage.

Threshold: < 15 FPS sustained for 5 seconds (after 3s warmup).
User can always re-enable effects from Settings > Appearance.
2026-03-08 21:55:10 -06:00
vicrodh a029f30fa5 feat: show similarity percentage in discovery artists sidebar
Display similarity score next to each discovery artist name. Update
DiscoveryArtist interface with similarityPercent field. Add i18n keys
for youMayAlsoLike section and sidebar layout improvements.
2026-03-08 15:47:33 -06:00
vicrodh 6b87554dbb feat: frontend image cache with size-aware loading and settings UI
- getQobuzImageForSize(): picks small (230px) for grids, large for hero
- cachedSrc Svelte action: resolves images through backend disk cache
- imageCacheService: in-memory URL map with dedup for pending requests
- AlbumCard uses cachedSrc action for artwork rendering
- Settings UI: Toggle for cache on/off, numeric input for max size (MB),
  stats display, clear button — uses existing Toggle and input styles
- Removed unused Artwork Thumbnails section (never showed data)
- i18n: added image cache keys to all 4 locales (en/es/de/fr)
2026-03-08 10:52:35 -06:00
vicrodh 6685566091 feat(label): add group-by-artist toggle and performance improvements
Add artist grouping option for Label Releases view and remove
expensive loadAllAlbums() call. Use v2_get_label_page for richer
label image data. Add groupByArtist i18n keys to all 4 locales.
2026-03-06 08:48:36 -06:00
vicrodh 4e6a52e453 feat(label): redesign Label Releases view with logo, sorting, and filters
- Replace generic icon with circular label logo (matches LabelView)
- Fix double close button in search: single X that clears and closes
- Add sort options: newest, oldest, title A-Z/Z-A, artist A-Z
- Add Hi-Res filter toggle
- Load all albums automatically when sorting/filtering
- i18n: add labelReleases keys to all 4 locales
- Search bar now replaces title area instead of floating separately

API analysis: Qobuz label endpoints have no server-side sort/filter
params, so all sorting and filtering is done client-side after
paginated fetch.
2026-03-05 14:33:42 -06:00
vicrodh 97f42f4fea fix(settings): remove gapless restrictions for DAC Passthrough and ALSA Direct
Gapless now works on all backends, so the UI constraints that disabled
it for DAC Passthrough and ALSA Direct are removed. Only streaming-only
mode still disables gapless (no cache available). Removed experimental
badge. Cleaned up unused i18n keys.
2026-03-05 12:20:15 -06:00
vicrodh 43df8a40e4 fix(purchases): restructure download paths to Artist/Album [FORMAT][Quality]/track
Embeds quality in album folder name instead of subfolder, so each
quality variant appears as a separate album in the local library.
Adds download error toast and fixes format labels to bracket notation.
Closes #116
2026-03-05 11:12:39 -06:00
vicrodh b15a375e23 feat(immersive): add 3-mode background system (Full/Lite/Off)
Replace binary blur toggle with a 3-option dropdown. Full mode uses
the existing WebGL2 shader, Lite mode renders a pre-blurred static
image animated with CSS transforms (compositor-driven, immune to
Wayland frame callback stutter), and Off mode shows a solid color.

Includes config migration from disableBlurBackground to backgroundMode,
updated composition profiles, and i18n for all 4 locales.

Closes #127
2026-03-02 13:18:55 -06:00
vicrodh 00675de6b8 feat(snap): add snap sandbox detection and welcome modal wiring
Detect when QBZ runs inside a Snap sandbox (via SNAP env var) and show
a one-time welcome modal with required plug connection commands. Adds a
Snap Sandbox section in Settings with copyable commands, mirroring the
existing Flatpak pattern.

Backend: snap.rs module, DB table snap_welcome_shown, V2 commands.
Frontend: updatesService, +page.svelte modal queue, SettingsView section.
2026-03-02 11:10:50 -06:00
vicrodh 5492e8115e feat(immersive): refine neon and tunnel panel visuals
cx
2026-03-02 00:50:45 -06:00
vicrodh c2f2888312 feat: add cancel button for purchase album downloads
Allow users to cancel an in-progress album download. The current track
finishes but no further tracks are started. A cancel button appears in
the progress bar during download, and a cancelled state shows how many
tracks completed. Closes #133.
2026-03-01 14:14:47 -06:00
vicrodh 976e5226b4 feat: add miniplayer keyboard shortcuts and fix X button behavior
Add Shift+M toggle shortcut for mini player mode (main and mini window).
Add 1-5 number keys for surface switching (micro/compact/artwork/queue/lyrics)
in mini player context. Add playback shortcuts (Space, Ctrl+Arrow) to mini
player window. Fix X button to close app (or hide to tray) instead of
duplicating the Expand button behavior. Closes #134.
2026-03-01 14:04:18 -06:00
vicrodh ef48cd5936 refactor: move immersive settings to end of Appearance section
Group immersive-related settings under a new "Immersive" subsection
at the bottom of Settings > Appearance, in order:
1. Immersive Default View
2. Composition (collapsible)
3. Disable Blur Background
4. Animation Frame Rate (collapsible)

Also fix chevron alignment in collapsible sections to be right-aligned
(justify-content: space-between) and clean up unused CSS classes.
2026-03-01 13:03:12 -06:00
vicrodh c518cffe30 fix: align immersive settings with standard collapsible pattern
- Replace raw checkbox with Toggle component for blur background
- Use composition-subsection class for FPS section (adds top border)
- Use composition-title class for consistent 14px font size
- Move desc to section-note inside expanded content
- Add summary key for inline collapsed text
- Shorten title from "Immersive Animation Frame Rate" to
  "Animation Frame Rate"
2026-03-01 12:46:18 -06:00
vicrodh d509c30979 feat: update composition profiles with GSK renderer and blur toggle
Add gskRenderer and disableBlurBackground fields to CompositionProfile.
Update existing profiles: Xwayland Performance now disables blur.
Add new Max Performance profile (Cairo software renderer + blur off)
for maximum compatibility on stutter-affected systems.

Profile matching and apply logic now includes all new fields.

Part of #127.
2026-03-01 12:39:47 -06:00
vicrodh 09b1ee0d72 feat: add option to disable immersive blur background
When enabled, replaces the expensive blurred album artwork background
with a solid dark color extracted from the artwork at tiny resolution.
Significantly reduces GPU load and fixes stutter on affected systems.

Setting is stored in localStorage (same as FPS settings) and applies
on next immersive mode entry.

Part of #127.
2026-03-01 12:34:46 -06:00
vicrodh 58ad252798 feat: add GSK_RENDERER control for GTK4 rendering backend
Add gsk_renderer field to graphics settings DB with UI dropdown
(Auto/GL/NGL/Vulkan/Cairo). Value is read at startup and set as
GSK_RENDERER env var. Env var override takes precedence. Also
included in --reset-graphics and reset now restores hw_accel to true.

Part of #127.
2026-03-01 12:30:41 -06:00
vicrodh 37df510994 feat: add quality-adjusted tooltip case for hardware compatibility
When QBZ adjusts quality for device compatibility (e.g. requesting
Hi-Res instead of Ultra Hi-Res because the DAC doesn't support
176.4kHz), show a blue info tooltip instead of the yellow "Resampled
by system" warning. The new message clarifies that playback is
bit-perfect with no resampling — QBZ simply requested a compatible
quality from the source.

Two distinct tooltip cases:
- Yellow: "Resampled by system" (PipeWire/system is resampling)
- Blue: "Quality adjusted for device compatibility" (QBZ chose lower
  quality, hardware plays natively)
2026-02-28 07:48:03 -06:00