Как скачивать видео с YouTube на чистом PHP без лишней боли

20 июл 2026
935
309
45
4 месяца

Знакомая история: нужно прикрутить к проекту скачивание роликов с 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 отличную подборку ссылок на статьи и исходники других парсеров.

Практические кейсы

Где это реально может пригодиться:

  1. Телеграм-боты. Если вы пишете бота для скачивания видео, PHP-библиотека позволит не плодить микросервисы на Python.
  2. Превью-сервисы. Когда нужно быстро выдернуть метаданные или скриншот видео без использования тяжелого и лимитированного YouTube API.
  3. Архивация контента. Создание локальных копий важных видео для внутренних нужд компании.

Стоит ли использовать

Проект выглядит бодро: тесты проходят, коммиты появляются регулярно (что критично для таких инструментов, так как YouTube меняет разметку постоянно).

Из минусов — сейчас есть проблема со скоростью загрузки. YouTube часто троттлит запросы до 100 кб/с, если они кажутся ему подозрительными. Автор знает об этом и держит задачу в туду-листе. Также пока нет встроенной склейки видео и аудио через ffmpeg, так что если вам нужно 4K (где звук и видео всегда идут раздельно), придется дописывать эту логику самостоятельно.

Если вам нужно простое и понятное решение на PHP без лишнего оверхеда, youtube-downloader — отличный кандидат на место в вашем composer.json.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.