YouTube-Frühjahrsputz mit Python: Abos automatisch löschen

Bild ohne Beschreibung

Die letzten Tage bestanden bei mir aus viel Couchtime. Und wie das so ist: YouTube läuft mit. Eigentlich eine feine Sache, aber irgendwann kam der Punkt, an dem es mir einfach zu viel wurde.

Ein Blick auf meinen Abo-Zähler war ein kleiner Schock: 1185 Kanäle.

Über die Jahre hat sich da ein digitaler Bodensatz angesammelt, der meinen Feed verstopft. Mich stresst das. Statt Inspiration bekomme ich Rauschen im Ohr. Ich möchte wieder einen Feed, der mich wirklich interessiert und weiterbringt. Qualität statt Quantität.

Also musste eine Lösung her. Es gab zwei Optionen:

  • Die nukleare Option: Das YouTube-Konto löschen und bei Null anfangen.
  • Die Frickel-Lösung: Ein Skript bauen, das für mich aufräumt.

Natürlich ist es Option B geworden. Warum einfach, wenn es auch mit Python und Terminal geht?

Das Backup für die Reue (Google Takeout)

Bevor ich das Skript von der Leine liess, gab es noch einen wichtigen Schritt: Die Sicherung. Ich wollte zwar aufräumen, aber nicht blind alles verbrennen. Unter den 1185 Kanälen sind garantiert ein paar Perlen, die ich später vermissen werde. Die Lösung dafür ist Google Takeout. Dort habe ich mir meine Abo-Liste als CSV exportiert. Das hat zwei Vorteile: Ich kann beruhigt alles löschen, weil nichts "wirklich" weg ist.

Wenn der Feed später zu leer ist, greppe ich einfach durch die CSV-Datei (oder scrolle sie durch) und suche mir gezielt die Kanäle raus, die es wert sind, erneut abonniert zu werden.

Das Problem mit dem "Button"

YouTube will nicht, dass man geht. Es gibt keinen "Alle deabonnieren"-Button. Manuell 1185 Mal zu klicken und Bestätigungs-Pop-ups wegzudrücken, ist keine Option für jemanden, der NVIM benutzt, um die Maus zu vermeiden.

Erste Versuche mit JavaScript in der Browser-Konsole waren mässig erfolgreich. Lazy Loading und unvorhersehbare DOM-Elemente machten das Ganze zu einer wackeligen Angelegenheit. Also: Ab zur API.

Die Lösung: Python & Die Quota-Falle

Der Plan war simpel: Ein Python-Skript, das sich über die Google Data API in meinen Account einloggt, die Liste holt und aufräumt. Technisch auf meinem Arch-Setup kein Problem – venv erstellt, google-api-python-client installiert, API-Key besorgt.

Das Skript lief an, die ersten Kanäle verschwanden. Herrlich. Doch dann: Stopp. Was ich nicht bedacht hatte: Google hat eine Währung für API-Nutzung. Tagesbudget: 10.000 Punkte. Kosten für das Löschen eines Abos: 50 Punkte. Das macht exakt 200 Löschungen pro Tag.

Entschleunigtes Aufräumen

Statt des schnellen Kahlschlags ist mein YouTube-Frühjahrsputz nun ein tägliches Ritual geworden. Jeden Morgen lasse ich das Skript laufen. Es dauert ein paar Sekunden, dann sind die nächsten 200 Karteileichen weg, bis das Quota-Limit greift.

In ca. 6 Tagen werde ich wieder bei Null sein (oder ich stoppe das Skript vorher, wenn nur noch die Perlen übrig sind).

Falls du auch vor einem Berg aus digitalem Müll stehst und dich fragst, wie du ihn loswirst:

  • Ein Google Cloud Projekt erstellen (console.cloud.google.com)
  • Die YouTube Data API v3 aktivieren
  • Einen OAuth 2.0-Client-ID erstellen (Anwendungstyp: "Desktop App")
  • Die JSON-Datei herunterladen und als client_secret.json im selben Ordner speichern
  • Libraries installieren:

Bash

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

Das Skript Speichere dies z. B. als nuke_subs.py.

Python

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

scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]

def main():
    # Authentifizierung
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "client_secret.json"

    # Flow starten
    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
        client_secrets_file, scopes)
    credentials = flow.run_local_server(port=0)

    youtube = googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials)

    print("Authentifizierung erfolgreich. Starte Löschvorgang...")

    try:
        while True:
            # Liste der Abos abrufen (immer die ersten 50)
            request = youtube.subscriptions().list(
                part="id,snippet",
                mine=True,
                maxResults=50
            )
            response = request.execute()

            items = response.get("items", [])

            if not items:
                print("Keine weiteren Abos gefunden.")
                break

            for item in items:
                sub_id = item["id"]
                title = item["snippet"]["title"]

                print(f"Lösche: {title}...")

                try:
                    youtube.subscriptions().delete(id=sub_id).execute()
                except googleapiclient.errors.HttpError as e:
                    if e.resp.status == 403 and "quotaExceeded" in str(e):
                        print("\nAPI-Quota für heute erreicht (ca. 200 Löschungen).")
                        print("Das Skript stoppt hier. Versuche es morgen erneut.")
                        return
                    else:
                        print(f"Fehler beim Löschen von {title}: {e}")

    except Exception as e:
        print(f"Ein Fehler ist aufgetreten: {e}")

if __name__ == "__main__":
    main()

Es fühlt sich gut an, die Kontrolle zurückzuholen. Manchmal ist ein bisschen Code genau das Richtige, um den Kopf (und den Feed) wieder freizubekommen.

Wie sieht es bei dir aus? Sammelst du noch oder löschst du schon?

Kommentare: 0

Interesse an einer Diskussion? Schreibe einen Kommentar. ▼