VOD-пайплайн
Как запись стрима попадает на три площадки
Запись длиной в несколько часов нужно скачать, уместить в лимит Telegram и выложить в Telegram, YouTube и Boosty. Запуск делается одной командой в боте, остальное идёт без участия человека, в том числе возврат к работе после падения.
- СкачиваниеTwitch · 3 попытки
- СжатиеFFmpeg · до 4096 МБ
- Telegramпост по сетке
- YouTubeзагрузка частями
- Boostyзагрузка частями
YouTube и Boosty получают исходник в фоне, пока для Telegram готовится сжатая копия. За всем следит управляющий бот.
Жёсткий лимит при любой длине записи
Telegram не примет файл больше 4096 МБ, а длина эфира каждый раз другая. Поэтому битрейт считается от длины записи: цель 3960 МБ, из которых 128 кбит/с остаются звуку. Если файл всё равно вышел за лимит, он кодируется заново с целью 3700 МБ.
VIDEO_BITRATE=$(( (3960 * 8 * 1024 / DURATION) - 128 ))
Эфиры длиннее пяти часов
На такой длине битрейт упал бы слишком сильно, поэтому запись режется на части и выходит альбомом. Границы выбираются в боте: автоматически, пополам или вручную. Лимит проверяется для каждой части отдельно.
Падение на середине не отменяет работу
Кодирование идёт долго, а загрузки зависят от чужих серверов, так что сбои неизбежны. Каждый готовый шаг оставляет маркер. При продолжении скрипт сверяет, что маркеры относятся к той же записи, и пропускает всё уже сделанное: скачивание, кодирование, опубликованные посты. Перед стартом он ещё проверяет место на диске.
if [ "$RESUME" = "1" ] && [ -f "$STATE_DIR/encode_done" ] && [ -s output.mp4 ]; then
log "RESUME: output.mp4 уже закодирован"
Кто заметит, что процесс умер
Скрипт, упавший ночью, сам об этом не сообщит. Поэтому бот каждые две минуты проверяет, жив ли процесс и дошёл ли этап до конца. Перед тревогой он ждёт ещё 10 секунд, чтобы не принять штатное завершение за сбой, а затем присылает кнопки «Продолжить» и «Сбросить». Ручная отмена сбрасывает состояние и тревоги не вызывает.
Пост выходит точно по сетке
Загрузка файла занимает разное время, а пост должен появиться ровно в :00 или :30. Поэтому байты отправляются на серверы Telegram заранее, а в нужную секунду создаётся только сообщение. Это занимает доли секунды и не зависит от скорости заливки.
Bash · Python · FFmpeg · Telethon · YouTube Data API · tmux · systemd
Вернуться к проектам