Add #[cfg(target_os = "linux")] to pipewire_backend and pulse_backend
modules. Add CpalDefaultBackend for non-Linux platforms using CPAL
default host (CoreAudio on macOS). Gate reset_pipewire_clock() calls.
rcgen 0.14 breaking changes:
- CertificateParams::new() takes Vec<String> not Vec<SanType>
- Certificate::from_params() replaced by params.self_signed(&key_pair)
- cert.serialize_pem() replaced by cert.pem()
- cert.serialize_private_key_pem() replaced by key_pair.serialize_pem()
- Ia5String no longer public, DNS SANs passed as strings
Also prefixed unused _envelope variable in qconnect_service.rs.
cc
QconnectBadge was passing { rendererId } instead of
{ request: { renderer_id: rendererId } } to v2_qconnect_set_active_renderer,
causing "missing required key request" error on every handoff attempt.
Also fixed TypeError when event.payload is a string ("TransportConnected")
instead of an object — the 'in' operator requires an object operand.
cc
QBZ wasn't appearing as a renderer on first connect because the
frontend snapshot was emitted before the deferred renderer join
completed. After joining as renderer, wait 500ms and re-request
session state so the server sends an updated renderer list that
includes QBZ.
cc
Major rewrite reflecting current state of the project:
- Qobuz Connect as headline feature
- No API keys needed (proxy-based architecture)
- API proxy self-hosting instructions for source builds
- Updated tech stack (rodio 0.22, MuPDF 0.6, ashpd, 5 locales)
- 13 crates including 4 QConnect crates
- Removed outdated sections (KWin title bar, vendored rodio, data migration)
- Streamlined installation and known issues
cc
Camera raised (y: 1738 -> 2200) and tilted steeper (x: -0.65 -> -0.78)
so the entire bed is visible without overflowing the bottom edge.
Also avoids covering the track info in the lower-right corner.
cc
Nix sets HOME=/homeless-shelter during builds, which makes
dirs::config_dir() return a technically writable but unusable path.
The keyring/D-Bus is also unavailable in the sandbox.
Added detection for HOME containing "homeless-shelter" or
"/nix/store", and NIX_BUILD_TOP env var, to skip credential
roundtrip tests in Nix builds.
cc
MediaControlError doesn't impl Display on all platforms. Using {}
would fail to compile on non-Linux targets. Use {:?} (Debug) instead.
Cherry-picked from PR #181 by @afonsojramos.
cc
The mpris slot requires an auto-connect review from Canonical that has
been pending for 9+ days. Remove it to unblock the version bump from
1.1.18 to 1.1.20. MPRIS media controls will not work in the snap
build until the review is approved in a future release.
cc
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
- devalue 5.6.3 -> 5.6.4: fixes prototype pollution in parse/unflatten
(GHSA #23, #24)
- @sveltejs/kit -> 2.53.3: fixes deserialization DoS in form actions
cc
Replaces placeholder-text markdown templates with structured YAML
issue forms. Dropdowns for installation method, display server, and
audio backend. Required fields for description, steps, and version.
Same output format when reading submitted issues.
cc
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
v2_query_dac_capabilities was returning hardcoded sample rates
(44.1-192kHz including 176.4kHz) instead of querying the actual
hardware. This caused incorrect configuration for DACs that don't
support all rates (e.g. DacMagic Plus doesn't support 176.4kHz).
Now queries /proc/asound/cardN/stream0 via PipeWire sink mapping
or ALSA device ID to get the real discrete rates from the USB
descriptor. Falls back to defaults only if detection fails.
cc
Tauri invoke errors are objects with { code, details, message } fields.
Template literal interpolation with ${err} produces [object Object].
Extract .message or .details, falling back to JSON.stringify().
The quality fallback itself (UltraHiRes -> HiRes) is already handled
by get_stream_url_with_fallback in qbz-core.
cc
loadFollowingPlaylists was calling non-existent v2_get_runtime_status
command. Fixed to use getUserInfo() from authStore instead.
Also fixed loadFavoritePlaylists early return when no favorites exist
— it was skipping the loadFollowingPlaylists() call entirely.
cc
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
Qobuz API's albums_count on Artist objects includes compilations,
tributes, appearances, and other non-album releases, showing
exaggerated numbers (e.g. 647 albums for an artist with ~20 releases).
Removed the count display from:
- Favorites artist list view
- Favorites artist grid view
- Search results artist cards
The accurate album count is available inside ArtistDetailView where
the actual releases are loaded and filtered.
cc
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
USB hubs/docks (e.g. Razer USB4 Dock) may need longer than 300ms for
sample rate switching. When PipeWire hasn't finished reconfiguring,
96K/192K tracks play at wrong speed (half/quarter) and sound distorted.
Changes:
- Increase initial clock.force-rate delay from 300ms to 500ms
- After stream creation, query pw-metadata clock.rate to verify the
actual graph rate matches what was requested
- If mismatch detected, retry with additional 500ms delay and re-force
- Log warnings when rate can't be verified so users can report
cc
mupdf 0.5 had struct size mismatches on Arch Linux (mupdf-sys bindings
incompatible with system MuPDF headers). Upgrading to mupdf 0.6 fixes
the bindings.
- Removed the booklet feature gate — mupdf is now a direct dependency
again, matching the v1.1.19 configuration
- Removed stub implementation (always compile real MuPDF backend)
- sys-lib-libjpeg remains excluded (cross-distro libjpeg incompatibility)
cc