**Download Sources**: Soulseek (FLAC priority), YouTube (audio extraction), or Hybrid mode (tries primary source, falls back automatically)
**Features**
- Quality profiles: Audiophile, Balanced, Mobile
- Automatic format fallback (FLAC → MP3)
- Duplicate prevention against library
- Batch processing with retry logic
- Synchronized lyrics (LRC) for every track
### Metadata & Reliability
**Dual-Source System**
- **Primary**: Spotify (Preferred for richer data and discovery features)
- **Backup**: iTunes (No authentication required)
- **Redundancy**: System automatically manages both sources. If Spotify is authorized, it is prioritized. If Spotify is unavailable, rate-limited, or unauthorized, SoulSync **seamlessly switches to iTunes** for metadata, cover art, and artist tracking.
- **Fail-Safe**: Even with Spotify authorized, iTunes metadata is maintained as a redundant layer to ensure zero downtime.
- **Backup**: iTunes/Apple Music — no authentication required, works out of the box
- **Seamless switching**: If Spotify is unavailable, rate-limited, or unauthorized, SoulSync automatically falls back to iTunes for metadata, cover art, and artist info
- **MusicBrainz enrichment** — background worker matches artists, albums, and tracks to MusicBrainz IDs with 90-day caching
### Advanced Matching Engine
- Version-aware matching: strictly rejects remixes when you want the original (and vice versa)
- Unicode and accent handling (KoЯn, Bjork, A$AP Rocky)
- Fuzzy matching with weighted confidence scoring (title, artist, duration)
- Album variation detection (Deluxe, Remastered, Taylor's Version, etc.)
- Multi-query search strategy: generates 4-6 query variations per track
- Short title protection: prevents "Love" from matching "Loveless"
- Source-specific weighting: Soulseek prioritizes artist match, YouTube prioritizes title match
### Automation
### Automation
**Watchlist** - Monitor unlimited artists, auto-discover similar artists via music-map.com
**Watchlist** - Monitor unlimited artists with per-artist configuration
- Choose which release types to track: Albums, EPs, Singles
- **Spotify API** credentials ([Dashboard](https://developer.spotify.com/dashboard)) — optional but recommended
- **Media Server** (optional): Plex, Jellyfin, or Navidrome
- **Media Server** (optional): Plex, Jellyfin, or Navidrome
### Step 1: Set Up slskd
### Step 1: Set Up slskd
@ -188,10 +231,12 @@ Open SoulSync at `http://localhost:8008` (or your server's IP) and go to Setting
**Paths:**
**Paths:**
- **Download Path**: This should be the container path where slskd's downloads are mapped. If you followed the volume mapping above, that's `/app/downloads`
- **Download Path**: This should be the container path where slskd's downloads are mapped. If you followed the volume mapping above, that's `/app/downloads`
- **Transfer Path**: This is where SoulSync puts your organized/renamed music. The default is `/app/Transfer` - just make sure you have a volume mapping for it
- **Transfer Path**: This is where SoulSync puts your organized/renamed music. The default is `/app/Transfer` - just make sure you have a volume mapping for it so the files persist and your media server can see them
- **Staging Path**: Optional — for importing existing audio files. Map a host folder to `/app/Staging` if you want to use the import feature
**Media Server** (optional):
**Media Server** (optional):
- **Plex/Jellyfin/Navidrome URL**: Use your machine's actual IP address, not `localhost`. For example `http://192.168.1.100:32400` for Plex. Same reason as slskd - `localhost` inside Docker means the container, not your host machine.
- **Plex/Jellyfin/Navidrome URL**: Use your machine's actual IP address, not `localhost`. For example `http://192.168.1.100:32400` for Plex. Same reason as slskd - `localhost` inside Docker means the container, not your host machine.
- After connecting, run a **Database Update** from the Dashboard to populate your library
### Step 4: Docker Path Mapping
### Step 4: Docker Path Mapping
@ -206,6 +251,7 @@ This is where most issues come from. The key concept: SoulSync runs inside a Doc
| Database | `/app/data` | Use a named volume (see below) |
| Database | `/app/data` | Use a named volume (see below) |
| slskd Downloads | `/app/downloads` | Same folder slskd downloads to |
| slskd Downloads | `/app/downloads` | Same folder slskd downloads to |
| Music Library/Transfer | `/app/Transfer` | Where you want organized music to go |
| Music Library/Transfer | `/app/Transfer` | Where you want organized music to go |
**Important:** The database should use a named volume (`soulsync_database:/app/data`), not a direct host path mount. Mounting a host folder to `/app/database` will overwrite Python module files the app needs to run.
**Important:** The database should use a named volume (`soulsync_database:/app/data`), not a direct host path mount. Mounting a host folder to `/app/database` will overwrite Python module files the app needs to run.
@ -233,7 +281,11 @@ The paths you enter in SoulSync's settings page should always be the **container
### Unraid Users
### Unraid Users
If you're using the Unraid template from Community Applications, double check that the container path for your music share is set to match what SoulSync actually uses. The download folder should map to `/app/downloads` and your library/transfer folder should map to `/app/Transfer`. Then use those same container paths in SoulSync's settings page.
If you're using the Unraid template from Community Applications:
- PUID/PGID are shown during setup — set them to match your permissions (default 99/100)
- The Music Share mount gives SoulSync access to your downloads and library
- Make sure the Transfer Dir path is **writable** — read-only mounts will cause post-processing failures
- After installing, run a **Database Update** from the Dashboard to populate your library
---
---
@ -241,13 +293,13 @@ If you're using the Unraid template from Community Applications, double check th
**Perfect for:**
**Perfect for:**
- Self-hosters with Plex/Jellyfin/Navidrome
- Self-hosters with Plex/Jellyfin/Navidrome
- Music enthusiasts with 500+ album collections
- Music enthusiasts building and maintaining large collections
- Electronic music fans (Beatport integration)
- Electronic music fans (Beatport integration)
- Former Spotify users wanting local discovery
- Former Spotify users wanting local discovery that actually works
**Not ideal for:**
**Not ideal for:**
- Casual users wanting simple sync
- Casual users wanting simple one-click sync
- Slow/metered internet connections
- Slow or metered internet connections
- Users uncomfortable with APIs or Docker
- Users uncomfortable with APIs or Docker
---
---
@ -256,36 +308,41 @@ If you're using the Unraid template from Community Applications, double check th
- **Matching Engine** — version-aware fuzzy matching with multi-strategy query generation and source-specific confidence weighting
- Discovery system with custom algorithms
- **Download Orchestrator** — routes between Soulseek and YouTube with hybrid fallback, batch processing with concurrent workers, automatic retry on failure/timeout
- Download pipeline with quality profiles
- **Discovery System** — custom algorithms for personalized playlists, seasonal content, and similar artist exploration
- Metadata enhancement (lyrics, art, tags)
- **Metadata Pipeline** — dual-source (Spotify/iTunes) with MusicBrainz enrichment, AcoustID verification, LRC lyrics, album art embedding via mutagen
- Template-based file organization
- **Database Update Worker** — incremental sync from media servers with smart early-stopping (Jellyfin fast-path: ~2 API calls vs thousands)
- **Web Scan Manager** — debounced media server scanning with completion callbacks