sssync
A scriptable playlist sync tool for Qobuz, Spotify, and Jellyfin.
Features
- Sync playlists from Spotify or Qobuz into Qobuz or Jellyfin (Spotify is read-only, so it's a source only)
- ISRC-based track matching (exact) with fuzzy title/artist/duration fallback
- Incremental, append-only syncs — existing playlist contents are never touched
- Favorites sync between services that support them
- Simple TOML config, streamrip-style CLI
Installation
Requires Python 3.11+.
Install as an isolated tool (recommended):
uv tool install sssync
# or
pipx install sssync
Try it without installing anything:
uvx sssync playlists qobuz
Or with pip in a virtualenv:
pip install sssync
Configuration
sssync config
Creates and opens ~/.config/sssync/config.toml:
[qobuz]
# Session token: log into https://play.qobuz.com → DevTools →
# Application → Cookies → qobuz.com → user_auth_token
token = ""
[spotify]
client_id = ""
client_secret = ""
redirect_uri = "http://127.0.0.1:8888/callback"
[jellyfin]
url = "http://your-server/jellyfin"
api_key = ""
# or: api_key_path = "~/jellyfin_api_key.txt"
Usage
List playlists on a source:
sssync playlists qobuz
sssync playlists jellyfin
Sync a playlist (accepts a name, id, or URL):
sssync sync spotify qobuz "House Mix"
sssync sync qobuz jellyfin 69103992
sssync sync qobuz jellyfin 69103992 "House Mix (DJ Set)"
Sync everything:
sssync sync spotify qobuz --all
Preview without writing:
sssync sync qobuz jellyfin 69103992 --dry-run
Sync favorites:
sssync favorites spotify qobuz
How matching works
- ISRC — if both services expose the track's ISRC, it's an exact match.
- Fuzzy — normalized title/artist similarity (rapidfuzz) with a duration
tolerance. Thresholds are tunable in the
[sync]section of the config.
Unmatched tracks are reported, never silently dropped.
Development
git clone https://github.com/uprcse/sssync.git
cd sssync
pip install -e ".[dev]"
pytest tests/
ruff check sssync tests
CI runs pytest + ruff on Python 3.11–3.13.
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sssync-0.2.0.tar.gz.
File metadata
- Download URL: sssync-0.2.0.tar.gz
- Upload date:
- Size: 17.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be1a7e53fbf2a7e09bc626353ae1c89dd6c7f4a534846d2087b02a7eb3e43dae
|
|
| MD5 |
3db4af24d44ed937374276408c6b43eb
|
|
| BLAKE2b-256 |
e8283a4103a540b64b40075f418913ae6f9a7d2c093e4d5d020bb2b57471f990
|
Provenance
The following attestation bundles were made for sssync-0.2.0.tar.gz:
Publisher:
release.yml on uprcse/sssync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sssync-0.2.0.tar.gz -
Subject digest:
be1a7e53fbf2a7e09bc626353ae1c89dd6c7f4a534846d2087b02a7eb3e43dae - Sigstore transparency entry: 2668427083
- Sigstore integration time:
-
Permalink:
uprcse/sssync@b77484a0e3c0199895788eddca5fd46ce2a41011 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/uprcse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b77484a0e3c0199895788eddca5fd46ce2a41011 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sssync-0.2.0-py3-none-any.whl.
File metadata
- Download URL: sssync-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e44df29efcd5b7fd73066c22555126f44cdba062de35ac446bfbab34c617160c
|
|
| MD5 |
63a653fb5d3c24b7f62afea5eedc8e25
|
|
| BLAKE2b-256 |
dd1579e8b8337835d34251c69de47833dc53274f65c1f51ee6db67bcd5cb4660
|
Provenance
The following attestation bundles were made for sssync-0.2.0-py3-none-any.whl:
Publisher:
release.yml on uprcse/sssync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sssync-0.2.0-py3-none-any.whl -
Subject digest:
e44df29efcd5b7fd73066c22555126f44cdba062de35ac446bfbab34c617160c - Sigstore transparency entry: 2668427099
- Sigstore integration time:
-
Permalink:
uprcse/sssync@b77484a0e3c0199895788eddca5fd46ce2a41011 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/uprcse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b77484a0e3c0199895788eddca5fd46ce2a41011 -
Trigger Event:
push
-
Statement type: