Перейти к основному содержанию
Скидка 50% все планы, ограниченное время. Начиная от $2.48/mo
11 min left
Игры и медиа

Запуск yt-dlp на VPS для персонального архивирования без графики

S Автор: Sajjad 11 мин чтения
yt-dlp running headless on a VPS, feeding scheduled downloads into an organized video library that a media server can scan

Запуск yt-dlp на VPS даёт долгим загрузкам машину, которая остаётся в сети после того, как вы закрыли ноутбук. Он также выстраивает понятный путь от запланированной выгрузки канала до медиатеки, которую сможет просканировать Jellyfin.

Сервер меняет три части рабочего процесса: установке нужны актуальные зависимости для YouTube, видео с доступом по аккаунту нужен безопасный перенос cookie, а автоматизации нужен продуманный темп запросов. Настройка ниже закрывает все три, не предполагая, что каждой загрузке нужны cookie, веб-интерфейс или провайдер PO Token.

Кратко (TL;DR)

  • Установите yt-dlp в виртуальном окружении Python вместе с ffmpeg, ffprobe, yt-dlp-ejs и поддерживаемой средой выполнения JavaScript. Сейчас проект рекомендует Deno.
  • Начинайте без cookie от аккаунта. Добавляйте их только для приватных плейлистов, видео с возрастным ограничением, контента для участников канала или другого случая с доступом по аккаунту.
  • Оставьте поведение yt-dlp по умолчанию с одним фрагментом, пока у вас не появится измеренная причина его менять. Используйте параметры пауз и разнесённые расписания, чтобы снизить нагрузку запросами.
  • Чистый CLI плюс systemd — самая простая надёжная связка. Выбирайте Pinchflat для автоматических правил по каналам, MeTube для очереди в браузере или Tube Archivist для интерфейса просмотра с поиском.
  • Считайте хранилище главной переменной при расчёте размера. Проверьте репрезентативную выборку, прежде чем покупать дисковую ёмкость под полный архив.

Используйте yt-dlp ответственно

Архивируйте медиа только тогда, когда у вас есть разрешение, а использование соответствует условиям платформы и применимому праву.

  • Хорошие кандидаты — ваши собственные загрузки, материалы в общественном достоянии и то, скачивание чего разрешил правообладатель.
  • Подписка YouTube Premium сама по себе не даёт права копировать видео вне тех функций, которые предоставляет YouTube.
  • Разрешения и ограничения YouTube ограничивают скачивание и автоматизированный доступ, если только сервис или соответствующие правообладатели этого не разрешили.
  • Это руководство не рассматривает обход DRM, коммерческое распространение и способы уклонения от мер, которые применяет платформа.

Что нужно перед началом

Базовая установка небольшая, а медиафайлы — нет. Подготовьте сервер и путь для хранения, прежде чем скачивать целый канал.

  • VPS с Ubuntu 22.04 или новее либо с актуальным выпуском Debian и доступом по SSH
  • Python 3.10 или новее
  • Достаточно места под репрезентативную выборку плюс запас на частичные файлы и постобработку
  • Отдельный локальный браузер — только если нужны cookie от аккаунта
  • Необязательно: Jellyfin, Emby или другой медиасервер, способный читать каталог архива

Зачем размещать yt-dlp на VPS?

VPS полезен, когда задача должна выполняться независимо от вашего повседневного компьютера. Он даёт загрузчику постоянный процесс, предсказуемую файловую систему и планировщик, который не останавливается, когда ноутбук уходит в сон или меняет сеть.

Компромиссы важны. Месячный лимит трафика вашего сервера может стать ограничением, когда вы отдаёте архив обратно потоком, а IP-адрес VPS может упереться в лимиты запросов раньше, чем ваше домашнее подключение. На вас также ложатся обновления, работа с учётными данными, резервные копии, очистка хранилища и безопасность медиасервера. Для разовой загрузки проще ноутбук. Для регулярных выгрузок или общей медиатеки VPS удобнее в эксплуатации.

Рассчитывайте VPS вокруг хранилища и воспроизведения

yt-dlp VPS sizing guide: starting allocations of 2 vCPU and 2 GB RAM for raw yt-dlp with systemd, 2 vCPU and 4 GB RAM for MeTube or Pinchflat, and 4 vCPU and 8 GB RAM for Tube Archivist, beside a method for projecting storage from a sample download

yt-dlp скачивает и ремуксирует медиа; обычно он не перекодирует каждый файл. Поэтому постоянные требования загрузчика к процессору и памяти остаются скромными, тогда как расход диска зависит от длительности видео, разрешения, кодека и выбранного формата.

Используйте эти значения как осторожные отправные точки, а не как официальные минимумы:

