>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
PHP

Cómo descargar videos de YouTube con PHP puro sin complicaciones

Una historia conocida: necesitas agregar descarga de videos a tu proyecto o simplemente obtener una URL de stream directa. Lo primero que viene a la mente es el clásico youtube-dl. Pero los problemas comienzan de inmediato. Tienes que dealing with system calls, manage Python installations in your container, y esperar que el binary no se rompa en el peor momento posible.

Hace poco encontré el repositorio youtube- down- loader del desarrollador Athlon16. Es un intento de construir una biblioteca adecuada en PHP puro que no arrastra un montón de dependencias externas y herramientas externas.

¿Cuál es el punto de este proyecto

El autor lo dice claramente: la mayoría de las bibliotecas PHP para YouTube están abandonadas desde hace cinco años o simplemente envuelven llamadas a scripts de Python. Este proyecto sigue una idea diferente. No hay intérpretes de JavaScript ni llamadas al shell. Solo PHP y solicitudes HTTP estándar.

El proyecto está inspirado en gigantes como yt-dlp, pero adaptado para las especificidades de los servidores web. Si necesitas integrar rápidamente funcionalidad de descarga en una aplicación PHP existente, este es probablemente el camino más fácil.

Qué puede hacer la biblioteca

La herramienta cubre las necesidades básicas que enfrentan los desarrolladores al trabajar con sitios de alojamiento de video.

Obtener enlaces directos

El escenario más común es proporcionar una URL de video y obtener una lista de formatos disponibles. La biblioteca devuelve un objeto DownloadOptions que contiene enlaces a videos de diferentes calidades, pistas de audio y streams combinados.

use YouTube\YouTubeDownloader;
use YouTube\Exception\YouTubeException;

$youtube = new YouTubeDownloader();

try {
    $downloadOptions = $youtube->getDownloadLinks("https://www.youtube.com/watch?v=aqz-KE-bpKQ");

    if ($downloadOptions->getAllFormats()) {
        // Берем первый попавшийся формат, где есть и звук, и видео
        echo $downloadOptions->getFirstCombinedFormat()->url;
    }
} catch (YouTubeException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Streaming de video a través del servidor

A veces no puedes exponer el enlace directo al usuario (por ejemplo, para evitar exponer la IP de tu servidor o evadir restricciones). La biblioteca tiene un YouTubeStreamer integrado que te permite hacer proxy del stream a través de tu backend.

$youtube = new \YouTube\YouTubeStreamer();
// Передаем URL потока, полученный ранее
$youtube->stream('https://r4---sn-n4v7knll.googlevideo.com/videoplayback?...');

Trabajando con restricciones y cookies

YouTube no gusta la automatización. Si un video tiene restricciones de edad o solo está disponible para usuarios autorizados, una solicitud regular devolverá un error. La biblioteca te permite proporcionar un archivo de cookies exportado desde tu navegador. Es una forma "hacky" pero funcional de hacer que el servicio piense que la solicitud proviene de una persona real.

$youtube = new YouTubeDownloader();
$youtube->getBrowser()->setCookieFile('./cookies.txt');
$youtube->getBrowser()->setUserAgent('Mozilla/5.0...');

Por cierto, hay incluso un método consentCookies() que hace clic programáticamente en el botón "Aceptar" en los avisos de cookies europeos. Una pequeña cosa, pero ahorra tiempo en depuración.

Cómo funciona internamente

En lugar de analizar la página con regex (que no es confiable), la biblioteca intenta imitar el comportamiento del cliente. Analiza las estructuras de datos internas de YouTube, encuentra firmas y decodifica enlaces. Si tienes curiosidad sobre cómo funciona realmente la ingeniería inversa del protocolo de YouTube, el autor dejó una gran colección de enlaces a artículos y código fuente de otros parsers en el README.

Casos de uso prácticos

Dónde esto puede ser realmente útil:

  1. Bots de Telegram. Si estás escribiendo un bot de descarga de videos, una biblioteca PHP te permite evitar generar microservicios en Python.
  2. Servicios de vista previa. Cuando necesitas obtener rápidamente metadatos o una captura de pantalla de un video sin usar la API de YouTube, que es pesada y tiene límite de tasa.
  3. Archivo de contenido. Crear copias locales de videos importantes para necesidades internas de la empresa.

¿Vale la pena usar

El proyecto parece activo: las pruebas pasan, los commits llegan regularmente (lo cual es crítico para herramientas como esta ya que YouTube constantemente cambia su marcado).

En el lado negativo, actualmente hay un problema con la velocidad de descarga. YouTube a menudo limita las solicitudes a 100 kbps si parecen sospechosas. El autor lo sabe y lo tiene en su lista de tareas. Además, aún no hay fusión de video y audio integrada a través de ffmpeg, así que si necesitas 4K (donde el audio y el video siempre vienen por separado), tendrás que escribir esta lógica tú mismo.

Si necesitas una solución PHP simple y directa sin sobrecarga adicional, youtube- down- loader es un gran candidato para tu composer.json.

Proyectos relacionados