Top 100 instrumentals

Dieser Blogbeitrag ist für alle, die Hintergrundmusik brauchen und Pop mögen. Nachdem ich jahrelang kein Radio gehört und kaum Kontakt zu Mainstream-Pop hatte, habe ich mich plötzlich wieder dafür interessiert. Um Verpasstes nachzuholen, habe ich angefangen, die deutschen Jahrescharts der letzten Jahre zu hören. Allerdings lenkt mich Musik mit Gesang bei Maker-Projekten ab. Um das Problem zu lösen, habe ich mir von ChatGPT ein Python-Skript generieren lassen und es anschließend angepasst. Es erstellt YouTube-Playlists aus einer Textliste. So könnt ihr das auch machen.

Schritt-für-Schritt-Anleitung für eure instrumentale Pop-Playlist

1. Google-Developer-Konto einrichten

Um die YouTube-API zu nutzen, braucht ihr ein Google-Developer-Konto. So richtet ihr es ein:

  1. Öffnet die Google Cloud Console und meldet euch mit eurem Google-Konto an.
  2. Neues Projekt anlegen: Klickt oben auf der Seite auf das Projekt-Dropdown und wählt „New Project“. Gebt dem Projekt einen Namen und klickt auf „Create“.
  3. YouTube Data API v3 aktivieren: Sucht in der API-Bibliothek nach „YouTube Data API v3“, klickt darauf und dann auf „Enable“.
  4. Zugangsdaten erstellen: Geht in der Seitenleiste auf den Reiter „Credentials“, klickt auf „Create Credentials“ und wählt „OAuth client ID“. Falls noch nicht geschehen, müsst ihr zuerst den OAuth-Zustimmungsbildschirm konfigurieren. Wählt „Desktop app“ und klickt auf „Create“.
  5. Zugangsdaten herunterladen: Klickt auf das Download-Symbol neben euren neuen Zugangsdaten, um eine JSON-Datei zu erhalten. Speichert diese Datei als config.json.

2. Die nötige Python-Bibliothek installieren

Stellt sicher, dass Python installiert ist. Installiert dann die nötigen Bibliotheken mit pip:

pip install google-auth-oauthlib google-api-python-client

3. Eingabedatei vorbereiten

Die Eingabe-Textdatei wird als Kommandozeilenparameter übergeben und muss pro Zeile einen Künstler und einen Songtitel enthalten. Die Daten kopiert ihr manuell von einer Website wie den Offiziellen Deutschen Charts und lasst sie von ChatGPT formatieren.

Dafür könnt ihr folgenden Prompt verwenden:

This is a list of the german top 100 charts of 2022: 
1 Udo Lindenberg & Apache 207 Komet Warner
2 Miley Cyrus Flowers Columbia
[...]

please remove the attached names of record labels and format in the following format:

Udo Lindenberg & Apache - 207 Komet
Miley Cyrus - Flowers 

4. Skript ausführen

Das ist das Python-Skript, das ihr verwenden werdet (Download):

import os
import argparse
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors

# Set up YouTube API
scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]

def youtube_authenticate():
    # Disable OAuthlib's HTTPS verification when running locally.
    # *DO NOT* leave this option enabled in production.
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"

    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "config.json"

    # Get credentials and create an API client
    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
        client_secrets_file, scopes
    )
    credentials = flow.run_local_server(port=0)
    return googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials
    )

def search_video(youtube, query):
    request = youtube.search().list(
        part="snippet", maxResults=1, q=query + " instrumental"
    )
    response = request.execute()
    return response["items"][0]["id"]["videoId"] if response["items"] else None

def create_playlist(youtube, title, description):
    request = youtube.playlists().insert(
        part="snippet,status",
        body={
            "snippet": {
                "title": title,
                "description": description,
                "tags": ["instrumental", "music", "playlist"],
                "defaultLanguage": "en",
            },
            "status": {"privacyStatus": "public"},
        },
    )
    response = request.execute()
    return response["id"]

def add_video_to_playlist(youtube, playlist_id, video_id):
    request = youtube.playlistItems().insert(
        part="snippet",
        body={
            "snippet": {
                "playlistId": playlist_id,
                "resourceId": {"kind": "youtube#video", "videoId": video_id},
            }
        },
    )
    request.execute()

def load_songs_from_file(songs_file):
    if not os.path.exists(songs_file):
        raise FileNotFoundError(f"File {songs_file} does not exist.")
    with open(songs_file, "r") as file:
        songs = [line.strip() for line in file if line.strip()]
    return songs

def main():
    # Set up argument parser
    parser = argparse.ArgumentParser(
        description="Create a YouTube playlist from a list of songs."
    )
    parser.add_argument("songs_file", type=str, help="Path to the songs .txt file")
    args = parser.parse_args()

    youtube = youtube_authenticate()

    # Load songs from the file
    try:
        songs = load_songs_from_file(args.songs_file)
    except FileNotFoundError as e:
        print(e)
        return

    # Extract the filename without extension
    filename = os.path.splitext(os.path.basename(args.songs_file))[0]

    # Create a new playlist
    playlist_id = create_playlist(
        youtube,
        f"{filename} Instrumentals",
        f"Instrumental versions of the {filename}",
    )

    # Search for each song and add the instrumental version to the playlist
    for song in songs:
        video_id = search_video(youtube, song)
        if video_id:
            add_video_to_playlist(youtube, playlist_id, video_id)
            print(f"Added {song} instrumental to the playlist")
        else:
            print(f"Instrumental version of {song} not found")

if __name__ == "__main__":
    main()

5. Mit Tageskontingenten umgehen und Playlists zusammenführen

Nach etwa 40 bis 50 Songs kann das Skript abbrechen, weil das Tageskontingent der Google-API aufgebraucht ist. Ihr könnt den Vorgang dann über mehrere Tage fortsetzen, bis eure Playlist vollständig ist.

YouTube-Playlists zusammenführen

Wenn ihr mehrere Playlists erstellt habt, könnt ihr sie über die YouTube-Oberfläche zu einer zusammenführen:

  1. Öffnet euren YouTube-Kanal und dort „YouTube Studio“.
  2. Wählt „Playlists“ in der Seitenleiste.
  3. Öffnet eine eurer Playlists und klickt auf das Drei-Punkte-Menü.
  4. Wählt „Alle hinzufügen zu“ und dann die Playlist, mit der ihr sie zusammenführen wollt.

Beispiel-Playlists und Skript

Diese YouTube-Playlists habe ich mit dem Skript erstellt:

Nutzt und verändert das Skript gern nach Belieben, um eure eigenen instrumentalen Pop-Playlists zu erstellen. Viel Spaß beim Hören!