|
|
1 day ago | |
|---|---|---|
| .claude | 1 month ago | |
| assets | 4 months ago | |
| config | 1 week ago | |
| core | 5 days ago | |
| database | 1 week ago | |
| logs | 3 months ago | |
| services | 1 week ago | |
| templates | 1 week ago | |
| ui | 4 weeks ago | |
| utils | 2 weeks ago | |
| webui | 4 days ago | |
| .dockerignore | 3 months ago | |
| .gitattributes | 1 month ago | |
| .gitignore | 4 months ago | |
| DOCKER-OAUTH-FIX.md | 3 months ago | |
| DOCKER-TRANSFER-GUIDE.md | 1 week ago | |
| DOCKER.md | 3 months ago | |
| DOCKER_PERMISSIONS.md | 3 months ago | |
| Dockerfile | 1 month ago | |
| README-Docker.md | 3 months ago | |
| README.md | 1 week ago | |
| UNRAID.md | 3 months ago | |
| beatport_unified_scraper.py | 3 months ago | |
| docker-compose.yml | 2 weeks ago | |
| entrypoint.sh | 1 month ago | |
| license.txt | 4 months ago | |
| main.py | 2 weeks ago | |
| requirements-webui.txt | 3 months ago | |
| requirements.txt | 3 months ago | |
| web_server.py | 1 day ago | |
README.md
🎵 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
Docker (Recommended)
# 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
- slskd: Download, run on port 5030
- Spotify API: Client ID/Secret from Developer Dashboard
- Tidal API (optional): Client ID/Secret from Developer Dashboard
- Media Server (optional): Plex, Jellyfin, or Navidrome
API Credentials
Spotify
- Create app → Settings
- Add redirect URI:
http://127.0.0.1:8888/callback - Copy Client ID and Secret
Tidal
- Create app
- Add redirect URI:
http://127.0.0.1:8889/callback - Add scopes:
user.read,playlists.read - 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
- Launch SoulSync and go to Settings
- Enter API credentials for streaming services and media server
- Configure slskd URL (
http://localhost:5030) and API key - Set download and transfer paths
- 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
- 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:
- Complete OAuth flow - get redirected to
http://127.0.0.1:8888/callback?code=... - Edit URL to use your server IP:
http://192.168.1.5:8888/callback?code=... - Press Enter to complete authentication
See DOCKER-OAUTH-FIX.md for details.
📊 Workflow
- Sync: Select Spotify/Tidal/YouTube playlist
- Match: SoulSync compares against your library
- Download: Missing tracks queued from Soulseek
- Process: Files enhanced with metadata, lyrics, and album art
- Organize: Moved to transfer folder with template-based structure
- Scan: Media server automatically rescans library
- Update: SoulSync database syncs with your collection
🐛 Troubleshooting
Enable Debug Logging
- Settings → Log Level → DEBUG
- Check
logs/app.logfor 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