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_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">
<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"><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/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/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>
# 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.
## 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
Coming soon.
@@ -29,7 +51,7 @@ Coming soon.
### Streaming and Playback
- 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.
- Audio device enumeration and per-device output selection.
- DAC passthrough mode for bit-perfect playback.
@@ -41,6 +63,11 @@ Coming soon.
- Favorites and playlists from your Qobuz account.
- 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
- Chromecast device discovery and streaming.
- DLNA/UPnP device discovery and streaming (AVTransport SOAP).
@@ -51,13 +78,21 @@ Coming soon.
- MPRIS media controls and media key support on Linux.
- Desktop notifications for track changes.
- Last.fm scrobbling and now-playing updates.
- Discogs artwork fetching for local library.
- Shareable Qobuz URLs and universal SongLink links (Odesli).
### Interface
- Now playing, queue panel, and full-screen playback views.
- Focus mode for distraction-free listening.
- Mini player mode.
- Keyboard shortcuts for common actions.
- English and Spanish localization.
### Settings
- Audio device selection and quality preferences.
- API keys configuration for self-hosted builds.
- Theme and appearance options.
## 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.
@@ -69,24 +104,29 @@ QBZ draws inspiration from projects like qobuz-dl, and from the broader Linux au
## Tech Stack
- **Desktop:** Rust + Tauri 2
- **Frontend:** SvelteKit + TypeScript + Vite
- **Frontend:** SvelteKit 5 + TypeScript + Vite
- **Audio:** rodio + symphonia
- **Networking:** reqwest
- **Local library:** walkdir + lofty + rusqlite
- **Integrations:** souvlaki (MPRIS), notify-rust, SongLink (Odesli)
- **UX:** svelte-i18n, lucide-svelte
## Development
## Building from Source
### Prerequisites
- Rust (latest stable)
- Node.js 18+
- Node.js 20+
- Linux with audio support (PipeWire, ALSA, or PulseAudio)
- System dependencies: `webkit2gtk-4.1`, `gtk3`, `alsa-lib`
### Setup
```bash
# Clone the repository
git clone https://github.com/vicrodh/qbz.git
cd qbz
# Install dependencies
npm install
@@ -97,11 +137,9 @@ npm run tauri dev
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.
Copy the example environment file and configure it with your credentials:
When building from source, you need to provide your own API keys. Copy the example environment file:
```bash
cp .env.example .env
@@ -109,42 +147,54 @@ cp .env.example .env
#### 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)
2. Create a new application (any name works)
3. Copy your API Key and Shared Secret
4. Update your `.env` file:
2. Create a new application
3. Add to `.env`:
```env
LAST_FM_API_KEY=your_api_key_here
LAST_FM_API_SHARED_SECRET=your_shared_secret_here
LAST_FM_APP_NAME=your_app_name
LAST_FM_APP_REGISTER=your_lastfm_username
LAST_FM_API_KEY=your_api_key
LAST_FM_API_SHARED_SECRET=your_shared_secret
```
The application will work without Last.fm credentials, but scrobbling will be disabled.
#### Discogs Integration
To enable automatic album artwork fetching from Discogs when building from source:
#### Discogs Integration (Local Library Artwork)
1. Go to [Discogs Developer Settings](https://www.discogs.com/settings/developers)
2. Create a new application
3. Copy your Consumer Key and Consumer Secret
4. Update your `.env` file:
3. Add to `.env`:
```env
DISCOGS_API_CLIENT_KEY=your_consumer_key_here
DISCOGS_API_CLIENT_SECRET=your_consumer_secret_here
DISCOGS_API_CLIENT_KEY=your_consumer_key
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
```
qbz-nix/
qbz/
├── src/ # Frontend (SvelteKit)
├── src-tauri/
│ └── src/
@@ -155,12 +205,21 @@ qbz-nix/
│ ├── cast/ # Chromecast & DLNA casting
│ ├── library/ # Local library backend
│ ├── lastfm/ # Last.fm integration
│ ├── discogs/ # Discogs integration
│ ├── playlist_import/ # Spotify/Tidal import
│ ├── share/ # SongLink / share utilities
│ ├── media_controls/ # MPRIS integration
│ └── commands/ # Tauri IPC commands
├── packaging/
│ ├── aur/ # Arch Linux PKGBUILD
│ └── flatpak/ # Flatpak manifest
└── static/ # Static assets and logo
```
## Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
## License
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
}