Selbst gehosteter Dienst
alexta69/metube avatar
alexta69/metube

MeTube: yt-dlp hinter einer Weboberfläche mit PUID, OUTPUT_TEMPLATE und Abonnements

Selbstgehosteter Video-Downloader für YouTube und andere Websites (Web-Benutzeroberfläche für yt-dlp).

14.745 Sterne1.084 ForksPythonAGPL-3.0
GitHub

Auf einen Blick

Was ist das?
MeTube setzt eine selbst gehostete Weboberfläche vor yt-dlp und lädt Videos, Audio, Untertitel und Miniaturbilder im Browser. Der Überblick gilt dem Container-Start, den Umgebungsvariablen, den drei Ebenen von yt-dlp-Optionen und der AGPL-3.0-Lizenz.
Für wen ist es gedacht?
MeTube passt zu allen, die yt-dlp bereits nutzen und eine Warteschlange mit Weboberfläche suchen, die auch Abonnements abarbeitet, ohne dass ein Terminal offen bleibt. Weniger geeignet ist es für Installationen ohne Container und für Umgebungen, in denen mehrere Personen Zugriff auf die Oberfläche haben, weil ALLOW_YTDL_OPTIONS_OVERRIDES dort zur Ausführung beliebiger yt-dlp-Optionen im Container führt und ALLOW_PRIVATE_ADDRESSES den Schutz vor internen Adressen abschaltet.
Darf ich es kommerziell nutzen?
Ja, unter strengen Bedingungen. AGPL-3.0 ist eine Lizenz mit Netzwerk-Copyleft: Wenn andere eine veränderte Version über ein Netzwerk nutzen, etwa als gehosteten Dienst, müssen Sie ihnen den Quellcode unter derselben Lizenz anbieten.
Wird es noch gepflegt?
Ja. Die letzten Commits kamen vor 6 Tagen.
In welcher Sprache ist es geschrieben?
Hauptsächlich Python, laut der Sprachstatistik von GitHub.

Die Antworten beruhen auf den GitHub-Daten des Projekts (zuletzt abgeglichen am 15. September 2026) und auf unserer Analyse. Sie sind keine Rechtsberatung.

TIEFGEHENDE OPEN-SOURCE-ANALYSE

MeTube: yt-dlp hinter einer Weboberfläche auf Port 8081

MeTube ist eine selbst gehostete Weboberfläche für yt-dlp und lädt damit Medien von YouTube sowie von Dutzenden weiterer Seiten, die yt-dlp unterstützt. Die Repository-Beschreibung nennt es einen Video-Downloader für YouTube und andere Seiten mit Web-Oberfläche. Im Material sind 14539 Sterne, 1071 Forks und 11 offene Issues eingetragen, als Sprache Python, als Standardbranch master und als neueste Veröffentlichung 2026.08.28.

Drei Fähigkeiten stellt die README nach vorn: Videos, Audio, Untertitel und Miniaturbilder aus dem Browser herunterladen, Playlists und Kanäle mit konfigurierbarer Ausgabe laden sowie Kanäle und Playlists abonnieren, wobei MeTube in Abständen nach neuen Beiträgen sieht und sie automatisch einreiht. Damit verschiebt sich der Nutzen vom einzelnen Download zum dauerhaften Abgreifen einer Quelle.

Veröffentlicht werden Multi-Arch-Images für amd64 und arm64. Der Release-Takt folgt dem Upstream: Sobald eine neue stabile yt-dlp-Version erscheint, wird automatisch ein neues MeTube-Image gebaut. Wer Nightly-Builds bevorzugt, setzt YTDL_NIGHTLY_UPDATE_TIME.

PUID, PGID, UMASK: der Start mit ghcr.io/alexta69/metube

Der kürzeste Weg zum laufenden Dienst führt über einen einzigen Container-Befehl. docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube veröffentlicht Port 8081 und bindet ein lokales Verzeichnis unter /downloads ein. Eine Compose-Datei folgt demselben Muster, ergänzt um restart: unless-stopped und denselben Port und Volume-Pfad. Andere Installationsarten nennt die README nicht.

Bei den Rechten sind drei Variablen maßgeblich. PUID legt den Nutzer fest, unter dem MeTube läuft, mit Voreinstellung 1000, die alte Schreibweise UID wird weiterhin unterstützt. PGID gilt für die Gruppe, ebenfalls 1000, mit GID als altem Namen. UMASK setzt die Dateimaske, voreingestellt auf 022. Wer schon einmal Dateien mit falschem Besitzer in einem Download-Verzeichnis hatte, trägt die eigenen Werte hier ein.

Zur Laufzeitsteuerung kommen DEFAULT_THEME mit den Werten light, dark oder auto, LOGLEVEL mit den Stufen DEBUG bis NONE und Voreinstellung INFO sowie ENABLE_ACCESSLOG hinzu, das standardmäßig aus ist. Über CHOWN_DIRS lässt sich das automatische Setzen der Besitzrechte auf Download-, Status- und temporäres Verzeichnis beim Containerstart abschalten, wenn die Rechte extern gesetzt werden.

