Automated Music Discovery and Collection Manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Broque Thomas 31903990fa
ensure listenbrainz is saved to db
1 day ago
.claude download bubbles for discoverp age 1 month ago
assets rate limiting 4 months ago
config Add customizable file organization templates 1 week ago
core Improve wishlist track sorting robustness 5 days ago
database Improve artist handling and preserve album data in sync 1 week ago
logs Add Docker support and improve headless compatibility 3 months ago
services Improve artist handling and preserve album data in sync 1 week ago
templates Update soulsync.xml 1 week ago
ui connect watchlist settings to scan 4 weeks ago
utils Add dynamic log level control via Web UI 2 weeks ago
webui Update style.css 4 days ago
.dockerignore Update Docker setup and config paths 3 months ago
.gitattributes update readme 1 month ago
.gitignore Update .gitignore 4 months ago
DOCKER-OAUTH-FIX.md Add Docker OAuth authentication troubleshooting guide 3 months ago
DOCKER-TRANSFER-GUIDE.md Create DOCKER-TRANSFER-GUIDE.md 1 week ago
DOCKER.md Create DOCKER.md 3 months ago
DOCKER_PERMISSIONS.md Add manual track matching and Docker permission docs 3 months ago
Dockerfile unraid fix 1 month ago
README-Docker.md Add Docker support and improve headless compatibility 3 months ago
README.md Add customizable file organization templates 1 week ago
UNRAID.md Update database mount path and docs for SoulSync 3 months ago
beatport_unified_scraper.py beatport progress 3 months ago
docker-compose.yml Update docker-compose.yml 2 weeks ago
entrypoint.sh unraid fix 1 month ago
license.txt Create license.txt 4 months ago
main.py Add dynamic log level control via Web UI 2 weeks ago
requirements-webui.txt Update requirements-webui.txt 3 months ago
requirements.txt auto lyric download 3 months ago
web_server.py ensure listenbrainz is saved to db 1 day ago

README.md

SoulSync Logo

🎵 SoulSync - Automated Music Discovery & Collection Manager

Bridge streaming services to your local music library. Automatically sync Spotify/Tidal/YouTube playlists to Plex/Jellyfin/Navidrome via Soulseek with intelligent matching, metadata enhancement, and automated discovery.

⚠️ CRITICAL: Configure file sharing in slskd before use. Users who only download without sharing get banned by the Soulseek community. Set up shared folders at http://localhost:5030/shares.

📢 Development Focus: New features are developed for the Web UI version. The Desktop GUI receives maintenance and bug fixes only.

Core Features

Sync & Download

  • Auto-sync playlists from Spotify/Tidal/YouTube to your media server
  • Smart matching against your existing library
  • FLAC-priority downloads from Soulseek with automatic fallback
  • Customizable file organization with template-based path structures
  • Synchronized lyrics (LRC) for every track via LRClib.net

Metadata & Organization

  • Enhanced metadata with album art and proper tags
  • Flexible folder templates: $albumartist/$album/$track - $title
  • Automatic library scanning and database updates
  • Clean, organized music collection

Discovery & Automation

  • Browse complete artist discographies with similar artist recommendations
  • Intelligent music discovery using your watchlist (music-map.com integration)
  • Curated playlists: Release Radar, Discovery Weekly, Seasonal Mixes
  • Beatport chart integration for electronic music
  • Artist watchlist monitors new releases automatically

Management

  • Comprehensive library browser with search and completion tracking
  • Wishlist system with automatic retry (30-minute intervals)
  • Granular wishlist management (remove individual tracks or entire albums)
  • Dynamic log level control (DEBUG/INFO/WARNING/ERROR)
  • Background automation handles retries and database updates

🚀 Installation

# Using docker-compose
curl -O https://raw.githubusercontent.com/Nezreka/SoulSync/main/docker-compose.yml
docker-compose up -d

# Or run directly
docker run -d -p 8008:8008 boulderbadgedad/soulsync:latest

# Access at http://localhost:8008

Web UI (Python)

git clone https://github.com/Nezreka/SoulSync
cd SoulSync
pip install -r requirements.txt
python web_server.py
# Open http://localhost:8008

Desktop GUI

git clone https://github.com/Nezreka/SoulSync
cd SoulSync
pip install -r requirements.txt
python main.py

Quick Setup

Prerequisites

API Credentials

Spotify

  1. Create app → Settings
  2. Add redirect URI: http://127.0.0.1:8888/callback
  3. Copy Client ID and Secret