НастройкаСтартовые ресурсыПодход к хранилищуЛучший выбор
Чистый yt-dlp с systemd2 vCPU, 2 GB RAMРасчёт по выборкеЗагрузки по расписанию без интерфейса
MeTube или Pinchflat2 vCPU, 4 GB RAMРасчёт по выборкеОчередь в браузере или подписки на каналы
Tube Archivist4 vCPU, 8 GB RAMЛокальный диск с запасом на ростАрхив с поиском и встроенным воспроизведением

Небольшому тесту нужно около 2 ГБ доступной памяти, а установке среднего и крупного размера около 4 ГБ, согласно документу руководство по развёртыванию Tube Archivist. Старт выше этой планки оставляет место операционной системе, Docker, работе Elasticsearch и ещё одному сервису вроде Jellyfin.

Прежде чем рассчитывать полный архив, смоделируйте или скачайте репрезентативную группу в выбранном разрешении. Посмотрите итоговый каталог через du, разделите на число завершённых видео и учтите необычно длинные ролики.

du -sh ~/archive
find ~/archive -type f \( -name '*.mp4' -o -name '*.mkv' \) | wc -l
df -h ~/archive

Выборка полезнее общей оценки «гигабайт на видео», потому что отражает реальную длительность и набор форматов конкретного канала.

Установка yt-dlp и его актуальных зависимостей

Проект yt-dlp поддерживает Python 3.10 и новее. Список зависимостей yt-dlp настоятельно рекомендует ffmpeg, ffprobe, yt-dlp-ejs и поддерживаемую среду выполнения JavaScript для полной поддержки YouTube.

Начните с системных пакетов и изолированного окружения Python:

sudo apt update
sudo apt install -y python3 python3-venv ffmpeg curl nano
python3 -m venv ~/yt-dlp-venv
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

Deno включён в yt-dlp по умолчанию, и именно эту среду выполнения сейчас рекомендует руководство по EJS проекта проект. Установите его, добавьте в PATH вашей оболочки и проверьте каждый компонент:

curl -fsSL https://deno.land/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
yt-dlp --version
ffmpeg -version | head -1
deno --version
yt-dlp --simulate --verbose "https://www.youtube.com/watch?v=VIDEO_ID"

Подробный вывод перечисляет зависимости, которые видит yt-dlp. Если ffmpeg отсутствует, yt-dlp предупреждает об этом и не может ни объединить раздельные потоки видео и аудио наилучшего качества, ни выполнить ряд шагов постобработки.

Для установки через pip обновляйтесь, повторно запуская pip внутри виртуального окружения. Встроенная команда yt-dlp -U предназначена для бинарных релизов, а не для пакетов pip.

source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

Каналы обновлений описаны в разделе заметок об обновлении yt-dlp. Доступны каналы stable, nightly и master, причём обычным пользователям проект рекомендует nightly: исправления экстракторов приходят туда раньше следующего стабильного выпуска.

Добавляйте cookie только для контента с доступом по аккаунту

Сначала попробуйте целевой URL без cookie. Руководство yt-dlp по YouTube говорит, что cookie нужны только для контента, требующего аккаунта: приватных плейлистов, видео с возрастным ограничением и материалов для участников канала. Вход по OAuth с yt-dlp больше не работает.

Когда cookie всё же нужны, экспортируйте отдельную сессию YouTube на своём локальном компьютере. Описанная в проекте процедура экспорта cookie использует окно приватного просмотра, чтобы YouTube не обновил экспортированную сессию в открытой обычной вкладке:

  1. Откройте одно приватное окно или окно инкогнито и войдите в YouTube.
  2. В той же вкладке откройте файл robots.txt YouTube.
  3. Экспортируйте только cookie домена youtube.com в формате Netscape с помощью одного из расширений, перечисленных в FAQ yt-dlp.
  4. Закройте приватное окно и не открывайте эту сессию снова.
  5. Скопируйте файл на VPS и ограничьте права доступа к нему.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'

Проверьте файл на URL, требующем аккаунта:

~/yt-dlp-venv/bin/yt-dlp \
  --cookies ~/cookies.txt \
  --simulate \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Файлы cookie — это учётные данные сессии, а к выбору браузерных расширений нужно подходить осторожно, о чём говорит FAQ yt-dlp по cookie. Руководство по экстрактору YouTube также предупреждает, что использование аккаунта вместе с yt-dlp может привести к временной или постоянной блокировке. Применяйте cookie только там, где цель этого требует, держите файл закрытым и используйте отдельный аккаунт, а не основной аккаунт Google.

Не прописывайте --cookies в глобальной конфигурации, если большинство целей публичные. Используйте второй файл конфигурации или добавляйте флаг только к тем задачам, где он нужен.

