Important
Le développement actif sur ce référentiel a été suspendu depuis le 14/07/2023. Bien que cela puisse encore fonctionner dans certains scénarios, sachez que le support est désormais géré uniquement par la communauté et que les PR ne sont actuellement pas fusionnés avec le dépôt. Pour les mises à jour en cours, nous vous encourageons à explorer des forks comme @distube/ytdl-core. Nous pourrions revoir le développement à l’avenir. Merci pour votre intérêt et votre soutien de longue durée !
Cordialement TFAN, 2024-08-13
Encore un autre module de téléchargement YouTube. Écrit uniquement avec Javascript et une interface de streaming conviviale pour les nœuds.
Vous pouvez nous contacter pour obtenir de l'aide sur notre serveur de chat
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript : importer ytdl depuis 'ytdl-core'; avec --esModuleInterop// TypeScript : importer * en tant que ytdl depuis 'ytdl-core' ; avec --allowSyntheticDefaultImports// TypeScript : import ytdl = require('ytdl-core'); avec aucun des éléments ci-dessusytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
Tente de télécharger une vidéo à partir de l'URL indiquée. Renvoie un flux lisible. options
peuvent avoir les éléments suivants, en plus de toute option getInfo()
et de toute option chooseFormat()
.
range
- Une plage d'octets au format {start: INT, end: INT}
qui spécifie une partie du fichier à télécharger, c'est-à-dire {start: 10355705, end: 12452856}. Non pris en charge sur les formats segmentés (DASH MPD, m3u8).
Cela télécharge une partie du fichier, et non une vidéo épissée séparément.
begin
- À quelle heure dans la vidéo commencer. Prend en charge les formats 00:00:00.000
, 0ms, 0s, 0m, 0h
ou nombre de millisecondes. Exemple : 1:30
, 05:10.123
, 10m30s
.
Pour les vidéos en direct, cela accepte également un horodatage Unix ou un objet Date, et la valeur par défaut est Date.now()
.
Cette option n'est pas très fiable pour les vidéos non live, voir #129 et #219.
liveBuffer
- Durée de tampon à utiliser pour les vidéos en direct, en millisecondes. La valeur par défaut est 20000
.
highWaterMark
: quantité de vidéo téléchargée à mettre en mémoire tampon. Voir la documentation du nœud pour en savoir plus. La valeur par défaut est 512 Ko.
dlChunkSize
- Lorsque le format choisi est vidéo uniquement ou audio uniquement, le téléchargement est séparé en plusieurs morceaux pour éviter toute limitation. Cette option spécifie la taille de chaque morceau en octets. Le définir sur 0 désactive le découpage. La valeur par défaut est 10 Mo.
IPv6Block
- Bloc IPv6 à parcourir, une alternative à l'utilisation d'un proxy. En savoir plus. La valeur par défaut est undefined
.
ytdl.videoInfo
- Informations.
ytdl.videoFormat
- Format vidéo.
Émis lorsque les info
de la vidéo sont récupérées, ainsi que le format choisi à télécharger.
number
- Longueur du morceau en octets ou numéro de segment.
number
- Nombre total d'octets ou de segments téléchargés.
number
- Nombre total d'octets ou de segments.
Émis chaque fois qu'un nouveau morceau est reçu. Transmet des valeurs décrivant la progression du téléchargement.
Tous les événements miniget sont transmis et peuvent être écoutés à partir du flux renvoyé.
Appelez pour abandonner et arrêter le téléchargement d'une vidéo.
Utilisez-le si vous souhaitez uniquement obtenir des métainformations à partir d'une vidéo.
Obtient les métainformations d'une vidéo. Comprend des formats supplémentaires et une URL déchiffrée prête à être téléchargée. C'est ce que la fonction ytdl()
utilise en interne.
options
peuvent avoir les éléments suivants
requestOptions
- Tout ce qui doit être fusionné dans les options de requête avec lesquelles le miniget est appelé, comme headers
.
requestCallback
- Fournit une fonction de rappel qui reçoit les objets de flux de requêtes miniget utilisés lors de la récupération des métainformations.
lang
- Le symbole à 2 caractères d'une langue. La valeur par défaut est en
.
Une fois que vous avez reçu les métadonnées d'une vidéo avec la fonction ytdl.getInfo
, vous pouvez transmettre ces informations ainsi que d'autres options à cette fonction.
Peut être utilisé si vous souhaitez choisir vous-même un format. Génère une erreur s'il ne parvient pas à trouver un format correspondant.
options
peuvent avoir les éléments suivants
quality
- Qualité vidéo à télécharger. Il peut s'agir d'une valeur itag, d'une liste de valeurs itag ou de l'une de ces chaînes : highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. highestaudio
/ lowestaudio
essaient de minimiser le débit vidéo pour des formats audio tout aussi bons, tandis highestvideo
/ lowestvideo
essaient de minimiser l'audio respectivement. La valeur par défaut est highest
, qui préfère les formats vidéo et audio.
Les formats d'une vidéo typique seront triés de la manière suivante en fonction de 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
le format 18 à 360p sera choisi en premier car il s'agit du format de la plus haute qualité à la fois vidéo et audio. Si vous souhaitez un format de meilleure qualité avec à la fois la vidéo et l'audio, consultez la section sur la gestion des flux séparés.
filter
- Utilisé pour filtrer la liste des formats parmi lesquels choisir. Peut être audioandvideo
ou videoandaudio
pour filtrer les formats contenant à la fois de la vidéo et de l'audio, video
pour filtrer les formats contenant de la vidéo ou videoonly
pour les formats contenant de la vidéo et aucune piste audio supplémentaire. Peut également être audio
ou audioonly
. Vous pouvez donner une fonction de filtrage qui est appelée avec chaque format disponible. Cette fonction reçoit l'objet format
comme premier argument et doit renvoyer true si le format est préférable.
// Exemple avec une fonction personnalisée.ytdl(url, { filter: format => format.container === 'mp4' })
format
- Principalement utilisé pour télécharger des flux vidéo ou audio spécifiques. Il peut s'agir d'un objet format
spécifique renvoyé par getInfo
.
Fournir cette option ignorera les options filter
et quality
puisque le format est explicitement fourni.
// Exemple de choix d'un format vidéo.let info = wait ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { quality: '134' });console.log('Format found!', format);
Si vous souhaitez travailler avec certains formats uniquement, vous pouvez utiliser l'option filter
ci-dessus.
// Exemple de filtrage des formats en audio uniquement.let info = wait ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formats avec uniquement de l'audio : ' + audioFormats.length);
Renvoie vrai si la chaîne donnée satisfait au format d'identification de YouTube.
Renvoie vrai s’il est possible d’analyser un identifiant vidéo valide.
Renvoie un identifiant vidéo à partir d'une URL YouTube. Génère une erreur s’il ne parvient pas à analyser un identifiant.
Identique à ytdl.getURLVideoID()
ci-dessus, mais peut être appelé directement avec l'ID vidéo, auquel cas il le renvoie. C'est ce que ytdl utilise en interne. Génère une erreur s’il ne parvient pas à analyser un identifiant.
La chaîne de version extraite directement du package.json.
ytdl ne peut pas télécharger les vidéos appartenant aux catégories suivantes
Limité au niveau régional (nécessite un proxy)
Privé (si vous y avez accès, nécessite des cookies)
Locations (si vous y avez accès, nécessite des cookies)
Contenu YouTube Premium (si vous y avez accès, nécessite des cookies)
Seuls les flux en direct HLS sont actuellement pris en charge. Les autres formats seront filtrés dans ytdl.chooseFormats
Les liens de téléchargement générés sont valables 6 heures et ne peuvent être téléchargés qu'à partir de la même adresse IP.
Lorsque vous effectuez trop de demandes, YouTube peut bloquer. Cela entraînera le refus de vos demandes avec HTTP-StatusCode 429. Les étapes suivantes peuvent vous aider :
Mettre à jour ytdl-core vers la dernière version
Utilisez des proxys (vous pouvez trouver un exemple ici)
Développez l'idée de proxy en faisant pivoter les adresses (IPv6-)
lisez ceci pour plus d'informations à ce sujet
Utiliser des cookies (vous pouvez trouver un exemple ici)
pour que cela prenne effet, vous devez PREMIÈREment attendre que la limite de débit actuelle expire
Attendez (ça disparaît généralement en quelques jours)
Pour les tâches gourmandes en requêtes, il peut être utile de répartir vos requêtes sur plusieurs adresses IP sources. Changer l'adresse IP source que vous utilisez est similaire à l'utilisation d'un proxy, sauf sans contourner les restrictions telles qu'un verrouillage de région. Plus d'adresses IP entraînent moins de requêtes par IP et augmentent donc votre limite de débit. Étant donné que les adresses IPv4 constituent une ressource limitée, nous vous conseillons d'utiliser IPv6.
Utiliser un bloc IPv6, c'est essentiellement disposer de millions d'adresses IPv6 à votre demande. Dans un bloc IPv6 /64 (qui est généralement le bloc attribué à un seul foyer), il y a 18 446 744 073 709 551 616 adresses IPv6 uniques. Cela vous permettrait de faire chaque demande avec une adresse IPv6 différente.
Même si l'utilisation d'un bloc IP aide à lutter contre les limites de débit, vous devez configurer votre système hôte pour accepter le trafic http de chaque message d'un bloc IP. Nous ne pouvons pas vous aider avec la configuration d'un hébergeur/fournisseur d'hébergement spécifique, mais une recherche sur Internet le peut très probablement.
En règle générale, les vidéos 1080p ou supérieures ne contiennent pas d'audio encodé. L'audio doit être téléchargé séparément et fusionné via une bibliothèque d'encodage. ffmpeg
est l'outil le plus utilisé, avec de nombreux modules Node.js disponibles. Utilisez les objets format
renvoyés par ytdl.getInfo
pour télécharger des flux spécifiques à combiner en fonction de vos besoins. Regardez example/ffmpeg.js pour un exemple de cela.
YouTube met constamment à jour son site Web, il n'est pas si rare que cela cesse de fonctionner. Si cela ne fonctionne pas pour vous et que vous utilisez la dernière version, n'hésitez pas à ouvrir un problème. Assurez-vous de vérifier s'il n'y en a pas déjà un avec la même erreur.
Exécutez les tests sur test/irl-test.js
pour vous assurer qu'il s'agit réellement d'un problème avec ytdl-core.
npm run test:irl
Ces tests ne sont pas moqués, ils essaient de commencer à télécharger quelques vidéos. Si ceux-ci échouent, il est temps de déboguer. Si l'erreur que vous obtenez concerne le déchiffrement de la signature, vérifiez lib/sig.js
. Sinon, l'erreur est probablement dans lib/info.js
.
npm installer ytdl-core@latest
Ou pour les utilisateurs de Yarn :
fil ajouter ytdl-core@latest
Assurez-vous d'installer la dernière version de ytdl-core pour suivre les derniers correctifs.
Si vous utilisez un bot ou une application qui utilise ytdl-core tel que ytdl-core-discord ou discord-player, cela peut dépendre d'une ancienne version. Pour mettre à jour sa version ytdl-core, cette bibliothèque doit mettre à jour son fichier package.json
, vous ne pouvez pas simplement changer la version sur package.json
de votre projet, l'application utilisera toujours sa propre ancienne version de ytdl-core.
Regardez dans leur dépôt pour voir s'ils ont déjà une demande d'extraction active qui met à jour ytdl-core. Si ce n'est pas le cas, ouvrez un problème leur demandant de mettre à jour ytdl-core, ou mieux encore, lancez le projet et soumettez une pull request avec la version mise à jour.
Pendant que vous attendez la fusion des demandes d'extraction, vous pouvez pointer vers sa branche dans votre package.json
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
Le problème de l'utilisation d'une version obsolète de ytdl-core est devenu si répandu que ytdl-core vérifie désormais les mises à jour au moment de l'exécution et toutes les 12 heures. S'il trouve une mise à jour, il affichera un avertissement sur la console vous conseillant de mettre à jour. En raison de la nature de cette bibliothèque, il est important de toujours utiliser la dernière version à mesure que YouTube continue de se mettre à jour.
Si vous souhaitez désactiver cette vérification de mise à jour, vous pouvez le faire en fournissant la variable d'environnement YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - Un wrapper cli de ceci.
pully - Un autre wrapper cli de celui-ci destiné aux formats de haute qualité.
ytsr - Résultats de recherche de vidéos YouTube.
ytpl - Liste de lecture YouTube et résolveur de chaîne.
Les tests sont écrits avec du moka
test npm