Commit Graph
147 Commits
Author SHA1 Message Date
victorrhgap 080b916c64 feat: prevent system sleep during playback via XDG portal
Add idle_inhibit module using ashpd's Inhibit portal to prevent
screen blanking and system suspend while audio is playing.

- Acquires Idle+Suspend inhibit when playback starts
- Releases when paused, stopped, or track cleared
- Works on GNOME, KDE, Sway, XFCE
- Works inside Flatpak/Snap (no extra permissions needed)
- Graceful fallback if portal unavailable

Addresses #229

cc
2026-03-31 12:41:21 -06:00
Victor RH e229bbd7c3 Merge pull request #223 from vicrodh/dependabot/cargo/src-tauri/pre-release/lofty-0.23.3
chore(deps): bump lofty from 0.18.2 to 0.23.3 in /src-tauri
2026-03-31 09:11:39 -06:00
Afonso Jorge Ramos a2fb44511d feat(macos): add deep link support for qobuzapp:// URLs
Add tauri-plugin-deep-link to handle qobuzapp:// URLs on macOS, where
the OS delivers URLs via Apple Events instead of CLI arguments.

- Register qobuzapp scheme in tauri.conf.json (injected into Info.plist)
- Add on_open_url handler for Apple Event URL delivery
- Extract is_qobuz_link() and handle_qobuz_link() helpers to deduplicate
  URL matching across single-instance, first-launch, and deep-link paths
- Tighten URL matching from contains() to starts_with() for security
- Log emit errors instead of silently discarding them
2026-03-31 05:53:44 +02:00
Victor RH b9572b3c2e Merge pull request #218 from vicrodh/dependabot/cargo/src-tauri/pre-release/axum-0.8.8
chore(deps): bump axum from 0.7.9 to 0.8.8 in /src-tauri
2026-03-30 21:46:12 -06:00
Victor RH 1e4ce38258 Merge pull request #224 from vicrodh/dependabot/cargo/src-tauri/pre-release/souvlaki-0.8.3
chore(deps): bump souvlaki from 0.7.3 to 0.8.3 in /src-tauri
2026-03-30 21:39:20 -06:00
dependabot[bot] e5556f7842 chore(deps): bump rand from 0.8.5 to 0.10.0 in /src-tauri
Bumps [rand](https://github.com/rust-random/rand) from 0.8.5 to 0.10.0.
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-random/rand/compare/0.8.5...0.10.0)

