Wichtig
Die aktive Entwicklung dieses Repositorys wurde seit dem 14.07.2023 unterbrochen. Auch wenn es in einigen Szenarien immer noch funktioniert, beachten Sie bitte, dass der Support jetzt ausschließlich von der Community übernommen wird und PRs derzeit nicht mit dem Repo zusammengeführt werden. Für laufende Updates empfehlen wir Ihnen, Forks wie @distube/ytdl-core zu erkunden. Möglicherweise werden wir die Entwicklung in Zukunft noch einmal überdenken. Vielen Dank für Ihr Interesse und Ihre langjährige Unterstützung!
Beste Grüße TFAN, 13.08.2024
Noch ein weiteres YouTube-Download-Modul. Nur mit Javascript und einer knotenfreundlichen Streaming-Schnittstelle geschrieben.
Sie können uns für Support auf unserem Chat-Server kontaktieren
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: import ytdl from 'ytdl-core'; mit --esModuleInterop// TypeScript: import * as ytdl from 'ytdl-core'; mit --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); mit keinem der oben genanntenytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ')
.pipe(fs.createWriteStream('video.mp4')); Versucht, ein Video von der angegebenen URL herunterzuladen. Gibt einen lesbaren Stream zurück. options können zusätzlich zu jeder getInfo() Option und chooseFormat() Option Folgendes haben.
range – Ein Bytebereich in der Form {start: INT, end: INT} , der einen Teil der herunterzuladenden Datei angibt, z. B. {Start: 10355705, Ende: 12452856}. Wird bei segmentierten Formaten (DASH MPD, m3u8) nicht unterstützt.
Dadurch wird ein Teil der Datei heruntergeladen und kein separat zusammengefügtes Video.
begin – Wann im Video beginnen soll. Unterstützt die Formate 00:00:00.000 , 0ms, 0s, 0m, 0h oder die Anzahl der Millisekunden. Beispiel: 1:30 , 05:10.123 , 10m30s .
Bei Live-Videos akzeptiert dies auch einen Unix-Zeitstempel oder ein Date-Objekt und ist standardmäßig Date.now() .
Diese Option ist für Nicht-Live-Videos nicht sehr zuverlässig, siehe Nr. 129 und Nr. 219.
liveBuffer – Wie viel Zeitpuffer in Millisekunden für Live-Videos verwendet werden soll. Der Standardwert ist 20000 .
highWaterMark – Wie viel vom Video heruntergeladen wird, um es im Speicher zwischenzuspeichern. Weitere Informationen finden Sie in den Dokumenten des Knotens. Standardmäßig 512 KB.
dlChunkSize – Wenn das ausgewählte Format nur Video oder nur Audio ist, wird der Download in mehrere Blöcke aufgeteilt, um eine Drosselung zu vermeiden. Diese Option gibt die Größe jedes Blocks in Bytes an. Wenn Sie den Wert auf 0 setzen, wird das Chunking deaktiviert. Der Standardwert ist 10 MB.
IPv6Block – IPv6-Block zum Durchlaufen, eine Alternative zur Verwendung eines Proxys. Mehr lesen. Der Standardwert ist undefined .
ytdl.videoInfo - Info.
ytdl.videoFormat – Videoformat.
Wird ausgegeben, wenn die info zusammen mit dem ausgewählten Format zum Herunterladen abgerufen werden.
number – Chunk-Länge in Bytes oder Segmentnummer.
number – Gesamtzahl der heruntergeladenen Bytes oder Segmente.
number – Gesamtzahl der Bytes oder Segmente.
Wird immer dann ausgegeben, wenn ein neuer Block empfangen wird. Übergibt Werte, die den Download-Fortschritt beschreiben.
Alle Miniget-Ereignisse werden weitergeleitet und können im zurückgegebenen Stream abgehört werden.
Rufen Sie an, um den Download eines Videos abzubrechen und zu stoppen.
Verwenden Sie dies, wenn Sie nur Metainformationen von einem Video erhalten möchten.
Ruft Metainformationen aus einem Video ab. Enthält zusätzliche Formate und kann die entschlüsselte URL herunterladen. Dies wird von der Funktion ytdl() intern verwendet.
options können Folgendes haben
requestOptions – Alles, was in die Anforderungsoptionen eingefügt werden soll, mit denen Miniget aufgerufen wird, z. B. headers .
requestCallback – Stellen Sie eine Rückruffunktion bereit, die Miniget-Anfrage-Stream-Objekte empfängt, die beim Abrufen von Metainformationen verwendet werden.
lang – Das zweistellige Symbol einer Sprache. Der Standardwert ist en .
Sobald Sie Metadaten von einem Video mit der Funktion ytdl.getInfo erhalten haben, können Sie diese Informationen zusammen mit anderen Optionen an diese Funktion übergeben.
Kann verwendet werden, wenn Sie selbst ein Format auswählen möchten. Gibt einen Fehler aus, wenn kein passendes Format gefunden wird.
options können Folgendes haben
quality – Videoqualität zum Herunterladen. Kann ein Itag-Wert, eine Liste von Itag-Werten oder eine dieser Zeichenfolgen sein: highest / lowest / highestaudio / lowestaudio / highestvideo / lowestvideo . highestaudio / lowestaudio versuchen, die Videobitrate für gleich gute Audioformate zu minimieren, während highestvideo / lowestvideo jeweils versuchen, die Audiobitrate zu minimieren. Der Standardwert ist highest , wodurch Formate mit Video und Audio bevorzugt werden.
Die Formate eines typischen Videos werden wie folgt nach quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
Format 18 bei 360p wird zuerst ausgewählt, da es das Format mit der höchsten Qualität sowohl für Video als auch für Audio ist. Wenn Sie ein Format mit höherer Qualität für Video und Audio wünschen, lesen Sie den Abschnitt zum Umgang mit separaten Streams.
filter – Wird zum Filtern der Liste der zur Auswahl stehenden Formate verwendet. Kann audioandvideo oder videoandaudio sein, um Formate zu filtern, die sowohl Video als auch Audio enthalten, video , um nach Formaten zu filtern, die Video enthalten, oder videoonly für Formate, die Video und keine zusätzliche Audiospur enthalten. Kann auch audio oder audioonly sein. Sie können eine Filterfunktion angeben, die bei jedem verfügbaren Format aufgerufen wird. Diese Funktion erhält das format als erstes Argument und sollte true zurückgeben, wenn das Format vorzuziehen ist.
// Beispiel mit benutzerdefinierter Funktion.ytdl(url, { filter: format => format.container === 'mp4' }) format – Wird hauptsächlich zum Herunterladen bestimmter Video- oder Audiostreams verwendet. Dies kann ein bestimmtes format sein, das von getInfo zurückgegeben wird.
Durch die Bereitstellung dieser Option werden die filter und quality ignoriert, da das Format explizit bereitgestellt wird.
// Beispiel für die Auswahl eines Videoformats.let info =wait ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, {quality: '134' });console.log('Format gefunden!', Format); Wenn Sie nur mit einigen Formaten arbeiten möchten, können Sie die filter oben verwenden.
// Beispiel für das Filtern der Formate nur auf Audio.let info = waiting ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formate nur mit Audio: ' + audioFormats.length);Gibt „true“ zurück, wenn die angegebene Zeichenfolge dem ID-Format von YouTube entspricht.
Gibt true zurück, wenn eine gültige Video-ID analysiert werden kann.
Gibt eine Video-ID von einer YouTube-URL zurück. Löst einen Fehler aus, wenn das Parsen einer ID fehlschlägt.
Identisch mit ytdl.getURLVideoID() oben, kann jedoch direkt mit der Video-ID aufgerufen werden und gibt diese dann zurück. Dies ist, was ytdl intern verwendet. Löst einen Fehler aus, wenn das Parsen einer ID fehlschlägt.
Die Versionszeichenfolge, die direkt aus package.json entnommen wird.
ytdl kann keine Videos herunterladen, die in die folgenden Kategorien fallen
Regional eingeschränkt (erfordert einen Proxy)
Privat (wenn Sie Zugriff haben, sind Cookies erforderlich)
Vermietungen (wenn Sie Zugriff haben, sind Cookies erforderlich)
YouTube Premium-Inhalte (falls Sie Zugriff haben, sind Cookies erforderlich)
Derzeit werden nur HLS-Livestreams unterstützt. Andere Formate werden in ytdl.chooseFormats herausgefiltert
Generierte Download-Links sind 6 Stunden lang gültig und können möglicherweise nur von derselben IP-Adresse heruntergeladen werden.
Wenn zu viele Anfragen gestellt werden, blockiert YouTube möglicherweise. Dies führt dazu, dass Ihre Anfragen mit dem HTTP-StatusCode 429 abgelehnt werden. Die folgenden Schritte könnten Ihnen helfen:
Aktualisieren Sie ytdl-core auf die neueste Version
Proxys verwenden (ein Beispiel finden Sie hier)
Erweitern Sie die Proxy-Idee durch rotierende (IPv6-)Adressen
Lesen Sie dies, um weitere Informationen hierzu zu erhalten
Cookies verwenden (ein Beispiel finden Sie hier)
Damit dies wirksam wird, müssen Sie ZUERST warten, bis das aktuelle Ratenlimit abläuft
Warten Sie ab (normalerweise verschwindet es innerhalb weniger Tage)
Bei anfrageintensiven Aufgaben kann es sinnvoll sein, Ihre Anfragen auf mehrere Quell-IP-Adressen zu verteilen. Das Ändern der von Ihnen verwendeten Quell-IP ähnelt der Verwendung eines Proxys, außer dass Einschränkungen wie eine Regionssperre umgangen werden. Mehr IP-Adressen führen zu weniger Anfragen pro IP und erhöhen somit Ihr Ratenlimit. Da IPv4-Adressen eine begrenzte Ressource darstellen, empfehlen wir die Verwendung von IPv6.
Die Verwendung eines IPv6-Blocks bedeutet im Wesentlichen, dass Sie auf Ihre Anfrage Millionen von IPv6-Adressen haben. In einem /64-IPv6-Block (normalerweise der Block, der einem einzelnen Haushalt zugewiesen wird) gibt es 18.446.744.073.709.551.616 eindeutige IPv6-Adressen. Dies würde es Ihnen ermöglichen, jede Anfrage mit einer anderen IPv6-Adresse zu stellen.
Auch wenn die Verwendung eines IP-Blocks gegen Ratenbegrenzungen hilft, müssen Sie Ihr Hostsystem so einrichten, dass es HTTP-Verkehr von jeder Nachricht in einem IP-Block akzeptiert. Wir können Ihnen bei der Einrichtung eines bestimmten Hosts/Hosting-Anbieters nicht helfen, eine Suche im Internet jedoch höchstwahrscheinlich.
Normalerweise ist bei Videos mit 1080p oder besser kein Ton kodiert. Das Audio muss separat heruntergeladen und über eine Kodierungsbibliothek zusammengeführt werden. ffmpeg ist das am weitesten verbreitete Tool, es sind viele Node.js-Module verfügbar. Verwenden Sie die von ytdl.getInfo zurückgegebenen format , um bestimmte Streams herunterzuladen und diese entsprechend Ihren Anforderungen zu kombinieren. Ein Beispiel hierfür finden Sie unter example/ffmpeg.js.
YouTube aktualisiert seine Website ständig. Es kommt nicht selten vor, dass dies nicht mehr funktioniert. Wenn es bei Ihnen nicht funktioniert und Sie die neueste Version verwenden, können Sie gerne ein Problem eröffnen. Stellen Sie sicher, dass Sie überprüfen, ob es nicht bereits einen mit dem gleichen Fehler gibt.
Führen Sie die Tests unter test/irl-test.js aus, um sicherzustellen, dass es sich tatsächlich um ein Problem mit ytdl-core handelt.
npm run test:irl
Diese Tests werden nicht verspottet, sie versuchen, mit dem Herunterladen einiger Videos zu beginnen. Wenn dies fehlschlägt, ist es Zeit für das Debuggen. Wenn der Fehler, den Sie erhalten, eine Signaturentschlüsselung ist, überprüfen Sie lib/sig.js . Andernfalls liegt der Fehler wahrscheinlich in lib/info.js .
npm install ytdl-core@latest
Oder für Yarn-Benutzer:
Garn ytdl-core@latest hinzufügen
Stellen Sie sicher, dass Sie die neueste Version von ytdl-core installieren, um mit den neuesten Korrekturen Schritt zu halten.
Wenn Sie einen Bot oder eine App verwenden, die ytdl-core verwendet, wie z. B. ytdl-core-discord oder discord-player, ist diese möglicherweise von einer älteren Version abhängig. Um ihre ytdl-core-Version zu aktualisieren, muss diese Bibliothek ihre package.json Datei aktualisieren. Sie können nicht einfach die Version in package.json Ihres Projekts ändern, die App verwendet weiterhin ihre eigene ältere Version von ytdl-core.
Schauen Sie in ihrem Repo nach, ob sie bereits eine aktive Pull-Anfrage haben, die ytdl-core aktualisiert. Wenn dies nicht der Fall ist, öffnen Sie ein Problem und bitten Sie sie, ytdl-core zu aktualisieren, oder, noch besser, teilen Sie das Projekt auf und senden Sie eine Pull-Anfrage mit der aktualisierten Version.
Während Sie darauf warten, dass die Pull-Anforderungen zusammengeführt werden, können Sie in Ihrer package.json auf den Zweig verweisen
„ytdl-core-discord“: „amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1“
Das Problem der Verwendung einer veralteten Version von ytdl-core ist so weit verbreitet, dass ytdl-core jetzt zur Laufzeit und alle 12 Stunden nach Updates sucht. Wenn ein Update gefunden wird, wird eine Warnung an die Konsole ausgegeben, die Sie zum Aktualisieren auffordert. Aufgrund der Art dieser Bibliothek ist es wichtig, immer die neueste Version zu verwenden, da YouTube ständig aktualisiert wird.
Wenn Sie diese Update-Prüfung deaktivieren möchten, können Sie dies tun, indem Sie die Umgebungsvariable YTDL_NO_UPDATE bereitstellen.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl – Ein CLI-Wrapper davon.
pully – Ein weiterer CLI-Wrapper davon, der auf hochwertige Formate abzielt.
ytsr – Suchergebnisse für YouTube-Videos.
ytpl – YouTube-Playlist und Kanal-Resolver.
Tests werden mit Mokka geschrieben
NPM-Test