Migrate playlists between music platforms. Privacy-first, open-source, one-time price.
SoundShift transfers your playlists and liked songs across streaming services. Unlike SongShift, Soundiiz, TuneMyMusic, and FreeYourMusic — SoundShift runs 100% on your device, is open-source (MIT), and doesn't require a subscription.
| Feature | SoundShift | Competitors |
|---|---|---|
| Privacy | 100% on-device | Your tokens hit their servers |
| Pricing | Free CLI, one-time paid app | Monthly subscriptions |
| Source code | Open (MIT) | Closed |
| Match quality | 5-factor confidence scoring | Hope for the best |
| Indian platforms | JioSaavn (planned) | Zero support |
| Resume | Picks up where it left off | Starts over |
pip install soundshift
# Export your Spotify playlists (opens browser for login)
soundshift export
# Migrate a playlist to YouTube Music
soundshift migrate "My Playlist"That's it. Your playlist is now on YouTube Music.
# From PyPI (recommended)
pip install soundshift
# From source
git clone https://github.com/ayushparkara/soundshift.git
cd soundshift
pip install -e .Requirements: Python 3.10+, a Spotify account, a YouTube Music account, a browser with DevTools.
soundshift export Export Spotify playlists + liked songs
soundshift export --csv Also export to CSV
soundshift export --no-liked Skip liked songs
soundshift list List exported playlists
soundshift migrate "Playlist Name" Migrate one playlist
soundshift migrate --all Migrate all playlists
soundshift migrate --liked Migrate liked songs
soundshift migrate --fast "Name" Disable rate-limit delays
soundshift migrate --min-confidence high "X" Only add high-confidence matches
soundshift migrate --from spotify --to ytmusic "X" Explicit platforms
soundshift reset --auth Reset YT Music auth
soundshift reset --progress Reset migration progress
soundshift-gui Launch the GUI
Source Platform Engine Destination Platform
+--------------+ +----------------+ +------------------+
| Spotify | --> | SoundShift | --> | YouTube Music |
| (PKCE auth) | | - Search | | (browser auth) |
| | | - Match (5x) | | |
| JioSaavn* | | - Add | | More coming* |
+--------------+ | - Resume | +------------------+
+----------------+
- Export — Authenticate with source platform, download playlists as JSON
- Match — For each track, search the destination with multiple strategies. Score results on 5 factors (title, artist, album, duration, rank) and assign confidence: HIGH / MEDIUM / LOW
- Add — Songs added individually (not batched) to avoid the all-or-nothing failure mode
- Resume — Progress saved every 20 songs. Re-run to pick up where you left off
SoundShift scores every match on 5 factors:
| Factor | Weight | What it checks |
|---|---|---|
| Title | 35% | Fuzzy string similarity (handles punctuation, casing) |
| Artist | 30% | Normalized artist name comparison |
| Album | 15% | Album name similarity (strips "Deluxe", "Remastered", etc.) |
| Duration | 10% | Track length within tolerance |
| Rank | 10% | Prefer higher search results |
Confidence levels:
- HIGH (>= 0.85) — Auto-accept
- MEDIUM (0.60 - 0.84) — Accept, flag for review
- LOW (< 0.60) — Skip by default
Use --min-confidence high to only accept perfect matches, or --min-confidence low to accept everything.
SoundShift uses PKCE OAuth with Spotify's public client — no Developer app, no API keys, no setup. Just run soundshift export and log in via the browser window that opens.
YouTube Music has no official API. SoundShift uses browser cookies:
- Open https://music.youtube.com and log in
- Press F12 -> Network tab -> Refresh
- Click any request -> Right-click -> Copy request headers
- Paste when SoundShift prompts you
Headers are stored locally in data/yt_headers.json — never sent anywhere except directly to music.youtube.com.
JioSaavn has no official API. SoundShift reverse-engineered the internal endpoints. Login with your JioSaavn email and password:
soundshift export --from jiosaavn
soundshift migrate --from jiosaavn --to ytmusic "My Playlist"Credentials are stored locally in data/jiosaavn_creds.json. This is the first migration tool in the world to support JioSaavn — no competitor (SongShift, Soundiiz, TuneMyMusic, FreeYourMusic) offers this.
SoundShift uses an adapter pattern — the migration engine is platform-agnostic:
soundshift/
models.py # Track, Playlist, MatchResult dataclasses
adapters/
base.py # SourceAdapter, DestinationAdapter interfaces
spotify.py # Spotify source (PKCE OAuth + API)
ytmusic.py # YouTube Music destination (cookie auth)
matcher.py # 5-factor priority matching engine
exporters.py # CSV/JSON export
migrator.py # Platform-agnostic migration engine
cli.py # CLI interface
gui.py # tkinter GUI
Adding a new platform means implementing one adapter class. The engine, CLI, matcher, and exporters work without modification.
| Platform | Source (export) | Destination (import) | Status |
|---|---|---|---|
| Spotify | Yes | Yes | Stable |
| YouTube Music | Yes | Yes | Stable |
| JioSaavn | Yes | - | New — first tool to support this |
| Apple Music | Planned | Planned | Future |
| SoundCloud | Planned | Planned | Future |
| Tidal | Planned | Planned | Future |
Supported migration paths: Spotify -> YTMusic, JioSaavn -> YTMusic, JioSaavn -> Spotify, YTMusic -> Spotify, and more.
Export your playlists as CSV for DJ software (Serato, Rekordbox), spreadsheets, or backup:
soundshift export --csvProduces data/playlists.csv with columns: playlist, track_name, artist, album, duration_ms.
My migration fails after some time. Play music on music.youtube.com in the background while migrating — keeps the session alive.
Can I migrate YT Music -> Spotify? Not yet. SoundShift currently supports Spotify as source and YT Music as destination. More combinations coming with new adapters.
Is my data safe?
Yes. Everything runs on your machine. The only network calls are to api.spotify.com and music.youtube.com. The source code is MIT — read it yourself.
Why browser headers instead of OAuth for YT Music?
Google's YouTube OAuth scope doesn't grant write access to music.youtube.com. Browser cookies are what the web client uses and support both read and write.
The YT Music auth keeps failing.
Make sure you're copying all request headers (not just the cookie), you're logged into YouTube Music (not regular YouTube), and the headers include x-goog-authuser.
SoundShift is MIT licensed. Contributions welcome — especially new platform adapters.
git clone https://github.com/ayushparkara/soundshift.git
cd soundshift
pip install -e ".[dev]"
python -m pytest tests/To add a new platform, implement SourceAdapter or DestinationAdapter from soundshift/adapters/base.py and register it in soundshift/adapters/__init__.py.
MIT — see LICENSE for details.