Files
qbz/snapcraft.yaml
T
vicrodh 4e9cf815fe chore(release): bump snapcraft and flake to 1.2.14
snapcraft.yaml: version: '1.2.14' AND source-tag: v1.2.14 (both fields —
updating only one leaves the Snap Store building the previous tag).
packaging/snap/snapcraft.yaml is a symlink to it, so both stay in sync
automatically.

flake.nix: qbzVersion -> 1.2.14; srcHash/npmHash cleared, to be refilled
via `nix build` after the v1.2.14 tag exists, in a follow-up commit as in
prior releases.

cc
2026-05-25 08:38:00 -06:00

179 lines
7.6 KiB
YAML

# QBZ Snap package configuration
# NOTE: Keep this file in sync with packaging/snap/snapcraft.yaml.
name: qbz-player
title: "QBZ — Native Qobuz Client for Linux"
version: '1.2.14'
summary: Native Qobuz player for Linux with bit-perfect audio and DAC control
description: |
QBZ is a native Linux desktop client for Qobuz™, designed for high-fidelity playback.
Unlike browser-based players or web wrappers, QBZ uses a native audio pipeline with direct ALSA and PipeWire integration, allowing bit-perfect playback, exclusive device access, and proper per-track sample-rate switching for external DACs.
Browsers are limited by system mixers and WebAudio, often resampling audio to 48 kHz. QBZ bypasses these limitations to deliver true high-resolution audio up to 24-bit / 192 kHz on Linux.
Features:
- Native Qobuz™ streaming client (not a web wrapper)
- Bit-perfect playback with ALSA exclusive mode
- DAC passthrough and per-track sample-rate switching
- Hi-Res FLAC playback
- Queue, playlists, favorites, and offline cache
- Local library integration
- Chromecast and DLNA support
- MPRIS media keys and desktop integration
- Open source (MIT license)
QBZ is built for Linux users and audiophiles who care about how audio actually reaches their hardware.
Note: When using ALSA exclusive mode or DAC passthrough, QBZ may block other
applications from recording or playing sound while audio is active. This is
expected behavior for bit-perfect playback and can be disabled in settings.
Legal:
QBZ uses the Qobuz™ API but is not affiliated with, endorsed by, or certified by Qobuz.
license: MIT
contact: https://github.com/vicrodh/qbz/discussions
website: https://qbz.lol
source-code: https://github.com/vicrodh/qbz
issues: https://github.com/vicrodh/qbz/issues
grade: stable
confinement: strict
base: core22
icon: packaging/snap/snap/gui/qbz.png
passthrough:
layout:
/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1:
bind: $SNAP/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1
/usr/share/alsa:
bind: $SNAP/usr/share/alsa
/etc/alsa:
bind: $SNAP/etc/alsa
/usr/lib/x86_64-linux-gnu/alsa-lib:
bind: $SNAP/usr/lib/x86_64-linux-gnu/alsa-lib
architectures:
- build-on: [amd64]
build-for: [amd64]
- build-on: [arm64]
build-for: [arm64]
apps:
qbz:
command: bin/qbz
desktop: packaging/snap/snap/gui/qbz.desktop
extensions: [gnome]
environment:
# Prefer GNOME platform GL libs to avoid Mesa/driver mismatches on NVIDIA.
LD_LIBRARY_PATH: $SNAP/gnome-platform/usr/lib/x86_64-linux-gnu:$SNAP/gnome-platform/lib/x86_64-linux-gnu:$SNAP/gnome-platform/usr/lib/aarch64-linux-gnu:$SNAP/gnome-platform/lib/aarch64-linux-gnu:$SNAP/gnome-platform/usr/lib:$SNAP/gnome-platform/lib:$LD_LIBRARY_PATH
WEBKIT_EXEC_PATH: $SNAP/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1
GTK_USE_PORTAL: "0"
GIO_USE_PORTAL: "0"
PIPEWIRE_RUNTIME_DIR: $XDG_RUNTIME_DIR/..
plugs:
- network
- network-status
- audio-playback
- home
- removable-media
- desktop
- desktop-legacy
- wayland
- x11
- unity7
- gsettings
- alsa
- pipewire
slots:
- mpris
slots:
mpris:
interface: mpris
name: qbz
parts:
qbz:
plugin: rust
source: https://github.com/vicrodh/qbz.git
source-tag: v1.2.14
build-packages:
- libwebkit2gtk-4.1-dev
- libgtk-3-dev
- libayatana-appindicator3-dev
- librsvg2-dev
- patchelf
- libssl-dev
- libasound2-dev
- pkg-config
- curl
# alsa-utils for aplay command (device enumeration)
- alsa-utils
# unzip needed by mupdf-sys build (ODT template extraction)
- unzip
# libclang needed by bindgen (mupdf-sys 0.6 generates bindings at build time)
- libclang-dev
stage-packages:
- libwebkit2gtk-4.1-0
- libgtk-3-0
- libayatana-appindicator3-1
- libasound2
- libasound2-data
- libasound2-plugins
- libssl3
- pipewire-bin
- pulseaudio-utils
# Include alsa-utils in the snap for aplay -L command
- alsa-utils
override-build: |
export CARGO_HOME="$SNAPCRAFT_PART_BUILD/.cargo"
export RUSTUP_HOME="$SNAPCRAFT_PART_BUILD/.rustup"
export PATH="$CARGO_HOME/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PKG_CONFIG_PATH="/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig:/usr/share/pkgconfig:/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig:/snap/gnome-42-2204-sdk/current/usr/share/pkgconfig"
export LIBRARY_PATH="/usr/lib/$SNAPCRAFT_ARCH_TRIPLET:/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET"
export LD_LIBRARY_PATH="/usr/lib/$SNAPCRAFT_ARCH_TRIPLET:/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET"
# Core22 ships SQLite 3.37 which lacks sqlite3_error_offset (added 3.38).
# libsqlite3-dev is pulled in transitively by webkit2gtk-dev, and the
# RUSTFLAGS -L puts /usr/lib before the bundled sqlite output dir,
# so the linker finds the old system libsqlite3.a first.
# Fix: replace system sqlite with a version >= 3.38.
SQLITE_VER=3460100
curl -sSf "https://www.sqlite.org/2024/sqlite-autoconf-${SQLITE_VER}.tar.gz" | tar xz
pushd "sqlite-autoconf-${SQLITE_VER}"
./configure --quiet --prefix=/usr --libdir="/usr/lib/$SNAPCRAFT_ARCH_TRIPLET"
make -j"$(nproc)" && make install
popd
export RUSTFLAGS="-L native=/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -L native=/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -L native=/snap/gnome-42-2204-sdk/current/usr/lib -C link-arg=-Wl,-rpath-link,/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -C link-arg=-Wl,-rpath-link,/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -C link-arg=-Wl,-rpath-link,/snap/gnome-42-2204-sdk/current/usr/lib"
export LDFLAGS="-L/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -L/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -L/snap/gnome-42-2204-sdk/current/usr/lib -Wl,-rpath-link,/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -Wl,-rpath-link,/snap/gnome-42-2204-sdk/current/usr/lib/$SNAPCRAFT_ARCH_TRIPLET -Wl,-rpath-link,/snap/gnome-42-2204-sdk/current/usr/lib"
if ! command -v cargo >/dev/null 2>&1; then
curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable
fi
# Allow sandboxed builds to override GTK_USE_PORTAL.
perl -0pi -e 'if ($_ !~ /var_os\\(\"GTK_USE_PORTAL\"\\)/) { s/std::env::set_var\\(\"GTK_USE_PORTAL\", \"1\"\\);/if std::env::var_os\\(\"GTK_USE_PORTAL\"\\).is_none() {\\n std::env::set_var(\"GTK_USE_PORTAL\", \"1\");\\n }/ }' src-tauri/src/main.rs
# Install Node.js for frontend build
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
# Build frontend
npm ci
# Snap Store policy prohibits competing auto-updaters; disable
# the `updater` Cargo feature so tauri-plugin-updater is not linked.
npm run tauri build -- --no-bundle -- --no-default-features
# Install binary, desktop file, and icon
mkdir -p $SNAPCRAFT_PART_INSTALL/bin
cp src-tauri/target/release/qbz $SNAPCRAFT_PART_INSTALL/bin/qbz
mkdir -p $SNAPCRAFT_PART_INSTALL/packaging/snap/snap/gui
cp packaging/snap/snap/gui/qbz.desktop $SNAPCRAFT_PART_INSTALL/packaging/snap/snap/gui/
cp packaging/snap/snap/gui/qbz.png $SNAPCRAFT_PART_INSTALL/packaging/snap/snap/gui/
override-prime: |
snapcraftctl prime
if [ -d "$SNAPCRAFT_PRIME/usr/lib/aarch64-linux-gnu" ] && [ ! -e "$SNAPCRAFT_PRIME/usr/lib/x86_64-linux-gnu" ]; then
ln -s aarch64-linux-gnu "$SNAPCRAFT_PRIME/usr/lib/x86_64-linux-gnu"
fi