DOWNLOAD_DIR, STATE_DIR, TEMP_DIR: wo MeTube was ablegt

Die Ablage ist in drei Bereiche geteilt. DOWNLOAD_DIR zeigt auf das Zielverzeichnis, im Image voreingestellt auf /downloads, außerhalb auf das aktuelle Verzeichnis. AUDIO_DOWNLOAD_DIR erlaubt es, reine Tondateien zu trennen; fehlt der Wert, gilt DOWNLOAD_DIR. TEMP_DIR nimmt Zwischendateien auf, und die README empfiehlt dafür ein SSD- oder RAM-Dateisystem wie tmpfs, weist aber darauf hin, dass ein RAM-Dateisystem das Fortsetzen abgebrochener Downloads verhindern kann.

Der Zustand liegt in STATE_DIR, im Image unter /downloads/.metube. Dort stehen die Dateien queue.json, pending.json, completed.json und subscriptions.json. Wer Backups plant, sollte dieses Verzeichnis einbeziehen, den sonst sind Warteschlange und Abonnements nach einem Neu-Aufsetzen leer.

Für die Ablage innerhalb des Zielverzeichnisses gibt es eigene Schalter. CUSTOM_DIRS ist standardmäßig aktiv und blendet unter den erweiterten Optionen ein Feld für den Zielordner ein, CREATE_CUSTOM_DIRS erlaubt das Anlegen fehlender Verzeichnisse mitsamt Freitexteingabe. CUSTOM_DIRS_EXCLUDE_REGEX filtert Vorschläge, voreingestellt auf ein Muster, das Verzeichnisse mit Punkt oder @ am Anfang ausblendet. DEFAULT_FOLDER wählt einen Ordner vor, bleibt aber überschreibbar. DOWNLOAD_DIRS_INDEXABLE entscheidet, ob die Verzeichnisse über den Webserver auflistbar sind, voreingestellt auf false.

OUTPUT_TEMPLATE und YTDL_OPTIONS_PRESETS: Namen und Profile

Die Dateinamen folgen Vorlagen. OUTPUT_TEMPLATE ist voreingestellt auf %(title)s.%(ext)s, OUTPUT_TEMPLATE_CHAPTER auf ein Muster mit Abschnittsnummer und Titel für in Kapitel geteilte Videos, OUTPUT_TEMPLATE_PLAYLIST auf %(playlist_title)s/%(title)s.%(ext)s und OUTPUT_TEMPLATE_CHANNEL auf %(channel)s/%(title)s.%(ext)s. Ein leerer Wert bei den letzten beiden führt zurück auf OUTPUT_TEMPLATE.

Die Anpassung von yt-dlp selbst geschieht auf drei Ebenen. Globale Optionen wirken für jeden Download und werden als JSON-Objekt in YTDL_OPTIONS übergeben. Presets sind benannte Bündel, die pro Download in der Oberfläche auswählbar sind, definiert über YTDL_OPTIONS_PRESETS. Overrides je Download sind ein Freitext-JSON-Feld in der Oberfläche und standardmäßig abgeschaltet. Beim Start werden die Ebenen in dieser Reihenfolge zusammengeführt, widersprechende Schlüssel gewinnt die spezifischere Ebene.

Für Betrieb mit mehreren Konfigurationen empfiehlt sich der Weg über Dateien. YTDL_OPTIONS_FILE und YTDL_OPTIONS_PRESETS_FILE verweisen auf JSON-Dateien, die überwacht und bei Änderung automatisch neu geladen werden. Das ersetzt den Neustart des Containers nach jeder Anpassung.

ALLOW_PRIVATE_ADDRESSES und Overrides: zwei Schalter mit Folgen

Zwei Einstellungen hebt die README mit einer Warnung hervor. ALLOW_PRIVATE_ADDRESSES ist standardmäßig false und weist URLs zurück, die auf interne Hosts auflösen, womit Angriffe über gefälschte Anfragen aus dem Servernetz unterbunden werden sollen. Wird der Schalter aktiv, entfällt dieser Schutz vollständig; die README empfiehlt das nur in vertrauenswürdigen Umgebungen.

Der zweite Schalter ist ALLOW_YTDL_OPTIONS_OVERRIDES. Ist er aktiv, kann jeder mit Zugriff auf die Oberfläche beliebige yt-dlp-API-Optionen übergeben, was praktisch auf die Ausführung eigener Befehle im Container hinauslaufen kann. Auch hier gilt die Empfehlung, ihn nur in vertrauenswürdigen Umgebungen zu setzen. Für einen Dienst, der hinter einem Reverse-Proxy erreichbar ist, ist die Voreinstellung die richtige Wahl.

