Spotify YouTube Music

Move a playlist to the other service. Without the wrong songs.

A free, open-source command-line tool that moves playlists both ways between Spotify and YouTube Music — tracks, cover art and Liked Songs. When it is not sure which version is right, it asks instead of guessing.

$ git clone https://github.com/DecoudJuan/Migratify

MIT licensed · Python 3.10+ · Windows, macOS and Linux · no account, no server, no API key

  • auto-accepted
    88 or above, no version mismatch, no close runner-up.
  • queued for review
    70 to 88, or a near-tie. Five candidates, and you pick.
  • not found
    Below 70. Reported by name, never substituted.

01 The wrong song problem

Moving a playlist is easy. Moving it correctly is not.

The same title exists as a cover, a karaoke track, a live take, a remix, a sped-up edit — and as a different song by a different artist.

Most tools take the first search result and hand you a playlist that is quietly 15% wrong. Migratify scores every candidate instead, and a wrong-artist match is capped below the review floor — so it can never even be offered to you.

searching youtube music for
Wicked Game — Chris Isaak
Heart Shaped World · 4:46
Wicked Game — Chris Isaak
song · official artist channel · duration matches (4:46)
96
Wicked Game — Chris Isaak
live version · version mismatch (−25) · duration differs
71
Wicked Game — HIM
artist mismatch (vetoed) — capped, cannot be suggested
40
Wicked Game — Karaoke Version
artist mismatch (vetoed) · karaoke (−25)
31
Auto-accepted: the top candidate clears 88 with no version penalty and no close runner-up. The other three never reach your playlist.

02 How it works

Three commands. Only one of them writes.

Deciding is separate from doing. Run the whole migration, read the report, change your mind — neither account will have noticed.

01

migratify plan

Reads the source playlist, scores every candidate on the destination and writes a report. An interrupted run resumes where it stopped.

read-only
02

migratify review

Only the tracks the scorer could not settle. Five candidates each, with lengths, scores and the reason for every number.

local only
03

migratify apply

Creates the playlist and adds what was accepted — naming the destination account before it asks. Run it twice and nothing duplicates.

the only writer
migratify apply — the confirmation writes
migratify > apply
About to write
Late night driving
Spotify → YouTube Music
account: juan@gmail.com
94 tracks will be added
2 unresolved matches will be left out
Continue? [Y/n]: y

Created https://music.youtube.com/playlist?list=PLxK…
in juan@gmail.com
Added 94 tracks
Cover not uploaded — YouTube Music has no API for
playlist artwork. The original is at
~/.migratify/covers/a3f1c9b2e5d4.jpg if you want to set it by hand.

Done.
  url:     https://music.youtube.com/playlist?list=PLxK…
  account: juan@gmail.com on YouTube Music

03 What it carries across

A playlist is more than a list of tracks.

Both directions, one engine

Spotify → YouTube Music and back again. The direction comes from the URL you paste.

Liked Songs

Your saved library migrates like any playlist — and lands as one. Nothing is ever written into a library.

Name, description, cover

The playlist travels, not just its contents. Cover upload wherever the destination allows it.

Sync, not re-migrate

migratify sync matches only what never arrived, into the playlist that already exists.

You just sign in

No developer app, no client ID, no API key. Works on a free Spotify account.

Auditable reports

Markdown, CSV or JSON per run: what matched, what it scored, what was missing.

Resumable and cached

Matches are cached locally per direction, so running it again costs no new searches.

Runs without Python

Standalone builds for Windows and macOS. Double-click and you get the prompt.

No server, no account

It runs on your machine and talks only to the two services. Everything stays in ~/.migratify.

04 The matching engine

Scored on five signals, vetoed on two.

Every candidate that comes back is scored from 0 to 100. Artist and duration carry the weight, because they are what a cover cannot fake.

Artist veto — similarity below 0.5 caps the candidate at 40, under the review floor, however perfect the title looks.

Version penalty — 25 points for every differing tag: live, remix, acoustic, instrumental, karaoke, radio edit, sped up.

ISRC short-circuit — an exact ISRC hit scores 100 at once. Recording identity, not similarity.

  • artist0.40
  • title0.30
  • duration0.20
  • album0.05
  • result type0.05

Duration is the best cover detector there is. A re-recording almost never lands within five seconds of the original. When a service does not report a length, it scores a neutral 0.5 — absence is not evidence.

0 — 69 not found Reported by name. Nothing is substituted.
70 — 87 your review Five candidates, with reasons.
88 — 100 accepted Clean and clear.

The near-tie rule matters as much as the thresholds: top two within four points and the track goes to review, however high the score. Taking the higher number would be a coin flip dressed as a decision. Every threshold is configurable.

