

Einleitung: Warum ich meine Playlists spiegeln wollte
Ich höre auf Spotify, brauche dieselben Playlists aber gelegentlich auch auf YouTube, etwa für ein Gerät ohne Spotify, fürs Teilen oder für Hintergrundvideos. Das jedes Mal von Hand nachzubauen ist mühsam. Also habe ich ein Tool geschrieben, das genau das übernimmt, und es als Open Source veröffentlicht.
Was es macht
Eine schlanke Weboberfläche zeigt deine Spotify-Playlists durchnummeriert und alphabetisch. Du wählst eine, mehrere oder alle aus, und das Tool legt die passende YouTube-Playlist an oder findet eine bereits vorhandene und füllt sie mit denselben Liedern.
Die Synchronisation läuft bewusst nur in eine Richtung: Spotify ist die Quelle der Wahrheit. Was du auf YouTube änderst oder löschst, wirkt sich nie auf Spotify aus. Löschst du auf YouTube etwas und synchronisierst erneut, wird der Spotify-Stand wiederhergestellt. Fehlende Titel werden ergänzt, überzählige auf Wunsch entfernt. Die YouTube-Playlist ist danach ein exaktes Spiegelbild der Spotify-Vorlage.
Während ein Lauf arbeitet, siehst du eine Live-Warteschlange mit Status pro Playlist (wartet, läuft, fertig) und kannst einzelne Listen oder den ganzen Vorgang jederzeit abbrechen.
Zwei technische Grenzen
Zwei Eigenschaften ergeben sich aus den APIs und bestimmen, was das Tool leisten kann.
Erstens gibt es keine Garantie, dass immer exakt die Spotify-Version gefunden wird und kein Cover. Es existiert keine offizielle Zuordnung zwischen einer Spotify-Track-ID und einem bestimmten YouTube-Video. Man sucht, und man bekommt Videos zurück. Was möglich ist, ist ein guter, regelbasierter Treffer. Dazu gleich mehr. Lieder, bei denen sich das Tool nicht sicher ist, landen in einer Prüfliste, statt heimlich übernommen zu werden.
Zweitens hat die YouTube-Schnittstelle ein Tageskontingent. Eine Suche ist vergleichsweise teuer, weshalb sich pro Tag nur eine begrenzte Zahl neuer Titel auflösen lässt. Große Bibliotheken brauchen also mehrere Tage. Damit das nicht jedes Mal von vorn losgeht, merkt sich das Tool jeden Treffer dauerhaft, auch die erfolglosen. Beim nächsten Lauf kostet ein bereits bekanntes Lied nichts mehr, und man kann genau dort weitermachen, wo das Kontingent am Vortag aufgehört hat.
Wie es die richtige Version findet
Der Trick steckt in einem Detail des YouTube-Ökosystems: Zu fast jedem offiziell veröffentlichten Song erzeugt YouTube automatisch einen Eintrag auf einem Kanal nach dem Muster „Künstler - Topic". Das ist das Nächste, was es zur Studioversion gibt. Das Matching bevorzugt deshalb gezielt diese Topic-Kanäle sowie offizielle und VEVO-Kanäle, gleicht zusätzlich die Spieldauer mit der Spotify-Länge ab und wertet alles ab, was nach Variante klingt, etwa Cover, Live, Remix, Karaoke, Demo oder Extended Mix. Liegt der beste Kandidat unter einer einstellbaren Mindestqualität, wird er nicht automatisch übernommen, sondern zur Kontrolle aufgelistet. In der Praxis fängt das genau die richtigen Verdächtigen ab, während saubere Originale durchlaufen.
Technik
Das Backend ist in Python mit FastAPI geschrieben, die Anmeldung läuft über die aktuellen OAuth-Mechanismen (Spotify Authorization Code, Google OAuth mit Offline-Zugriff). Als Speicher dient eine kleine SQLite-Datenbank, die zugleich der Match-Cache ist. Die Oberfläche ist bewusst schlankes Vanilla-JavaScript ohne Framework-Ballast. Das Tool läuft lokal, gehört dir, und es liegen keine fremden Server dazwischen.
Selbst ausprobieren
Der Code liegt offen auf GitHub, inklusive einer zweisprachigen Anleitung (Englisch und Deutsch), die Schritt für Schritt durch das Anlegen der Spotify- und Google-Zugangsdaten führt:
github.com/netperformance/SpotifyYoutubeSynchronizer
Jeder legt seine eigenen API-Schlüssel an und trägt sie in eine lokale Konfigurationsdatei ein, es werden also keinerlei Zugangsdaten geteilt. Ein kurzer Befehl, beide Dienste verbinden, Playlists auswählen, fertig.
Auf der Liste für die nächste Version steht eine Oberfläche, um unsicheren Treffern manuell das richtige Video zuzuweisen, damit die Prüfliste nicht nur aussortiert, sondern auch auflöst. Rückmeldungen und Pull Requests sind willkommen.
