Парсинг Youtube.com с помощью youtube-dl

Обзорная статья по эксплуатации программы для скачивания различных форматов видео с Youtube.

При разработке проекта «Время Не Покажет», необходимо было скачивать видеофайлы с Youtube, разбивать их на кадры, с последующим распознаванием текста. Для выполнения первой задачи я воспользовался youtube-dl.

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

Требования и установка

Для работы программы необходим только интерпретатор Python, версии не ниже 2.6, что позволяет запускать её, практически, на всех вариантах Unix (включая FreeBSD и Linux), Windows и macOS.

Для установки на Linux, достаточно выполнить следующие команды:

$ sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
$ sudo chmod a+rx /usr/local/bin/youtube-dl

Если в системе не установлен curl, на помощь придёт wget:

$ sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
$ sudo chmod a+rx /usr/local/bin/youtube-dl

Больше информации по установке на соответствующей странице проекта.

Использование

Синтаксис программы очень прост:

youtube-dl [OPTIONS] URL [URL...]

Для скачивания видео (на котором демонстрируется работа нашего самодельного книжного сканера) достаточно выполнить в консоли следующую команду:

$ youtube-dl https://www.youtube.com/watch?v=az6GKZ5y2ao

Формат видео

По умолчанию, без передачи параметров, youtube-dl пытается скачать видеофайл самого высокого качества, в текущую директорию. Для получения другого формата в программе реализован механизм выбора формата видео.

Синтаксис выбора формата --format FORMAT или -f FORMAT, где FORMAT — это селектор, соответствующий определённому формату видеофайла.

Чтобы выяснить какие форматы есть для конкретного видео, необходимо указать опцию --list-formats или -F.

$ youtube-dl -F https://www.youtube.com/watch?v=az6GKZ5y2ao
[youtube] az6GKZ5y2ao: Downloading webpage
[youtube] az6GKZ5y2ao: Downloading video info webpage
[youtube] az6GKZ5y2ao: Downloading MPD manifest
[info] Available formats for az6GKZ5y2ao:
format code  extension  resolution      note
139          m4a        audio only      DASH audio   49k, m4a_dash container, mp4a.40.5@ 48k (22050Hz)
251          webm       audio only      DASH audio  122k, webm_dash container, opus @160k (48000Hz)
140          m4a        audio only      DASH audio  129k, m4a_dash container, mp4a.40.2@128k (44100Hz)
278          webm       256x144         DASH video   95k, webm_dash container, vp9, 30fps, video only
160          mp4        256x144         DASH video  108k, mp4_dash container, avc1.4d400b, 30fps, video only
242          webm       426x240         DASH video  220k, webm_dash container, vp9, 30fps, video only
133          mp4        426x240         DASH video  242k, mp4_dash container, avc1.4d400c, 30fps, video only
243          webm       640x360         DASH video  405k, webm_dash container, vp9, 30fps, video only
134          mp4        640x360         DASH video  635k, mp4_dash container, avc1.4d401e, 30fps, video only
244          webm       854x480         DASH video  752k, webm_dash container, vp9, 30fps, video only
135          mp4        854x480         DASH video 1155k, mp4_dash container, avc1.4d4014, 30fps, video only
247          webm       1280x720        DASH video 1505k, webm_dash container, vp9, 30fps, video only
136          mp4        1280x720        DASH video 2690k, mp4_dash container, avc1.4d401f, 30fps, video only
43           webm       640x360         medium, vp8.0, vorbis@128k, 9.29MiB
18           mp4        640x360         medium 673k, avc1.42001E, mp4a.40.2@ 96k (44100Hz), 7.89MiB
22           mp4        1280x720        hd720 2352k, avc1.64001F, mp4a.40.2@192k (44100Hz) (best)

Эта команда не приведёт к скачиванию видео, а только выведет данные о всех форматах. Как видно из списка, для каждого формата видео указано разрешение кадров, расширение файла и соответствующий им код (format code из первой колонки). Для скачивания видео с кодом 160, достаточно выполнить следующую команду:

$ youtube-dl -f 160 https://www.youtube.com/watch?v=az6GKZ5y2ao

Этот список может различаться в зависимости от скачиваемого видео, поэтому ни все форматы могут быть доступны. В этом случае можно перечислить, в порядке убывания приоритета, коды предпочтительных форматов через косую черту. Например, опция -f 22/136/247/135 укажет программе сперва попытаться скачать видео с кодом 22 и если его не существует, попытаться скачать 136 и так далее. При отсутствие указанных форматов, программа завершит работу, сообщив о неудаче. Для скачивания нескольких форматов одного и того же видео, используется запятая в качестве разделителя.

Механизм выбора формата позволяет проводить фильтрацию по следующим мета данным, используя знаки сравнения <, <=, >, >=, =(равно), !=(не равно):

  • filesize: Количество байтов, если известно заранее;
  • width: Ширина видео, если известно;
  • height: Высота видео, если известно;
  • tbr: Средний битрейт аудио и видео в кбит/с;
  • abr: Средний битрейт аудио в кбит/с;
  • vbr: Средний битрейт видео в кбит/с;
  • asr: Частота дискретизации звука в герцах;
  • fps: Частота кадров.

Опция -f "[height>500]" укажет программе скачать видео с высотой кадра более 500px.

Имена выходных файлов

В примерах выше, скачиваемый видеофайл сохранялся в текущую директорию и именовался заголовком, идентификатором и расширением. Например, Сканирование книг с помощью фотокамер Canon PowerShot a2200 hd-az6GKZ5y2ao.mp4.

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

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

  • id (строка): идентификатор видео;
  • title (строка): название видео;
  • url (строка): URL видео;
  • ext (строка): расширение видеофайла;
  • upload_date (строка): дата загрузки видео (ГГГГММДД);
  • duration (число): длина видео в секундах;
  • view_count (числов): сколько пользователей, смотревших видео на Youtube.com;

Для корректного форматирования шаблона, зарезервированные имена обёртывают специальным оператором форматирования строки %(NAME)s или %(NAME)d.

В качестве примера, скачаем видеофайл в директорию /home/amr/video и составим название из имён id, ext и duration:

$ youtube-dl -o "/home/amr/video/%(duration)d-%(id)s.%(ext)s" https://www.youtube.com/watch?v=az6GKZ5y2ao

В результате мы получим видеофайл по адресу: /home/amr/video/98-az6GKZ5y2ao.f136.mp4.

Заключение

Можно было бы ещё написать о том, что youtube-dl позволяет скачивать миниатюры, субтитры и целые плейлисты; берёт на себя задачу аутентификации, управление сетью и файловой системой. Но об этом лучше написано в документации.

Программа постоянно развивается, объединяя вокруг себя огромное сообщество энтузиастов, которое разрабатывает дополнительные расширения, обёртки на другие языки программирования (php) и, даже, программы с графическим интерфейсом.

Это всё общественное достояние, доступ к которому может получить любой желающий.