Считайте PO Token средством диагностики по необходимости

yt-dlp access troubleshooting flow: simulate the URL first, then branch to no cookies needed for a working public video, a cookie export for account-gated content, or a dependency update and PO Token check when failures continue

Proof of Origin Token не является универсальным требованием при установке. Сейчас YouTube требует эти токены для части сочетаний клиента и запроса, и точная матрица меняется.

Когда стандартные клиенты не срабатывают, рекомендуется плагин-провайдер для клиента mweb, о чём говорит руководство yt-dlp по PO Token. Там указан bgutil-ytdlp-pot-provider как один из рекомендуемых вариантов, но этому плагину нужны и провайдер токенов, и плагин для yt-dlp. Установка одного лишь пакета Python — ещё не полная настройка.

Используйте такой порядок, когда загрузка с YouTube не удаётся:

  1. Обновите yt-dlp, yt-dlp-ejs и среду выполнения JavaScript.
  2. Воспроизведите сбой с --verbose и без дополнительного переопределения клиента.
  3. Добавляйте cookie только если видео требует аккаунта.
  4. Если ошибка указывает на требование PO Token, следуйте актуальным инструкциям провайдера, на которые ссылается официальное руководство.

Так нестабильный обходной приём не попадает в базовую установку, которая в остальном стабильна.

Выбор фронтенда по рабочему процессу

Главный выбор — не в том, у какого интерфейса длиннее список возможностей. Решите, нужна ли вам очередь в браузере, подписки по правилам или полноценная локальная библиотека в духе YouTube.

ПараметрРазвёртываниеСильные стороныГлавный компромисс
Чистый CLIБез фронтендаСкрипты, конфигурационные файлы, systemd, точный контроль над флагамиНет веб-интерфейса
MeTubeОдин контейнер DockerЗагрузки через браузер плюс подписки на каналы и плейлистыОграниченное управление библиотекой после загрузки
PinchflatОдин контейнер DockerПравила для каналов и плейлистов, RSS, хранение, вывод для медиацентраСоздан для управления загрузками, а не для просмотра внутри приложения
Tube ArchivistКонтейнеры приложения, Redis и ElasticsearchПоиск, метаданные, очереди, страницы каналов и воспроизведениеНаибольшие расходы памяти и эксплуатационные накладные

Для лёгкого браузерного сценария MeTube поддерживает подписки на каналы и плейлисты, которые периодически проверяют новинки и сами ставят их в очередь. Это по-прежнему самый простой вариант, когда вам нужна прежде всего веб-форма и очередь загрузок.

Pinchflat лучше всего подходит для постоянного архивирования каналов, которые будут смотреть через Jellyfin, Plex, Kodi или RSS-клиент. Он самодостаточен, периодически проверяет источники, поддерживает правила хранения и намеренно оставляет воспроизведение другому приложению.

Tube Archivist оправдывает свои дополнительные сервисы, когда вы хотите, чтобы сам архив вёл себя как видеосайт с поиском. Если интерфейс воспроизведения у вас уже даёт Jellyfin, начните с чистого CLI или Pinchflat и добавляйте Tube Archivist только тогда, когда его модель поиска и метаданных решает реальную вашу проблему.

Постройте воспроизводимую конфигурацию архива

Держите долгоживущие параметры в одном файле, а URL канала передавайте из командной строки или планировщика. Этот пример ограничивает вывод 1080p, записывает идентификаторы завершённых видео, добавляет мягкое разнесение запросов и пишет метаданные, полезные и вне yt-dlp.

Создайте каталоги и файл конфигурации:

mkdir -p ~/.config/yt-dlp ~/archive
nano ~/.config/yt-dlp/archive.conf

Добавьте такие параметры:

-P "~/archive"
-o "%(channel)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"
-f "bv*[height<=1080]+ba/b[height<=1080]"
--merge-output-format mp4
--download-archive ~/archive/downloaded.txt
--sleep-requests 1
--sleep-interval 5
--max-sleep-interval 10
--write-info-json
--write-thumbnail
--write-subs
--write-auto-subs
--sub-langs en.*
--embed-subs
--embed-thumbnail
--embed-metadata
--sponsorblock-mark all

Прогоните тест на одном видео, прежде чем отдавать yt-dlp целый канал:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Затем запустите URL канала или плейлиста с той же конфигурацией:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/@CHANNEL/videos"

Файл --download-archive записывает идентификаторы успешно скачанных видео, поэтому последующие запуски их пропускают. Поначалу оставьте значение по умолчанию --concurrent-fragments 1. Руководство yt-dlp по YouTube советует делать паузы между видео, когда сессия упирается в лимиты запросов; универсального безопасного потолка параллельности фрагментов для IP-адресов VPS там не публикуется.

