Importante
El desarrollo activo de este repositorio ha estado en pausa desde el 14 de julio de 2023. Si bien es posible que aún funcione en algunos escenarios, tenga en cuenta que el soporte ahora lo maneja únicamente la comunidad y que los RP actualmente no están fusionados con el repositorio. Para obtener actualizaciones continuas, le recomendamos que explore bifurcaciones como @distube/ytdl-core. Es posible que revisemos el desarrollo en el futuro. ¡Gracias por su interés y apoyo duradero!
Saludos cordiales TFAN, 2024-08-13
Otro módulo más de descarga de YouTube. Escrito únicamente con Javascript y una interfaz de transmisión compatible con nodos.
Puede contactarnos para obtener soporte en nuestro servidor de chat.
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: importar ytdl desde 'ytdl-core'; con --esModuleInterop// TypeScript: importar * como ytdl desde 'ytdl-core'; con --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); sin ninguno de los anteriores ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
Intenta descargar un vídeo desde la URL proporcionada. Devuelve una secuencia legible. options
pueden tener lo siguiente, además de cualquier opción getInfo()
y opción chooseFormat()
.
range
: un rango de bytes en el formato {start: INT, end: INT}
que especifica parte del archivo a descargar, es decir, {inicio: 10355705, fin: 12452856}. No se admite en formatos segmentados (DASH MPD, m3u8).
Esto descarga una parte del archivo y no un vídeo empalmado por separado.
begin
: a qué hora comenzar el video. Admite formatos 00:00:00.000
, 0ms, 0s, 0m, 0h
o número de milisegundos. Ejemplo: 1:30
, 05:10.123
, 10m30s
.
Para videos en vivo, esto también acepta una marca de tiempo Unix o un objeto Date, y el valor predeterminado es Date.now()
.
Esta opción no es muy confiable para videos que no están en vivo, consulte los puntos 129 y 219.
liveBuffer
: cuánto tiempo de búfer usar para videos en vivo en milisegundos. El valor predeterminado es 20000
.
highWaterMark
: cantidad de descarga de video que se almacena en la memoria. Consulte los documentos de node para obtener más información. El valor predeterminado es 512 KB.
dlChunkSize
: cuando el formato elegido es solo video o solo audio, la descarga se separa en varios fragmentos para evitar limitaciones. Esta opción especifica el tamaño de cada fragmento en bytes. Establecerlo en 0 deshabilita la fragmentación. El valor predeterminado es 10 MB.
IPv6Block
: bloque IPv6 para rotar, una alternativa al uso de un proxy. Leer más. El valor predeterminado es undefined
.
ytdl.videoInfo
- Información.
ytdl.videoFormat
: formato de vídeo.
Se emite cuando se recupera la info
del vídeo, junto con el formato elegido para descargar.
number
: longitud del fragmento en bytes o número de segmento.
number
: total de bytes o segmentos descargados.
number
: bytes o segmentos totales.
Se emite cada vez que se recibe un nuevo fragmento. Pasa valores que describen el progreso de la descarga.
Todos los eventos miniget se reenvían y se pueden escuchar desde la transmisión devuelta.
Llame para cancelar y detener la descarga de un video.
Úselo si solo desea obtener metainformación de un video.
Obtiene metainformación de un vídeo. Incluye formatos adicionales y URL descifrada lista para descargar. Esto es lo que usa internamente la función ytdl()
.
options
pueden tener las siguientes.
requestOptions
: cualquier cosa que se combine con las opciones de solicitud con las que se llama a miniget, como headers
.
requestCallback
: proporciona una función de devolución de llamada que recibe objetos de flujo de solicitud miniget utilizados al obtener metainformación.
lang
: el símbolo de 2 caracteres de un idioma. El valor predeterminado es en
.
Una vez que haya recibido metadatos de un video con la función ytdl.getInfo
, puede pasar esa información junto con otras opciones a esta función.
Se puede utilizar si desea elegir un formato usted mismo. Genera un error si no encuentra ningún formato coincidente.
options
pueden tener las siguientes.
quality
- Calidad del vídeo para descargar. Puede ser un valor de itag, una lista de valores de itag o una de estas cadenas: highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. highestaudio
/ lowestaudio
intenta minimizar la tasa de bits de video para formatos de audio igualmente buenos, mientras que highestvideo
/ lowestvideo
intenta minimizar el audio respectivamente. El valor predeterminado es highest
, que prefiere formatos con video y audio.
Los formatos de un vídeo típico se ordenarán de la siguiente manera según 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
Se elegirá primero el formato 18 a 360p, ya que es el formato de mayor calidad tanto con video como con audio. Si desea un formato de mayor calidad con video y audio, consulte la sección sobre cómo manejar transmisiones separadas.
filter
: se utiliza para filtrar la lista de formatos para elegir. Puede ser audioandvideo
o videoandaudio
para filtrar formatos que contienen video y audio, video
para filtrar formatos que contienen video o videoonly
para formatos que contienen video y ninguna pista de audio adicional. También puede ser audio
o audioonly
. Puede proporcionar una función de filtrado que se llame con cada formato disponible. Esta función recibe el objeto format
como primer argumento y debe devolver verdadero si el formato es preferible.
// Ejemplo con función personalizada.ytdl(url, { filtro: formato => formato.contenedor === 'mp4' })
format
: se utiliza principalmente para descargar secuencias de audio o vídeo específicas. Puede ser un objeto format
específico devuelto por getInfo
.
Al proporcionar esta opción se ignorarán las opciones filter
y quality
, ya que el formato se proporciona explícitamente.
// Ejemplo de elección de un formato de vídeo.let info = await ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { calidad: '134' });console.log('¡Formato encontrado!', formato);
Si desea trabajar solo con algunos formatos, puede utilizar la opción filter
anterior.
// Ejemplo de filtrado de formatos a solo audio.let info = await ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formatos solo con audio: ' + formatos de audio.longitud);
Devuelve verdadero si la cadena proporcionada cumple con el formato de ID de YouTube.
Devuelve verdadero si se puede analizar una identificación de video válida.
Devuelve una identificación de video de una URL de YouTube. Genera un error si no puede analizar una ID.
Igual que el ytdl.getURLVideoID()
anterior, pero se puede llamar directamente con el ID del vídeo, en cuyo caso lo devuelve. Esto es lo que ytdl usa internamente. Genera un error si no puede analizar una ID.
La cadena de versión tomada directamente del paquete.json.
ytdl no puede descargar videos que se encuentren dentro de lo siguiente
Restringido regionalmente (requiere un proxy)
Privado (si tiene acceso, requiere cookies)
Alquileres (si tiene acceso, requiere cookies)
Contenido Premium de YouTube (si tiene acceso, requiere cookies)
Actualmente, solo se admiten transmisiones en vivo de HLS. Otros formatos se filtrarán en ytdl.chooseFormats
Los enlaces de descarga generados son válidos durante 6 horas y solo se pueden descargar desde la misma dirección IP.
Al realizar demasiadas solicitudes, YouTube podría bloquearse. Esto dará como resultado que sus solicitudes sean rechazadas con HTTP-StatusCode 429. Los siguientes pasos pueden ayudarlo:
Actualiza ytdl-core a la última versión
Utilice proxies (puede encontrar un ejemplo aquí)
Amplíe la idea de proxy rotando direcciones (IPv6-)
lee esto para más información sobre esto
Utilice cookies (puede encontrar un ejemplo aquí)
Para que esto surta efecto, PRIMERO debe esperar a que expire el límite de tasa actual.
Espere (normalmente desaparece en unos días)
Para tareas que requieren muchas solicitudes, puede resultar útil distribuir sus solicitudes entre varias direcciones IP de origen. Cambiar la IP de origen que utiliza es similar a usar un proxy, excepto que no evita restricciones como el bloqueo de región. Más direcciones IP dan como resultado menos solicitudes por IP y, por lo tanto, aumentan su límite de velocidad. Dado que las direcciones IPv4 son un recurso limitado, recomendamos utilizar IPv6.
Usar un bloque IPv6 es esencialmente tener millones de direcciones IPv6 a tu disposición. En un bloque /64 IPv6 (que suele ser el bloque asignado a un solo hogar), hay 18.446.744.073.709.551.616 direcciones IPv6 únicas. Esto le permitiría realizar cada solicitud con una dirección IPv6 diferente.
Aunque el uso de un bloque de IP ayuda contra los límites de velocidad, requiere que configure su sistema host para aceptar el tráfico http de cada mensaje en un bloque de IP. No podemos ayudarlo con la configuración de ningún proveedor de alojamiento/host específico, pero lo más probable es que busque en Internet.
Normalmente, los vídeos de 1080p o mejores no tienen audio codificado. El audio debe descargarse por separado y fusionarse a través de una biblioteca de codificación. ffmpeg
es la herramienta más utilizada y hay muchos módulos de Node.js disponibles. Utilice los objetos format
devueltos por ytdl.getInfo
para descargar secuencias específicas y combinarlas según sus necesidades. Mire example/ffmpeg.js para ver un ejemplo de cómo hacer esto.
YouTube actualiza su sitio web todo el tiempo, no es tan raro que esto deje de funcionar. Si no funciona para usted y está utilizando la última versión, no dude en abrir un problema. Asegúrate de comprobar si no hay ninguno con el mismo error.
Ejecute las pruebas en test/irl-test.js
para asegurarse de que esto sea realmente un problema con ytdl-core.
npm run test:irl
Estas pruebas no se burlan, intentan comenzar a descargar algunos videos. Si fallan, entonces es hora de depurar. Si el error que recibe es el descifrado de la firma, consulte lib/sig.js
. De lo contrario, es probable que el error esté dentro de lib/info.js
.
npm instala ytdl-core@latest
O para usuarios de Yarn:
hilo agregar ytdl-core@latest
Asegúrese de instalar la última versión de ytdl-core para mantenerse al día con las últimas correcciones.
Si estás usando un bot o una aplicación que usa ytdl-core, como ytdl-core-discord o discord-player, es posible que dependa de una versión anterior. Para actualizar su versión ytdl-core, esa biblioteca tiene que actualizar su archivo package.json
, no puede simplemente cambiar la versión en package.json
de su proyecto, la aplicación seguirá usando su propia versión anterior de ytdl-core.
Mire en su repositorio para ver si ya tienen una solicitud de extracción activa que actualice ytdl-core. Si no lo hacen, abra un problema pidiéndoles que actualicen ytdl-core, o mejor aún, bifurque el proyecto y envíe una solicitud de extracción con la versión actualizada.
Mientras espera que se fusionen las solicitudes de extracción, puede señalar su rama en su package.json
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
El problema del uso de una versión desactualizada de ytdl-core se volvió tan frecuente que ytdl-core ahora busca actualizaciones en tiempo de ejecución y cada 12 horas. Si encuentra una actualización, imprimirá una advertencia en la consola indicándole que actualice. Debido a la naturaleza de esta biblioteca, es importante utilizar siempre la última versión a medida que YouTube continúa actualizándose.
Si desea deshabilitar esta verificación de actualización, puede hacerlo proporcionando la variable de entorno YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl: un contenedor cli de esto.
pully: otro contenedor cli de este dirigido a formatos de alta calidad.
ytsr: resultados de búsqueda de vídeos de YouTube.
ytpl: lista de reproducción de YouTube y resolución de canales.
Los exámenes se escriben con mocha.
prueba de NPM