YouTube.js

Un cliente JavaScript para la API privada de YouTube - accede a videos, comentarios, chats en vivo y datos de transmisión sin claves API ni cuotas

TL;DR

En una línea: YouTube.js (youtubei.js) es un cliente JavaScript completo para la API privada InnerTube de YouTube que funciona en Node.js, Deno y navegadores.

Valores principales:

  • No requiere claves API ni cuotas
  • Acceso a videos, comentarios, chats en vivo y datos de transmisión
  • Soporte multiplataforma (Node.js, Deno, navegadores)
  • Control total sobre descargas de videos y transmisión

Quick Start

Prerequisitos

  • Node.js 16.8+ (usa la implementación fetch de undici)
  • Soporte para EventTarget y CustomEvent
  • Fetch compatible con especificaciones con soporte ReadableStream

Instalación

# npm
npm install youtubei.js@latest

# Yarn
yarn add youtubei.js@latest

# Deno
deno add npm:youtubei.js@latest

# Git (versión edge)
npm install github:LuanRT/YouTube.js

Verificar instalación

import { Innertube } from 'youtubei.js';

const youtube = await Innertube.create();
console.log('¡YouTube.js inicializado correctamente!');

Primer comando

import { Innertube } from 'youtubei.js';

const youtube = await Innertube.create();

// Buscar videos
const results = await youtube.search('tutoriales de JavaScript');
console.log(results.videos[0].title);

// Obtener información del video
const info = await youtube.getBasicInfo('dQw4w9WgXcQ');
console.log(info.basic_info.title);

Cheatsheet

OperaciónCódigo
Inicializar clienteconst yt = await Innertube.create()
Buscar videosawait yt.search('consulta')
Obtener info básicaawait yt.getBasicInfo('videoId')
Obtener info completaawait yt.getInfo('videoId')
Descargar videoconst stream = await info.download()
Elegir formatoinfo.chooseFormat({ type: 'audio', quality: 'best' })
Obtener URL de transmisiónformat.decipher(yt.session.player)
Convertir a DASHinfo.toDash()
Obtener comentariosawait yt.getComments('videoId')
Acceder al chat en vivoconst livechat = info.getLiveChat()

Gotchas

Problema 1: Descargas de video sin audio

Razón: YouTube proporciona video y audio como flujos separados para muchos formatos. La descarga predeterminada puede incluir solo el video.

Solución:

const info = await youtube.getInfo('videoId');

// Elegir formato específico con video y audio
const format = info.chooseFormat({
  type: 'video+audio',
  quality: 'best'
});

// O descargar audio y video por separado y fusionarlos
const audioFormat = info.chooseFormat({ type: 'audio', quality: 'best' });
const videoFormat = info.chooseFormat({ type: 'video', quality: 'best' });

Problema 2: Las URL de transmisión expiran

Razón: YouTube genera URL con límite de tiempo para transmisión. Estas URL normalmente expiran después de 6 horas.

Solución:

// Siempre obtener información nueva al transmitir
const info = await youtube.getBasicInfo('videoId');
const url = info.streaming_data?.formats[0].decipher(yt.session.player);

// Para aplicaciones de larga duración, actualizar las URL periódicamente

Problema 3: Limitación de velocidad y bloqueos

Razón: YouTube puede limitar o bloquear solicitudes si detecta patrones de acceso automatizado.

Solución:

// Usar retrasos razonables entre solicitudes
await new Promise(resolve => setTimeout(resolve, 1000));

// Considerar implementar retroceso exponencial
// Rotar direcciones IP o usar proxies para uso de alto volumen

Next Steps