Планирование загрузок с помощью systemd

Пользовательский таймер systemd даёт задаче постоянное расписание и журналы, без длинной команды в cron. Случайная задержка вдобавок не даёт всем запланированным источникам стартовать в одну и ту же секунду. Чтобы не зависеть от PATH пользовательского менеджера, служба указывает yt-dlp прямо на стандартный путь установки Deno.

Создайте службу:

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/yt-dlp-archive.service
[Unit]
Description=Archive a YouTube channel with yt-dlp

[Service]
Type=oneshot
ExecStart=%h/yt-dlp-venv/bin/yt-dlp --js-runtimes deno:%h/.deno/bin/deno --config-location %h/.config/yt-dlp/archive.conf https://www.youtube.com/@CHANNEL/videos

Создайте таймер:

nano ~/.config/systemd/user/yt-dlp-archive.timer
[Unit]
Description=Run the yt-dlp archive daily

[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

Включите таймер и разрешите пользовательской службе работать, когда вы не вошли в систему:

systemctl --user daemon-reload
systemctl --user enable --now yt-dlp-archive.timer
sudo loginctl enable-linger "$USER"
systemctl --user list-timers
journalctl --user -u yt-dlp-archive.service -n 100 --no-pager

Для нескольких каналов создайте по экземпляру службы на канал или используйте отдельные таймеры. Разнесите их по времени, а не запускайте несколько крупных выгрузок разом.

Подключите архив к Jellyfin

Смонтируйте или откройте тот же каталог ~/archive для Jellyfin, а затем добавьте его как библиотеку. Для «сырой» структуры канал/дата подходит библиотека типа Music Videos в Jellyfin : она принимает вложенные папки и произвольные имена файлов без сопоставления метаданных онлайн. Для немузыкального архива ярлык неточный, но по структуре файлов подходит лучше типа «Shows», который ждёт папки сериалов и сезонов с именами эпизодов вида SxxEyy. Избегайте Mixed Content, если только вас не устраивает предупреждение Jellyfin о том, что результаты по метаданным могут быть ненадёжными.

Параметры метаданных, миниатюр и субтитров в конфигурации yt-dlp сохраняют полезную информацию рядом с каждым файлом или внутри него. Jellyfin всё равно может потребовать ручной правки метаданных, потому что канал YouTube не ложится чисто на базу данных телесериалов.

Если вы хотите имена файлов и метаданные под Jellyfin с меньшей ручной работой, у Pinchflat есть готовые профили для медиацентров под этот сценарий. Более широкий выбор между медиасерверами разбирает наше сравнение Jellyfin и Plex охватывает компромиссы по воспроизведению, удалённому доступу и транскодированию.

Разместите стек на постоянном сервере

Когда процесс отработает на небольшом тестовом наборе, перенесите его на Linux VPS от Cloudzy , чтобы загрузки по расписанию и ваша медиатека оставались онлайн, не занимая повседневный компьютер. Вы также можете развернуть Jellyfin как приложение в один клик и указать его библиотеке каталог, куда пишет yt-dlp.

Посмотреть тарифы Linux

Разрабатывайте на Linux VPS с root-доступом, NVMe и мощью AMD EPYC.

Посмотреть тарифы Linux

Часто задаваемые вопросы

Нужен ли yt-dlp графический процессор на VPS?

Нет. yt-dlp может скачивать и ремуксировать медиа без графического процессора. GPU становится важен, когда Jellyfin или другой медиасервер вынужден перекодировать видео для несовместимых клиентов или каналов с меньшей пропускной способностью; прямое воспроизведение такой конвертации не требует.

Может ли yt-dlp возобновить прерванную загрузку?

Да. yt-dlp по умолчанию включает частичные файлы и продолжение, поэтому следующий запуск обычно возобновляет уже скачанные фрагменты, а не начинает заново. Не добавляйте --no-continue, --no-part или --force-overwrites, если хотите такое поведение.

Стоит ли размещать yt-dlp и Jellyfin на одном VPS?

Они могут делить один VPS, когда места, процессора и исходящего трафика хватает на обе задачи. Разделяйте их, когда воспроизведение или перекодирование конкурирует с большими загрузками, когда нужны независимые окна обслуживания или когда архиву место на более дешёвом хранилище, чем у стримингового сервера.

Поделиться

Ещё в блоге

Читайте дальше.

Готовы к развёртыванию? От $2,48/мес.

Независимое облако с 2008 года. AMD EPYC, NVMe, 40 Gbps. Возврат денег в течение 14 дней.