No description
Find a file
Broque Thomas 0bd1cab9e2 Improve enhanced search results toggle UX
Updated the enhanced search button to toggle showing/hiding previous results, with dynamic icon and text changes. Prevented duplicate event listeners by ensuring single initialization. Improved dropdown visibility logic and user feedback when no results are available.
2025-12-29 15:54:47 -08:00
.claude download bubbles for discoverp age 2025-11-18 18:58:37 -08:00
assets rate limiting 2025-08-11 08:36:51 -07:00
config Add configurable Soulseek search timeout and buffer 2025-12-28 21:02:01 -08:00
core Convert track duration to milliseconds in search results 2025-12-29 14:54:28 -08:00
database Improve artist handling and preserve album data in sync 2025-12-09 10:44:54 -08:00
logs Add Docker support and improve headless compatibility 2025-09-11 08:26:25 -07:00
services Improve artist handling and preserve album data in sync 2025-12-09 10:44:54 -08:00
templates Update soulsync.xml 2025-12-10 09:52:23 -08:00
ui connect watchlist settings to scan 2025-11-24 21:43:11 -08:00
utils Add dynamic log level control via Web UI 2025-12-08 12:53:44 -08:00
webui Improve enhanced search results toggle UX 2025-12-29 15:54:47 -08:00
.dockerignore Update Docker setup and config paths 2025-09-13 15:12:23 -07:00
.gitattributes update readme 2025-11-10 10:46:32 -08:00
.gitignore Update .gitignore 2025-08-14 14:03:37 -07:00
beatport_unified_scraper.py beatport progress 2025-10-01 19:52:22 -07:00
docker-compose.yml Update docker-compose.yml 2025-12-08 15:25:42 -08:00
DOCKER-OAUTH-FIX.md Add Docker OAuth authentication troubleshooting guide 2025-09-13 08:24:40 -07:00
DOCKER-TRANSFER-GUIDE.md Create DOCKER-TRANSFER-GUIDE.md 2025-12-10 13:46:22 -08:00
DOCKER.md Create DOCKER.md 2025-09-11 21:00:41 -07:00
DOCKER_PERMISSIONS.md Add manual track matching and Docker permission docs 2025-10-03 10:48:25 -07:00
Dockerfile unraid fix 2025-11-17 12:58:49 -08:00
entrypoint.sh unraid fix 2025-11-17 12:58:49 -08:00
license.txt Create license.txt 2025-08-16 09:06:13 -07:00
main.py Add dynamic log level control via Web UI 2025-12-08 12:53:44 -08:00
README-Docker.md Add Docker support and improve headless compatibility 2025-09-11 08:26:25 -07:00
README.md Add customizable file organization templates 2025-12-10 09:46:22 -08:00
requirements-webui.txt Update requirements-webui.txt 2025-09-28 13:09:41 -07:00
requirements.txt auto lyric download 2025-09-22 16:04:06 -07:00
UNRAID.md Update database mount path and docs for SoulSync 2025-09-12 09:38:18 -07:00
web_server.py Add search bubble snapshot and download tracking system 2025-12-29 14:33:59 -08:00

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