docs: update README and add AUR automation

- Add installation instructions (AUR, Flatpak, AppImage)
- Document all API keys (Last.fm, Discogs, Spotify, Tidal)
- Add playlist import feature documentation
- Update project structure
- Add PKGBUILD for qbz-bin AUR package
- Add workflow to auto-update AUR on release
- Update .env.example with Spotify/Tidal variables
This commit is contained in:
vicrodh committed 2026-01-12 14:23:16 -06:00
1 parent 1b6c895f62
commit 7287da5b27
4 files changed
+245 -32

No files matched your search

+14
View File
@@ -13,3 +13,17 @@ LAST_FM_APP_REGISTER=your_lastfm_username
DISCOGS_API_CLIENT_KEY=your_consumer_key_here DISCOGS_API_CLIENT_KEY=your_consumer_key_here
DISCOGS_API_CLIENT_SECRET=your_consumer_secret_here DISCOGS_API_CLIENT_SECRET=your_consumer_secret_here
# Spotify API Configuration (for playlist import)
# Create your own Spotify application at: https://developer.spotify.com/dashboard
# These credentials are used for importing playlists from Spotify
SPOTIFY_API_CLIENT_ID=your_client_id_here
SPOTIFY_API_CLIENT_SECRET=your_client_secret_here
# Tidal API Configuration (for playlist import)
# Create your own Tidal application at: https://developer.tidal.com/
# These credentials are used for importing playlists from Tidal
TIDAL_API_CLIENT_ID=your_client_id_here
TIDAL_API_CLIENT_SECRET=your_client_secret_here
+101
View File
@@ -0,0 +1,101 @@
name: release-aur
on:
release:
types: [published]
workflow_dispatch:
inputs:
version:
description: "Version to publish (e.g. 1.0.0)"
required: true
type: string
jobs:
update-aur:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Determine version
id: version
run: |
if [[ "${{ github.event_name }}" == "release" ]]; then
VERSION="${{ github.event.release.tag_name }}"
VERSION="${VERSION#v}"
else
VERSION="${{ inputs.version }}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Wait for release assets
if: github.event_name == 'release'
run: |
echo "Waiting 60s for release assets to be available..."
sleep 60
- name: Download release tarball and get checksum
id: checksum
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
TARBALL_URL="https://github.com/vicrodh/qbz/releases/download/v${VERSION}/qbz_${VERSION}_amd64.tar.gz"
echo "Downloading: $TARBALL_URL"
curl -fsSL -o /tmp/qbz.tar.gz "$TARBALL_URL"
SHA256=$(sha256sum /tmp/qbz.tar.gz | cut -d' ' -f1)
echo "sha256=$SHA256" >> "$GITHUB_OUTPUT"
echo "Checksum: $SHA256"
- name: Setup SSH for AUR
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh
echo "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
chmod 600 ~/.ssh/aur
echo "Host aur.archlinux.org" >> ~/.ssh/config
echo " IdentityFile ~/.ssh/aur" >> ~/.ssh/config
echo " User aur" >> ~/.ssh/config
ssh-keyscan -t ed25519 aur.archlinux.org >> ~/.ssh/known_hosts
- name: Clone AUR repo
run: |
git clone ssh://aur@aur.archlinux.org/qbz-bin.git /tmp/aur-qbz-bin
- name: Update PKGBUILD
env:
VERSION: ${{ steps.version.outputs.version }}
SHA256: ${{ steps.checksum.outputs.sha256 }}
run: |
cd /tmp/aur-qbz-bin
# Update version
sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
# Reset pkgrel to 1 for new version
sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
# Update checksum
sed -i "s/^sha256sums=.*/sha256sums=('${SHA256}')/" PKGBUILD
cat PKGBUILD
- name: Generate .SRCINFO
run: |
cd /tmp/aur-qbz-bin
docker run --rm -v "$PWD":/pkg -w /pkg archlinux:latest bash -c "
pacman -Sy --noconfirm pacman-contrib
makepkg --printsrcinfo > .SRCINFO
"
cat .SRCINFO
- name: Commit and push to AUR
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
cd /tmp/aur-qbz-bin
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add PKGBUILD .SRCINFO
git commit -m "Update to v${VERSION}"
git push
+91 -32
View File
@@ -5,12 +5,9 @@
<p align="center"> <p align="center">
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/github-vicrodh%2Fqbz-0b0b0b?style=flat&logo=github" alt="GitHub repo" /></a> <a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/github-vicrodh%2Fqbz-0b0b0b?style=flat&logo=github" alt="GitHub repo" /></a>
<a href="https://github.com/vicrodh/qbz/releases"><img src="https://img.shields.io/github/v/release/vicrodh/qbz?style=flat" alt="Release" /></a> <a href="https://github.com/vicrodh/qbz/releases"><img src="https://img.shields.io/github/v/release/vicrodh/qbz?style=flat" alt="Release" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/version-0.1.0-0b0b0b?style=flat" alt="Version" /></a> <a href="https://aur.archlinux.org/packages/qbz-bin"><img src="https://img.shields.io/aur/version/qbz-bin?style=flat&logo=archlinux" alt="AUR" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/github/license/vicrodh/qbz?style=flat" alt="License" /></a> <a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/github/license/vicrodh/qbz?style=flat" alt="License" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/github/last-commit/vicrodh/qbz?style=flat" alt="Last commit" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/platform-Linux-0b0b0b?style=flat&logo=linux" alt="Platform" /></a> <a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/platform-Linux-0b0b0b?style=flat&logo=linux" alt="Platform" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/lang-Rust-0b0b0b?style=flat&logo=rust" alt="Language: Rust" /></a>
<a href="https://github.com/vicrodh/qbz"><img src="https://img.shields.io/badge/ui-Svelte-0b0b0b?style=flat&logo=svelte" alt="UI: Svelte" /></a>
</p> </p>
# QBZ # QBZ
@@ -21,6 +18,31 @@ QBZ is a free and open source (FOSS) Qobuz client for Linux with native, high-fi
Browsers cap audio output around 48 kHz, while Qobuz streams up to 192 kHz. QBZ uses a native playback pipeline with direct device control so your system and DAC receive the original resolution, with caching and system integrations that wrappers cannot provide. Browsers cap audio output around 48 kHz, while Qobuz streams up to 192 kHz. QBZ uses a native playback pipeline with direct device control so your system and DAC receive the original resolution, with caching and system integrations that wrappers cannot provide.
## Installation
### Arch Linux (AUR)
```bash
# Using yay
yay -S qbz-bin
# Using paru
paru -S qbz-bin
```
### Flatpak
```bash
# Download from releases
flatpak install ./QBZ.flatpak
```
### AppImage / Tarball
Download the latest release from the [Releases](https://github.com/vicrodh/qbz/releases) page.
> **Note:** Pre-built binaries include all API integrations (Last.fm, Discogs, Spotify, Tidal) ready to use. If you build from source, you'll need to provide your own API keys.
## Screenshots ## Screenshots
Coming soon. Coming soon.
@@ -29,7 +51,7 @@ Coming soon.
### Streaming and Playback ### Streaming and Playback
- Qobuz authentication and full catalog search (albums, tracks, artists, playlists). - Qobuz authentication and full catalog search (albums, tracks, artists, playlists).
- Native decoding for FLAC and MP3 with real-time playback state updates. - Native decoding for FLAC, MP3, AAC, and ALAC with real-time playback state updates.
- Quality selection with automatic fallback across Qobuz tiers. - Quality selection with automatic fallback across Qobuz tiers.
- Audio device enumeration and per-device output selection. - Audio device enumeration and per-device output selection.
- DAC passthrough mode for bit-perfect playback. - DAC passthrough mode for bit-perfect playback.
@@ -41,6 +63,11 @@ Coming soon.
- Favorites and playlists from your Qobuz account. - Favorites and playlists from your Qobuz account.
- Local library backend: directory scanning, metadata extraction, CUE sheet parsing, and SQLite indexing. - Local library backend: directory scanning, metadata extraction, CUE sheet parsing, and SQLite indexing.
### Playlist Import
- Import playlists from Spotify and Tidal into your Qobuz library.
- Automatic track matching with fuzzy search.
- Batch import with progress tracking.
### Network Casting ### Network Casting
- Chromecast device discovery and streaming. - Chromecast device discovery and streaming.
- DLNA/UPnP device discovery and streaming (AVTransport SOAP). - DLNA/UPnP device discovery and streaming (AVTransport SOAP).
@@ -51,13 +78,21 @@ Coming soon.
- MPRIS media controls and media key support on Linux. - MPRIS media controls and media key support on Linux.
- Desktop notifications for track changes. - Desktop notifications for track changes.
- Last.fm scrobbling and now-playing updates. - Last.fm scrobbling and now-playing updates.
- Discogs artwork fetching for local library.
- Shareable Qobuz URLs and universal SongLink links (Odesli). - Shareable Qobuz URLs and universal SongLink links (Odesli).
### Interface ### Interface
- Now playing, queue panel, and full-screen playback views. - Now playing, queue panel, and full-screen playback views.
- Focus mode for distraction-free listening. - Focus mode for distraction-free listening.
- Mini player mode.
- Keyboard shortcuts for common actions.
- English and Spanish localization. - English and Spanish localization.
### Settings
- Audio device selection and quality preferences.
- API keys configuration for self-hosted builds.
- Theme and appearance options.
## Open Source ## Open Source
QBZ is MIT-licensed and fully open source. No telemetry, no lock-in, and no hidden services. Just a clean, transparent player built for Linux audio fans. QBZ is MIT-licensed and fully open source. No telemetry, no lock-in, and no hidden services. Just a clean, transparent player built for Linux audio fans.
@@ -69,24 +104,29 @@ QBZ draws inspiration from projects like qobuz-dl, and from the broader Linux au
## Tech Stack ## Tech Stack
- **Desktop:** Rust + Tauri 2 - **Desktop:** Rust + Tauri 2
- **Frontend:** SvelteKit + TypeScript + Vite - **Frontend:** SvelteKit 5 + TypeScript + Vite
- **Audio:** rodio + symphonia - **Audio:** rodio + symphonia
- **Networking:** reqwest - **Networking:** reqwest
- **Local library:** walkdir + lofty + rusqlite - **Local library:** walkdir + lofty + rusqlite
- **Integrations:** souvlaki (MPRIS), notify-rust, SongLink (Odesli) - **Integrations:** souvlaki (MPRIS), notify-rust, SongLink (Odesli)
- **UX:** svelte-i18n, lucide-svelte - **UX:** svelte-i18n, lucide-svelte
## Development ## Building from Source
### Prerequisites ### Prerequisites
- Rust (latest stable) - Rust (latest stable)
- Node.js 18+ - Node.js 20+
- Linux with audio support (PipeWire, ALSA, or PulseAudio) - Linux with audio support (PipeWire, ALSA, or PulseAudio)
- System dependencies: `webkit2gtk-4.1`, `gtk3`, `alsa-lib`
### Setup ### Setup
```bash ```bash
# Clone the repository
git clone https://github.com/vicrodh/qbz.git
cd qbz
# Install dependencies # Install dependencies
npm install npm install
@@ -97,11 +137,9 @@ npm run tauri dev
npm run tauri build npm run tauri build
``` ```
### Environment Variables (Building from Source Only) ### Environment Variables
> **Note:** If you're using pre-built binaries from the [Releases](https://github.com/vicrodh/qbz/releases) page, Last.fm integration is already configured and ready to use. The following instructions are only for developers building from source. When building from source, you need to provide your own API keys. Copy the example environment file:
Copy the example environment file and configure it with your credentials:
```bash ```bash
cp .env.example .env cp .env.example .env
@@ -109,42 +147,54 @@ cp .env.example .env
#### Last.fm Integration #### Last.fm Integration
To enable Last.fm scrobbling when building from source, you need to create a Last.fm API application:
1. Go to [Last.fm API Account](https://www.last.fm/api/account/create) 1. Go to [Last.fm API Account](https://www.last.fm/api/account/create)
2. Create a new application (any name works) 2. Create a new application
3. Copy your API Key and Shared Secret 3. Add to `.env`:
4. Update your `.env` file:
```env ```env
LAST_FM_API_KEY=your_api_key_here LAST_FM_API_KEY=your_api_key
LAST_FM_API_SHARED_SECRET=your_shared_secret_here LAST_FM_API_SHARED_SECRET=your_shared_secret
LAST_FM_APP_NAME=your_app_name
LAST_FM_APP_REGISTER=your_lastfm_username
``` ```
The application will work without Last.fm credentials, but scrobbling will be disabled. #### Discogs Integration (Local Library Artwork)
#### Discogs Integration
To enable automatic album artwork fetching from Discogs when building from source:
1. Go to [Discogs Developer Settings](https://www.discogs.com/settings/developers) 1. Go to [Discogs Developer Settings](https://www.discogs.com/settings/developers)
2. Create a new application 2. Create a new application
3. Copy your Consumer Key and Consumer Secret 3. Add to `.env`:
4. Update your `.env` file:
```env ```env
DISCOGS_API_CLIENT_KEY=your_consumer_key_here DISCOGS_API_CLIENT_KEY=your_consumer_key
DISCOGS_API_CLIENT_SECRET=your_consumer_secret_here DISCOGS_API_CLIENT_SECRET=your_consumer_secret
``` ```
The application will work without Discogs credentials, but automatic artwork fetching for local library will be disabled. #### Spotify Integration (Playlist Import)
1. Go to [Spotify Developer Dashboard](https://developer.spotify.com/dashboard)
2. Create a new application
3. Add to `.env`:
```env
SPOTIFY_API_CLIENT_ID=your_client_id
SPOTIFY_API_CLIENT_SECRET=your_client_secret
```
#### Tidal Integration (Playlist Import)
1. Go to [Tidal Developer Portal](https://developer.tidal.com/)
2. Create a new application
3. Add to `.env`:
```env
TIDAL_API_CLIENT_ID=your_client_id
TIDAL_API_CLIENT_SECRET=your_client_secret
```
> **Note:** All integrations are optional. The application will work without them, but the corresponding features will be disabled.
## Project Structure ## Project Structure
``` ```
qbz-nix/ qbz/
├── src/ # Frontend (SvelteKit) ├── src/ # Frontend (SvelteKit)
├── src-tauri/ ├── src-tauri/
│ └── src/ │ └── src/
@@ -155,12 +205,21 @@ qbz-nix/
│ ├── cast/ # Chromecast & DLNA casting │ ├── cast/ # Chromecast & DLNA casting
│ ├── library/ # Local library backend │ ├── library/ # Local library backend
│ ├── lastfm/ # Last.fm integration │ ├── lastfm/ # Last.fm integration
│ ├── discogs/ # Discogs integration
│ ├── playlist_import/ # Spotify/Tidal import
│ ├── share/ # SongLink / share utilities │ ├── share/ # SongLink / share utilities
│ ├── media_controls/ # MPRIS integration │ ├── media_controls/ # MPRIS integration
│ └── commands/ # Tauri IPC commands │ └── commands/ # Tauri IPC commands
├── packaging/
│ ├── aur/ # Arch Linux PKGBUILD
│ └── flatpak/ # Flatpak manifest
└── static/ # Static assets and logo └── static/ # Static assets and logo
``` ```
## Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
## License ## License
MIT MIT
+39
View File
@@ -0,0 +1,39 @@
# Maintainer: blitzkriegfc <blitzkriegfc@proton.me>
pkgname=qbz-bin
pkgver=1.0.0
pkgrel=1
pkgdesc="Native Qobuz client for Linux with Hi-Fi audio support (pre-built binary)"
arch=('x86_64')
url="https://github.com/vicrodh/qbz"
license=('MIT')
depends=('webkit2gtk-4.1' 'gtk3' 'alsa-lib' 'libappindicator-gtk3')
optdepends=(
'pipewire-alsa: PipeWire audio support'
'pipewire-pulse: PulseAudio compatibility'
)
provides=('qbz')
conflicts=('qbz')
options=('!strip')
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/vicrodh/qbz/releases/download/v${pkgver}/qbz_${pkgver}_amd64.tar.gz")
sha256sums=('SKIP')
package() {
cd "${srcdir}"
# Install binary
install -Dm755 "qbz" "${pkgdir}/usr/bin/qbz"
# Install desktop file
install -Dm644 "qbz.desktop" "${pkgdir}/usr/share/applications/qbz.desktop"
# Install icons
for size in 32x32 128x128 256x256; do
if [[ -f "icons/hicolor/${size}/apps/qbz.png" ]]; then
install -Dm644 "icons/hicolor/${size}/apps/qbz.png" \
"${pkgdir}/usr/share/icons/hicolor/${size}/apps/qbz.png"
fi
done
# Install license
install -Dm644 "${srcdir}/../LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" 2>/dev/null || true
}