Increased the number of tracks returned by enhanced search from 10 to 20. Updated CSS for enhanced search sections and artist cards to improve visual appearance, spacing, and responsiveness, including larger artist images, new backgrounds, and better layout for various screen sizes. |
||
|---|---|---|
| .claude | ||
| assets | ||
| config | ||
| core | ||
| database | ||
| logs | ||
| services | ||
| templates | ||
| ui | ||
| utils | ||
| webui | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| beatport_unified_scraper.py | ||
| docker-compose.yml | ||
| DOCKER-OAUTH-FIX.md | ||
| DOCKER-TRANSFER-GUIDE.md | ||
| DOCKER.md | ||
| DOCKER_PERMISSIONS.md | ||
| Dockerfile | ||
| entrypoint.sh | ||
| license.txt | ||
| main.py | ||
| README-Docker.md | ||
| README.md | ||
| requirements-webui.txt | ||
| requirements.txt | ||
| UNRAID.md | ||
| web_server.py | ||
🎵 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