Собственная копия YouTube

в 9:00, , рубрики: Без рубрики
Собственная копия YouTube - 1

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

В итоге получается, что мы делаем нечто вроде маленькой копии YouTube, только на своём сервере. В определённом смысле это архивная копия на случай удаления видеоконтента из-за цензуры YouTube. Или на случай, если серверы YouTube станут недоступны с территории РФ из-за какого-то «технического сбоя».

Зачем это нужно

Во-первых, YouTube обильно заполнен различными трекерами и скриптами для отслеживания каждого вашего нажатия. Всё это регистрируется и сохраняется в профиль, которым Google делится с рекламодателями (точно так же отслеживаются все действия в браузере Chrome). Например, вы один раз в жизни посмотрели что-то неприглядное — и это навсегда сохранится, вам будут периодически показывать рекламу на эту тему и подсовывать видео в рекомендациях.

Во-вторых, найти что-то на YouTube труднее, чем иголку в стоге сена, потому что поиск там очень плохо реализован. Лучше самостоятельно разложить всё по полочкам и сделать нормальный полнотекстовый поиск по метаданным в собственном хранилище.

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

Tube Archivist

Как раз для создания домашнего архива из видеороликов YouTube создана программа Tube Archivist (на базе yt-dlp).

Базовая функциональность:

  • подписка на любые каналы YouTube;
  • скачивание видеофайлов;
  • индексация метаданных и поиск по ним;
  • воспроизведение видео;
  • отслеживание, какие видеофайлы в подписке вы просмотрели, а какие нет.

Минимальные системные требования — двухъядерный CPU (четыре потока), 2 ГБ оперативной памяти (для тестирования) или 4 ГБ (для работы).

В реальности чем больше памяти в системе, тем лучше, потому что для Tube Archivist (TA) обязательно требуется Docker. Сама программа разбита на три основных компонента в разных контейнерах. Соответственно, установка софта сводится по большей мере к редактированию файла docker-compose.yml:

version: '3.3'

services:
  tubearchivist:
    container_name: tubearchivist
    restart: unless-stopped
    image: bbilly1/tubearchivist
    ports:
      - 8000:8000
    volumes:
      - media:/youtube
      - cache:/cache
    environment:
      - ES_URL=http://archivist-es:9200     # needs protocol e.g. http and port
      - REDIS_HOST=archivist-redis          # don't add protocol
      - HOST_UID=1000
      - HOST_GID=1000
      - TA_HOST=tubearchivist.local         # set your host name
      - TA_USERNAME=tubearchivist           # your initial TA credentials
      - TA_PASSWORD=verysecret              # your initial TA credentials
      - ELASTIC_PASSWORD=verysecret         # set password for Elasticsearch
      - TZ=America/New_York                 # set your time zone
    depends_on:
      - archivist-es
      - archivist-redis
  archivist-redis:
    image: redis/redis-stack-server
    container_name: archivist-redis
    restart: unless-stopped
    expose:
      - "6379"
    volumes:
      - redis:/data
    depends_on:
      - archivist-es
  archivist-es:
    image: bbilly1/tubearchivist-es         # only for amd64, or use official es 8.9.0
    container_name: archivist-es
    restart: unless-stopped
    environment:
      - "ELASTIC_PASSWORD=verysecret"       # matching Elasticsearch password
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "xpack.security.enabled=true"
      - "discovery.type=single-node"
      - "path.repo=/usr/share/elasticsearch/data/snapshot"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es:/usr/share/elasticsearch/data    # check for permission error when using bind mount, see readme
    expose:
      - "9200"

volumes:
  media:
  cache:
  redis:
  es:

Здесь всего шесть обязательных полей:

  • TA_HOST — IP-адрес или имя хоста сервера;
  • TA_USERNAME — первоначальное имя пользователя для авторизации в Tube Archivist;
  • TA_PASSWORD — первоначальный пароль для авторизации в Tube Archivist;
  • ELASTIC_PASSWORD — пароль к ElasticSearch;
  • REDIS_HOST — имя хоста для Redis;
  • TZ — часовой пояс для шедулера.

