Как скачивать видео с YouTube на чистом PHP без лишней боли
Знакомая история: нужно прикрутить к проекту скачивание роликов с YouTube или просто вытянуть прямую ссылку на поток. Первое, что приходит в голову — старый добрый youtube-dl. Но тут же начинаются проблемы. Приходится возиться с системными вызовами shell_exec, следить за установленным Python в контейнере и надеяться, что бинарник не отвалится в самый неподходящий момент.
Недавно наткнулся на репозиторий youtube-downloader от разработчика Athlon1600. Это попытка сделать нормальную библиотеку на чистом PHP, которая не тянет за собой хвост из сторонних зависимостей и внешних утилит.
В чем соль проекта
Автор прямо говорит: большинство PHP-библиотек для YouTube либо заброшены пять лет назад, либо просто оборачивают вызовы к Python-скриптам. Этот проект живет другой идеей. Здесь нет интерпретаторов JavaScript или обращений к шеллу. Только PHP и стандартные сетевые запросы.
Проект вдохновлен гигантами вроде yt-dlp, но адаптирован под специфику веб-серверов. Если вам нужно быстро интегрировать функционал загрузки в существующее PHP-приложение, это, пожалуй, самый легкий путь.
Что умеет библиотека
Инструмент закрывает базовые потребности, с которыми сталкивается разработчик при работе с видео-хостингами.
Получение прямых ссылок
Самый частый сценарий — скормить URL видео и получить список доступных форматов. Библиотека возвращает объект DownloadOptions, в котором лежат ссылки на видео разного качества, аудиодорожки и комбинированные потоки.
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();
}
Стриминг видео через сервер
Иногда нельзя отдавать прямую ссылку пользователю (например, чтобы не светить IP сервера или обойти ограничения). В библиотеке есть встроенный YouTubeStreamer, который позволяет проксировать поток через ваш бэкенд.
$youtube = new \YouTube\YouTubeStreamer();
// Передаем URL потока, полученный ранее
$youtube->stream('https://r4---sn-n4v7knll.googlevideo.com/videoplayback?...');
Работа с ограничениями и куками
YouTube не жалует автоматику. Если видео имеет возрастные ограничения или доступно только авторизованным пользователям, обычный запрос вернет ошибку. Библиотека позволяет подкинуть файл с куками, экспортированными из браузера. Это «костыльный», но рабочий способ заставить сервис думать, что запрос идет от реального человека.
$youtube = new YouTubeDownloader();
$youtube->getBrowser()->setCookieFile('./cookies.txt');
$youtube->getBrowser()->setUserAgent('Mozilla/5.0...');
Кстати, там даже есть метод consentCookies(), который программно нажимает кнопку «Принять» в европейских уведомлениях о куках. Мелочь, а приятно экономит время на отладке.
Как это устроено внутри
Вместо того чтобы парсить страницу регулярками (что ненадежно), библиотека пытается имитировать поведение клиента. Она разбирает внутренние структуры данных YouTube, находит сигнатуры и расшифровывает ссылки. Если вам интересно, как именно происходит реверс-инжиниринг протоколов YouTube, автор оставил в README отличную подборку ссылок на статьи и исходники других парсеров.
Практические кейсы
Где это реально может пригодиться:
- Телеграм-боты. Если вы пишете бота для скачивания видео, PHP-библиотека позволит не плодить микросервисы на Python.
- Превью-сервисы. Когда нужно быстро выдернуть метаданные или скриншот видео без использования тяжелого и лимитированного YouTube API.
- Архивация контента. Создание локальных копий важных видео для внутренних нужд компании.
Стоит ли использовать
Проект выглядит бодро: тесты проходят, коммиты появляются регулярно (что критично для таких инструментов, так как YouTube меняет разметку постоянно).
Из минусов — сейчас есть проблема со скоростью загрузки. YouTube часто троттлит запросы до 100 кб/с, если они кажутся ему подозрительными. Автор знает об этом и держит задачу в туду-листе. Также пока нет встроенной склейки видео и аудио через ffmpeg, так что если вам нужно 4K (где звук и видео всегда идут раздельно), придется дописывать эту логику самостоятельно.
Если вам нужно простое и понятное решение на PHP без лишнего оверхеда, youtube-downloader — отличный кандидат на место в вашем composer.json.