Tidal

  1. Create app
  2. Add redirect URI: http://127.0.0.1:8889/callback
  3. Add scopes: user.read, playlists.read
  4. Copy Client ID and Secret

Plex

  • Get token from any media item URL: ?X-Plex-Token=YOUR_TOKEN
  • Server URL: http://YOUR_IP:32400

Jellyfin

  • Settings → API Keys → Generate new key
  • Server URL: http://YOUR_IP:8096

Navidrome

  • Settings → Users → Generate API Token
  • Or use username/password
  • Server URL: http://YOUR_IP:4533

Configuration

  1. Launch SoulSync and go to Settings
  2. Enter API credentials for streaming services and media server
  3. Configure slskd URL (http://localhost:5030) and API key
  4. Set download and transfer paths
  5. Customize file organization (optional):
    • Enable custom templates in Settings → File Organization
    • Default: $albumartist/$albumartist - $album/$track - $title
    • Variables: $artist, $albumartist, $album, $title, $track, $playlist
    • Example: Music/$artist/$year - $album/$track - $title
  6. Share files in slskd to avoid bans

📁 File Organization

SoulSync supports customizable path templates with validation and fallback protection.

Default Structure

Transfer/
  Artist/
    Artist - Album/
      01 - Track.flac
      01 - Track.lrc

Template System

  • Albums: $albumartist/$albumartist - $album/$track - $title
  • Singles: $artist/$artist - $title/$title
  • Playlists: $playlist/$artist - $title

Available Variables

  • $artist, $albumartist, $album, $title
  • $track (zero-padded: 01, 02...)
  • $playlist (playlist name)

Features

  • Client-side validation prevents invalid templates
  • Reset to defaults button in settings
  • Automatic fallback if template fails
  • Changes apply immediately to new downloads

🐳 Docker Notes

Path Configuration

volumes:
  - ./config:/app/config          # Settings persist
  - ./logs:/app/logs              # Log files
  - /mnt/c:/host/mnt/c:rw        # Mount Windows drives
  - /mnt/d:/host/mnt/d:rw

Use /host/mnt/X/path in settings where X is your drive letter.

OAuth from Remote Devices When accessing from a different machine, Spotify redirects may fail:

  1. Complete OAuth flow - get redirected to http://127.0.0.1:8888/callback?code=...
  2. Edit URL to use your server IP: http://192.168.1.5:8888/callback?code=...
  3. Press Enter to complete authentication

See DOCKER-OAUTH-FIX.md for details.

📊 Workflow

  1. Sync: Select Spotify/Tidal/YouTube playlist
  2. Match: SoulSync compares against your library
  3. Download: Missing tracks queued from Soulseek
  4. Process: Files enhanced with metadata, lyrics, and album art
  5. Organize: Moved to transfer folder with template-based structure
  6. Scan: Media server automatically rescans library
  7. Update: SoulSync database syncs with your collection

🐛 Troubleshooting

Enable Debug Logging

  • Settings → Log Level → DEBUG
  • Check logs/app.log for detailed information
  • Change takes effect immediately

Common Issues

Files not organizing properly

  • Verify transfer path points to your music library
  • Check template syntax in Settings → File Organization
  • Use "Reset to Defaults" if templates are broken
  • Review logs for path-related errors

Docker drive access

  • Ensure drives are mounted in docker-compose.yml
  • Restart Docker Desktop if mounts fail
  • Verify paths use /host/mnt/X/ prefix

Wishlist tracks stuck

  • Remove items using delete buttons on wishlist page
  • Auto-retry runs every 30 minutes
  • Check logs for download failures

Multi-library setups

  • Select correct library from dropdown in settings (Plex/Jellyfin)
  • Test connection to verify credentials

🏗️ Architecture

  • Services: Spotify, Tidal, Plex, Jellyfin, Navidrome, Soulseek clients
  • Database: SQLite with automatic library caching and updates
  • UI: PyQt6 Desktop + Flask Web Interface
  • Matching: Advanced text normalization and fuzzy scoring
  • Metadata: Mutagen + LRClib.net for tags and lyrics
  • Automation: Multi-threaded with retry logic and background tasks

📝 Recent Updates

  • Customizable file organization with template-based paths and validation
  • Log level control without restart
  • Jellyfin library selector for multi-library setups
  • Enhanced wishlist management with track/album removal
  • Docker config persistence between container restarts

Support on Ko-fi

Star History