No description
Find a file
Broque Thomas 61618c2fc7
Merge pull request #126 from Nezreka/itunes
Apple Music added as fallback metadata source if Spotify is not available. Spotify is always preferred if it is available with its richer data responses. Will easily swap from Spotify to Apple Music on the fly if you are rate limited by Spotify or worse, temp banned. 

Apple Music and Spotify will now each have their own discovery pool for the discover page. Both will always be updated on every watchlist scan so long as Spotify is authorized, otherwise only Apple Music data is pulled.

**Known issues:**

Any artist image pulled while Apple Music is the primary source will only pull album art for that artist since they do not provide artist images :(  This can, very rarely, lead to cases where the album image that is pulled could have another another artist displayed if it's some collab single, EP or something. Seen it happen once with an indie artist so it's possible.

Looking for a great api / website to parse easily specifically for artist names and a huge db to pull from.
2026-01-25 11:07:50 -08:00
assets rate limiting 2025-08-11 08:36:51 -07:00
config gracefully try to load configs from file into DB if the DB is fresh 2026-01-18 12:04:39 -05:00
core force refetch similar artists when Spotify IDs missing 2026-01-24 23:46:01 -08:00
database Fix watchlist artist config and add image at insert when Itunes source. 2026-01-25 09:24:28 -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
tools Fix iTunes-only Discover page not loading data 2026-01-24 21:48:17 -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 Fix artist image not appearing for artist bubble, artist bubble modal or when an artist is selected in search. 2026-01-25 10:51:02 -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 2026-01-01 10:00:53 -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 just testing things 2026-01-03 13:10:37 -08:00
entrypoint.sh Move database files to /app/data and use env var for path 2026-01-01 09:53:39 -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
METADATA-FALLBACK-IMPLEMENTATION.md Add iTunes metadata client and fallback guide 2026-01-22 15:31:02 -08:00
README-Docker.md Update data directory mapping and config path handling 2026-01-06 07:17:35 -08:00
README.md update version modal and readme 2026-01-25 10:33:32 -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 update version modal and readme 2026-01-25 10:33:32 -08:00

SoulSync Logo

SoulSync - Intelligent Music Discovery & Automation Platform

Spotify-quality music discovery for self-hosted libraries. Automates downloads, curates playlists, monitors artists, and organizes your collection with zero manual effort.

IMPORTANT: Configure file sharing in slskd to avoid Soulseek bans. Set up shared folders at http://localhost:5030/shares.

Community: Discord | Support: GitHub Issues | Donate: Ko-fi


What It Does

SoulSync bridges streaming services to your media server with automated discovery:

  1. Monitors artists → Automatically detects new releases
  2. Generates playlists → Release Radar, Discovery Weekly, Seasonal, Decade/Genre mixes
  3. Downloads missing tracks → From Soulseek, Beatport charts, playlists
  4. Enriches metadata → LRC lyrics, album art, proper tags
  5. Organizes files → Custom templates for clean folder structures
  6. Syncs media server → Plex, Jellyfin, or Navidrome stay updated

Key Features

Discovery Engine

Release Radar - 30 new tracks from watchlist artists (updates daily)

Discovery Weekly - 50 tracks from similar artists using custom algorithm

  • 20 popular + 20 mid-tier + 10 deep cuts
  • Built from 1000+ track discovery pool
  • Refreshes every 24 hours

Seasonal Playlists - Halloween, Christmas, Valentine's, Summer, Spring, Autumn (auto-generated)

Personalized Playlists (12+ types)

  • Recently Added, Top Tracks, Forgotten Favorites
  • Decade Playlists (1960s-2020s), Genre Playlists (15 categories)
  • Daily Mixes, Hidden Gems, Popular Picks, Custom Builder

ListenBrainz - Import recommendation and community playlists

Beatport - Electronic music charts by genre (House, Techno, Trance, etc.)

  • Top 100, Hype Charts, DJ Charts, Staff Picks

Multi-Source Downloads

Sources: Soulseek (FLAC priority), YouTube (Audio), Beatport charts, Spotify/Tidal playlists

Features

  • Quality profiles: Audiophile, Balanced, Mobile
  • Automatic format fallback (FLAC → MP3)
  • Duplicate prevention against library
  • Batch processing with retry logic
  • Synchronized lyrics (LRC) for every track

Metadata & Reliability

Dual-Source System

  • Primary: Spotify (Preferred for richer data and discovery features)
  • Backup: iTunes (No authentication required)
  • Redundancy: System automatically manages both sources. If Spotify is authorized, it is prioritized. If Spotify is unavailable, rate-limited, or unauthorized, SoulSync seamlessly switches to iTunes for metadata, cover art, and artist tracking.
  • Fail-Safe: Even with Spotify authorized, iTunes metadata is maintained as a redundant layer to ensure zero downtime.

Advanced Matching

  • Unicode/accent handling (KoЯn, Björk, A$AP Rocky)
  • Fuzzy matching with confidence scoring
  • Album variation detection (Deluxe, Remastered, etc.)
  • Multi-strategy: exact → normalized → fallback

Automation

Watchlist - Monitor unlimited artists, auto-discover similar artists via music-map.com

Wishlist - Failed downloads retry every 30 minutes automatically

Background Tasks - Database sync, discovery pool updates, seasonal content

Library Management

  • Quality Scanner - Find low-bitrate files to replace
  • Duplicate Cleaner - Identify redundant tracks
  • Completion Tracking - Album progress percentages
  • Enhanced Search - Unified search across Spotify, library, Soulseek
  • Template Organization - $albumartist/$album/$track - $title (fully customizable)

Installation

curl -O https://raw.githubusercontent.com/Nezreka/SoulSync/main/docker-compose.yml
docker-compose up -d
# Access at http://localhost:8008

Python

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

Quick Setup

Prerequisites

  • slskd on port 5030 (Download)
  • Spotify API credentials (Dashboard)
  • Media Server (optional): Plex, Jellyfin, or Navidrome

Configuration

  1. Spotify API

    • Create app → Add redirect: http://127.0.0.1:8888/callback
    • Copy Client ID and Secret
  2. SoulSync Settings

    • Enter API credentials
    • Configure slskd URL and API key
    • Set download/transfer paths
    • Connect media server (optional)
    • Configure slskd file sharing to avoid bans
  3. Docker OAuth Fix (if accessing from remote device)

    • Redirected to http://127.0.0.1:8888/callback?code=...
    • Manually edit URL to server IP: http://192.168.1.5:8888/callback?code=...
    • Spotify requires 127.0.0.1 (banned localhost Nov 2025)
    • See DOCKER-OAUTH-FIX.md

Who Should Use This

Perfect for:

  • Self-hosters with Plex/Jellyfin/Navidrome
  • Music enthusiasts with 500+ album collections
  • Electronic music fans (Beatport integration)
  • Former Spotify users wanting local discovery

Not ideal for:

  • Casual users wanting simple sync
  • Slow/metered internet connections
  • Users uncomfortable with APIs or Docker

Comparison

Feature SoulSync Lidarr Headphones Beets
Custom Discovery Algorithm
Personalized Playlists (12+)
Beatport Integration
ListenBrainz Playlists
Multi-Source (Spotify/Tidal/YouTube)
Watchlist Monitoring ✓ (100+)
LRC Lyrics Plugin
Advanced Matching
Quality Scanner + Duplicate Cleaner
Template-Based Organization
Seasonal Playlists

SoulSync is the only tool combining intelligent discovery with multi-source automation and library management.


Architecture

Scale: 83,000+ lines Python, 120+ API endpoints, handles 10,000+ album libraries

Integrations: Spotify, Tidal, YouTube, Plex, Jellyfin, Navidrome, Slskd, ListenBrainz, LRClib, music-map.com, Beatport

Stack: Python 3.8+, Flask, SQLite, PyQt6 (desktop GUI in maintenance mode)

Core Components:

  • Matching engine with Unicode/fuzzy logic
  • Discovery system with custom algorithms
  • Download pipeline with quality profiles
  • Metadata enhancement (lyrics, art, tags)
  • Template-based file organization

File Organization

Default Structure

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

Custom Templates

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

Features: Client-side validation, automatic fallback, instant apply


Troubleshooting

Enable Debug Logging: Settings → Log Level → DEBUG → Check logs/app.log

Common Issues

  • Files not organizing: Verify transfer path, check template syntax, use "Reset to Defaults"
  • Docker paths: Ensure drives mounted in docker-compose.yml, use /host/mnt/X/ prefix
  • OAuth from remote: Manually edit callback URL to server IP (Spotify requires 127.0.0.1)
  • Wishlist stuck: Auto-retry runs every 30 mins, check logs for failures
  • Multi-library: Select correct library in settings dropdown

Roadmap

Planned

  • WebSocket support (replace polling)
  • Batch wishlist operations
  • Download history browser UI
  • Source reliability tracking
  • Notification center
  • Mobile-responsive improvements

Under Consideration

  • MusicBrainz ID integration
  • Additional streaming sources (Deezer, Apple Music)
  • Playlist collaboration between instances
  • Machine learning for matching

License

MIT License - See LICENSE file for details


Acknowledgments

Services: slskd, music-map.com, LRClib.net, Spotify, Tidal, Plex, Jellyfin, Navidrome

Community: Contributors, testers, and users providing feedback


Support on Ko-fi

Star History