---
updated-dependencies:
- dependency-name: rand
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 05:36:29 +00:00
dependabot[bot] d0064d122a chore(deps): bump souvlaki from 0.7.3 to 0.8.3 in /src-tauri
Bumps [souvlaki](https://github.com/Sinono3/souvlaki) from 0.7.3 to 0.8.3.
- [Release notes](https://github.com/Sinono3/souvlaki/releases)
- [Changelog](https://github.com/Sinono3/souvlaki/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Sinono3/souvlaki/compare/0.7.3...0.8.3)

---
updated-dependencies:
- dependency-name: souvlaki
  dependency-version: 0.8.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 05:36:08 +00:00
dependabot[bot] 63dd054815 chore(deps): bump lofty from 0.18.2 to 0.23.3 in /src-tauri
Bumps [lofty](https://github.com/Serial-ATA/lofty-rs) from 0.18.2 to 0.23.3.
- [Release notes](https://github.com/Serial-ATA/lofty-rs/releases)
- [Changelog](https://github.com/Serial-ATA/lofty-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Serial-ATA/lofty-rs/compare/0.18.2...0.23.3)

---
updated-dependencies:
- dependency-name: lofty
  dependency-version: 0.23.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 05:35:57 +00:00
dependabot[bot] ef1915f83d chore(deps): bump axum from 0.7.9 to 0.8.8 in /src-tauri
Bumps [axum](https://github.com/tokio-rs/axum) from 0.7.9 to 0.8.8.
- [Release notes](https://github.com/tokio-rs/axum/releases)
- [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/axum/compare/axum-v0.7.9...axum-v0.8.8)

---
updated-dependencies:
- dependency-name: axum
  dependency-version: 0.8.8
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 05:35:32 +00:00
victorrhgap 7c96720dca chore: bump version to 1.2.1
Update all version endpoints, regenerate lockfiles,
add metainfo release entry and release docs.

cc
2026-03-25 19:47:08 -06:00
Afonso Jorge Ramos 3809a5cc67 feat(macos): add notify-rust dependency for desktop notifications 2026-03-20 00:45:15 +01:00
dependabot[bot] 3e6b51c7dd chore(deps): bump qrcode-generator from 4.1.9 to 5.0.0 in /src-tauri
Bumps [qrcode-generator](https://github.com/magiclen/qrcode-generator) from 4.1.9 to 5.0.0.
- [Commits](https://github.com/magiclen/qrcode-generator/compare/v4.1.9...v5.0.0)

---
updated-dependencies:
- dependency-name: qrcode-generator
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 23:22: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
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 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 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 65a0d523bb fix(qconnect): track active remote renderer state for skip and seekbar
cx
2026-03-13 11:55:48 -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 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 a4a6722110 chore: bump version to 1.1.20 2026-03-11 12:53:13 -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 05f1a5ec13 chore: bump version to 1.1.19
- Cargo.toml, tauri.conf.json, package.json, snapcraft.yaml
- Regenerate Cargo.lock and package-lock.json
- Add metainfo release entry for 1.1.19
2026-03-09 00:35:42 -06:00
vicrodh 69aed4e1ad feat(notifications): migrate from notify-rust to ashpd XDG Portal
Replace direct D-Bus notifications (notify-rust) with XDG Desktop
Portal notifications (ashpd) for Flathub compliance. Portal
notifications use the app's .desktop file identity and don't require
--talk-name=org.freedesktop.Notifications permission.

- Replace notify-rust dep with ashpd (linux-only, tokio+notification)
- Use NotificationProxy for portal-based notifications
- Use stable ID "track-now-playing" to replace instead of stacking
- Convert artwork path to file:// URI via ashpd::Uri
- Graceful fallback when portal is unavailable
2026-03-03 22:25:59 -06:00
vicrodh b49d0b3e3b chore(release): bump version to 1.1.19-rc-1
cx
2026-03-01 18:59:24 -06:00
vicrodh faf8844584 chore: upgrade rodio 0.19 to 0.22, remove vendored rodio/cpal
Remove vendored rodio and cpal from src-tauri/vendor/ since rodio 0.22
now includes upstream f32 decoder support (our vendored modification).
Update all Cargo.toml files to use rodio 0.22 from crates.io and remove
the [patch.crates-io] section.
2026-02-28 07:48:03 -06:00
vicrodh bb723c7ca5 feat: switch booklet viewer from pdfjs-dist to MuPDF backend
Replace browser-side pdfjs-dist canvas rendering with server-side
MuPDF rendering for high-quality PDF booklet display. MuPDF renders
pages to PNG at configurable DPI in Rust, producing much sharper
results than the JavaScript canvas approach which had persistent
JPEG 2000 WASM decoder issues.

- Add mupdf crate with sys-lib features (avoid GTK symbol conflicts)
- Create pdf_viewer.rs with v2_booklet_open/render_page/close commands
- Download PDF to temp file, render pages on demand via MuPDF
- Display rendered PNGs as img tags instead of canvas
- DPI scales with zoom and devicePixelRatio for crisp output
- Support rotation via MuPDF transformation matrix
2026-02-28 07:48:03 -06:00
vicrodh 6d2128e90a chore: bump version to 1.1.18 2026-02-26 03:41:45 -06:00
vicrodh 1981771584 chore: bump version to 1.1.17 2026-02-23 17:59:24 -06:00
vicrodh 26db1c1728 chore(release): bump version to 1.1.15 2026-02-23 12:18:08 -06:00
vicrodh a0790f9a1d feat(qconnect-tauri): add runtime service bridging renderer commands to CoreBridge
cx
2026-02-21 12:54:06 -06:00
vicrodh 373220c379 chore(qconnect): register workspace crates and tauri adapter dependency
-cx
2026-02-21 12:17:30 -06:00
vicrodh 98ffd3dff2 chore: bump version to 1.1.15-rc-2 2026-02-19 16:57:19 -06:00
vicrodh a6cfa36a8d fix(packaging): compile binary as qbz instead of qbz-nix
Add [[bin]] section to Cargo.toml so cargo produces target/release/qbz
directly. Update all packaging references (workflows, PKGBUILD, Flatpak
manifest, AUR desktop file) to use the new binary name. This fixes DEB
and RPM packages installing the binary as /usr/bin/qbz-nix instead of
/usr/bin/qbz.
2026-02-18 16:45:10 -06:00
vicrodh ba09345aa3 chore(release): prepare 1.1.15-rc-1 and beta checklist
cx
2026-02-17 20:13:30 -06:00
vicrodh 63994c0a20 refactor(cast): extract qbz-cast crate
Extract casting functionality (Chromecast, AirPlay, DLNA) to standalone
qbz-cast crate. This crate is Tauri-agnostic and can be used by TUI/CLI
clients.

- Move device connection, discovery, threading, and media server to crate
- Keep only Tauri commands in src-tauri/src/cast/
- Thin re-exports in src-tauri for backwards compatibility
- Remove duplicate dependencies from src-tauri Cargo.toml
2026-02-15 14:51:06 -06:00
vicrodh d6e4b3349b feat(qbz-library): extract local library management to standalone crate
Create qbz-library crate with:
- LibraryScanner: directory scanning for audio files
- MetadataExtractor: audio metadata extraction via lofty
- LibraryDatabase: SQLite persistence with WAL mode
- CueParser: CUE sheet parsing for single-file albums
- Thumbnails: artwork extraction and thumbnail generation
- Tag sidecar: album metadata override files

src-tauri re-exports from qbz-library for backwards compatibility.
Enables TUI/headless clients to manage local libraries without Tauri.
2026-02-15 12:12:52 -06:00
vicrodh 384459d4d7 feat(qbz-cache): extract audio caching to standalone crate
Create qbz-cache crate with:
- AudioCache: L1 in-memory LRU cache (~300MB)
- PlaybackCache: L2 disk-based cache (~500MB)
- LRU eviction with spillover from L1 to L2

src-tauri now re-exports from qbz-cache for backwards compatibility.
This enables TUI/headless clients to use caching without Tauri.
2026-02-15 11:27:38 -06:00
vicrodh 6310e9b216 chore: add qbz-integrations crate dependency
Wire qbz-integrations to src-tauri Cargo.toml. The crate provides
Tauri-independent implementations of Last.fm, ListenBrainz, and
MusicBrainz integrations.

Next step: Create V2 commands that use the new crate, then gradually
deprecate the existing in-tree implementations.
2026-02-15 11:05:33 -06:00
vicrodh d0e46aca05 feat(qbz-nix): Phase 6.1 - integrate extracted crates
Add dependencies on extracted crates and create TauriAdapter.

Changes:
- Add qbz-models, qbz-audio, qbz-player, qbz-qobuz, qbz-core as deps
- Add async-trait dependency for FrontendAdapter impl
- Create tauri_adapter.rs implementing FrontendAdapter
- TauriAdapter emits CoreEvents to frontend via Tauri event system

This is the first step of integration. The old modules still exist
but the new crates are now available for gradual migration.
2026-02-14 14:32:24 -06:00
vicrodh d3a4e4a688 Bump version to 1.1.14 for release
Changes since 1.1.13:
- Fix MPRIS dbus name to use appid (Flathub compliance)
- Fix SQLite WAL mode for all connections (UI lag fix)
- Add volume +/- step buttons in player bar
- Add playlist search in sidebar with folder auto-expand
- New playlist collage layout (3+1 grid)
2026-02-13 09:07:02 -06:00
vicrodh 008dfbcbb0 Bump version to 1.1.13 for Flathub submission 2026-02-12 15:12:07 -06:00
vicrodh f70000bbcc Bump version to 1.1.12 2026-02-12 14:32:52 -06:00
vicrodh 700183b0bb fix: prevent multiple instances when reopening from desktop icon
Cherry-picked from main (c163435b)

cc
2026-02-12 09:46:03 -06:00
vicrodh d6e9375333 chore: bump version to 1.1.11 2026-02-10 08:00:42 -06:00
vicrodh a7409bfdd4 chore: bump version to 1.1.10 2026-02-10 02:17:48 -06:00
vicrodh 3e4cc6921c Add developer settings backend, log capture system, and --reset-dmabuf CLI flag
Developer settings: SQLite-backed store for force_dmabuf toggle.
Logging: TeeWriter captures env_logger output to ring buffer;
log_startup() captures pre-logger startup messages.
Upload: multipart POST to 0x0.st for log sharing.
CLI: --reset-dmabuf flag resets force_dmabuf and exits for recovery.
2026-02-08 15:00:58 -06:00
vicrodh eaacc9e3a7 feat(audio): add real-time EBU R128 volume normalization (Phase 2)
Replace static ReplayGain-only normalization with real-time loudness
analysis that works with any audio source including Qobuz streams.

New components:
- DynamicAmplify: Source wrapper that reads gain from shared atomic
  with 50ms linear ramp to prevent clicks on gain changes
- AnalyzerTap: Source wrapper that batches samples and sends them
  to the analyzer thread via bounded channel (never blocks audio)
- LoudnessAnalyzer: Background thread computing EBU R128 integrated
  LUFS, first measurement at ~10s, refinement every ~5s
- LoudnessCache: SQLite persistence for computed LUFS values so
  replayed tracks get instant gain application

Pipeline when normalization ON:
  Decode -> Diagnostic -> AnalyzerTap -> DynamicAmplify -> Visualizer

Pipeline when normalization OFF (bit-perfect, unchanged):
  Decode -> Diagnostic -> Visualizer

Re-enable normalization toggle in NowPlayingBar UI.
2026-02-08 08:24:51 -06:00
vicrodh 3f18378c13 bump version to 1.1.9 2026-02-07 01:52:38 -06:00
vicrodh 6d49e2ce5a chore: bump version to 1.1.8 2026-02-04 20:48:22 -06:00
vicrodh 94c867c934 chore: bump version to 1.1.8-rc-6 for workflow testing 2026-02-04 18:46:58 -06:00