Всё остальное опционально.

Более детальные инструкции по установке на Unraid, Synology, Podman и True NAS см. в документации проекта.

Презентация:

▍ Расширение для браузера

Для удобного взаимодействия с сервером, а также скачивания видео с YouTube разработано расширение Tube Archivist Companion:

Расширение добавляет в интерфейс YouTube несколько управляющих элементов для скачивания видео в одно нажатие кнопки, а также для подписки на канал внутри TA.

Собственная копия YouTube - 2

Собственная копия YouTube - 3

Для работы расширения требуется инстанс с последней версией TA, потому что API подвержен изменениям.

▍ Импорт метаданных c YouTube

Кроме самого видеофайла, TA скачивает с YouTube метаданные для него. Они сохраняются локально и индексируются для быстрого полнотекстового поиска.

Кроме того, по метаданным можно организовать/сортировать свою коллекцию.

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

Другие медиасерверы

В каком-то смысле функциональность TA пересекается с функциональностью стандартных медиасерверов, таких как Plex, Jellyfin, Kodi (XBMC) и др. В принципе, их можно использовать в связке друг с другом: TA — для скачивания видео, организации коллекции и полнотекстового поиска по ней, а Plex или другой медиасервер — непосредственно для видеотрансляции.

Собственная копия YouTube - 4
Kodi

Как вариант, вся коллекция ютубовских видео хранится в коллекции TA, а другой медиасервер отвечает за весь остальной контент из других источников (с торрентов, Netflix и других видеосервисов, откуда вы копируете и сохраняете видео). В этом есть определённый смысл, потому что в «локальный YouTube» тематически отличается от видеоколлекции с кинофильмами.

«Локальный YouTube» — это передачи, документальные видео и домашние видео, записанные на телефон, видеорегистратор, хедкам и др. С другой стороны, функциональный видеосервер — это в основном кинофильмы в высоком разрешении. Там уже есть функции, которые отсутствуют в TA, в том числе настройки транскодирования и битрейта, уровень допустимой нагрузки на CPU и др.

Но вообще лучше всего установить плагин Tube Archivist для интеграции с Plex. В этом случае сканер и агент Tube Archivist работают вместе с Plex, распознают все видео, включая метаданные, и добавляют их в библиотеку Plex для просмотра и трансляции стандартным способом (TA должен быть запущен во время сканирования файловой системы и обновления метаданных).

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

Кроме Plex, разработана также интеграция с Jellyfin.

Собственная копия YouTube - 5
Папка Tube Archivist после импорта в Jellyfin

Каждый канал YouTube импортируется как сериал, а каждый год архива — как сезон сериала. Из TA импортируются названия, описания и дата видео, название и описание канала.


Примечание. Скачанный с YouTube контент хранится в папке Docker. Эта папка может вырасти до очень большого размера, потому что TA скачивает всё содержимое каналов, так что к этому следует быть готовым, то есть подготовить хранилище соответствующего размера. В реальности TA не очень приспособлен для работы на среднем ПК, это инструмент для серьёзного архивирования контента — десятки и сотни терабайт видео. Скорее можно представить, что какой-то провайдер устанавливает его на своих серверах, чтобы обеспечить «зеркало» YouTube для своих абонентов, которым недоступен оригинальный YouTube.

В частном использовании, скорее всего, для работы с TA понадобится полноценный NAS с несколькими большими HDD. Так что это не обычный плеер типа Plex, а более серьёзная штука. Стоит добавить, что Tube Archivist использует поисковый движок ElasticSearch, а его индекс автоматически закрывается от записи в read only, если занятое место на диске достигает показателя 95% (статус read only сохраняется до тех пор, пока уровень не опустится до 90%). В целом, при сильном заполнении диска TA выдаёт много разных ошибок.

