Skip to main content

sssync

A scriptable playlist sync tool for Qobuz, Spotify, and Jellyfin.

sssync sync spotify qobuz --all
sssync sync qobuz jellyfin <playlist-id> "My Playlist"
sssync sync qobuz jellyfin --dry-run

Features

  • Sync playlists from Spotify or Qobuz into Qobuz or Jellyfin (Spotify is read-only, so it's a source only)
  • ISRC-first matching — exact track identification via ISRC, with fuzzy title/artist/duration fallback
  • Incremental, append-only syncs — existing playlist contents are never touched; re-running adds only what's missing
  • Favorites sync between services that support them
  • Dry-run mode — preview matches without writing anything
  • 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"

Only the sections you use need to be filled in — sources are loaded lazily per command.

Usage

List playlists on a source:

sssync playlists qobuz
sssync playlists jellyfin

Sync a playlist (accepts a name, an id, or a URL):

sssync sync spotify qobuz "My Playlist"
sssync sync qobuz jellyfin <playlist-id>
sssync sync qobuz jellyfin <playlist-id> "My Playlist"

Sync everything:

sssync sync spotify qobuz --all

Preview without writing:

sssync sync qobuz jellyfin <playlist-id> --dry-run

Sync favorites:

sssync favorites spotify qobuz

How matching works

  1. ISRC — if both services expose the track's ISRC, it's an exact match.
  2. Fuzzy — normalized title/artist similarity (rapidfuzz) with a duration tolerance. Thresholds are tunable in the [sync] section of the config:
[sync]
title_threshold = 80
artist_threshold = 75
duration_tolerance_ms = 5000
min_score = 75

Unmatched tracks are reported, never silently dropped. API errors during matching are captured per track and included in the sync report.

Safety

Writes are append-only by design. sssync never removes or reorders tracks in an existing destination playlist, and dry-run makes no changes at all. Destination playlists keep their cover art and metadata.

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. Releases are published to PyPI automatically on tag push via Trusted Publishing.

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

sssync-0.2.1.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sssync-0.2.1-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file sssync-0.2.1.tar.gz.

File metadata

  • Download URL: sssync-0.2.1.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sssync-0.2.1.tar.gz
Algorithm Hash digest
SHA256 88a8c4ecce5ab7ca3382721fc9f4ea2d73daadef63eed510372872c3933156fb
MD5 c905db810352635b3b7bc7395a371f60
BLAKE2b-256 c1bd8600038b19c916f98f7197a049a4f6b7497000f7d78bcb022979674785f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for sssync-0.2.1.tar.gz:

Publisher: release.yml on uprcse/sssync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sssync-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: sssync-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 16.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sssync-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b24496dcb5904d6b7d9c7c01d15e227c081c9fc4f052b9ebc1eec0ac114ad846
MD5 bb1abc61ecd7842fc2f0e7c49619a222
BLAKE2b-256 efdb99ad695eaa904037de37b2848974d9ee1aeec84bbe175e6c1f3702974d46

See more details on using hashes here.

Provenance

The following attestation bundles were made for sssync-0.2.1-py3-none-any.whl:

Publisher: release.yml on uprcse/sssync

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.2

2 files

This release

0.2.1 This release

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page