12 KiB
🎵 SoulSync - Automated Music Discovery & Collection Manager
Bridge the gap between streaming services and your local music library. Automatically sync Spotify/Tidal/YouTube playlists to Plex/Jellyfin/Navidrome via Soulseek.
⚠️ CRITICAL: You MUST configure file sharing in slskd before using SoulSync. Users who only download without sharing get banned by the Soulseek community. Set up shared folders in slskd's web interface at
http://localhost:5030/shares- share your music library or downloads folder.
✨ What It Does
- Auto-sync playlists from Spotify/Tidal/YouTube to your media server
- Smart matching finds what you're missing vs what you own
- Download missing tracks from Soulseek with FLAC priority
- Metadata enhancement adds proper tags and album art
- Automatic lyrics synchronized LRC files for every download
- Auto server scanning triggers library scans after downloads
- Auto database updates keeps SoulSync database current
- File organization creates clean folder structures
- Artist discovery browse complete discographies with similar artists recommendations powered by music-map.com
- Music library browser comprehensive collection management with search and completion tracking
- Wishlist system saves failed downloads for automatic retry
- Artist watchlist monitors for new releases and adds missing tracks
- Discover page intelligent music discovery using your watchlist to curate personalized playlists
- Background automation retries failed downloads every hour
Star History
🚀 Three Ways to Run
1. Desktop GUI (Original)
Full PyQt6 desktop application with all features.
git clone https://github.com/Nezreka/SoulSync
cd SoulSync
pip install -r requirements.txt
python main.py
2. Web UI (New!)
Browser-based interface - same features, runs anywhere.
python web_server.py
# Open http://localhost:8008
3. Docker (New!)
Containerized web UI with persistent database.
# Option 1: Use docker-compose (recommended)
curl -O https://raw.githubusercontent.com/Nezreka/SoulSync/main/docker-compose.yml
docker-compose up -d
# Option 2: Run directly
docker run -d -p 8008:8008 boulderbadgedad/soulsync:latest
# Open http://localhost:8008
⚡ Quick Setup
Prerequisites
- slskd: Download from GitHub, run on port 5030
- Spotify API: Get Client ID/Secret (see setup below)
- Tidal API: Get Client ID/Secret (see setup below)
- Media Server: Plex, Jellyfin, or Navidrome (optional but recommended)
🔑 API Setup Guide
Spotify API Setup
- Go to Spotify Developer Dashboard
- Click "Create App"
- Fill out the form:
- App Name:
SoulSync(or whatever you want) - App Description:
Music library sync - Website:
http://localhost(or leave blank) - Redirect URI:
http://localhost:8888/callback
- App Name:
- Click "Save"
- Click "Settings" on your new app
- Copy the Client ID and Client Secret
Tidal API Setup
- Go to Tidal Developer Dashboard
- Click "Create New App"
- Fill out the form:
- App Name:
SoulSync - Description:
Music library sync - Redirect URI:
http://localhost:8889/callback - Scopes: Select
user.readandplaylists.read
- App Name:
- Click "Save"
- Copy the Client ID and Client Secret
Plex Token Setup
Easy Method:
- Open Plex in your browser and sign in
- Go to any movie/show page
- Click "Get Info" or three dots menu → "View XML"
- In the URL bar, copy everything after
X-Plex-Token=- Example:
http://192.168.1.100:32400/library/metadata/123?X-Plex-Token=YOUR_TOKEN_HERE
- Example:
- Your Plex server URL is typically
http://YOUR_IP:32400
Alternative Method:
- Go to plex.tv/claim while logged in
- Your 4-minute claim token appears - this isn't what you need
- Instead, right-click → Inspect → Network tab → Reload page
- Look for requests with
X-Plex-Tokenheader and copy that value
Navidrome Setup
Easy Method:
- Open your Navidrome web interface and sign in
- Go to Settings → Users
- Click on your user account
- Under Token, click "Generate API Token"
- Copy the generated token
- Your Navidrome server URL is typically
http://YOUR_IP:4533
Using Username/Password:
- You can also use your regular username and password instead of a token
- SoulSync supports both authentication methods for Navidrome
Jellyfin Setup
- Open your Jellyfin web interface and sign in
- Go to Settings → API Keys
- Click "+" to create a new API key
- Give it a name like "SoulSync"
- Copy the generated API key
- Your Jellyfin server URL is typically
http://YOUR_IP:8096
Final Steps
- Set up slskd with downloads folder and API key
- Launch SoulSync, go to Settings, enter all your API credentials
- Configure your download and transfer folder paths
- Important: Share music in slskd to avoid bans
Docker Notes
- Database persists between rebuilds via named volume
- Mount drives containing your download/transfer folders:
volumes: - /mnt/c:/host/mnt/c:rw # For C: drive paths - /mnt/d:/host/mnt/d:rw # For D: drive paths - Uses separate database from GUI/WebUI versions
Docker OAuth Fix (Remote Access)
If accessing SoulSync from a different machine than where it's running:
- Set your Spotify callback URL to
http://127.0.0.1:8888/callback - Open SoulSync settings and click authenticate
- Complete Spotify authorization - you'll be redirected to
http://127.0.0.1:8888/callback?code=SOME_CODE_HERE - If the page fails to load, edit the URL to use your actual SoulSync IP:
- Change:
http://127.0.0.1:8888/callback?code=SOME_CODE_HERE - To:
http://192.168.1.5:8888/callback?code=SOME_CODE_HERE
- Change:
- Press Enter and authentication should complete
Note: Spotify only allows 127.0.0.1 as a local redirect URI, hence this workaround. You may need to repeat this process after rebuilding containers.
🎵 Beatport Integration
Discover the hottest dance music with our fresh Beatport integration. Whether you're following superstar DJs or hunting for underground gems, SoulSync pulls directly from Beatport's extensive catalog.
Chart Explorer: Browse featured charts, DJ curated sets, and trending tracks Genre Deep Dive: Discover new releases and popular tracks by genre One-Click Downloads: Grab entire charts or individual tracks instantly Premium Discovery: Access the same charts that DJs use to find their next big tracks
Just hit up the Beatport section in the web UI and start exploring. Perfect for DJs building sets or anyone who wants to stay ahead of the curve on electronic music trends.
🎧 Discover Page - Intelligent Music Discovery
The Discover page is your personalized music recommendation engine, powered by your watchlist and listening habits. Unlike generic algorithms, it builds recommendations based on artists you actively care about.
How It Works
Watchlist-Driven Discovery
- Add artists to your watchlist on the Artists page
- SoulSync automatically builds a database of similar artists using music-map.com
- This creates a web of related artists based on your taste, not generic popularity
Curated Playlists The Discover page generates three intelligent playlists:
-
Release Radar - New releases from the past 7 days
- Tracks from your watchlist artists
- Tracks from similar artists in the database
- Tracks from artists already in your library
- Always fresh, always relevant
-
Discovery Weekly - Curated selection of recent music
- Similar to Release Radar but with a broader time window
- Helps you catch up on releases you might have missed
- Blends familiar and new artists
-
Featured Artist Slideshow
- Hero carousel showcasing similar artists you might like
- Shows why each artist is recommended (e.g., "Similar to 5 artists in your watchlist")
- One-click add to watchlist or view full discography
- Genre tags and popularity indicators
The Discovery Flow
Your Watchlist → Similar Artists Database → Spotify API → Curated Playlists
↓ ↓ ↓ ↓
Artists you Related artists New releases Personalized
follow from music-map and catalogs discovery
Key Features:
- 📊 Data-driven: Uses actual music relationship data, not just popularity
- 🎯 Personalized: Built around your specific tastes via watchlist
- 🔄 Always fresh: Release Radar updates daily with new music
- 🎨 Visual discovery: Hero slideshow makes finding new artists engaging
- 📥 One-click downloads: Add entire playlists or individual tracks instantly
Why It's Different
Traditional recommendation engines suggest popular artists or use collaborative filtering ("people who liked X also liked Y"). SoulSync's Discover page is different:
- Taste-focused: Only recommends based on artists you explicitly watch
- Relationship-based: Uses actual musical similarities via music-map
- Library-aware: Considers what you already own to avoid duplicates
- Fresh content: Prioritizes new releases over backcatalog
- Transparent: Shows you exactly why each artist is recommended
Perfect for discovering new music that actually matches your taste, not what's trending globally.
📁 File Flow
- Search: Query Soulseek via slskd API
- Download: Files saved to configured download folder
- Process: Auto-organize to transfer folder with metadata enhancement
- Lyrics: Automatic LRC file generation using LRClib.net API
- Server Scan: Triggers library scan on your media server (60s delay)
- Database Sync: Updates SoulSync database with new tracks
- Structure:
Transfer/Artist/Artist - Album/01 - Track.flac+01 - Track.lrc - Import: Media server picks up organized files with lyrics
🔧 Config Example
{
"spotify": {
"client_id": "your_client_id",
"client_secret": "your_client_secret"
},
"plex": {
"base_url": "http://localhost:32400",
"token": "your_plex_token"
},
"jellyfin": {
"base_url": "http://localhost:8096",
"api_key": "your_jellyfin_api_key"
},
"navidrome": {
"base_url": "http://localhost:4533",
"username": "your_username",
"password": "your_password"
},
"soulseek": {
"slskd_url": "http://localhost:5030",
"api_key": "your_api_key",
"download_path": "/path/to/downloads",
"transfer_path": "/path/to/music/library"
}
}
⚠️ Important Notes
- Must share files in slskd - downloaders without shares get banned
- Docker uses separate database from GUI/WebUI versions
- Transfer path should point to your media server music library
- FLAC preferred but supports all common formats
- OAuth from different devices: See DOCKER-OAUTH-FIX.md if you get "Insecure redirect URI" errors
🏗️ Architecture
- Core: Service clients for Spotify, Plex, Jellyfin, Navidrome, Soulseek
- Database: SQLite with full media library cache and automatic updates
- UI: PyQt6 desktop + Flask web interface
- Matching: Advanced text normalization and scoring
- Lyrics: LRClib.net integration for synchronized lyrics
- Automation: Multi-threaded with automatic retry, scanning, and database updates
Modern, clean, automated. Set it up once, let it manage your music library.