- Allow dead_code on TokenValidationResponse.code (deserialized but not read)
- Remove unused MusicProvider import in commands_v2.rs
- Restore #[allow(non_snake_case)] on v2_plex_cache_get_tracks
- Replace drop(tokens) with let _ = tokens (drop on reference is no-op)
Shuffle favorite artists randomly so all get a fair chance (was
deterministic, first artist dominated). Cap at 2 albums per artist.
Shuffle final results for variety on each load.
Add #[allow(non_snake_case)] to V2 command functions and structs that
use camelCase parameter names for Tauri frontend compatibility.
Renaming to snake_case would break the frontend-backend contract.
Previously, the section displayed the user's own favorite albums — the
same albums they had already marked as favorites. Now it resolves the
artists behind those favorite albums (and favorite tracks), fetches
their catalogs from the Qobuz API (parallel, max 8 artists, 25 albums
each), and filters out albums the user already has in favorites or
recently played. Results are cached in reco_album_meta for instant
future lookups.
Closes#122
Migrate downloaded_purchases to compound PK (track_id, format_id) so
the same track downloaded in MP3 and FLAC are tracked separately.
Album detail endpoint now returns downloaded_format_ids per track.
Quality folder was being prepended to the destination path by the
frontend, resulting in Quality/Artist/Album/track. Now quality_dir
is passed as a separate parameter through the full stack and inserted
between album and filename by the backend path builder.
Right-click on album artwork shows context menu with:
- Add/Change/Remove custom album cover
- Open in browser
- Save as...
Also adds v2_save_image_url_to_file backend command.
cc
v2_library_set_custom_album_cover: resize, cache, store in db
v2_library_remove_custom_album_cover: delete files + db entry
v2_library_get_all_custom_album_covers: bulk load for frontend store
cc
- Add flac; keyword to all .desktop files (was only in deb template)
- Add StartupNotify=true to flatpak .desktop files (was missing)
- Add Keywords line to snap .desktop (was missing entirely)
- Unify shortDescription to match other .desktop Comment fields
cc
GDK_DPI_SCALE is a float multiplier that works on X11, XWayland, and
native Wayland. Previously it was only applied when force_x11 was
enabled, leaving native Wayland users with no way to compensate for
their DE scale factor from within the app.
- Move GDK_DPI_SCALE application out of the force_x11 block in main.rs
- Show the DPI Scale setting in the UI for all backends (not gated
behind the Force X11 toggle)
- GDK_SCALE remains XWayland-only (integer, not useful on Wayland)
- Setting is already persistent in graphics_settings.db
- Add window_width, window_height, is_maximized columns to window_settings DB
with automatic migration for existing installs
- Restore saved size on startup; restore maximized state after window creation
- Save non-maximized size on every Resize event
- Save maximized flag on CloseRequested
- Default remains 1280x800 for first launch
- Remove require_tos_accepted gate from all login commands
(v2_auto_login, v2_manual_login, v2_start_oauth_login, v2_login)
- Call accept_tos_best_effort after each successful session activation
so the value is persisted the moment login succeeds
- Re-initialize LegalSettingsStore in accept_tos_best_effort if torn
down (e.g. after factory reset that deletes legal_settings.db)
- Bootstrap ToS check now fails open (unwrap_or(true)) so saved
credentials still trigger auto-login after a factory reset
The frontend checkbox already gates the UI; the backend gate was
causing double-failures when the DB was unavailable post-factory-reset.
window.open() calls from social login providers are intercepted and opened
as related WebviewWindows (required on Linux/WebKitGTK). Both the main
window and all popups watch for play.qobuz.com?code_autorisation= so the
code is captured regardless of which window receives the final redirect.
Cleanup on timeout/cancel iterates all qobuz-oauth* windows.
- Save user_auth_token after successful OAuth login
- On bootstrap, restore session via saved token if no email/password creds
- If token is expired, clear it so user sees login screen normally
- Clear OAuth token on v2_clear_saved_credentials (logout)
- Add login_with_token() to api client (reuses OAuth /user/login step)
Also rename t->translateStore in NowPlayingBar.svelte (ADR-001 fix from Codex)
and improve clean-dev-runtime.sh to kill all stale processes and ports
Qobuz redirects to play.qobuz.com/discover?code_autorisation=XXX
not ?code=XXX. Both the navigation intercept and the /oauth/callback
API call were using the wrong parameter name, so the code was never
captured and the exchange request was malformed.
on_navigation returning false does not reliably block HTTP 302 redirects
on WebKitGTK (Linux). Closing the window from within the callback is
more reliable than calling close() from an async Tokio thread.
Changes:
- Always return true from on_navigation (never try to block)
- Close oauth window inside on_navigation callback after code capture
- Best-effort close via app.get_webview_window() after await (fallback)
- Add logging of every URL visited for debugging
- Idempotent: ignore duplicate code captures if callback fires twice
- v2_bulk_add_to_queue: add multiple tracks to end of queue
- v2_bulk_add_to_queue_next: add multiple tracks as play next (reversed
to preserve selection order)
- v2_bulk_add_favorites: add multiple tracks to favorites via API then
update local cache atomically (lock not held across await points)
- v2_add_tracks_to_playlist and v2_remove_tracks_from_playlist already
accept Vec<u64> — no changes needed for playlist bulk actions
Add get_all_custom_artist_images() database method and
v2_library_get_all_custom_artist_images command to support
loading all custom artist image overrides at once for the
global resolution store.
KWin scripting noBorder=false cannot override the xdg-decoration
protocol on Wayland. Window rules (kwinrulesrc) operate at a deeper
level and should force SSD before protocol negotiation. Uses
kwriteconfig6 to add/remove rules and qdbus6 to trigger reconfigure.
Now that the script is confirmed working (noBorder=false set on QBZ
window, resourceClass=qbz), remove the chatty per-window log lines
that would spam journalctl on every app launch.
The KWin D-Bus scripting API requires calling run() on the specific
script object (/Scripting/Script{id}) returned by loadScript(), not
start() on the /Scripting root. Also unloads previous script instance
before reloading, and adds 500ms delay to ensure window is mapped.
The KWin script checked for resourceClass === "qbz" but on Wayland,
KWin sets resourceClass from the xdg-toplevel app_id, which is the
full GTK application ID: "com.blitzfc.qbz" (from tauri.conf.json
identifier). Now matches all three possible values: com.blitzfc.qbz,
qbz, qbz-nix. Added diagnostic print() for journalctl debugging.
GTK3 hardcodes CLIENT_SIDE in the xdg-decoration Wayland protocol,
so GTK_CSD=0 alone doesn't work — KWin still sees CSD preference
and won't draw server-side decorations.
New approach for KDE Plasma + Wayland + system title bar:
1. Create window with decorations=false (no GTK CSD)
2. Load a KWin script via D-Bus that forces noBorder=false for QBZ
3. KWin draws its own native Breeze SSD title bar
This gives QBZ a title bar identical to Dolphin, Konsole, etc.
On non-KDE DEs, the old decorations(true) path is used unchanged.
Reverts the ineffective GTK_CSD=0 approach from previous commit.
Previously GTK_CSD=1 was set unconditionally on Wayland, forcing GTK to
draw its own client-side title bar (Breeze-GTK). On KDE Plasma this
looks wrong because native apps use KWin's server-side decorations
(Breeze-KDE).
Now reads the use_system_titlebar setting before GTK init:
- system title bar ON: GTK_CSD=0 (WM draws native decorations)
- system title bar OFF: GTK_CSD=1 (doesn't matter, decorations=false)
This makes QBZ's title bar match Dolphin, Konsole, etc. on KDE Plasma,
and Nautilus, etc. on GNOME — the window manager draws the decorations
in its own native style.
Instead of using wallpaper k-means + accent override (which produced
wrong backgrounds), the system source now reads ALL colors from the
DE config (kdeglobals for KDE, dconf hints for GNOME).
Maps Window/View/Button/Selection/Header sections directly to CSS
variables — bg-primary from Window, bg-secondary from View,
bg-tertiary from Button, accent from Selection, text from
ForegroundNormal, etc.
Adds SystemColorScheme type, get_system_color_scheme() in system.rs,
generate_theme_from_scheme() in generator.rs, and two new V2 commands:
v2_generate_theme_from_system_colors and v2_get_system_color_scheme.
Frontend tryAccentColorTheme() replaced with trySystemColorSchemeTheme()
which calls the new endpoint. Old color math helpers removed.
- V2 commands (generate_theme_from_image, generate_theme_from_wallpaper,
extract_palette) now use tokio::task::spawn_blocking to avoid freezing
the main thread during CPU-bound image decoding and k-means clustering.
This lets the UI spinner animate properly.
- KDE accent detection now falls back to Colors:Selection DecorationFocus
and BackgroundNormal from kdeglobals when no explicit AccentColor is set.
This reads the actual KDE color scheme accent instead of only looking
for the Plasma 6 custom accent field.
cc
Six new commands:
- v2_detect_desktop_environment: detect current DE
- v2_get_system_wallpaper: get wallpaper path
- v2_get_system_accent_color: get DE accent color
- v2_generate_theme_from_image: generate theme from any image
- v2_generate_theme_from_wallpaper: generate theme from system wallpaper
- v2_extract_palette: extract color palette for preview
All are pure functions (no State needed), registered in invoke_handler.
cc
Rust module auto_theme/ with:
- K-means clustering (k=6) on downsampled images for palette extraction
- CSS variable generator producing all ~40 required theme tokens
- WCAG AA contrast enforcement for text and accent colors
- Desktop environment detection (GNOME, KDE Plasma, COSMIC, XFCE, Cinnamon)
- Wallpaper path retrieval per DE (gsettings, Plasma config, COSMIC config)
- System accent color retrieval (GNOME 47+, KDE, COSMIC)
cc
Add get_all_custom_artist_images() database method and
v2_library_get_all_custom_artist_images command to support
loading all custom artist image overrides at once for the
global resolution store.