Запуск 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 завантажує та ремуксує медіа; зазвичай він не перекодовує кожен файл. Тому постійні вимоги завантажувача до процесора й пам'яті лишаються скромними, тоді як витрата диска залежить від тривалості відео, роздільності, кодека та обраного формату.
Використовуйте ці значення як обережні відправні точки, а не як офіційні мінімуми:
| Налаштування | Стартові ресурси | Підхід до сховища | Найкращий вибір |
|---|---|---|---|
| Чистий yt-dlp із systemd | 2 vCPU, 2 GB RAM | Розрахунок за вибіркою | Завантаження за розкладом без інтерфейсу |
| MeTube або Pinchflat | 2 vCPU, 4 GB RAM | Розрахунок за вибіркою | Черга в браузері або підписки на канали |
| Tube Archivist | 4 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 посібник з 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 лише для контенту з доступом за обліковим записом
Спершу спробуйте цільову адресу без cookie. Посібник yt-dlp щодо YouTube каже, що cookie потрібні лише для контенту, який вимагає облікового запису: приватних плейлистів, відео з віковим обмеженням і матеріалів для учасників. Вхід через OAuth із yt-dlp більше не працює.
Коли cookie таки потрібні, експортуйте окремий сеанс YouTube на своєму локальному комп'ютері. Процедура експорту cookie від проєкту використовує вікно приватного перегляду, щоб YouTube не змінив експортований сеанс у відкритій звичайній вкладці:
- Відкрийте одне приватне вікно або вікно анонімного перегляду й увійдіть у YouTube.
- У тій самій вкладці відкрийте файл robots.txt YouTube.
- Експортуйте лише cookie з youtube.com у форматі Netscape за допомогою одного з розширень, перелічених у FAQ yt-dlp.
- Закрийте приватне вікно й більше не відкривайте цей сеанс.
- Скопіюйте файл на 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 як до умовного засобу усунення несправностей
Proof of Origin Token не є універсальною вимогою під час встановлення. Наразі YouTube вимагає ці токени для частини поєднань клієнта та запиту, і точна матриця змінюється.
Коли типові клієнти не спрацьовують, рекомендують плагін-провайдер для клієнта mweb, як зазначає посібник yt-dlp щодо PO Token. Там названо bgutil-ytdlp-pot-provider як один із рекомендованих варіантів, але цьому плагіну потрібні і провайдер токенів, і плагін для yt-dlp. Встановити лише пакет Python — це ще не повне налаштування.
Дотримуйтеся такого порядку, коли завантаження з YouTube не вдається:
- Оновіть yt-dlp, yt-dlp-ejs і середовище виконання JavaScript.
- Відтворіть збій із --verbose і без додаткового перевизначення клієнта.
- Додавайте cookie лише тоді, коли відео вимагає облікового запису.
- Якщо помилка вказує на вимогу 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 VPS з root-доступом, NVMe та потужністю AMD EPYC.
Переглянути тарифи LinuxЧасті запитання
Чи потрібен yt-dlp графічний процесор на VPS?
Ні. yt-dlp може завантажувати та ремуксувати медіа без графічного процесора. GPU стає важливим тоді, коли Jellyfin чи інший медіасервер має перекодувати відео для несумісних клієнтів або з'єднань із меншою пропускною здатністю; пряме відтворення такого перетворення не потребує.
Чи може yt-dlp відновити перерване завантаження?
Так. yt-dlp типово вмикає часткові файли та продовження, тож пізніший запуск зазвичай відновлює вже завантажені фрагменти, а не починає їх заново. Не додавайте --no-continue, --no-part чи --force-overwrites, якщо хочете саме такої поведінки.