Просто yt-dlp

В большинстве случаев можно заменить Tube Archivist на обычный yt-dlp. Написать простой баш-скрипт для проверки обновлений по списку каналов со скачиванием новых видеороликов, которые добавляются в библиотеку Plex или Jellyfin. Вот пример такого скрипта для скачивания пяти последних видеороликов по списку каналов. Чтобы узнать RSS какого-то канала YouTube, нужно вставить URL этого канала в RSS-ридер, потом адрес RSS добавляем в скрипт для скачивания.

Скрипт

#!/usr/bin/env bash
 
if [ ! -f "/input/feeds.txt" ]
then
    >&2 echo "Failed to open file /input/feeds.txt. Exiting."
    exit 1
fi
 
if [ ! -d "/output" ]
then
    >&2 echo "Failed to switch to directory /output. Exiting."
    exit 1
fi
 
cd /output
 
grep "^[^#;]" /input/feeds.txt | while read feed
do
    echo "[ytdl-pvr] Downloading feed: $feed"
    # Grab the RSS feed from YouTube, grab the recent video URLs, and use yt-dlp to download the video
    # The following arguments are used to download 1080p H.264 videos with AAC audio,
    # such that they can be natively played on devices released within the last 10 years while still having
    # good quality:
    # --format, --remux-video, --merge-output-video
    # The following arguments are used to write thumbnail and metadata to be compatible with Jellyfin.
    # --write-thumbnail, --convert-thumbnails, --embed-thumbnail, --embed-metadata, --embed-subs
    # To help Jellyfin sorting videos by release date, --no-mtime is set to prevent e.g. edits to
    # video comments from making a video seem to be released more recently
    # To prevent the script failing when feeds include a future video, --datebefore now is set
    curl --fail-with-body -L -s "$feed" | xq -r '.feed.entry[0:5] | .[].link."@href"' | yt-dlp 
        --batch-file - 
        --output="%(channel)s/%(upload_date)s %(title)s [%(id)s].%(ext)s" 
        --download-archive .ytdl-pvr-archive.txt  
        --continue 
        --no-progress 
        --format 'bestvideo[vcodec^=avc1]+bestaudio[acodec^=mp4a]' 
        --remux-video "mp4" 
        --merge-output-format "mp4" 
        --no-mtime 
        --no-cache-dir 
        --write-thumbnail 
        --convert-thumbnails jpg 
        --embed-thumbnail 
        --embed-metadata 
        --embed-subs 
        --sub-lang en,en.* 
        --datebefore now
    # Continue processing in case of a processing error
    continue
done

Здесь yt-dlp скачивает видеоролики в формате 1080p H.264, так что они не займут много места. Хотя в TA тоже можно выбрать формат видео по умолчанию, например, bestvideo[vcodec*=avc1]+bestaudio[acodec*=mp4a]/mp4.

Как известно, yt-dlp тоже умеет копировать метаданные. В приведённом скрипте опция --download-archive .ytdl-pvr-archive.txt проверяет список сохранённых файлов, чтобы не скачивать их повторно. Можно ещё запустить дополнительный скрипт, который будет удалять старые видеоролики, например, возрастом более месяца. Так можно автоматизировать просмотр YouTube в офлайне на обычном ПК без тяжеловесных инструментов архивирования вроде TA.

См. также докер-контейнер ytdl-sub для автоматического скачивания видео и добавления его в Plex/Jellyfin/Kodi (примерно такой же скрипт, как выше, только в контейнере).

После настройки файлов конфигурации config.yaml и subscriptions.yaml процесс запускается простой командой:

ytdl-sub sub subscriptions.yaml

Контейнеры одинаково запускаются в любой ОС, где работает Docker (Linux, RPi, Win, Mac, etc).

Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх 🕹️

Автор: Анатолий Ализар

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js