Commit Graph
1202 Commits
Author SHA1 Message Date
Victor RH 9cf7657be7 Merge pull request #193 from vicrodh/dependabot/cargo/src-tauri/pre-release/ashpd-0.13.8
chore(deps): bump ashpd from 0.13.3 to 0.13.8 in /src-tauri
2026-03-19 17:21:03 -06:00
Victor RH eb82bc8920 Merge pull request #190 from vicrodh/dependabot/cargo/src-tauri/pre-release/tauri-2.10.3
chore(deps): bump tauri from 2.10.2 to 2.10.3 in /src-tauri
2026-03-19 17:21:01 -06:00
dependabot[bot] d04781826c chore(deps): bump ashpd from 0.13.3 to 0.13.8 in /src-tauri
Bumps [ashpd](https://github.com/bilelmoussaoui/ashpd) from 0.13.3 to 0.13.8.
- [Release notes](https://github.com/bilelmoussaoui/ashpd/releases)
- [Commits](https://github.com/bilelmoussaoui/ashpd/commits)

---
updated-dependencies:
- dependency-name: ashpd
  dependency-version: 0.13.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 23:16:32 +00:00
dependabot[bot] 9d29ed757c chore(deps): bump uuid from 1.21.0 to 1.22.0 in /src-tauri
Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.21.0 to 1.22.0.
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/v1.21.0...v1.22.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 23:16:18 +00:00
dependabot[bot] 92058de4a2 chore(deps): bump rcgen from 0.12.1 to 0.14.7 in /src-tauri
Bumps [rcgen](https://github.com/rustls/rcgen) from 0.12.1 to 0.14.7.
- [Release notes](https://github.com/rustls/rcgen/releases)
- [Commits](https://github.com/rustls/rcgen/compare/v0.12.1...v0.14.7)

---
updated-dependencies:
- dependency-name: rcgen
  dependency-version: 0.14.7
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 23:16:06 +00:00
dependabot[bot] 97ac638ae3 chore(deps): bump tauri from 2.10.2 to 2.10.3 in /src-tauri
Bumps [tauri](https://github.com/tauri-apps/tauri) from 2.10.2 to 2.10.3.
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/tauri-v2.10.2...tauri-v2.10.3)

---
updated-dependencies:
- dependency-name: tauri
  dependency-version: 2.10.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 23:15:47 +00:00
vicrodh af23efb3c1 chore: bump version to 1.2.0
Updated:
- src-tauri/Cargo.toml
- src-tauri/tauri.conf.json
- package.json + package-lock.json
- snapcraft.yaml (root + packaging/)
- flake.nix
- Cargo.lock
- metainfo.xml (new release entry)
- README: Snap MPRIS limitation note with forum link

cc
2026-03-19 17:12:31 -06:00
vicrodh 768b9c118c fix(qconnect): re-request session state after renderer join
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
2026-03-19 16:07:28 -06:00
vicrodh 780f75158a fix: skip credential tests in Nix build sandbox (#154)
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
2026-03-19 14:52:24 -06:00
vicrodh 6261f312be fix: use {:?} for souvlaki MediaControlError formatting
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
2026-03-19 14:42:12 -06:00
vicrodh 1f1e729db8 fix: HiFi Wizard now detects real DAC sample rates from /proc/asound
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
2026-03-19 12:41:24 -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 509426ebcf fix: restore booklet viewer with mupdf 0.6 (#170)
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
2026-03-19 09:28:07 -06:00
vicrodh c2e9a4f0ba fix: replace broken screen resolution clamping with sane fallback
xdpyinfo returns combined multi-monitor resolution (e.g. 6000x1600 for
dual monitors), causing false positives like clamping 1926x1590 to
5700x1520. The 95% multiplier made things worse — the fallback size was
larger than any single monitor.

Replace with simple corruption guard: only clamp values above 8K
(obviously corrupt DB entries), fallback to 1920x1080. The window
manager already handles fitting windows to the actual display.

cc
2026-03-19 08:44:29 -06:00
vicrodh 2439b5f4d8 fix: remove KDE KWin SSD hack entirely (#170)
The KWin window rule approach (kwinrulesrc + qdbus reconfigure) was
never actually active because GDK_BACKEND is unset on most KDE Wayland
sessions. In v1.1.18 this meant decorations(use_system_titlebar) was
used directly — GTK CSD appeared (ugly but functional, no CPU issues).

The hack itself, when triggered, caused double titlebar and a CPU busy
loop that blocked networking. Remove all KDE-specific detection and
KWin rule setup. Window now simply uses decorations(use_system_titlebar)
on all platforms, matching the effective behavior of v1.1.18.

The one-time cleanup of stale kwinrulesrc entries is preserved so users
who had the rule from v1.1.14-v1.1.19 get it cleaned up automatically.

cc
2026-03-19 08:29:49 -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 9bcafe26fb fix: alsa_hardware_volume was hardcoded false + v2_reset_audio_settings sync
Two additional gaps found during audio settings sync audit:

1. convert_to_qbz_audio_settings() hardcoded alsa_hardware_volume to
   false instead of reading settings.alsa_hardware_volume. This meant
   the player never received the user's ALSA hardware volume preference.

2. v2_reset_audio_settings saved defaults to DB but never synced them
   to the CoreBridge player, leaving stale settings in memory.

cc
2026-03-18 22:20:04 -06:00
vicrodh e490010e58 fix: sync audio settings to CoreBridge player on change and session activation
Two bugs caused the exclusive mode to not work when QConnect was active:

1. Critical audio setters (backend_type, exclusive_mode, dac_passthrough,
   output_device, alsa_plugin, pw_force_bitperfect, sample_rate,
   alsa_hardware_volume) saved to the per-user store but never called
   reload_settings() on the CoreBridge player. The Player kept using
   stale settings (often defaults with backend_type=None), falling back
   to CPAL/PipeWire instead of ALSA Direct.

2. After login, per-user audio settings were loaded into AudioSettingsState
   but never pushed into the CoreBridge player, which was created at
   startup with flat-path defaults.

Fix: Add sync_audio_settings_to_player() helper and call it from all
critical audio setters. Also sync settings in activate_session() and
activate_offline_session() right after audio_settings.init_at().

cc
2026-03-18 22:03:23 -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 d4fa6f4210 feat(qconnect): add debug-level diagnostics for shuffle order tracking
Logs QueueUpdated shuffle_order validity and resolve_core_shuffle_order
results at debug level for verbose troubleshooting.

cc
2026-03-16 19:16:10 -06:00
vicrodh 8330dd08ed Revert "Reapply "fix(qconnect): pass server shuffle order through to CoreBridge""
This reverts commit 2bb72455d1.
2026-03-16 11:05:12 -06:00
vicrodh 2bb72455d1 Reapply "fix(qconnect): pass server shuffle order through to CoreBridge"
This reverts commit d9f112390f.
2026-03-16 11:01:53 -06:00
vicrodh d9f112390f Revert "fix(qconnect): pass server shuffle order through to CoreBridge"
This reverts commit 065cf734d2.
2026-03-16 10:54:02 -06:00
vicrodh 065cf734d2 fix(qconnect): pass server shuffle order through to CoreBridge
resolve_core_shuffle_order was reordering the server's shuffle_order
to put the current track first. This destroyed the server's concept
of "already played" vs "upcoming" — CoreBridge showed all tracks as
upcoming while the web player correctly split them.

Now the server's raw shuffle_order is passed through unchanged.
CoreBridge's set_queue_with_order finds shuffle_position from
current_index, preserving the played/upcoming split.

cc
2026-03-16 10:52:41 -06:00
vicrodh 9c14a76975 fix: make mupdf optional to unblock build on Arch Linux
mupdf-sys 0.5.0 bindings are incompatible with the current system
MuPDF library (struct size assertions overflow). Gate mupdf behind
a booklet feature flag (disabled by default). When disabled, booklet
commands return an error instead of crashing the build.

cc
2026-03-15 13:48:35 -06:00
vicrodh 87be5fbf16 feat: add set_autoplay_mode and autoplay_load_tracks remote commands
Backend _if_remote methods for QConnect autoplay protocol:
- set_autoplay_mode_if_remote: toggles autoplay on the QConnect server
- autoplay_load_tracks_if_remote: loads track IDs into the autoplay pool
Both follow the established _if_remote pattern with diagnostics.
2026-03-15 09:46:01 -06:00
vicrodh 8e2bb021c2 fix: guard re-bootstrap with has_disconnected flag
Prevents double-bootstrap on initial connect. The Subscribed
handler now only calls bootstrap_remote_presence when the
connection was previously lost (has_disconnected=true), not
on the first connect where connect() already bootstraps.
Also sets has_disconnected=true in the Disconnected handler.
2026-03-15 09:21:41 -06:00
vicrodh 8e87b414db feat(qconnect): route volume/mute to peer renderer when remote is active
New _if_remote backend commands for set_volume and mute_volume.
handleVolumeChange and handleToggleMute in both main view and miniplayer
now check for peer renderer before setting volume locally.  Media
control set_volume also routed through the guard.  When no peer is
active, volume is set locally and reported to QConnect server.
2026-03-15 09:14:07 -06:00
vicrodh 1fc2e79391 feat(qconnect): add stop_if_remote guard for media control stop action
When a peer renderer is active, the MPRIS/media-key stop command now
sends SetPlayerState(STOPPED) to the QConnect server instead of stopping
local playback.  Falls back to local stop on error or when no peer is
active.
2026-03-15 07:27:32 -06:00
vicrodh d21f2253bc feat(qconnect): add QConnect guards to shuffle, repeat, queue play, and history play handlers
When a peer renderer is active, shuffle/repeat/queue-play/history-play
commands are now routed to the QConnect server instead of being applied
locally.  Two new backend commands (toggle_shuffle_if_remote,
cycle_repeat_if_remote) follow the existing _if_remote pattern.
Guards added to both +page.svelte (main + immersive) and miniplayer.
2026-03-14 22:44:31 -06:00
vicrodh 66b5288150 fix(qconnect): use authoritative queue mutations
cx
2026-03-14 19:29:11 -06:00
vicrodh 8a468ed725 fix(qconnect): restore local repeat renderer flow
cx
2026-03-14 13:09:23 -06:00
vicrodh e6a20b02e8 fix(qconnect): align repeat loop mode mapping
cx
2026-03-14 11:43:31 -06:00
vicrodh 7a11b6548c fix(qconnect): anchor remote shuffle projection
cx
2026-03-14 07:32:46 -06:00
vicrodh 8b950da5c9 fix(qconnect): honor remote shuffle order for next
cx
2026-03-14 00:59:51 -06:00
vicrodh f693d1c61a fix(qconnect): wait for authoritative repeat mode
cx
2026-03-14 00:12:47 -06:00
vicrodh 6805b4f61a fix(qconnect): reapply authoritative queue snapshots
cx
2026-03-13 23:22:25 -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 d3d0fe491a fix(qconnect): stream local handoff playback
cx
2026-03-13 18:52:30 -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 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