- MeTube ist ein selbst gehostetes Web-UI für
yt-dlp, mit dem sich Medien von YouTube und Dutzenden unterstützten Websites im Browser herunterladen lassen
- Unterstützt den Download von Videos, Audio, Untertiteln und Thumbnails; auch Playlists und Kanäle können mit angepasstem Ausgabeformat und Download-Optionen heruntergeladen werden
- Kanäle und Playlists lassen sich abonnieren, um regelmäßig nach neuen Einträgen zu suchen und neue Uploads automatisch in die Warteschlange zu stellen
- Läuft per Docker oder docker-compose; Anzahl gleichzeitiger Downloads, Speicherpfad, Dateinamen-Template, HTTPS, CORS, Theme, Log-Level usw. werden über Umgebungsvariablen konfiguriert
yt-dlp-Optionen werden in der Reihenfolge globale Optionen, Presets und download-spezifische Overrides kombiniert; da download-spezifische Overrides beliebige Optionseingaben erlauben, sollten sie nur in vertrauenswürdigen Umgebungen aktiviert werden
Was MeTube macht
- MeTube ist ein selbst gehostetes Web-UI auf Basis von
yt-dlp
- Es kann Medien von YouTube und Dutzenden Websites herunterladen, die von
yt-dlp unterstützt werden
- Die wichtigsten Funktionen sind:
- Download von Videos, Audio, Untertiteln und Thumbnails über ein Browser-UI
- Download von Playlists und Kanälen
- Konfiguration von Ausgabepfaden und Download-Optionen
- Abonnieren von Kanälen und Playlists mit regelmäßiger Prüfung auf neue Einträge
- Automatisches Hinzufügen neuer Uploads zur Download-Warteschlange
Ausführung
- Kann direkt mit Docker ausgeführt werden
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- Das docker-compose-Beispiel verwendet das Image
ghcr.io/alexta69/metube und mountet /downloads im Container auf das Download-Verzeichnis des Hosts
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
Download- und Speicher-Konfiguration
- MAX_CONCURRENT_DOWNLOADS begrenzt die Anzahl gleichzeitig laufender Downloads; Standardwert ist
3
- Ist DELETE_FILE_ON_TRASHCAN auf
true gesetzt, wird beim Verschieben eines Eintrags aus dem UI-Bereich „Completed“ in den Papierkorb auch die Download-Datei auf dem Server gelöscht
- DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT legt die maximale Anzahl herunterladbarer Einträge aus einer Playlist fest; der Standardwert
0 bedeutet keine Begrenzung
- Auch Standardwerte für Abonnements werden über Umgebungsvariablen angepasst
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: automatisches Prüfintervall pro Abonnement, standardmäßig
60 Minuten
- SUBSCRIPTION_SCAN_PLAYLIST_END: maximale Anzahl von Playlist- bzw. Kanal-Einträgen, die bei einer Abonnementprüfung abgerufen werden, standardmäßig
50
- SUBSCRIPTION_MAX_SEEN_IDS: Obergrenze für die Anzahl gespeicherter Video-IDs pro Abonnement, standardmäßig
50000
- DOWNLOAD_DIR ist der Speicherpfad für Downloads; im Docker-Image ist der Standardwert
/downloads
- Für reine Audio-Downloads kann mit AUDIO_DOWNLOAD_DIR ein separater Speicherpfad gesetzt werden
- Über CUSTOM_DIRS und CREATE_CUSTOM_DIRS können im UI Download-Unterverzeichnisse ausgewählt oder automatisch erstellt werden
- In STATE_DIR werden persistente Statusdateien wie
queue.json, pending.json, completed.json und subscriptions.json gespeichert
- TEMP_DIR ist der Pfad für temporäre Download-Dateien; eine SSD oder ein RAM-Dateisystem kann die Performance verbessern, ein RAM-Dateisystem kann jedoch das Fortsetzen von Downloads verhindern
Dateinamen und yt-dlp-Optionen
- OUTPUT_TEMPLATE ist das Template für Download-Dateinamen; Standardwert ist
%(title)s.%(ext)s
- Für Kapitel-, Playlist- und Kanal-Downloads können separate Templates festgelegt werden
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
yt-dlp-Optionen werden als JSON-Objekt angegeben
- Die Optionshierarchie wird von breitem zu engem Geltungsbereich angewendet
- Globale Optionen: Standardwerte für alle Downloads
- Presets: benannte Optionsbündel, die im UI pro Download ausgewählt werden
- Download-spezifische Overrides: frei eingegebene Optionen, die nur für einen bestimmten Download gelten
- Bei kollidierenden Schlüsseln hat die spezifischere Einstellung Vorrang
- Download-spezifische Overrides haben Vorrang vor Presets
- Presets haben Vorrang vor globalen Optionen
- Wird ein Optionswert in JSON auf
null gesetzt, wird diese Option für den jeweiligen Download entfernt
YTDL_OPTIONS_FILE und YTDL_OPTIONS_PRESETS_FILE überwachen Dateiänderungen und werden automatisch neu geladen, sodass kein Container-Neustart nötig ist
- Werden Dateien und Umgebungsvariablen gemeinsam genutzt und dabei derselbe Schlüssel oder derselbe Preset-Name definiert, haben Dateieinstellungen Vorrang
Presets und Overrides
- Presets werden im UI unter Advanced Options als „Option Presets“ angezeigt
- Die Beispiel-Presets führen folgende Aufgaben aus
- sponsorblock: entfernt sponsor-, selfpromo- und interaction-Segmente
- embed-subs: lädt englische und deutsche Untertitel herunter und bettet sie in die Videodatei ein
- limit-rate: begrenzt die Download-Geschwindigkeit auf etwa 5 MB/s
- Werden mehrere Presets ausgewählt, werden sie der Reihe nach angewendet; bei gleichen Optionen überschreibt das spätere Preset das frühere
- Wird ALLOW_YTDL_OPTIONS_OVERRIDES auf
true gesetzt, erscheint im UI das freie JSON-Eingabefeld „Custom yt-dlp Options“
- Download-spezifische Overrides sind standardmäßig deaktiviert
- Wenn diese Funktion aktiviert wird, können UI-Nutzer beliebige
yt-dlp-API-Optionen übergeben; je nach Option kann dadurch die Ausführung beliebiger Befehle innerhalb des Containers möglich sein. Sie sollte daher nur in vertrauenswürdigen Umgebungen aktiviert werden
- MeTube erzwingt im anfänglichen Schritt zum Abrufen von Metadaten eigenes Verhalten für
extract_flat und noplaylist; Presets können diese Schlüssel in diesem Schritt nicht überschreiben
Cookies, Browser-Integration und Schnellzugriff
- Wenn eingeschränkte oder private Videos heruntergeladen werden müssen, können Browser-Cookies verwendet werden
- Cookies per Firefox- oder Chrome-Erweiterung als
cookies.txt exportieren
- In den Advanced Options von MeTube über Upload Cookies hochladen
- Hochgeladene Cookies im selben Abschnitt über Delete Cookies löschen
- Browser-Erweiterungen ermöglichen es, ein Video per Rechtsklick direkt an MeTube zu senden
- Für die Nutzung auf HTTPS-Seiten muss die MeTube-Instanz hinter einem HTTPS-Reverse-Proxy liegen
- Da Erweiterungen Anfragen von Ursprüngen wie
chrome-extension://... oder moz-extension://... senden, ist die Einstellung CORS_ALLOWED_ORIGINS=* erforderlich
- Die Chrome-Erweiterung kann über den Google Chrome Webstore oder aus dem Quellcode installiert werden
- Die Firefox-Erweiterung kann über Firefox Addons installiert oder aus dem Quellcode verwendet werden
- Der iOS Shortcut kann URLs aus dem Teilen-Menü von Safari an MeTube senden
- Das Bookmarklet sendet die aktuell geöffnete Webseite an MeTube; auf HTTPS-Seiten muss MeTube per HTTPS konfiguriert sein oder hinter einem HTTPS-Reverse-Proxy liegen
- Da das Bookmarklet vom Ursprung der aktuellen Seite Cross-Origin-Anfragen an MeTube sendet, müssen die Ursprünge der zu nutzenden Websites zu CORS_ALLOWED_ORIGINS hinzugefügt werden
- Die MeTube extension für Raycast ermöglicht es, Videos direkt aus Raycast hinzuzufügen
Webserver, HTTPS, Reverse Proxy
- Webserver-bezogene Einstellungen werden über Umgebungsvariablen angepasst
- HOST hat den Standardwert
0.0.0.0
- PORT hat den Standardwert
8081
- URL_PREFIX wird für Deployments unter einem Unterpfad hinter einem Reverse Proxy verwendet
- PUBLIC_HOST_URL und PUBLIC_HOST_AUDIO_URL ändern die Basis-URL für Download-Links abgeschlossener Dateien
- Wird HTTPS auf
true gesetzt und CERTFILE sowie KEYFILE angegeben, läuft MeTube im HTTPS-Modus
- Ein Reverse Proxy kann für HTTPS-Terminierung oder Authentifizierung verwendet werden
- Das Image
linuxserver/swag enthält Konfigurationsfragmente für MeTube als subfolder und subdomain sowie eine Authelia-Authentifizierungskonfiguration
- Das NGINX-Beispiel proxyt den Pfad
/metube/ auf http://metube:8081 und setzt die Header Upgrade und Connection für WebSocket-Funktionalität
- Auch Reverse-Proxy-Beispiele für Apache und Caddy werden bereitgestellt
Updates, Troubleshooting und lokale Entwicklung
- MeTube ist von yt-dlp abhängig; wegen Änderungen am Layout von Videowebsites muss
yt-dlp häufig aktualisiert werden
- Wenn ein neues stabiles
yt-dlp-Release erscheint, wird automatisch ein neues MeTube-Docker-Image veröffentlicht
- Um Container aktuell zu halten, kann watchtower verwendet werden
- Um dem Nightly-Channel von
yt-dlp zu folgen, wird in YTDL_NIGHTLY_UPDATE_TIME im Format HH:MM die Uhrzeit festgelegt, zu der täglich ein Upgrade und ein Neustart von MeTube ausgeführt werden
- Bei Problemen mit Authentifizierung, Nachbearbeitung, Berechtigungen oder
YTDL_OPTIONS wird empfohlen, zunächst direkt mit yt-dlp zu debuggen und anschließend die funktionierenden Optionen nach MeTube zu übernehmen
- Für lokalen Build und lokale Ausführung werden Node.js 22+ und Python 3.13 benötigt
- Das UI wird mit
pnpm gebaut, Python-Abhängigkeiten werden mit uv sync installiert, anschließend startet man mit uv run python3 app/main.py
- Das Docker-Image kann lokal mit
docker build -t metube . gebaut werden; dabei wird auch das UI mitgebaut
1 Kommentare
Meinungen auf Hacker News
Tube Archivist ist ebenfalls eine Überlegung wert. Wenn man nur ein paar Videos herunterladen will, ist es überdimensioniert, aber ich nutze es, um meine liebsten Tech-Kanäle zu archivieren und zu indexieren.
Nicht nur Transkripte/Untertitel, sondern auch Kommentare, Titel und Beschreibungen lassen sich per Volltext- und Metadatensuche durchsuchen – ärgerlicherweise ist das deutlich besser als das, was Alphabet anbietet.
https://www.tubearchivist.com/
https://github.com/kieraneglin/pinchflat
Für temporären Speicher kann ich das verstehen, aber ein Tool, das sich selbst als „Archivierungs“-Software bezeichnet, sollte davon ausgehen, dass es möglicherweise nicht länger überlebt als die Daten, die es bewahren soll.
Ich hatte gehofft, es wäre etwas wie ein PeerTube-Klon mit Download-Funktion, aber die Ergebnisse haben mich ernüchtert;
yt-dlpmit cleverer Konfiguration und Skripten erledigt Archivierungsarbeit besser.https://news.ycombinator.com/item?id=41100820
Zum Glück habe ich den Format-String, mit dem die Dateinamen gespeichert wurden, und da TubeSync ein Django- und PostgreSQL-Backend nutzt, könnte man sie vielleicht mit den YouTube-IDs verknüpfen. Trotzdem sieht die Migration ziemlich nach Albtraum aus.
Was ich wirklich will, ist ein YouTube-TiVo.
Ich habe etwa 100 Kanäle, die ich fast religiös verfolge, die aber nur selten etwas hochladen, und deren Videos möchte ich auf keinen Fall verpassen.
Ich will auch nicht bei YouTube Hunderte neuer Videos von Kanälen durchwühlen, die viermal am Tag posten, nur um die 1–2 zu finden, die ich tatsächlich sehen möchte. Am Ende verpasst man sie doch.
Schön wäre ein Prioritäts-Feed, der nur das enthält, was ich wirklich sehen will oder sehen sollte; noch besser wäre es, wenn alles heruntergeladen würde und ich es per DLNA ansehen könnte.
Dafür zu sorgen, dass wir das, was wir mögen, nicht verpassen, ist nicht die Art, wie YouTube arbeitet. YouTubes Art ist es, uns Videos anzudrehen, die 3-Minuten-Inhalte auf 18–22 Minuten strecken, während uns das Feedback ans Gesicht gefesselt bleibt.
Wenn du kein Konto erstellen möchtest, ist das in Ordnung, und NewPipe passt dann gut; aber es gibt eine eigene Seite, die Videos selbst ausgewählter Kanäle in chronologischer Reihenfolge zeigt. Da zu sagen, „dafür zu sorgen, dass wir das, was wir mögen, nicht verpassen, ist nicht die Art, wie YouTube arbeitet“, wirkt etwas seltsam.
Die Auffindbarkeit ist nicht gut, aber wenn das für deinen Use Case nicht nötig ist, ist es einen Blick wert.
https://fraidyc.at/
Eines verstehe ich nicht: Warum muss das auf einem Server gehostet werden? Könnte es nicht einfach eine Standalone-App sein, die unter Windows/Linux/mac läuft?
Ich habe vor Kurzem angefangen,
yt-dlpzu nutzen, und überlegt, eine einfache App zu bauen. Lohnt sich das? Gibt es für so etwas schon Alternativen?Viele Leute betreiben selbst gehostete Apps auf externen Servern, im Homelab oder in einer Kombination daraus und richten diese Ressourcen wie eine Infrastruktur mit Backups usw. ein. PC/Laptop/Tablet/Telefon bleiben dann relativ einfache Clients oder Caches; bei Verlust oder Beschädigung kann man lokal mit dem Server synchronisierte Inhalte einfach wiederherstellen, wodurch der Austausch leichter wird. Das ist einer der Gründe, warum diese Art von Self-Hosting beliebt ist.
Desktop-Apps als Wrapper um
yt-dlphabe ich einige gesehen. Ich habe sie nicht selbst genutzt, daher kann ich wenig über Stabilität oder Zuverlässigkeit sagen, aber wenn du nicht aus Spaß etwas Neues bauen willst, solltest du zuerst suchen. Vielleicht gibt es schon genau das, was du möchtest.yt-dlpzum Streamen, wenn man es auffordert, eine unterstützte URL zu öffnen. Parabolic ist ein dediziertes Download-Tool, dasyt-dlpverwendet.https://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter
yt-dlp. Das geht mit deutlich weniger Code und Komplexität; ich nutze dafür ein sehr kleines C-Programm. Auch ein kleines Shell-Skript funktioniert völlig ausreichend.Worüber niemand spricht:
yt-dlpkann inzwischen itag 22 nicht mehr herunterladen, und itag 18 ist gedrosselt. Deshalb mussyt-dlpAudio- und Videodateien getrennt laden und anschließend mitffmpegzusammenführen.Die YouTube-Werbeumsätze haben gerade die Konsensschätzungen verfehlt. Der Zugriff auf YouTube-Videos könnte künftig noch schlechter werden.
Wenn man nicht die Gewohnheit hat, bestimmte Formate auszuwählen, merkt man das vermutlich kaum. Manche haben zum Beispiel jahrelang nur itag 18 und 22 verwendet.
https://freetubeapp.io/
Eine Dockerisierte Web-App zu bauen und zu pflegen ist deutlich einfacher, als jeweils Desktop-/Mobile-Clients für Windows, macOS, Android, iOS und Linux zu erstellen.
Eine Schnittstelle, die mit Jellyfin integriert ist, wäre schön: YouTube durchsuchen, mit
yt-dlpherunterladen und dann werbefrei über Jellyfin streamen.yt-dlp-Schritt ist manuell. Ein Jellyfin-Plugin wäre großartig.Ziemlich cool. Momentan nutze ich https://cobalt.tools, das ist auch in Ordnung.
Ich habe festgestellt, dass Brave für iOS einen Playlist-Button hat, mit dem man YouTube-Videos herunterladen und auf dem Gerät speichern kann. PiP und Offline-Wiedergabe funktionieren, und Werbung gibt es auch nicht.
Es nutzt eine öffentliche Lizenz auf Basis des Mozilla-iOS-Backends; ich frage mich, warum nicht mehr Apps so etwas machen. Sie haben einen Weg gefunden, Apple dazu zu bringen, es zu akzeptieren, und der CEO hat hier auch schon einmal gepostet und diese Technik als zulässig verteidigt.
Im Kern funktioniert es erst, nachdem das Video innerhalb der normalen YouTube-Website geladen wurde, und es ist wie ein Lesemodus-Button, der nicht nur für YouTube, sondern für beliebige Videoinhalte gilt.
Ich finde es etwas erstaunlich, dass es so viele YouTube-Mirroring-Tools gibt. Wenn man so etwas nutzt: Warum lädt/archiviert man Videos, statt einfach von YouTube zu streamen?
Ich verstehe, dass Archivieren sinnvoll sein kann, falls etwas von YouTube gelöscht wird, aber bei mir passiert das extrem selten. Wenn ich ein Video gesehen habe, ist es erledigt, und wenn ich es später nicht mehr sehen kann, ist mir das ziemlich egal.
Erstens ist Werbeentfernung für viele ein ziemlich wichtiger Grund.
Zweitens kann man, wie schon erwähnt, ein Video oder einen ganzen Kanal nicht mehr streamen, wenn er wegen Copyright-Claims oder anderer Meldungen entfernt wurde. Je nachdem, welche Inhalte man schaut, kann das für manche deutlich wichtiger sein als für dich.
Drittens kann man für die Offline-Wiedergabe herunterladen. Das geht zwar auch mit der offiziellen YouTube-App, aber man muss für Premium zahlen; der Preis wirkt überzogen, und das Löschproblem bleibt trotzdem bestehen.
Viertens geht es um lokale Indizierung. Wenn man später auf Videos verweisen will, um sie erneut anzusehen oder zu teilen, kann es bequemer sein, sie in der eigenen Struktur zu organisieren, statt Lesezeichen auf die YouTube-Kopie zu pflegen oder jedes Mal zu suchen.
Es kann eine Mischung dieser Gründe sein, und sicher gibt es weitere, die ich nicht bedacht habe oder an die ich mich gerade nicht erinnere.
Das meiste, was ich herunterlade, sehe ich einmal an und lösche es dann.
Außerdem gibt es Situationen, in denen YouTube-Streaming nicht möglich ist: Das Internet ist ausgefallen, ein ausländischer Mobiltarif wäre zu teuer, oder man möchte einfach die miese Werbung loswerden.
Verwandt: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820
Wenn man einen der auf
yt-dlpbasierenden Server mit einem sehr einfachen Pi-hole-ähnlichen Image-Erstellungstool und einer ordentlichen Frontend-Client-App zur Wiedergabe verpackt, könnte das meiner Meinung nach groß werden – ähnlich wie Pi-hole sich bei weniger technisch versierten Nutzern verbreitet hat.Man kauft einen Raspberry Pi, schreibt ein Image auf eine microSD-Karte, wählt seine Lieblings-YouTube-Kanäle aus und installiert die Client-App; dann sind alle bevorzugten YouTube-Inhalte lokal und ohne Werbung verfügbar.
Ich nutze derzeit TubeSync. Der Funktionsumfang ist schlicht und es hat auch viele Bugs, aber für mich funktioniert es gut genug.
Was ich brauche, ist nur: Kanäle oder Playlists abonnieren, Videos in einen bestimmten Pfad herunterladen und einmal täglich nach neuen Inhalten suchen.
Die nötige UX beschränkt sich auf die Kanaleinstellungen; danach sollen einfach nur Dateien gespeichert werden, und Plex kümmert sich um den Rest. Kennt jemand eine bessere Alternative?