05 Commands

Every command, and whether it writes.

Command What it does Writes?
migratify Opens the interactive prompt — the banner above. Type commands without the prefix. no
migratify login Connects both services by signing in. Imports an existing browser session when it can, opens a login window when it cannot. no
migratify auth status What is connected, and which browsers were found on this machine. no
migratify playlists spotify Lists your playlists on a service, with track counts. Liked Songs included. no
migratify plan <url> Matches the whole playlist and writes a report. Safe to run as many times as you like. no
migratify review Resolves the ambiguous matches. Records your decisions locally. no
migratify apply Creates the destination playlist and adds the accepted tracks. Asks first, and names the account. yes
migratify migrate <url> plan → review → apply, guided, in one command. yes
migratify migrate liked --to ytmusic Migrates your saved library. Also --to spotify for the other direction. yes
migratify sync <url> Adds only the tracks that never reached the destination, into the playlist the first run created. yes
migratify runs Past runs with their IDs, so you can review or report on an older one. no
migratify report --format csv Re-renders any run's report as Markdown, CSV or JSON. no

06 Get it

Two ways in.

Standalone build

No Python. Unzip and run. ~70 MB.

  • Double-clicking the executable opens the interactive prompt.
  • The browser automation is bundled — signing in is the browser automation. It drives a browser you already have.
  • All releases and checksums →

From source

Python 3.10 or newer, any platform.

$ git clone https://github.com/DecoudJuan/Migratify
$ cd Migratify && pip install -e ".[login]"
$ migratify login
  • The login extra is the browser automation — what lets you connect by signing in.
  • Then migratify auth status to confirm it worked.
macOS — sessions import directly; Safari needs Full Disk Access for your terminal Windows — Chrome and Edge encrypt cookies since v127, so Migratify opens its own login window Linux — depends on your keyring, generally fine Over SSHmigratify auth ytmusic --paste

07 Questions

The things people actually ask.

How do I transfer a Spotify playlist to YouTube Music?

Install Migratify, run migratify login once to sign in to both services, then run migratify migrate followed by the playlist URL. Migratify detects the direction from the link, matches every track against YouTube Music, asks you about the ones it cannot decide, and only then creates the playlist.

Does it also move playlists from YouTube Music to Spotify?

Yes. The same engine runs in both directions and the direction is taken from the URL you paste: a Spotify link migrates to YouTube Music, a YouTube Music link migrates to Spotify. Nothing about the matching changes.

Can I migrate my Liked Songs or saved library?

Yes, in either direction: migratify migrate liked --to ytmusic, or --to spotify. Your saved library lands as an ordinary playlist on the other service. Migratify never writes into a saved library, because an unwanted playlist takes one click to delete and several hundred saved tracks do not.

Do I need a Spotify developer app, client ID or API key?

No. You sign in the way you always do, in a browser window, and Migratify captures that session locally. There is nothing to register and nothing to paste.

Does it work on a free Spotify account?

Yes, and that is why signing in is the default path. Since 2025 Spotify requires a Premium subscription for a newly registered app to reach the Web API, so the usual register-an-app flow is unavailable on a free account. Signing in does not touch that gate.

Will it add the wrong version of a song?

That is the failure Migratify is built to avoid. Every candidate is scored on artist, title, duration, album and result type. A wrong-artist candidate is vetoed below the review floor so it cannot even be offered. Each differing version tag — live, remix, acoustic, karaoke, sped up — costs 25 points. A track only auto-accepts at 88 or above with no version mismatch and no close runner-up; anything less certain waits for you.

Does it transfer the playlist cover art?

Name and description travel in both directions, and cover art uploads when the destination is Spotify. YouTube Music has no API for playlist artwork, so going that way Migratify downloads the original cover to your machine and tells you where it is, in case you want to set it by hand.

What if I add more songs to the playlist later?

Run migratify sync with the same playlist URL. It matches only the tracks that never reached the destination and adds them to the playlist the first migration created, rather than making a second one. The link is remembered per destination service.

Is it free, and where does my data go?

Migratify is free and MIT-licensed. It runs entirely on your machine and talks only to Spotify and YouTube Music. Sessions, the match cache and the reports live in a .migratify folder in your home directory. There is no Migratify server and no account to create.

Is there a website or browser extension instead of a CLI?

No, on purpose. A hosted version would need your Spotify and YouTube credentials on someone else's server, and the matcher depends on libraries that do not belong in a content script. A local command-line tool is the honest form for this problem — and it is also why nothing you migrate ever passes through a third party.

Your playlist, on the other service. Track for track.

Run plan as many times as you like — it never touches an account. Nothing is created until you say apply.

$ migratify migrate https://open.spotify.com/playlist/…