Hallo zusammen! Ich bin ein großer Musikliebhaber – Musik begleitet mich mein ganzes Leben. Wahrscheinlich deshalb benutze ich oft den Dienst Shazam. Wenn mir eine Melodie gefällt, shazame ich sie, finde heraus, welches Lied das ist (sogar in moderner Musik gibt es manchmal etwas, das mir gefällt) und dann… Was dann?
Vor ein paar Tagen habe ich mich in meinen Shazam-Account eingeloggt und festgestellt (mit einiger Überraschung, das muss ich zugeben), dass ich etwa 1.500 verschiedene Songs in meiner Liste habe. Da stellt sich die Frage – was tun? Manuell suchen? Das ist bei 1.500 Songs ziemlich mühsam und langwierig. Automatisieren? Woher soll ich die Songs herunterladen? Wie bekomme ich die Liste aller gespeicherten Songs aus Shazam? Ich will euch nicht lange auf die Folter spannen – während ich diesen Beitrag schreibe, läuft auf meinem zweiten Monitor bereits die Download-Statistik der Songs. Hier ein Screenshot davon:
Der Code ist noch nicht perfekt und wird einfach in Sublime Text ausgeführt (ich wollte ihn unbedingt im Streaming-Modus starten, daher habe ich ihn nicht in eine .exe-Datei umgewandelt; außerdem gibt es noch einiges zu verbessern). Aber das Wichtigste: Der Code funktioniert. Also, wie läuft das Ganze ab?
1. Abrufen der gespeicherten Songs aus Shazam:
Fangen wir mit dem Einfachen an – wie kann man eine Liste aller in Shazam gespeicherten Songs auf den eigenen Computer herunterladen? Ganz einfach: Besuche diesen Link: https://www.shazam.com/ru/privacy/login/download und du wirst folgendes Fenster sehen:
Melde dich an. In meinem Fall ist die Anmeldung mit meinem Google-Konto verknüpft. Also habe ich mich einfach über Google angemeldet und dann meine E-Mail-Adresse manuell eingegeben:
Drücke auf die Schaltfläche „Daten senden“, und du siehst eine Meldung, dass du deine gespeicherten Shazam-Daten innerhalb von 30 Tagen erhältst. Lass dich davon nicht abschrecken – ich habe meine Datei innerhalb von zwei Stunden bekommen. Die Datei kommt als Archiv „data.zip“ mit folgenden Dateien:
– AnalyticsSongs.jsonl
– AnalyticsUsage.jsonl
– Installations.json
– README.pdf
– SyncedSongs.csv
Ich hatte keine Lust, mich in die Details einzulesen (obwohl AnalyticsSongs.jsonl eine Menge interessanter Informationen enthält), also habe ich einfach direkt SyncedSongs.csv geöffnet. Und hier beginnt der nächste Schritt…
2. Erstellen einer Textdatei mit Interpret und Songtitel:
Die Datei SyncedSongs.csv hat die folgende Struktur:
artist,"title","status","date","longitude","latitude"
Uns interessieren natürlich nur der Interpret und der Titel des Songs. Man könnte Python verwenden, um die übrigen Spalten zu entfernen, aber warum kompliziert, wenn es mit Excel einfacher geht? Hier sind zwei Wege, um die CSV-Datei so zu öffnen, dass die Werte in Spalten aufgeteilt werden:
Methode 1:
Öffnen der Datei in Excel:
– Excel öffnen.
– Gehe zum Reiter „Daten“.
– Klicke auf „Aus Text/CSV“ (in älteren Excel-Versionen: „Öffnen“ und wähle die CSV-Datei).
– Stelle sicher, dass als Trennzeichen „Komma“ ausgewählt ist.
– Klicke auf „Laden“ oder „OK“ – die Daten werden in Spalten aufgeteilt.
Methode 2:
Verwendung des „Text in Spalten“-Assistenten:
– Falls die Datei bereits geöffnet ist und alle Daten in einer Spalte stehen, markiere diese Spalte.
– Gehe zum Reiter „Daten“.
– Klicke auf „Text in Spalten“.
– Wähle „Getrennt“ und klicke „Weiter“.
– Wähle als Trennzeichen „Komma“ (stelle sicher, dass keine anderen Trennzeichen ausgewählt sind) und klicke „Weiter“.
– Klicke „Fertig“ – die Daten werden in Spalten aufgeteilt.
Nachdem wir die auf Spalten aufgeteilten Daten haben, löschen wir die unnötigen Spalten und speichern den Rest als Textdatei:
– Wähle „Datei“ → „Speichern unter“.
– Wähle das Format „Text (Tabstopp-getrennt)“ (.txt).
– Speichern.
Nun haben wir eine Textdatei, in der jede Zeile aus dem Interpreten und dem Songtitel besteht, getrennt durch TAB. Jetzt stellt sich die Frage des Song-Downloads.
3. Musik-Download:
Direkt aus Shazam oder Spotify konnte ich keine Songs herunterladen. Allerdings gibt es YouTube, wo es wahrscheinlich fast alles gibt. Basierend auf dieser Idee habe ich ein Skript geschrieben, das automatisch nach Songs auf YouTube sucht und sie herunterlädt. Der Code verwendet die Python-Bibliothek yt_dlp.
import yt_dlp # Bibliothek zum Herunterladen von Audio/Video von YouTube from tqdm import tqdm # Bibliothek zur Anzeige eines Fortschrittsbalkens import time import os import sys # Datei mit der Songliste song_list_file = "Song_list.txt" # Log-Dateien success_file = "success.txt" # Datei mit erfolgreichen Downloads failed_file = "failed.txt" # Datei mit fehlgeschlagenen Downloads # Hauptschleife zur Verarbeitung der Songs while True: # Datei mit der Songliste lesen with open(song_list_file, "r", encoding="utf-8") as file: songs = file.readlines() # Wenn die Songliste leer ist – Beenden der Arbeit if not songs: break # Den ersten Song aus der Liste nehmen song = songs[0].strip() if not song: # Wenn die Zeile leer ist, überspringen wir sie songs.pop(0) continue # Zeile in Künstler und Songtitel aufteilen try: artist, title = song.split("\t", 1) # Trennzeichen – Tabulator except ValueError: # Falls die Zeile nicht dem Format entspricht, Fehler protokollieren with open(failed_file, "a", encoding="utf-8") as failed_log: failed_log.write(f"{song} - Falsches Format\n") songs.pop(0) continue # Suchanfrage für YouTube erstellen query = f"{artist} {title}" # Pfad zur heruntergeladenen Datei erstellen output_filename = f"downloads/{artist} - {title}.mp3" # Ordner für Downloads erstellen, falls nicht vorhanden os.makedirs("downloads", exist_ok=True) # yt-dlp-Einstellungen für den Audio-Download ydl_opts = { "format": "bestaudio/best", # Beste Audioqualität wählen "outtmpl": f"downloads/{artist} - {title}.%(ext)s", # Format des Dateinamens "quiet": True, # Zusätzliche Konsolenausgabe deaktivieren "postprocessors": [{ # Konvertierung in MP3 nach dem Download "key": "FFmpegExtractAudio", "preferredcodec": "mp3", "preferredquality": "192", }], "progress_hooks": [], # Hook zur Aktualisierung des Fortschritts "noprogress": True, # Standard-Fortschrittsanzeige von yt-dlp deaktivieren } print(f"\n🔍 Suche: {query}") # Fortschrittsbalken erstellen pbar = tqdm(total=100, desc=f"Herunterladen {query}", ncols=100, unit="%", dynamic_ncols=True, file=sys.stdout) def progress_hook(d): """Funktion zur Aktualisierung des Download-Fortschritts""" if d["status"] == "downloading": percent_str = d.get("_percent_str", "0.0%").strip("%") try: percent = float(percent_str) pbar.update(percent - pbar.n) # Differenz in Prozent aktualisieren except ValueError: pass elif d["status"] == "finished": pbar.n = 100 pbar.update(0) pbar.close() # Fortschritts-Hook zu den yt-dlp-Einstellungen hinzufügen ydl_opts["progress_hooks"].append(progress_hook) try: # Download mit yt-dlp starten with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([f"ytsearch:{query}"]) # Suche und Download # Prüfen, ob die Datei erstellt wurde if os.path.exists(output_filename): with open(success_file, "a", encoding="utf-8") as success_log: success_log.write(f"{query}\n") print(f"\r✅ Erfolgreich heruntergeladen: {query}{' ' * 30}") else: with open(failed_file, "a", encoding="utf-8") as failed_log: failed_log.write(f"{query} - Konvertierungsfehler\n") print(f"\r❌ Konvertierungsfehler: {query}{' ' * 30}") except Exception as e: # Fehler beim Download protokollieren with open(failed_file, "a", encoding="utf-8") as failed_log: failed_log.write(f"{query} - {str(e)}\n") print(f"\r❌ Fehler beim Herunterladen: {query} - {e}{' ' * 30}") # Verarbeitete Zeile aus der Datei entfernen songs.pop(0) with open(song_list_file, "w", encoding="utf-8") as file: file.writelines(songs) time.sleep(1) # Kurze Pause vor dem nächsten Download print("\n🎵 Abgeschlossen! Erfolgreiche Downloads in success.txt, Fehler in failed.txt.")
Den vollständigen Code findest du hier.
Falls du Fragen hast, schreib mir eine E-Mail oder kontaktiere mich auf Telegram. Und ja – eine GUI-Version dieser Anwendung wird bald veröffentlicht! 😊
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️