mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-09 23:55:10 -05:00
docs: update README for multi-provider architecture
This commit is contained in:
118
README.md
118
README.md
@@ -1,6 +1,6 @@
|
|||||||
# Octo-Fiesta
|
# Octo-Fiesta
|
||||||
|
|
||||||
A Subsonic API proxy server that transparently integrates Deezer as a music source. When a song is not available in your local Navidrome library, it is automatically fetched from Deezer, downloaded, and served to your Subsonic-compatible client. The downloaded song is then added to your library, making it available locally for future listens.
|
A Subsonic API proxy server that transparently integrates multiple music streaming providers as sources. When a song is not available in your local Navidrome library, it is automatically fetched from your configured provider, downloaded, and served to your Subsonic-compatible client. The downloaded song is then added to your library, making it available locally for future listens.
|
||||||
|
|
||||||
## Why "Octo-Fiesta"?
|
## Why "Octo-Fiesta"?
|
||||||
|
|
||||||
@@ -8,13 +8,15 @@ The name was randomly generated by GitHub when creating the repository. We found
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
- **Multi-Provider Architecture**: Pluggable music service system supporting multiple streaming providers (Deezer, Qobuz, and more to come)
|
||||||
- **Transparent Proxy**: Acts as a middleware between Subsonic clients (like Aonsoku, Sublime Music, etc.) and your Navidrome server
|
- **Transparent Proxy**: Acts as a middleware between Subsonic clients (like Aonsoku, Sublime Music, etc.) and your Navidrome server
|
||||||
- **Deezer Integration**: Seamlessly searches and streams music from Deezer when not available locally
|
- **Seamless Integration**: Automatically searches and streams music from your configured provider when not available locally
|
||||||
- **Automatic Downloads**: Songs are downloaded on-the-fly and cached for future use
|
- **Automatic Downloads**: Songs are downloaded on-the-fly and cached for future use
|
||||||
|
- **Hi-Res Audio Support**: Qobuz provider supports up to 24-bit/192kHz FLAC quality
|
||||||
- **Full Metadata Embedding**: Downloaded files include complete ID3 tags (title, artist, album, track number, year, genre, BPM, ISRC, etc.) and embedded cover art
|
- **Full Metadata Embedding**: Downloaded files include complete ID3 tags (title, artist, album, track number, year, genre, BPM, ISRC, etc.) and embedded cover art
|
||||||
- **Organized Library**: Downloads are saved in a clean `Artist/Album/Track.mp3` folder structure
|
- **Organized Library**: Downloads are saved in a clean `Artist/Album/Track` folder structure
|
||||||
- **Artist Deduplication**: Merges local and Deezer artists to avoid duplicates in search results
|
- **Artist Deduplication**: Merges local and streaming provider artists to avoid duplicates in search results
|
||||||
- **Album Enrichment**: Local albums are enriched with missing tracks from Deezer
|
- **Album Enrichment**: Local albums are enriched with missing tracks from streaming providers
|
||||||
- **Cover Art Proxy**: Serves cover art for external content transparently
|
- **Cover Art Proxy**: Serves cover art for external content transparently
|
||||||
|
|
||||||
## Compatible Clients
|
## Compatible Clients
|
||||||
@@ -37,12 +39,21 @@ The name was randomly generated by GitHub when creating the repository. We found
|
|||||||
|
|
||||||
These clients are **not compatible** with octo-fiesta due to architectural limitations:
|
These clients are **not compatible** with octo-fiesta due to architectural limitations:
|
||||||
|
|
||||||
- [Symfonium](https://symfonium.app/) - Uses offline-first architecture and never queries the server for searches, making Deezer integration impossible. [See details](https://support.symfonium.app/t/suggestions-on-search-function/1121/)
|
- [Symfonium](https://symfonium.app/) - Uses offline-first architecture and never queries the server for searches, making streaming provider integration impossible. [See details](https://support.symfonium.app/t/suggestions-on-search-function/1121/)
|
||||||
|
|
||||||
|
## Supported Music Providers
|
||||||
|
|
||||||
|
- **[Deezer](https://www.deezer.com/)** - Quality: FLAC, MP3_320, MP3_128
|
||||||
|
- **[Qobuz](https://www.qobuz.com/)** - Quality: FLAC, FLAC_24_HIGH (Hi-Res 24-bit/192kHz), FLAC_24_LOW, FLAC_16, MP3_320
|
||||||
|
|
||||||
|
Choose your preferred provider via the `MUSIC_SERVICE` environment variable. Additional providers may be added in future releases.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- A running Subsonic-compatible server (developed and tested with [Navidrome](https://www.navidrome.org/))
|
- A running Subsonic-compatible server (developed and tested with [Navidrome](https://www.navidrome.org/))
|
||||||
- A Deezer ARL token (for downloading)
|
- Credentials for at least one music provider:
|
||||||
|
- **Deezer**: ARL token from browser cookies
|
||||||
|
- **Qobuz**: User ID + User Auth Token from browser localStorage ([see Wiki guide](https://github.com/V1ck3s/octo-fiesta/wiki/Getting-Qobuz-Credentials-(User-ID-&-Token)))
|
||||||
- Docker and Docker Compose (recommended) **or** [.NET 9.0 SDK](https://dotnet.microsoft.com/download/dotnet/9.0) for manual installation
|
- Docker and Docker Compose (recommended) **or** [.NET 9.0 SDK](https://dotnet.microsoft.com/download/dotnet/9.0) for manual installation
|
||||||
|
|
||||||
## Quick Start (Docker)
|
## Quick Start (Docker)
|
||||||
@@ -62,12 +73,17 @@ The easiest way to run Octo-Fiesta is with Docker Compose.
|
|||||||
# Path where downloaded songs will be stored on the host
|
# Path where downloaded songs will be stored on the host
|
||||||
DOWNLOAD_PATH=./downloads
|
DOWNLOAD_PATH=./downloads
|
||||||
|
|
||||||
# Deezer ARL token (required)
|
# Music service provider (Deezer or Qobuz)
|
||||||
DEEZER_ARL=your-deezer-arl-token
|
MUSIC_SERVICE=Qobuz
|
||||||
|
|
||||||
# Preferred audio quality (optional): FLAC, MP3_320, MP3_128
|
# === Qobuz Configuration (if using Qobuz) ===
|
||||||
# If not set, the highest available quality for your account will be used
|
QOBUZ_USER_AUTH_TOKEN=your-qobuz-token
|
||||||
DEEZER_QUALITY=
|
QOBUZ_USER_ID=your-qobuz-user-id
|
||||||
|
QOBUZ_QUALITY=FLAC # FLAC, FLAC_24_HIGH, FLAC_24_LOW, FLAC_16, MP3_320
|
||||||
|
|
||||||
|
# === Deezer Configuration (if using Deezer) ===
|
||||||
|
DEEZER_ARL=your-deezer-arl-token
|
||||||
|
DEEZER_QUALITY=FLAC # FLAC, MP3_320, MP3_128
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Start the container**
|
3. **Start the container**
|
||||||
@@ -85,40 +101,45 @@ The easiest way to run Octo-Fiesta is with Docker Compose.
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
### Subsonic Settings
|
### General Settings
|
||||||
|
|
||||||
| Setting | Description |
|
| Setting | Description |
|
||||||
|---------|-------------|
|
|---------|-------------|
|
||||||
| `Subsonic:Url` | URL of your Navidrome/Subsonic server |
|
| `Subsonic:Url` | URL of your Navidrome/Subsonic server |
|
||||||
|
| `Subsonic:MusicService` | Music provider to use: `Deezer` or `Qobuz` (default: `Deezer`) |
|
||||||
### Library Settings
|
|
||||||
|
|
||||||
| Setting | Description |
|
|
||||||
|---------|-------------|
|
|
||||||
| `Library:DownloadPath` | Directory where downloaded songs are stored |
|
| `Library:DownloadPath` | Directory where downloaded songs are stored |
|
||||||
|
|
||||||
### Deezer Settings
|
### Deezer Settings
|
||||||
|
|
||||||
| Setting | Description |
|
| Setting | Description |
|
||||||
|---------|-------------|
|
|---------|-------------|
|
||||||
| `Deezer:Arl` | Your Deezer ARL token (required for downloads) |
|
| `Deezer:Arl` | Your Deezer ARL token (required if using Deezer) |
|
||||||
| `Deezer:ArlFallback` | Backup ARL token if primary fails |
|
| `Deezer:ArlFallback` | Backup ARL token if primary fails |
|
||||||
| `Deezer:Quality` | Preferred audio quality: `FLAC`, `MP3_320`, `MP3_128`. If not specified, the highest available quality for your account will be used |
|
| `Deezer:Quality` | Preferred audio quality: `FLAC`, `MP3_320`, `MP3_128`. If not specified, the highest available quality for your account will be used |
|
||||||
|
|
||||||
### Getting a Deezer ARL Token
|
### Qobuz Settings
|
||||||
|
|
||||||
1. Log in to [Deezer](https://www.deezer.com) in your browser
|
| Setting | Description |
|
||||||
2. Open Developer Tools (F12)
|
|---------|-------------|
|
||||||
3. Go to Application > Cookies > `https://www.deezer.com`
|
| `Qobuz:UserAuthToken` | Your Qobuz User Auth Token (required if using Qobuz) - [How to get it](https://github.com/V1ck3s/octo-fiesta/wiki/Getting-Qobuz-Credentials-(User-ID-&-Token)) |
|
||||||
4. Find the `arl` cookie and copy its value
|
| `Qobuz:UserId` | Your Qobuz User ID (required if using Qobuz) |
|
||||||
|
| `Qobuz:Quality` | Preferred audio quality: `FLAC`, `FLAC_24_HIGH`, `FLAC_24_LOW`, `FLAC_16`, `MP3_320`. If not specified, the highest available quality will be used |
|
||||||
|
|
||||||
> **Note**: ARL tokens expire periodically and need to be refreshed.
|
### Getting Credentials
|
||||||
|
|
||||||
|
#### Deezer ARL Token
|
||||||
|
|
||||||
|
See the [Wiki guide](https://github.com/V1ck3s/octo-fiesta/wiki/Getting-Deezer-Credentials-(ARL-Token)) for detailed instructions on obtaining your Deezer ARL token.
|
||||||
|
|
||||||
|
#### Qobuz Credentials
|
||||||
|
|
||||||
|
See the [Wiki guide](https://github.com/V1ck3s/octo-fiesta/wiki/Getting-Qobuz-Credentials-(User-ID-&-Token)) for detailed instructions on obtaining your Qobuz User ID and User Auth Token.
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
- **Playlist Search**: Subsonic clients like Aonsoku filter playlists client-side from a cached `getPlaylists` call. Deezer playlists appear in global search (`search3`) but not in the Playlists tab filter.
|
- **Playlist Search**: Subsonic clients like Aonsoku filter playlists client-side from a cached `getPlaylists` call. Streaming provider playlists appear in global search (`search3`) but not in the Playlists tab filter.
|
||||||
- **Region Restrictions**: Some Deezer tracks may be unavailable depending on your region.
|
- **Region Restrictions**: Some tracks may be unavailable depending on your region and provider.
|
||||||
- **ARL Expiration**: Deezer ARL tokens expire and need periodic refresh.
|
- **Token Expiration**: Provider authentication tokens expire and need periodic refresh.
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
@@ -131,9 +152,10 @@ The easiest way to run Octo-Fiesta is with Docker Compose.
|
|||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
┌─────────────────┐
|
┌─────────────────┐
|
||||||
│ Deezer API │
|
│ Music Providers │
|
||||||
│ (Metadata + │
|
│ - Deezer │
|
||||||
│ Downloads) │
|
│ - Qobuz │
|
||||||
|
│ - (more...) │
|
||||||
└─────────────────┘
|
└─────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -158,14 +180,21 @@ If you prefer to run Octo-Fiesta without Docker:
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"Subsonic": {
|
"Subsonic": {
|
||||||
"Url": "http://your-navidrome-server:4533"
|
"Url": "http://your-navidrome-server:4533",
|
||||||
|
"MusicService": "Qobuz"
|
||||||
},
|
},
|
||||||
"Library": {
|
"Library": {
|
||||||
"DownloadPath": "./downloads"
|
"DownloadPath": "./downloads"
|
||||||
},
|
},
|
||||||
|
"Qobuz": {
|
||||||
|
"UserAuthToken": "your-qobuz-token",
|
||||||
|
"UserId": "your-qobuz-user-id",
|
||||||
|
"Quality": "FLAC"
|
||||||
|
},
|
||||||
"Deezer": {
|
"Deezer": {
|
||||||
"Arl": "your-deezer-arl-token",
|
"Arl": "your-deezer-arl-token",
|
||||||
"ArlFallback": ""
|
"ArlFallback": "",
|
||||||
|
"Quality": "FLAC"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -184,13 +213,13 @@ If you prefer to run Octo-Fiesta without Docker:
|
|||||||
|
|
||||||
## API Endpoints
|
## API Endpoints
|
||||||
|
|
||||||
The proxy implements the Subsonic API and adds transparent Deezer integration to:
|
The proxy implements the Subsonic API and adds transparent streaming provider integration to:
|
||||||
|
|
||||||
| Endpoint | Description |
|
| Endpoint | Description |
|
||||||
|----------|-------------|
|
|----------|-------------|
|
||||||
| `GET /rest/search3` | Merged search results from Navidrome + Deezer |
|
| `GET /rest/search3` | Merged search results from Navidrome + streaming provider |
|
||||||
| `GET /rest/stream` | Streams audio, downloading from Deezer if needed |
|
| `GET /rest/stream` | Streams audio, downloading from provider if needed |
|
||||||
| `GET /rest/getSong` | Returns song details (local or Deezer) |
|
| `GET /rest/getSong` | Returns song details (local or from provider) |
|
||||||
| `GET /rest/getAlbum` | Returns album with tracks from both sources |
|
| `GET /rest/getAlbum` | Returns album with tracks from both sources |
|
||||||
| `GET /rest/getArtist` | Returns artist with albums from both sources |
|
| `GET /rest/getArtist` | Returns artist with albums from both sources |
|
||||||
| `GET /rest/getCoverArt` | Proxies cover art for external content |
|
| `GET /rest/getCoverArt` | Proxies cover art for external content |
|
||||||
@@ -199,13 +228,13 @@ All other Subsonic API endpoints are passed through to Navidrome unchanged.
|
|||||||
|
|
||||||
## External ID Format
|
## External ID Format
|
||||||
|
|
||||||
External (Deezer) content uses typed IDs:
|
External (streaming provider) content uses typed IDs:
|
||||||
|
|
||||||
| Type | Format | Example |
|
| Type | Format | Example |
|
||||||
|------|--------|---------|
|
|------|--------|---------|
|
||||||
| Song | `ext-deezer-song-{id}` | `ext-deezer-song-123456` |
|
| Song | `ext-{provider}-song-{id}` | `ext-deezer-song-123456`, `ext-qobuz-song-789012` |
|
||||||
| Album | `ext-deezer-album-{id}` | `ext-deezer-album-789012` |
|
| Album | `ext-{provider}-album-{id}` | `ext-deezer-album-789012`, `ext-qobuz-album-456789` |
|
||||||
| Artist | `ext-deezer-artist-{id}` | `ext-deezer-artist-259` |
|
| Artist | `ext-{provider}-artist-{id}` | `ext-deezer-artist-259`, `ext-qobuz-artist-123` |
|
||||||
|
|
||||||
Legacy format `ext-deezer-{id}` is also supported (assumes song type).
|
Legacy format `ext-deezer-{id}` is also supported (assumes song type).
|
||||||
|
|
||||||
@@ -257,10 +286,14 @@ octo-fiesta/
|
|||||||
│ └── SubsonicController.cs # Main API controller
|
│ └── SubsonicController.cs # Main API controller
|
||||||
├── Models/
|
├── Models/
|
||||||
│ ├── MusicModels.cs # Song, Album, Artist, etc.
|
│ ├── MusicModels.cs # Song, Album, Artist, etc.
|
||||||
│ └── SubsonicSettings.cs # Configuration model
|
│ ├── SubsonicSettings.cs # Configuration model
|
||||||
|
│ └── QobuzSettings.cs # Qobuz configuration
|
||||||
├── Services/
|
├── Services/
|
||||||
│ ├── DeezerDownloadService.cs # Deezer download & decryption
|
│ ├── DeezerDownloadService.cs # Deezer download & decryption
|
||||||
│ ├── DeezerMetadataService.cs # Deezer API integration
|
│ ├── DeezerMetadataService.cs # Deezer API integration
|
||||||
|
│ ├── QobuzBundleService.cs # Qobuz App ID/secret extraction
|
||||||
|
│ ├── QobuzDownloadService.cs # Qobuz download service
|
||||||
|
│ ├── QobuzMetadataService.cs # Qobuz API integration
|
||||||
│ ├── IDownloadService.cs # Download interface
|
│ ├── IDownloadService.cs # Download interface
|
||||||
│ ├── IMusicMetadataService.cs # Metadata interface
|
│ ├── IMusicMetadataService.cs # Metadata interface
|
||||||
│ └── LocalLibraryService.cs # Local file management
|
│ └── LocalLibraryService.cs # Local file management
|
||||||
@@ -287,4 +320,5 @@ GPL-3.0
|
|||||||
|
|
||||||
- [Navidrome](https://www.navidrome.org/) - The excellent self-hosted music server
|
- [Navidrome](https://www.navidrome.org/) - The excellent self-hosted music server
|
||||||
- [Deezer](https://www.deezer.com/) - Music streaming service
|
- [Deezer](https://www.deezer.com/) - Music streaming service
|
||||||
|
- [Qobuz](https://www.qobuz.com/) - Hi-Res music streaming service
|
||||||
- [Subsonic API](http://www.subsonic.org/pages/api.jsp) - The API specification
|
- [Subsonic API](http://www.subsonic.org/pages/api.jsp) - The API specification
|
||||||
|
|||||||
Reference in New Issue
Block a user