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:
1 parent
1b6c895f62
commit
7287da5b27
4 files changed
+245
-32
No files matched your search
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
Reference in new issue
Block a user