Ein dritter Punkt betrifft den Browser-Zugriff von außen: CORS_ALLOWED_ORIGINS steuert Anfragen über Ursprungsgrenzen hinweg und wird für Browsererweiterungen und Bookmarklets gebraucht. Steht die verweisende Seite auf HTTPS, muss auch MeTube über HTTPS ausgeliefert werden, sonst blockiert der Browser die Anfrage.

Abonnements: 60 Minuten Takt, 50 Einträge, 50000 gemerkte IDs

Der Abonnement-Teil hat eigene Grenzwerte, die man kennen sollte, bevor man einen Kanal mit langer Historie einträgt. SUBSCRIPTION_DEFAULT_CHECK_INTERVAL legt die Minuten zwischen zwei Prüfungen fest, voreingestellt auf 60. SUBSCRIPTION_SCAN_PLAYLIST_END begrenzt, wie viele Einträge pro Prüfung geholt werden, voreingestellt auf 50, und zwar die neuesten zuerst.

Damit die Zustandsdatei nicht unbegrenzt wächst, deckelt SUBSCRIPTION_MAX_SEEN_IDS die gespeicherten Video-IDs je Abonnement auf 50000. Die Zahl erklärt sich aus der Dokumentation als Schutz gegen das Anwachsen der Zustandsdatei. Wer einen sehr großen Kanal abonniert, sollte sich klar machen, dass jenseits dieser Grenze ältere Einträge aus dem Gedächtnis fallen.

Zum Download-Verhalten selbst gehören MAX_CONCURRENT_DOWNLOADS mit Voreinstellung 3, DELETE_FILE_ON_TRASHCAN, das Dateien auf dem Server löscht, wenn sie in der Oberfläche aus dem Abschnitt für abgeschlossene Aufträge entfernt werden, DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT ohne Begrenzung als Standard und CLEAR_COMPLETED_AFTER, das abgeschlossene und fehlgeschlagene Einträge nach einer Anzahl Sekunden aus der Liste räumt, standardmäßig abgeschaltet.

Cookies, HTTPS, URL_PREFIX und der Verzicht auf MeTube

Für eingeschränkte oder private Videos lässt sich eine aus dem Browser exportierte cookies.txt-Datei über die erweiterten Optionen hochladen. Mehrere Wege führen Links von außen in MeTube: Erweiterungen für Chrome und Firefox, Bookmarklets, eine iOS-Kurzbefehl-Variante und eine Raycast-Erweiterung. Die browserbasierten Wege verlangen die Freigabe über CORS_ALLOWED_ORIGINS.

HTTPS lässt sich direkt einschalten, mit HTTPS, CERTFILE und KEYFILE, oder an einen Reverse-Proxy auslagern. Bei Betrieb unter einem Unterverzeichnis ist URL_PREFIX zu setzen, und der Proxy muss die Upgrade- und Connection-Kopfzeilen weiterreichen, weil MeTube WebSocket für Echtzeitaktualisierungen nutzt. Fehlen diese Kopfzeilen, bleibt die Oberfläche stumm, während Downloads im Hintergrund laufen.

Als Alternative bleibt yt-dlp unmittelbar auf der Kommandozeile, mit eigenem Zeitplan über cron oder systemd-Timer. Der Unterschied liegt im Bedienmodell: Dort gibt es keine Weboberfläche, keine Warteschlange mit Zustand in queue.json und keine Abonnements, dafür entfällt der Container und die damit verbundenen Schalter. Hinzu kommt die Lizenz: MeTube steht unter AGPL-3.0, wer eine angepasste Fassung als Netzwerkdienst betreibt, muss den Nutzern den Quelltext anbieten, eine Verpflichtung, die bei einem selbst geschriebenen yt-dlp-Aufruf nicht entsteht.

Redaktionelles Fazit

MeTube passt zu allen, die yt-dlp bereits nutzen und eine Warteschlange mit Weboberfläche suchen, die auch Abonnements abarbeitet, ohne dass ein Terminal offen bleibt. Weniger geeignet ist es für Installationen ohne Container und für Umgebungen, in denen mehrere Personen Zugriff auf die Oberfläche haben, weil ALLOW_YTDL_OPTIONS_OVERRIDES dort zur Ausführung beliebiger yt-dlp-Optionen im Container führt und ALLOW_PRIVATE_ADDRESSES den Schutz vor internen Adressen abschaltet. Wer startet, mountet ein Download-Verzeichnis, setzt PUID und PGID auf den eigenen Nutzer, prüft in den erweiterten Optionen einen einzelnen Download mit dem gewünschten Preset und schaltet danach erst Abonnements mit einem klaren SUBSCRIPTION_SCAN_PLAYLIST_END zu.

Offizielle Quellen

  1. Official README
  2. Project repository
  3. Release notes
Community-Notizen

Community-Notizen