youtube-dl - загрузка видео с youtube.com или других видео-платформ
Чтобы установить его сразу для всех UNIX пользователей (Linux, macOS и т.д.), введите:
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
Пользователи Windows могут скачать .exe файл и поместить его в любое место на их PATH, кроме %SYSTEMROOT%\System32
(например, не устанавливайте в C:\Windows\System32
).
Вы также можете использовать pip:
sudo -H pip install --upgrade youtube-dl
Эта команда обновит youtube-dl, если вы уже установили его. Дополнительная информация доступна на странице pypi.
Пользователи macOS могут установить youtube-dl с помощью Homebrew: brew install youtube-dl
Или с помощью MacPorts:
sudo port install youtube-dl
В качестве альтернативы, обратитесь к инструкциям для разработчиков для получения информации о том, как проверять и работать с репозиторием git. Для дополнительных опций, включая PGP подписи, см. страницу загрузки youtube-dl.# ОПИСАНИЕ youtube-dl - это командная строковая программа для загрузки видео с YouTube.com и нескольких других сайтов. Она требует интерпретатора Python версии 2.6, 2.7 или 3.2+. Программа не имеет платформенных ограничений и должна работать на вашем Unix-компьютере, Windows или macOS. Программа выпущена в общественное достояние, что означает, что вы можете модифицировать её, распространять или использовать её по своему усмотрению.
youtube-dl [ПАРАМЕТРЫ] URL [URL...]
-h, --help Вывести это справочное сообщение и завершить выполнение
--version Вывести версию программы и завершить выполнение
-U, --update Обновить эту программу до последней версии. Убедитесь, что у вас есть достаточные права доступа (запустите с помощью sudo, если необходимо)
-i, --ignore-errors Продолжать загрузку, несмотря на ошибки, например, чтобы пропустить недоступные видео в плейлисте
--abort-on-error При возникновении ошибки прервать загрузку следующих видео (в плейлисте или на командной строке)
--dump-user-agent Отобразить текущее браузерное идентификационное имя
--list-extractors Перечислить все поддерживаемые извлечения
--extractor-descriptions Вывести описания всех поддерживаемых извлечений
--force-generic-extractor Принудительно использовать общий извлечник
``` --default-search PREFIX Использовать этот префикс для неквалифицированных URL. Например, "gvsearch2:" загружает два видео с Google Videos для youtube-dl "large apple". Используйте значение "auto", чтобы позволить youtube-dl угадывать ("auto_warning" для вывода предупреждения при угадывании). "error" просто выбрасывает ошибку. Значение по умолчанию "fixup_error" исправляет сломанные URL, но выбрасывает ошибку, если это невозможно, вместо поиска.
--ignore-config Не читать конфигурационные файлы. Когда задано в глобальном конфигурационном файле /etc/youtube-dl.conf: не читать конфигурацию пользователя в ~/.config/youtube-dl/config (%APPDATA%/youtube-dl/config.txt на
Windows)
--config-location ПУТЬ Путь к файлу конфигурации; либо путь
к конфигу, либо к папке, содержащей
его.
--flat-playlist Не извлекать видео из плейлиста,
а только перечислять их.
--mark-watched Помечать видео как просмотренные
(только для YouTube).
--no-mark-watched Не помечать видео как просмотренные
(только для YouTube).
--no-color Не выводить коды цвета в вывод. ## Опции сети:
--proxy URL Использовать указанный HTTP/HTTPS/SOCKS
прокси. Для включения SOCKS прокси,
укажите правильную схему. Например, socks5://127.0.0.1:1080/. Передайте
пустую строку (--proxy "") для
прямого подключения
--socket-timeout SECONDS Время ожидания перед отменой, в
секундах
--source-address IP IP-адрес клиента для привязки
-4, --force-ipv4 Выполнять все подключения через IPv4
-6, --force-ipv6 Выполнять все подключения через IPv6## Географическое ограничение:
--geo-verification-proxy URL Использовать этот прокси для
проверки IP-адреса для некоторых
сайтов с географическим ограничением.
По умолчанию используется прокси,
указанный опцией --proxy (или
отсутствует, если опция не указана),
для фактической загрузки.
--geo-bypass Пропускать географическое
ограничение путем подделки HTTP-заголовка
X-Forwarded-For
--no-geo-bypass Не пропускать географическое
ограничение путем подделки HTTP-заголовка
X-Forwarded-For
--geo-bypass-country CODE Пропускать географическое
ограничение с явно указанным двухбуквенным
кодом страны ISO 3166-1
--geo-bypass-ip-block IP_BLOCK Пропускать географическое
ограничение с явно указанным блоком IP
в формате CIDR
## Выбор видео:
--playlist-start ЧИСЛО Видео в плейлисте для начала (по умолчанию 1)
--playlist-end ЧИСЛО Видео в плейлисте для завершения (по умолчанию последнее)
--playlist-items ITEM_SPEC Видео в плейлисте для загрузки.Укажите индексы видео в плейлисте, разделённые запятыми, например: "--playlist-items 1,2,5,8", если вы хотите загрузить видео с индексами 1, 2, 5, 8 в плейлисте. Вы можете указать диапазон: "--playlist-items 1-3,7,10-13", это загрузит видео с индексами 1, 2, 3, 7, 10, 11, 12 и 13.
--match-title РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ Загрузить только те видео, названия которых соответствуют этому регулярному выражению или безразличному подстроковому поиску
--reject-title РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ Пропустить загрузку для видео, названия которых соответствуют этому регулярному выражению или безразличному подстроковому поиску
--max-downloads ЧИСЛО Прекратить загрузку после загрузки ЧИСЛА файлов
--min-filesize РАЗМЕР Не загружать видео, размер которых меньше РАЗМЕРА (например, 50k или 44.6m)
--max-filesize РАЗМЕР Не загружать видео, размер которых больше РАЗМЕРА (например, 50k или 44.6m)
--date ДАТА Загрузить только видео, загруженные в эту дату
--datebefore ДАТА Загрузить только видео, загруженные до или в эту дату (включительно)
--dateafter ДАТА Загрузить только видео, загруженные после или в эту дату (включительно)
--min-views КОЛИЧЕСТВО Не загружать видео, у которых меньше КОЛИЧЕСТВА просмотров
--max-views КОЛИЧЕСТВО Не загружать видео, у которых больше КОЛИЧЕСТВА просмотров
--match-filter ФИЛЬТР Общий фильтр видео. Укажите любой ключ (см."Шаблон вывода" для списка доступных ключей) для проверки наличия ключа,
key для проверки отсутствия ключа,
key > ЧИСЛО (например, "comment_count > 12",
также работает с >=, <, <=, !=, =) для сравнения с числом,
key = 'ЛИТЕРАЛ' (например, "uploader = 'Mike Smith'",
также работает с !=) для проверки соответствия строковому литералу и &
для требований к нескольким ключам. Значения, которые неизвестны,
исключаются, если вы не поставите вопросительный знак (?)
после оператора. Например, чтобы выбрать видео,
которые были лайкнуты более 100 раз и дизлайкнуты менее 50 раз
(или функция дизлайка недоступна на данном сервисе),
но которые также имеют описание, используйте
--match-filter "like_count > 100 & dislike_count <? 50 & description" .
--no-playlist Скачивать только видео, если URL
ссылается на видео и плейлист.
--yes-playlist Скачивать плейлист, если URL
ссылается на видео и плейлист.
--age-limit ЛЕТ Скачивать только видео, подходящие для
указанного возраста
--download-archive ФАЙЛ Скачивать только видео, не указанные в архивном файле. Записывать идентификаторы всех
скачанных видео в него.
--include-ads Скачивать рекламу (экспериментальная)
-r, --limit-rate СКОРОСТЬ Максимальная скорость загрузки в байтах
в секунду (например, 50K или 4.2M)
-R, --retries ПОПЫТКИ Количество попыток (по умолчанию 10), или
"бесконечно".
--fragment-retries ПОПЫТКИ Количество попыток для фрагмента
(по умолчанию 10), или "бесконечно" (DASH,
hlsnative и ISM)
--skip-unavailable-fragments Пропуск недоступных фрагментов (DASH,
hlsnative и ISM)
--abort-on-unavailable-fragment Прерывание загрузки, если какой-либо фрагмент
недоступен
--keep-fragments Сохранение загруженных фрагментов на диске после
завершения загрузки; фрагменты удаляются по умолчанию
--buffer-size РАЗМЕР Размер буфера загрузки (например, 1024 или
16K) (по умолчанию 1024)
--no-resize-buffer Не изменять автоматически размер буфера. По умолчанию,
размер буфера автоматически изменяется с начального
значения РАЗМЕР.
--http-chunk-size РАЗМЕР Размер блока для блочного HTTP-загрузки (например, 10485760 или 10M) (по умолчанию отключено).
Может быть полезен для обхода ограничений скорости,
накладываемых веб-сервером (экспериментальный).
--playlist-reverse Загрузка видео плейлиста в обратном порядке.
--playlist-random Загрузка видео плейлиста в случайном порядке.
--xattr-set-filesize Установка атрибута файла ytdl. filesize с
ожидаемым размером файла.
--hls-prefer-native Использование встроенного загрузчика HLS вместо
ffmpeg.
--hls-prefer-ffmpeg Использование ffmpeg вместо встроенного загрузчика HLS.
--hls-use-mpegts Использовать контейнер mpegts для видео HLS,
что позволяет воспроизводить видео во время его загрузки (некоторые плееры могут не поддерживать воспроизведение).
--external-downloader COMMAND Использовать указанный внешний загрузчик.
В настоящее время поддерживаются aria2c, avconv, Axel, curl, ffmpeg, httpie, wget.
--external-downloader-args ARGS Передавать эти аргументы внешнему загрузчику.
## Опции файловой системы:
-a, --batch-file FILE Файл, содержащий URL-ы для загрузки ('-'
для стандартного ввода), один URL на строку. Строки, начинающиеся с '#', ';' или ']', считаются комментариями и игнорируются. --id Использовать только идентификатор видео в имени файла
-o, --output TEMPLATE Шаблон имени выходного файла, см. раздел "OUTPUT TEMPLATE" для получения всей информации
--output-na-placeholder PLACEHOLDER Заполнитель для недоступных метаданных в шаблоне имени выходного файла (по умолчанию "NA")
--autonumber-start NUMBER Указать начальное значение для %(autonumber)s (по умолчанию 1)
--restrict-filenames Ограничить имена файлов только ASCII символами, и избегать '&' и пробелов в именах файлов
-w, --no-overwrites Не перезаписывать файлы
-c, --continue Принудительно возобновить частично загруженные файлы. По умолчанию youtube-dl будет возобновлять загрузки, если это возможно.
--no-continue Не возобновлять частично загруженные файлы (начать сначала)
--no-part Не использовать .part файлы - записывать напрямую в выходной файл
--no-mtime Не использовать заголовок Last-modified для установки времени модификации файла
--write-description Записать описание видео в файл .description
--write-info-json Записать метаданные видео в файл .info.json
--write-annotations Записать аннотации видео в файл .annotations.xml
--load-info-json FILE JSON файл, содержащий информацию о видео (создан с помощью опции "--write-info-json")
--cookies FILE Файл для чтения cookies и временного хранения cookie-файла
cookie jar --cache-dir DIR Расположение в файловой системе, где youtube-dl может временно хранить некоторые загруженные данные. По умолчанию $XDG_CACHE_HOME/youtube-dl или ~/.cache/youtube-dl. В настоящее время кэшируются только файлы YouTube-плеера (для видео с зашифрованными подписями), но это может измениться.
--no-cache-dir Отключить кэширование файловой системы
--rm-cache-dir Удалить все файлы кэширования файловой системы## Опции миниатюр:
--write-thumbnail Записать миниатюру на диск
--write-all-thumbnails Записать все форматы миниатюр на диск
--list-thumbnails Симулировать и вывести все доступные
форматы миниатюр## Параметры подробности / Симуляции:
-q, --тихий-режим Включить тихий режим
--игнорировать-предупреждения Игнорировать предупреждения
-s, --симулировать Не скачивать видео и не записывать ничего на диск
--пропустить-скачивание Не скачивать видео
-g, --получить-url Симулировать, тихий режим, но вывести URL
-e, --получить-название Симулировать, тихий режим, но вывести название
--получить-id Симулировать, тихий режим, но вывести ID
--получить-миниатюру Симулировать, тихий режим, но вывести URL миниатюры
--получить-описание Симулировать, тихий режим, но вывести описание видео --get-duration Симулировать, тихий режим, но вывести длительность видео
--get-file-name Симулировать, тихий режим, но вывести имя выходного файла
--get-format Симулировать, тихий режим, но вывести выходной формат
-j, --output-json Симулировать, тихий режим, но вывести информацию в формате JSON. См. "ШАБЛОН ВЫХОДНЫХ ДАННЫХ" для описания доступных ключей.
-J, --output-single-json Симулировать, тихий режим, но вывести информацию в формате JSON для каждого аргумента командной строки. Если URL относится к плейлисту, вывести всю информацию о плейлисте в одной строке.
--output-json Будьте тихими и выведите информацию о видео в формате JSON (видео всё ещё скачивается).
--new-line Выводить прогресс-бар новыми строками
--no-progress Не выводить прогресс-бар
--console-title Отображать прогресс в заголовке окна консоли
-v, --verbose-mode Выводить различные данные отладки
--output-pages Вывести загруженные страницы, закодированные с помощью base64 для отладки проблем (очень подробно)
--write-pages Записать загруженные промежуточные страницы в текущей директории для отладки
проблем --print-traffic Отображать отправленный и полученный HTTP-трафик
-C, --call-home Обращаться к серверу youtube-dl для отладки
--no-call-home Не обращаться к серверу youtube-dl для отладки## Обходные решения:
--encoding КОДИРОКА Принудительно задать указанный формат кодировки
(экспериментальный)
--no-check-certificate Отключить проверку сертификата при HTTPS
--prefer-insecure Использовать незашифрованный соединение для получения информации о видео.
(Поддерживается только для YouTube)
--user-agent UA Указать пользовательский агент
--referer URL Указать пользовательский referer, использовать если доступ к видео ограничен определенным доменом
--add-header ПОЛЯ:ЗНАЧЕНИЕ Указать пользовательский HTTP-заголовок и его значение, разделенные двоеточием ':'.
Эту опцию можно использовать несколько раз
--bidi-workaround Обойти терминалы, которые не поддерживают двунаправленный текст. Требуется выполнение bidiv или fribidi.
--sleep-interval SEКУНД Количество секунд для ожидания перед каждым загрузкой, когда используется в одиночку или нижняя граница диапазона для случайного ожидания перед каждой загрузкой (минимальное возможное количество секунд для ожидания). --max-sleep-interval СЕКУНД Верхняя граница диапазона для случайного ожидания перед каждой загрузкой (максимальное возможное количество секунд для ожидания).
Должна использоваться только вместе с --min-sleep-interval. ## Опции формата видео:
-f, --format FORMAT Код формата видео, см. раздел "ВЫБОР
ФОРМАТА" для всех сведений
--all-formats Скачивать все доступные форматы видео
--prefer-free-formats Приоритет свободным форматам видео,
если не указан конкретный формат
-F, --list-formats Вывести все доступные форматы для
запрошенных видео
--youtube-skip-dash-manifest Не скачивать манифесты DASH и
связанные данные для видео YouTube
--merge-output-format FORMAT Если требуется объединение (например,
bestvideo+bestaudio), выводить в
указанном контейнерном формате. Один
из mkv, mp4, ogg, webm, flv. Игнорируется,
если объединение не требуется## Варианты субтитров:
--write-sub Записать файл субтитров
--write-auto-sub Записать автоматически сгенерированные субтитры
(только для YouTube)
--all-subs Скачать все доступные субтитры видео
--list-subs Перечислить все доступные субтитры для видео --sub-format FORMAT Формат субтитров, принимает предпочтения форматов, например: "srt" или
"ass/srt/best"
--sub-lang LANGS Языки субтитров для загрузки (необязательно), разделенные запятыми, используйте
--list-subs для получения доступных языковых тегов## Варианты аутентификации:
-u, --username USERNAME Войти с этим идентификатором аккаунта
-p, --password PASSWORD Пароль аккаунта. Если этот параметр не указан, youtube-dl запросит пароль
интерактивно.
-2, --twofactor TWOFACTOR Код двухфакторной аутентификации
-n, --netrc Использовать данные аутентификации из .netrc
--video-password PASSWORD Пароль видео (vimeo, youku)## Варианты Adobe Pass:
--ap-mso MSO Идентификатор Adobe Pass для нескольких систем (провайдер телевидения), используйте --ap-list-mso для получения списка всех поддерживаемых систем
--ap-username USERNAME Идентификатор входа для нескольких систем
--ap-password PASSWORD Пароль для нескольких систем. Если этот параметр не указан, youtube-dl запросит пароль интерактивно.
--ap-list-mso Перечислить все поддерживаемые системы## Опции послепроцессинга:
-x, --extract-audio Преобразование видеофайлов в аудиофайлы
(требуется ffmpeg/avconv и
ffprobe/avprobe)
--audio-format FORMAT Указание аудиоформата: "best", "aac",
"flac", "mp3", "m4a", "opus", "vorbis",
или "wav"; "best" по умолчанию; Без
эффекта без -x
--audio-quality QUALITY Указание качества аудиофайлов ffmpeg/avconv,
введите значение от 0 (лучше) до 9
(хуже) для VBR или конкретную скорость
битрейта, например 128K (по умолчанию 5)
--recode-video FORMAT Перекодировка видео в другой формат, если
необходимо (поддерживаемые форматы:
mp4|flv|ogg|webm|mkv|avi)
--postprocessor-args ARGS Передача этих аргументов постпроцессору
-k, --keep-video Сохранение видеофайла на диске после послепроцессинга; видеофайл удаляется по
умолчанию
--no-post-overwrites Не перезаписывать файлы после
послепроцессинга; файлы после
послепроцессинга перезаписываются по
умолчанию
--embed-subs Встраивание субтитров в видео (только для
видеофайлов mp4, webm и mkv)
--embed-thumbnail Встраивание миниатюры в аудиофайл как
обложку
--add-metadata Запись метаданных в видеофайл
--metadata-from-title FORMAT Парсинг дополнительных метаданных, таких
как название песни / исполнитель, из
названия видео. Синтаксис формата такой
же, как --output. Также можно использовать
регулярное выражение с именованными
группами захвата. Распарсенные параметры
заменяют существующие значения. Пример: --metadata-from-title
"%(artist)s - %(title)s" соответствует
названию вида "Coldplay - Paradise".
Пример (регулярное выражение):
--metadata-from-title
"(?P<artist>.+?) - (?P<title>.+)"
--xattrs Записывать метаданные в xattrs файла
видео (используя стандарты Dublin Core
и XDG)
--fixup POLICY Автоматически исправлять известные
дефекты файла. Один из never (ничего не
делать), warn (только выводить
предупреждение), detect_or_warn (по
умолчанию; исправлять файл, если это
возможно, предупреждать в противном
случае)
--prefer-avconv ПREFER avconv over ffmpeg для выполнения
постпроцессинга
--prefer-ffmpeg ПREFER ffmpeg over avconv для выполнения
постпроцессинга (по умолчанию)
--ffmpeg-location PATH Расположение ffmpeg/avconv бинарника;
либо путь к бинарнику, либо содержащая
его директория.
--exec CMD Выполнять команду на файле после
загрузки и постпроцессинга, аналогично
синтаксису -exec в find.
Пример: --exec 'adb push {} /sdcard/Music/ && rm {}'
--convert-subs FORMAT Конвертировать субтитры в другой формат
(текущие поддерживаемые: srt|ass|vtt|lrc)
# КОНФИГУРАЦИЯВы можете настроить youtube-dl, разместив любую поддерживаемую опцию командной строки в файле конфигурации. На Linux и macOS системный файл конфигурации расположен по адресу `/etc/youtube-dl.conf`, а пользовательский файл конфигурации — по адресу `~/.config/youtube-dl/config`. На Windows пользовательский файл конфигурации может находиться по адресу `%APPDATA%\youtube-dl\config.txt` или `C:\Users\<user name>\youtube-dl.conf`. Обратите внимание, что по умолчанию файл конфигурации может не существовать, поэтому вам может потребоваться создать его самостоятельно.
Например, с помощью следующего файла конфигурации youtube-dl всегда будет извлекать аудио, не копировать метку времени mtime, использовать прокси и сохранять все видео в директории `Movies` в домашней директории:
-x
--no-mtime
--proxy 127.0.0.1:3128
-o ~/Movies/%(title)s.%(ext)s
Обратите внимание, что опции в файле конфигурации — это те же опции, или переключатели, которые используются в обычных вызовах командной строки, поэтому **не должно быть пробелов** после `-` или `--`, например, `-o` или `--proxy`, но не `- o` или `-- proxy`.
Вы можете использовать `--ignore-config`, если хотите отключить файл конфигурации для конкретного запуска youtube-dl.Вы также можете использовать `--config-location`, если хотите использовать пользовательский файл конфигурации для конкретного запуска youtube-dl.
### Аутентификация с помощью файла `.netrc`
Вы также можете настроить автоматическое хранение учетных данных для извлечений, поддерживающих аутентификацию (предоставляя имя пользователя и пароль с помощью `--username` и `--password`), чтобы не передавать учетные данные как аргументы командной строки при каждом запуске youtube-dl и предотвратить отслеживание простых текстовых паролей в истории командной строки. Это можно сделать с помощью файла [`.netrc`](https://stackoverflow.com/tags/.netrc/info) на основе каждого извлечения. Для этого вам нужно создать файл `.netrc` в вашем каталоге `$HOME` и ограничить права доступа на чтение/запись только для вас:
touch $HOME/.netrc chmod a-rwx,u+rw $HOME/.netrc
После этого вы можете добавить учетные данные для извлечения в следующем формате, где *extractor* — это имя извлечения в нижнем регистре:
machine login password
Например:
machine youtube login myaccount@gmail.com password my_youtube_password machine twitch login my_twitch_account_name password my_twitch_password
Чтобы активировать аутентификацию с помощью файла `.netrc`, вам следует передать `--netrc` в youtube-dl или поместить его в [файл конфигурации](#configuration). На Windows вам также может потребоваться вручную настроить переменную окружения `%HOME%`. Например:
set HOME=%USERPROFILE%
Параметр `-o` позволяет пользователям указывать шаблон для имен файлов-выводов.
**tl;dr:** [перейти к примерам](#output-template-examples).Основное использование заключается в том, чтобы не устанавливать никаких шаблонных аргументов при загрузке одного файла, как в случае с `youtube-dl -o funny_video.flv "https://some/video"`. Однако, шаблон может содержать специальные последовательности, которые будут заменены при загрузке каждого видео. Эти специальные последовательности могут быть сформатированы в соответствии с [операциями форматирования строк в Python](https://docs.python.org/2/library/string.html#string-formatting). Например, `%(NAME)s` или `%(NAME)05d`. Для ясности, это процентный символ, за которым следует имя в скобках, а затем форматирующие операции. Допустимые имена вместе с типом последовательности:
- `id` (строка): Идентификатор видео
- `title` (строка): Название видео
- `url` (строка): URL видео
- `ext` (строка): Расширение имени файла видео
- `alt_title` (строка): Второстепенное название видео
- `display_id` (строка): Альтернативный идентификатор видео
- `uploader` (строка): Полное имя загрузчика видео
- `license` (строка): Название лицензии, под которой видео распространяется
- `creator` (строка): Создатель видео
- `release_date` (строка): Дата (YYYYMMDD), когда видео было выпущено
- `timestamp` (число): UNIX-тамп-стамп момента, когда видео стало доступным
- `upload_date` (строка): Дата загрузки видео (YYYYMMDD)
- `uploader_id` (строка): Псевдоним или идентификатор загрузчика видео
- `channel` (строка): Полное имя канала, на котором видео загружено
- `channel_id` (строка): Идентификатор канала- `location` (строка): Физическое местоположение, где видео было снято
- `duration` (число): Длительность видео в секундах
- `view_count` (число): Количество пользователей, которые посмотрели видео на платформе
- `like_count` (число): Количество положительных оценок видео
- `dislike_count` (число): Количество отрицательных оценок видео
- `repost_count` (число): Количество репостов видео
- `average_rating` (число): Средняя оценка, данная пользователями, шкала зависит от веб-страницы
- `comment_count` (число): Количество комментариев к видео
- `age_limit` (число): Возрастное ограничение для видео (в годах)
- `is_live` (логическое): Является ли это видео прямым эфиром или видео с фиксированной длительностью
- `start_time` (число): Время в секундах, с которого должно начаться воспроизведение, как указано в URL
- `end_time` (число): Время в секундах, до которого должно закончиться воспроизведение, как указано в URL
- `format` (строка): Человекочитаемое описание формата
- `format_id` (строка): Код формата, указанный с помощью `--format`
- `format_note` (строка): Дополнительная информация о формате
- `width` (число): Ширина видео
- `height` (число): Высота видео
- `resolution` (строка): Текстовое описание ширины и высоты
- `tbr` (число): Средняя скорость передачи аудио и видео в KBit/s
- `abr` (число): Средняя скорость передачи аудио в KBit/s
- `acodec` (строка): Название используемого аудиокодека
- `asr` (число): Частота дискретизации аудио в Гц
- `vbr` (число): Средняя скорость передачи видео в KBit/s- `fps` (число): Частота кадров
- `vcodec` (строка): Название используемого видеокодека
- `container` (строка): Название формата контейнера
- `filesize` (число): Количество байт, если известно заранее
- `filesize_approx` (число): Оценка количества байт
- `protocol` (строка): Протокол, который будет использоваться для фактической загрузки
- `extractor` (строка): Название извлекателя
- `extractor_key` (строка): Имя ключа извлекателя
- `epoch` (число): Unix эпоха при создании файла
- `autonumber` (число): Число, которое будет увеличиваться с каждым скачиванием, начиная с `--autonumber-start`
- `playlist` (строка): Название или идентификатор плейлиста, содержащего видео
- `playlist_index` (число): Индекс видео в плейлисте, заполненный ведущими нулями в соответствии с общей длиной плейлиста
- `playlist_id` (строка): Идентификатор плейлиста
- `playlist_title` (строка): Название плейлиста
- `playlist_uploader` (строка): Полное имя загрузчика плейлиста
- `playlist_uploader_id` (строка): Псевдоним или идентификатор загрузчика плейлиста
Доступны для видео, которое относится к некоторому логическому разделу или секции:Тип документа для перевода: markdown
Язык исходного текста: английский
Язык финального текста: русский
---
Типы данных, доступные для видео:
- `chapter` (строка): Название или заголовок раздела, к которому относится видео
- `chapter_number` (число): Номер раздела, к которому относится видео
- `chapter_id` (строка): Идентификатор раздела, к которому относится видео
Доступны для видео, которое является эпизодом некоторого сериала или программы:
- `series` (строка): Название сериала или программы, к которой относится эпизод видео
- `season` (строка): Название сезона, к которому относится эпизод видео
- `season_number` (число): Номер сезона, к которому относится эпизод видео
- `season_id` (строка): Идентификатор сезона, к которому относится эпизод видео
- `episode` (строка): Название эпизода видео
- `episode_number` (число): Номер эпизода видео в рамках сезона
- `episode_id` (строка): Идентификатор эпизода видео
Доступны для медиа, которое является треком или частью музыкального альбома:
- `track` (строка): Название трека
- `track_number` (число): Номер трека в рамках альбома или диска
- `track_id` (строка): Идентификатор трека
- `artist` (строка): Исполнитель(и) трека
- `genre` (строка): Жанр(ы) трека
- `album` (строка): Название альбома, к которому относится трек
- `album_type` (строка): Тип альбома
- `album_artist` (строка): Список всех исполнителей, участвующих в альбоме
- `disc_number` (число): Номер диска или другого физического носителя, к которому относится трек
- `release_year` (число): Год (YYYY) выпуска альбомаКаждая из вышеупомянутых последовательностей, упомянутая в шаблоне вывода, будет заменена на фактическое значение, соответствующее имени последовательности. Обратите внимание, что некоторые последовательности не гарантируются присутствием, так как они зависят от метаданных, полученных определённым извлечением. Такие последовательности будут заменены запасным значением, предоставленным с помощью `--output-na-placeholder` (`NA` по умолчанию).
Например, для `-o %(title)s-%(id)s.%(ext)s` и mp4 видео с названием `youtube-dl test video` и идентификатором `BaW_jenozKcj`, это приведёт к созданию файла `youtube-dl test video-BaW_jenozKcj.mp4` в текущей директории.
Для числовых последовательностей можно использовать форматирование, связанное с числами, например, `%(view_count)05d` приведёт к строке с количеством просмотров, заполненным нулями до 5 символов, как в `00042`. Шаблоны вывода также могут содержать произвольный иерархический путь, например, `-o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'`, что приведёт к загрузке каждого видео в директорию, соответствующую этому шаблону пути. Любые отсутствующие директории будут автоматически созданы для вас.
Чтобы использовать литералы процента в шаблоне вывода, используйте `%%`. Чтобы вывести в стандартный поток вывода, используйте `-o -`.Текущий шаблон по умолчанию — `%(название)s-%(id)s.%(расширение)s`.
В некоторых случаях вы не хотите специальные символы, такие как 中, пробелы или &, особенно при передаче загруженного имени файла на систему Windows или через канал, не безопасный для 8-битных символов. В этих случаях добавьте флаг `--restrict-filenames`, чтобы получить более короткое название.
#### Шаблон вывода и Windows-скрипты
Если вы используете шаблон вывода внутри Windows-скрипта, то необходимо экранировать обычные символы процента (`%`) удвоением, так что `-o "%(название)s-%(id)s.%(расширение)s"` должно стать `-o "%%(название)s-%%(id)s.%%(расширение)s"`. Однако вы не должны изменять `%`'ы, которые не являются обычными символами, например, переменные окружения для расширения должны оставаться нетронутыми: `-o "C:\%HOMEPATH%\Desktop\%%(название)s.%%(расширение)s"`.
#### Примеры шаблонов вывода
Обратите внимание, что на Windows вы можете потребоваться использовать двойные кавычки вместо одинарных.
```bash
$ youtube-dl --get-filename -o '%(название)s.%(расширение)s' BaW_jenozKc
youtube-dl test video ''_ä↭𝕐.mp4 # Всякие странные символы
$ youtube-dl --get-filename -o '%(название)s.%(расширение)s' BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.mp4 # Простое имя файла
# Загрузка видео YouTube-плейлиста в отдельную директорию, индексированную по порядку видео в плейлисте
$ youtube-dl -o '%(плейлист)s/%(индекс_плейлиста)s - %(название)s.%(расширение)s' https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re
```# Загрузка всех плейлистов YouTube-канала/пользователя, сохраняя каждый плейлист в отдельной директории:
$ youtube-dl -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' https://www.youtube.com/user/TheLinuxFoundation/playlists
# Загрузка курса Udemy, сохраняя каждый раздел в отдельной директории под директорией MyVideos в вашем домашнем каталоге
$ youtube-dl -u user -p password -o '~/MyVideos/%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s' https://www.udemy.com/java-tutorial/
```# Скачивание всех серий сезона, сохранение каждой серии и каждого сезона в отдельной директории под C:/MyVideos
$ youtube-dl -o "C:/MyVideos/%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s" https://videomore.ru/kino_v_detalayah/5_sezon/367617
# Передача видео, которое скачивается, в stdout
$ youtube-dl -o - BaW_jenozKc
По умолчанию youtube-dl пытается скачать лучшее доступное качество, то есть если вы хотите лучшее качество, вам не нужно передавать какие-либо специальные опции, youtube-dl сделает это за вас по умолчанию.
Но иногда вы можете захотеть скачать в другом формате, например, когда вы находитесь на медленном или прерывистом соединении. Основной механизм для достижения этого — так называемая форматная выборка, на основе которой вы можете явно указать желаемый формат, выбрать форматы на основе некоторых критериев или критериев, установить приоритет и многое другое.Общая синтаксическая конструкция для форматной выборки выглядит как --format FORMAT
или более короткая -f FORMAT
, где FORMAT
— это выборочное выражение, то есть выражение, которое описывает формат или форматы, которые вы хотите скачать.
tl;dr: перейти к примерам.
Простейший случай — это запрос на конкретный формат, например, с помощью -f 22
вы можете скачать формат с кодом формата, равным OnClickListener. Вы можете получить список доступных кодов формата для определенного видео, используя --list-formats
или -F
. Обратите внимание, что эти коды форматов специфичны для конкретного извлечения.
Вы также можете использовать расширение файла (в настоящее время поддерживаются 3gp
, aac
, flv
, m4a
, mp3
, mp4
, ogg
, wav
, webm
) для скачивания лучшего качества формата определенного расширения файла, представленного как единого файла, например, -f webm
скачает лучший формат качества с расширением файла webm
, представленного как единого файла.
Вы также можете использовать специальные названия для выбора определенных краевых форматов:
Исправлено:
Текст:
Общая синтаксическая конструкция для форматной выборки выглядит как --format FORMAT
или более короткая -f FORMAT
, где FORMAT
— это выборочное выражение, то есть выражение, которое описывает формат или форматы, которые вы хотите скачать.
tl;dr: перейти к примерам.
Простейший случай — это запрос на конкретный формат, например, с помощью -f 22
вы можете скачать формат с кодом формата, равным 22. Вы можете получить список доступных кодов формата для определенного видео, используя --list-formats
или -F
. Обратите внимание, что эти коды форматов специфичны для конкретного извлечения.
Вы также можете использовать расширение файла (в настоящее время поддерживаются 3gp
, aac
, flv
, m4a
, mp3
, mp4
, ogg
, wav
, webm
) для скачивания лучшего качества формата определенного расширения файла, представленного как единого файла, например, -f webm
скачает лучший формат качества с расширением файла webm
, представленного как единого файла.
Вы также можете использовать специальные названия для выбора определенных краевых форматов: - best
: Выбор лучшего качества формата, представленного как единого файла с видео и аудио.
worst
: Выбор худшего качества формата, представленного как единого файла с видео и аудио.bestvideo
: Выбор лучшего качества видео-только формата (например, DASH видео). Может быть недоступен.worstvideo
: Выбор худшего качества видео-только формата. Может быть недоступен.bestaudio
: Выбор лучшего качества аудио-только формата. Может быть недоступен.worstaudio
: Выбор худшего качества аудио-только формата. Может быть недоступен. Например, чтобы скачать видео с наименьшим качеством, вы можете использовать -f worstvideo
.Если вы хотите скачать несколько видео, и у них нет одинаковых форматов, вы можете указать порядок предпочтений, используя слеши. Обратите внимание, что слеш ассоциативен слева направо, то есть форматы слева предпочтительнее. Например, -f 22/17/18
загрузит формат 22, если он доступен, в противном случае загрузит формат 17, если он доступен, в противном случае загрузит формат 18, если он доступен, в противном случае сообщит, что нет подходящих форматов для загрузки.Если вы хотите скачать несколько форматов одного видео, используйте запятую в качестве разделителя, например, -f 22,17,18
загрузит все три формата, если они доступны. Или более сложный пример, объединённый с функцией предпочтений: -f 136/137/mp4/bestvideo,140/m4a/bestaudio
.
Вы также можете фильтровать видеоформаты, добавляя условие в скобках, как в -f "best[height=720]"
(или -f "[filesize>10M]"
).
Следующие числовые мета-поля можно использовать с операторами сравнения <
, <=
, >
, >=
, =
(равно), !=
(не равно):
filesize
: Количество байт, если известно заранее
width
: Ширина видео, если известна
height
: Высота видео, если известна
tbr
: Средняя скорость передачи аудио и видео в KBit/s
abr
: Средняя скорость передачи аудио в KBit/s
vbr
: Средняя скорость передачи видео в KBit/s
asr
: Частота дискретизации аудио в Гц
fps
: Частота кадровТакже фильтрация работает для сравнений =
(равно), ^=
(начинается с), $=
(заканчивается на), *=
(содержит) и следующих строковых мета-полях:
ext
: Расширение файла
acodec
: Имя используемого аудиокодека
vcodec
: Имя используемого видеокодека
container
: Имя контейнера
protocol
: Протокол, который будет использоваться для фактической загрузки, в нижнем регистре (http
, https
, rtsp
, rtmp
, rtmpe
, mms
, f4m
, ism
, http_dash_segments
, m3u8
, или m3u8_native
)
format_id
: Краткое описание формата
language
: Код языка
Любое строковое сравнение может быть предварено отрицанием !
для получения противоположного сравнения, например, !*=
(не содержит).
Обратите внимание, что ни одно из вышеупомянутых мета-полей не гарантируется присутствием, так как это зависит только от метаданных, полученных конкретным извлечением, то есть метаданных, предлагаемых видеохостером. Форматы, для которых значение неизвестно, исключаются, если вы не поставите вопросительный знак (?
) после оператора. Вы можете объединять фильтры форматов, например, -f "[высота <=? 720][tbr>500]"
выбирает видео с разрешением до 720p (или видео, где высота неизвестна) с битрейтом не менее 500 Кбит/с.Вы можете объединить видео и аудио двух форматов в один файл, используя -f <видео-формат>+<аудио-формат>
(требуется установленный ffmpeg или avconv), например, -f bestvideo+bestaudio
загрузит лучший формат только для видео, лучший формат только для аудио и объединит их вместе с помощью ffmpeg/avconv.Выбор форматов также можно группировать с помощью скобок, например, если вы хотите загрузить лучшие mp4 и webm форматы с высотой менее 480, вы можете использовать -f '(mp4,webm)[высота<480]'
.
С конца апреля 2015 года и версии 2015.04.26, youtube-dl использует -f bestvideo+bestaudio/best
как стандартный выбор формата (см. #5447, #5456). Если ffmpeg или avconv установлены, это приведет к загрузке bestvideo
и bestaudio
отдельно и объединению их в один файл, что обеспечит наилучшее общее качество. В противном случае будет использоваться best
, что приведет к загрузке наилучшего доступного качества, представленного как один файл. best
также требуется для видео, не发布的来自YouTube的音频和视频文件。如果您只想下载某些DASH格式(例如,如果您对获取分辨率为1080p以上的视频不感兴趣),您可以在配置文件中添加 -f bestvideo[высота<=1080]+bestaudio/best
。请注意,如果您使用youtube-dl将内容流式传输到stdout
(并且很可能将其管道传输到您的媒体播放器),即,您明确指定输出模板为 -o -
,youtube-dl仍然使用 -f best
格式选择,以便立即将内容传递给您的播放器,而不是等待bestvideo
和bestaudio
下载并合并。
如果您希望保留旧的格式选择行为(在youtube-dl 2015.04.26之前),即,您希望下载作为单个文件提供的最佳可用质量媒体,您应该明确指定您的选择 -f best
。您可能希望将其添加到配置文件中,以便每次运行youtube-dl时都不必输入它。
Обратите внимание, что на Windows могут потребоваться двойные кавычки вместо одинарных.```bash
$ youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
$ youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]'
$ youtube-dl -f 'best[filesize<50M]'
$ youtube-dl -f '(bestvideo+bestaudio/best)[protocol^=http]'
$ youtube-dl -f 'bestvideo,bestaudio' -o '%(title)s.f%(format_id)s.%(ext)s'
Обратите внимание, что в последнем примере рекомендуется использовать шаблон вывода, так как `bestvideo` и `bestaudio` могут иметь одинаковое имя файла.
# ВЫБОР ВИДЕО
Видео можно фильтровать по дате загрузки с помощью опций `--date`, `--datebefore` или `--dateafter`. Они принимают даты в двух форматах:
- Абсолютные даты: Даты в формате `YYYYMMDD`.
- Относительные даты: Даты в формате `(now|today)[+-][0-9](day|week|month|year)(s)?`
Примеры:
```bash
# Скачать только видео, загруженные в последние 6 месяцев
$ youtube-dl --dateafter now-6months
# Скачать только видео, загруженные 1 января 1970 года
$ youtube-dl --date 19700101
# Скачать только видео, загруженные в десятилетие 2000-х
$ youtube-dl --dateafter 20000101 --datebefore 20091231
Если вы следовали нашим инструкциям по ручной установке, вы можете просто запустить youtube-dl -U
(или, на Linux, sudo youtube-dl -U
).Если вы установили youtube-dl с помощью pip, достаточно выполнить sudo pip install -U youtube-dl
.
Если вы установили youtube-dl с помощью менеджера пакетов, такого как apt-get или yum, используйте стандартные механизмы обновления системы. Обратите внимание, что пакеты распределений часто устаревают. Как правило, youtube-dl выпускает обновления по крайней мере раз в месяц, а часто и еженедельно или даже ежедневно. Просто перейдите по адресу https://yt-dl.org, чтобы узнать текущую версию. К сожалению, мы, разработчики youtube-dl, ничего не можем сделать, если ваша распределение предоставляет действительно устаревшую версию. Вы можете (и должны) пожаловаться в вашей распределении в их багтрекере или поддержке. В крайнем случае вы также можете удалить версию, установленную вашим менеджером пакетов, и следовать нашим инструкциям по ручной установке. Для этого удалите пакет дистрибутива, с помощью команды вида
sudo apt-get remove -y youtube-dl
Затем просто следуйте нашим инструкциям по ручной установке:
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
hash -r
После этого вы сможете обновляться с помощью sudo youtube-dl -U
.
Добавьте исключение для youtube-dl.exe
в настройках Windows Defender.
Unable to extract OpenGraph title
при работе с плейлистами YouTubeYouTube изменил формат плейлистов в марте 2014 года и позже, поэтому вам потребуется версия youtube-dl не ниже 2014.07.25 для загрузки всех видео с YouTube.Если вы установили youtube-dl с помощью менеджера пакетов, pip, setup.py или tarball, используйте тот же метод для обновления. Обратите внимание, что пакеты Ubuntu, похоже, больше не обновляются. Поскольку мы не связаны с Ubuntu, мы мало что можем сделать. Вы можете сообщить об ошибках людям, ответственным за упаковку Ubuntu, на эту почту — им нужно просто обновить пакет до относительно новой версии. См. выше, как это сделать.
error: использование шаблона вывода конфликтует с использованием заголовка, идентификатора видео или автоматического номера
Убедитесь, что вы не используете -o
вместе с любыми из этих опций -t
, --title
, --id
, -A
или --auto-number
в командной строке или в конфигурационном файле. Удалите последнее, если оно используется.
-citw
?По умолчанию youtube-dl стремится использовать лучшие опции (кстати, если у вас есть убедительный случай, что это должно быть иначе, пожалуйста, сообщите об этом в качестве проблемы). Поэтому копирование длинных строк опций с веб-страниц не всегда необходимо и иногда вредно. В частности, единственная опция из -citw
, которая регулярно полезна, это -i
.### Можно ли вернуть опцию -b
? Большинство людей, задающих этот вопрос, не осознают, что youtube-dl теперь по умолчанию загружает самое высокое доступное качество, как это указано YouTube, что может быть 1080p или 720p в некоторых случаях, поэтому вам больше не нужно использовать опцию -b
. Для некоторых конкретных видео YouTube может не указывать, что они доступны в определенном высококачественном формате, в котором вас интересует. В этом случае просто запросите его с помощью опции -f
, и youtube-dl попытается загрузить видео.
Похоже, что YouTube требует пройти тест CAPTCHA, если вы загружаете слишком много. Мы рассматриваем возможность предоставить способ для решения CAPTCHA, но в данный момент лучший вариант действий — открыть веб-браузер на URL YouTube, решить CAPTCHA, и перезапустить youtube-dl.
youtube-dl работает отлично самостоятельно на большинстве сайтов. Однако, если вы хотите конвертировать видео/аудио, вам потребуется avconv или ffmpeg. На некоторых сайтах — в частности на YouTube — видео могут быть доступны в более высоком качестве без звука. youtube-dl обнаружит, есть ли avconv/ffmpeg, и автоматически выберет лучший вариант.Видео или видеоформаты, передаваемые по протоколу RTMP, могут быть загружены только при наличии rtmpdump. Загрузка MMS и RTSP видео требует установки либо mplayer, либо mpv.
Как только видео полностью загружено, воспользуйтесь любым видеоплеером, например mpv, vlc или mplayer.
-g
, но оно не воспроизводится на другом компьютере / в моём веб-браузере.Это зависит от сервиса. В большинстве случаев запросы к видео (для загрузки/воспроизведения) должны исходить с того же IP-адреса и с теми же куками и/или HTTP-заголовками. Используйте опцию --cookies
, чтобы записать необходимые куки в файл, и укажите загрузчику читать куки из этого файла. Некоторые сайты также требуют использовать общий User-Agent, используйте --dump-user-agent
, чтобы увидеть используемый youtube-dl. Вы также можете получить необходимые куки и HTTP-заголовки из JSON-вывода, полученного с помощью --dump-json
. Использование IPv6 может быть полезным; в некоторых случаях ограничения применяются только к IPv4. Некоторые сервисы (иногда только для подмножества видео) не ограничивают URL видео по IP-адресу, cookie или user-agent, но это является исключением, а не правилом.Пожалуйста, имейте в виду, что некоторые протоколы URL не поддерживаются браузерами по умолчанию, включая RTMP. Если вы используете -g
, ваш собственный загрузчик должен поддерживать эти протоколы также.
Если вы хотите воспроизвести видео на машине, которая не запускает youtube-dl, вы можете перенаправить содержимое видео с машины, которая запускает youtube-dl. Вы можете использовать -o -
, чтобы позволить youtube-dl потоково передавать видео в stdout, или просто позволить проигрывателю загружать файлы, записанные youtube-dl последовательно.
YouTube перешёл на новый формат информации о видео в июле 2011 года, который не поддерживается старыми версиями youtube-dl. См. выше, чтобы узнать, как обновить youtube-dl.
YouTube требует дополнительной подписи с сентября 2012 года, которая не поддерживается старыми версиями youtube-dl. См. выше, чтобы узнать, как обновить youtube-dl.
[1] 2839
или 'v' не является внутренней или внешней командой
Это на самом деле вывод вашей оболочки. Поскольку амперсанд является одним из специальных символов оболочки, он интерпретируется оболочкой, что препятствует передаче всего URL youtube-dl. Чтобы отключить оболочку от интерпретации амперсандов (или любого другого специального символа), вам нужно либо заключить весь URL в кавычки, либо экранировать их обратным слешом (какой подход будет работать, зависит от вашей оболочки).Например, если ваш URL https://www.youtube.com/watch?t=4&v=BaW_jenozKc, вы должны получить следующую команду:youtube-dl 'https://www.youtube.com/watch?t=4&v=BaW_jenozKc'
или
youtube-dl https://www.youtube.com/watch?t=4\&v=BaW_jenozKc
Для Windows вам нужно использовать двойные кавычки:
youtube-dl "https://www.youtube.com/watch?t=4&v=BaW_jenozKc"
В феврале 2015 года новый YouTube-плеер содержал последовательность символов в строке, которая была неверно интерпретирована старыми версиями youtube-dl. См. выше, чтобы узнать, как обновить youtube-dl.
Эти два кода ошибки указывают на то, что сервис блокирует ваш IP-адрес из-за перегрузки. Обычно это мягкий блок, который можно снять, решив CAPTCHA. Просто откройте браузер и решите CAPTCHA, предложенную сервисом, после чего передайте cookies в youtube-dl. Обратите внимание, что если ваш компьютер имеет несколько внешних IP-адресов, вам также нужно передать точно такой же IP-адрес, который вы использовали для решения CAPTCHA, с помощью опции --source-address
. Также вам может потребоваться передать HTTP-заголовок User-Agent
вашего браузера с помощью опции --user-agent
.Если это не так (сервис не предлагает решить CAPTCHA), вы можете связаться с сервисом и попросить их разблокировать ваш IP-адрес, или — если у вас уже есть разрешенный IP-адрес — использовать опции --proxy
или --source-address
для выбора другого IP-адреса.### Ошибка SyntaxError: Non-ASCII character
Ошибка
File "youtube-dl", line 2
SyntaxError: Non-ASCII character '\x93' ...
означает, что вы используете устаревшую версию Python. Пожалуйста, обновите до Python 2.6 или 2.7.
С июня 2012 года (#342) youtube-dl упакован в исполняемый zipfile. Просто распакуйте его (может потребоваться переименование в youtube-dl.zip
на некоторых системах) или клонируйте репозиторий git, как указано выше. Если вы модифицируете код, вы можете запустить его, выполнив файл __main__.py
. Чтобы перекомпилировать исполняемый файл, выполните make youtube-dl
.
MSVCR100.dll
Чтобы запустить исполняемый файл, вам сначала нужно установить Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package (x86).
Если вы поместите youtube-dl и ffmpeg в ту же директорию, из которой выполняете команду, это будет работать, но это довольно неудобно.Чтобы сделать другую директорию работоспособной — как для ffmpeg
, так и для youtube-dl
, или для обеих — просто создайте директорию (например, C:\bin
, или C:\Users\<User name>\bin
), поместите все исполняемые файлы непосредственно в нее, а затем установите переменную окружения PATH, чтобы включить эту директорию. Отныне, после перезапуска вашей оболочки, вы сможете получить доступ к youtube-dl
и ffmpeg
(и youtube-dl
сможет найти ffmpeg
) просто введя youtube-dl
или ffmpeg
, независимо от того, в какой директории вы находитесь.### Как я могу поместить загрузки в определенную папку?
Используйте параметр -o
для указания шаблона вывода, например -o "/home/user/videos/%(title)s-%(id)s.%(ext)s"
. Если вы хотите, чтобы это работало для всех ваших загрузок, добавьте параметр в ваш файл конфигурации.
-
?Используйте либо добавьте https://www.youtube.com/watch?v=
перед ID, либо разделите ID от параметров с помощью --
:
youtube-dl -- -wNyEUrxzFU
youtube-dl "https://www.youtube.com/watch?v=-wNyEUrxzFU"
Используйте параметр --cookies
, например --cookies /path/to/cookies/file.txt
.
Для извлечения cookie-файлов из браузера используйте любое расширение браузера, которое поддерживает экспорт cookie-файлов. Например, Get cookies.txt LOCALLY (для Chrome) или cookies.txt (для Firefox).
Обратите внимание, что файл cookie должен быть в формате Mozilla/Netscape и первая строка файла cookie должна быть либо # HTTP Cookie File
, либо # Netscape HTTP Cookie File
. Убедитесь, что у вас есть правильный формат новой строки в файле cookie и преобразуйте новую строку, если необходимо, чтобы она соответствовала вашей ОС, то есть CRLF
(\r\n
) для Windows и LF
(\n
) для Unix и Unix-подобных систем (Linux, macOS и т.д.). HTTP Error 400: Bad Request
при использовании --cookies
является хорошим признаком неверного формата новой строки.Передача cookie-файлов youtube-dl является хорошим способом обхода входа, когда определённый извлечник не реализует это явно. Другой случай использования — обход CAPTCHA, который некоторые веб-сайты требуют от вас решить в определённых случаях для получения доступа (например, YouTube, CloudFlare).
Сначала вам нужно указать youtube-dl на прямую передачу медиа-файлов в stdout с помощью -o -
, а также указать ваш медиаплеер на чтение из stdin (он должен быть способен на это для прямого потока), а затем соединить первый поток с последним. Например, прямая передача в vlc может быть достигнута следующим образом:
youtube-dl -o - "https://www.youtube.com/watch?v=BaW_jenozKcj" | vlc -
Используйте функцию download-archive. С этой функцией вы должны сначала скачать полный плейлист с помощью --download-archive /путь/к/файлу/архива/скачивания.txt
, что запишет идентификаторы всех видео в специальный файл. Каждый последующий запуск с тем же --download-archive
будет скачивать только новые видео и пропускать все видео, которые были скачаны ранее. Обратите внимание, что только успешные загрузки записываются в файл.
Например, сначала,
youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
```скачает полный плейлист `PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re` и создаст файл `archive.txt`. Каждый последующий запуск будет скачивать только новые видео, если такие есть:
youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
### Нужно ли мне добавить `--hls-prefer-native` в конфигурацию?
Когда youtube-dl обнаруживает HLS-видео, он может скачать его либо с помощью встроенного загрузчика, либо с помощью ffmpeg. Поскольку многие HLS-потоки немного некорректны, а ffmpeg и youtube-dl каждый лучше справляются с некоторыми некорректными случаями, есть опция для переключения загрузчика, если это необходимо.
Когда youtube-dl знает, что один конкретный загрузчик лучше всего работает для определенного сайта, этот загрузчик будет выбран. В противном случае youtube-dl выберет лучший загрузчик для общей совместимости, что в настоящее время происходит с использованием ffmpeg. Этот выбор может измениться в будущих версиях youtube-dl с улучшением встроенного загрузчика и/или ffmpeg.
В частности, общий извлечник (используется, когда ваш сайт не входит в [список поддерживаемых сайтов youtube-dl](https://ytdl-org.github.io/youtube-dl/supportedsites.html)) не может требовать одного конкретного загрузчика.Если вы добавите либо `--hls-prefer-native`, либо `--hls-prefer-ffmpeg` в вашу конфигурацию, для разных подмножеств видео будет некорректно скачиваться. Вместо этого гораздо лучше [отправить отчет об ошибке](https://yt-dl.org/bug) или запрос на внесение изменений, который подробно объяснит, почему встроенный или ffmpeg HLS-загрузчик является лучшим выбором для вашего случая использования.### Можно ли добавить поддержку для этого сайта аниме-видео или сайта, который показывает текущие фильмы бесплатно?
В качестве политики (а также с точки зрения закона), youtube-dl не включает поддержку для сервисов, которые специализируются на нарушении авторских прав. В качестве правила большинства, если вы не можете легко найти видео, которое сервис явно имеет право распространять (то есть, которое было загружено создателем, дистрибьютором создателя или опубликовано под свободной лицензией), сервис, вероятно, не подходит для включения в youtube-dl.
Примечание: если сервис не хранит нарушительный контент, а только ссылается на тех, кто это делает, это свидетельствует о том, что сервис **не** должен быть включён в youtube-dl. То же самое относится к любому уведомлению о соответствии DMCA, если вся передняя страница сервиса заполнена видео, которые он не имеет права распространять. Заметка о "справедливом использовании" также неубедительна, если сервис показывает защищённые авторским правом видео в полном объёме без разрешения.
Запросы на поддержку сервисов, которые **покупают** права на распространение своего контента, вполне допустимы. Если у вас есть сомнения, вы можете просто указать источник, упоминающий легитимную покупку контента.### Как я могу ускорить работу над моей проблемой?
(Также известно как: Помогите, моя важная проблема не решается!) Команда основных разработчиков youtube-dl очень мала. Хотя мы делаем всё возможное, чтобы решить как можно больше проблем, иногда это может занять довольно много времени. Чтобы ускорить решение вашей проблемы, вот что вы можете сделать:
Во-первых, пожалуйста, сообщите о проблеме [в нашем трекере проблем](https://yt-dl.org/bugs). Это позволяет нам координировать все усилия пользователей и разработчиков и служит единым источником. К сожалению, проект youtube-dl вырос настолько, что использование личной электронной почты как эффективный канал коммуникации больше не применимо.
Пожалуйста, ознакомьтесь с [инструкциями по отслеживанию ошибок](#bugs) ниже. Многие ошибки не содержат всей необходимой информации. Если это возможно, предложите прокси, VPN или доступ к командной строке разработчикам youtube-dl. Если вы можете, проведите тестирование проблемы на нескольких компьютерах в разных странах, чтобы исключить местное цензурирование или проблемы с настройками.
Если никто не заинтересован в решении вашей проблемы, вы можете взять дело в свои руки и отправить запрос на внесение изменений (или заставить/оплатить кого-то ещё сделать это).Не стесняйтесь время от времени поднимать проблему, оставляя небольшой комментарий ("Проблема всё ещё присутствует в версии youtube-dl... из Франции, но исправлена из Бельгии"), но, пожалуйста, не чаще одного раза в месяц. Пожалуйста, не объявляйте вашу проблему как `важную` или `срочную`.
### Как можно определить, поддерживается ли заданный URL сервисом youtube-dl?
Во-первых, ознакомьтесь с [списком поддерживаемых сайтов](docs/supportedsites.md). Обратите внимание, что иногда сайт может изменить схему URL (например, с https://example.com/video/1234567 на https://example.com/v/1234567), и youtube-dl может отчитаться об URL службы из этого списка как не поддерживаемом. В этом случае просто сообщите об ошибке.
Определить, поддерживается ли URL, **невозможно**. Это связано с тем, что youtube-dl содержит универсальный извлечник, который соответствует **всем** URL. Вы можете быть склонны отключить, исключить или удалить универсальный извлечник, но этот извлечник не только позволяет пользователям извлекать видео с множества сайтов, которые встраивают видео с другой службы, но также может использоваться для извлечения видео с службы, которую он сам хостит. Поэтому мы ни в коем случае не рекомендуем и не поддерживаем отключение, исключение или удаление универсального извлечника.Если вы хотите узнать, поддерживается ли заданный URL, просто вызовите youtube-dl с этим URL. Если вы не получите видео, вероятно, URL либо не ссылается на видео, либо не поддерживается. Вы можете выяснить это, изучив вывод (если вы запускаете youtube-dl в консоли) или перехватив исключение `UnsupportedError`, если вы запускаете его из программы на Python.# Почему мне нужно пройти через столько формальностей при подаче сообщений об ошибках?До того, как у нас появился шаблон для ошибок, несмотря на наши подробные [инструкции по отчету об ошибках](#bugs), около 80% отчетов об ошибках, которые мы получали, были бесполезными, например, потому что люди использовали древние версии, отстоящие на сотни выпусков, из-за простых синтаксических ошибок (не в youtube-dl, а в общем использовании командной строки), из-за того, что проблема уже была отмечена несколько раз ранее, из-за того, что люди не читали сообщение об ошибке, даже если оно говорило "пожалуйста, установите ffmpeg", из-за того, что люди не упоминали URL, который они пытались скачать, и многих других простых, легко избегаемых проблем, многих из которых было совершенно не связано с youtube-dl. youtube-dl — это проект с открытым исходным кодом, который поддерживается слишком малым числом добровольцев, поэтому мы предпочитаем тратить время на исправление ошибок там, где уверены, что простые проблемы не применимы, и где можем быть уверены, что сможем воспроизвести проблему без необходимости повторно обращаться к репортеру. В связи с этим выход `youtube-dl -v YOUR_URL_HERE` (вместе с вашим URL) действительно является всем, что требуется для подачи отчета об ошибке. Шаблон отчета также подсказывает вам, какие базовые шаги вы можете выполнить, например, проверить, что ваша версия youtube-dl является актуальной.
# Руководство для разработчиковБольшинство пользователей не требуется сборка youtube-dl и они могут [скачать сборки](https://ytdl-org.github.io/youtube-dl/download.html) или получить их из своего дистрибутива.
Чтобы запустить youtube-dl как разработчик, вам не нужно ничего собирать. Просто выполните
python -m youtube_dl
Чтобы запустить тесты, просто запустите ваш любимый тестовый запуск или выполните тестовый файл напрямую; любое из следующего работает:
python -m unittest discover
python test/test_download.py
nosetests
Для версий Python 3.6 и выше, вы можете использовать [pynose](https://pypi.org/project/pynose/) для реализации `nosetests`. Оригинальная [nose](https://pypi.org/project/nose/) не была обновлена для версий 3.10 и выше.
См. пункт 6 [руководства по добавлению поддержки нового сайта](#добавление-поддержки-для-нового-сайта) для информации о том, как запустить тестовые случаи для конкретного извлечения.
Если вы хотите создать сборку youtube-dl самостоятельно, вам потребуется
* python
* make (только GNU make поддерживается)
* pandoc
* zip
* nosetests
### Добавление поддержки для нового сайта
Если вы хотите добавить поддержку для нового сайта, сначала **убедитесь**, что этот сайт **не посвящен [нарушению авторских прав](README.md#можете-вы-добавить-поддержку-для-этого-сайта-аниме-видео-или-сайта-который-показывает-текущие-фильмы-бесплатно)**. youtube-dl **не поддерживает** такие сайты, поэтому запросы на включение поддержки для них **будут отклонены**.После того, как вы убедитесь, что этот сайт распространяет свои материалы законно, вы можете следовать этому краткому списку (предполагая, что ваш сервис называется `yourextractor`):
1. [Создайте форк этого репозитория](https://github.com/ytdl-org/youtube-dl/fork)
2. Выполните команду для получения исходного кода:
git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git
3. Создайте новую ветку git с помощью команды:
cd youtube-dl
git checkout -b yourextractor
4. Начните с этого простого шаблона и сохраните его в `youtube_dl/extractor/yourextractor.py`:
```python
# кодировка: utf-8
from __future__ import unicode_literals
from .common import InfoExtractor
class YourExtractorIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?yourextractor\.com/watch/(?P<id>[0-9]+)'
_TEST = {
'url': 'https://yourextractor.com/watch/42',
'md5': 'TODO: md5 сумма первых 10241 байта видеофайла (используйте --test)',
'info_dict': {
'id': '42',
'ext': 'mp4',
'title': 'Название видео здесь',
'thumbnail': r're:^https?://.*\.jpg$',
# TODO более свойств, либо как:
# * Значение
# * MD5 контрольная сумма; начните строку с md5:
# * Регулярное выражение; начните строку с re:
# * Любое значение типа Python (например int или float)
}
}
def _real_extract(self, url):
video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id)
# TODO более кода следует здесь, например ...
title = self._html_search_regex(r'<h1>(.+?)</h1>', webpage, 'title')
``` return {
'id': видео_id,
'title': заголовок,
'description': self._og_search_description(веб_страница),
'uploader': self._search_regex(r'<div[^>]+id="uploader"[^>]*>([^<]+)<', веб_страница, 'uploader', fatal=False),
# TODO добавьте больше свойств (см. youtube_dl/extractor/common.py)
}
```
5. Добавьте импорт в [`youtube_dl/extractor/extractors.py`](https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/extractors.py).
6. Запустите `python test/test_download.py TestDownload.test_YourExtractor`. Это *должно завершиться ошибкой* сначала, но вы можете продолжать перезапускать его до тех пор, пока не закончите. Если вы решите добавить больше одного теста (на самом деле, тестового случая), то переименуйте ``_TEST`` в ``_TESTS`` и сделайте его списком словарей. Тесты будут названы `TestDownload.test_YourExtractor`, `TestDownload.test_YourExtractor_1`, `TestDownload.test_YourExtractor_2`, и т.д. Обратите внимание:
* имена тестов используют имя класса извлечения **без окончания `IE`**
* тесты с ключом `only_matching` в словаре теста не учитываются.
8. Посмотрите на [`youtube_dl/extractor/common.py`](https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/common.py) для возможных вспомогательных методов и [детального описания того, что должен и может вернуть ваш извлечник](https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L94-L303). Добавьте тесты и код для столько, сколько вам нужно.
9. Убедитесь, что ваш код соответствует [стандартам написания кода для youtube-dl](#youtube-dl-кодирования-стандарты) и проверьте код с [flake8](https://flake8.pycqa.org/en/latest/index.html#quickstart): $ flake8 youtube_dl/extractor/yourextractor.py
9. Убедитесь, что ваш код работает под всеми [версиями Python](https://www.python.org/), поддерживаемыми youtube-dl, а именно 2.6, 2.7, и 3.2+.
10. Когда тесты проходят, [добавьте](https://git-scm.com/docs/git-add) новые файлы и [закоммитьте](https://git-scm.com/docs/git-commit) их и [отправьте](https://git-scm.com/docs/git-push) результат, как это:
$ git add youtube_dl/extractor/yourextractor.py
$ git commit -m "Добавлен новый извлечник YourExtractor"
$ git push
$ git add youtube_dl/extractor/extractors.py
$ git add youtube_dl/extractor/yourextractor.py
$ git commit -m '[yourextractor] Добавить новый извлечённый файл'
$ git push origin yourextractor
11. Наконец, [создайте запрос на слияние](https://help.github.com/articles/creating-a-pull-request). Мы затем проверим и объединим его.
В любом случае, большое спасибо за ваши вклады!
## Кодовые соглашения для youtube-dl
В этом разделе представлены руководства по написанию идиоматического, надёжного и будущее-ориентированного кода извлечения.Извлекатели по своей природе очень хрупки, так как они зависят от структуры данных, предоставленных сторонними хостами медиа, которые находятся вне вашего контроля, и эта структура часто меняется. В качестве разработчика извлечения ваша задача не только написать код, который будет правильно извлекать ссылки на медиа и метаданные, но также минимизировать зависимость от структуры данных источника и даже сделать код способным предвидеть потенциальные будущие изменения и быть готовым к ним. Это важно, так как это позволит извлечению не ломаться при незначительных изменениях структуры, что позволит старым версиям youtube-dl продолжать работать. Хотя эта проблема может быть легко решена выпуском новой версии youtube-dl с внесённым исправлением, все предыдущие версии становятся сломанными во всех репозиториях и пакетах дистрибутивов, которые могут не быть такими быстрыми в получении обновления от нас. Безусловно, некоторые дистрибутивы без постоянных выпусков могут никогда не получить обновление вовсе.### Обязательные и необязательные метаполя
Для успешного извлечения youtube-dl полагается на метаданные, которые ваш извлечённый файл извлекает и предоставляет youtube-dl, выраженные в виде [информационного словаря](https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L94-L303) или просто *info dict*. Только следующие метаполя в *info dict* считаются обязательными для успешного процесса извлечения youtube-dl:
- `id` (идентификатор медиа)
- `title` (название медиа)
- `url` (URL для загрузки медиа) или `formats`
В действительности только последний вариант технически является обязательным (то есть, если вы не можете определить местоположение загрузки медиа, извлечение не имеет смысла). Но по соглашению youtube-dl также считает `id` и `title` обязательными. Таким образом, вышеупомянутые метаполя являются критическими данными, без которых извлечение не имеет смысла, и если любое из них не может быть извлечено, то извлечённый файл считается полностью сломанным. [Любое поле](https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L188-L303) помимо упомянутых считается **необязательным**. Это означает, что извлечение должно быть **терпимым** к ситуациям, когда источники для этих полей могут быть недоступны (даже если они всегда доступны в данный момент), и **будущепroof**, чтобы не нарушить извлечение общих обязательных полей.#### Пример
Предположим, что у вас есть словарь источников `meta`, который вы получили в виде JSON с HTTP-запросом, и он имеет ключ `summary`:
```python
meta = self._download_json(url, video_id)
Предположим, что в данный момент структура meta
выглядит следующим образом:
{
...
"summary": "some fancy summary text",
...
}
Предположим, что вы хотите извлечь summary
и поместить его в результирующий словарь информации как description
. Поскольку description
является необязательным мета-полем, вы должны быть готовы к тому, что этот ключ может отсутствовать в словаре meta
, поэтому вы должны извлекать его следующим образом:
description = meta.get('summary') # верно
а не так:
description = meta['summary'] # неверно
Второй вариант приведет к сбою процесса извлечения с ошибкой KeyError
, если summary
исчезнет из meta
в будущем, но с первым подходом извлечение продолжит работу с description
установленным в None
, что вполне допустимо (помните, что None
эквивалентен отсутствию данных).
Аналогично, вы должны передать fatal=False
, когда извлекаете необязательные данные с веб-страницы с помощью _search_regex
, _html_search_regex
или подобных методов, например:
description = self._search_regex(
r'<span[^>]+id="title"[^>]*>([^<]+)<',
webpage, 'description', fatal=False)
С fatal
установленным в False
, если _search_regex
не сможет извлечь description
, он выдаст предупреждение и продолжит извлечение.Вы также можете передать default=<some fallback value>
, например:
description = self._search_regex(
r'<span[^>]+id="title"[^>]*>([^<]+)<',
webpage, 'description', default=None)
В случае неудачи этот код продолжит извлечение без ошибок, установив description
в None
. Это полезно для мета-полей, которые могут присутствовать или отсутствовать.
При извлечении метаданных попытайтесь делать это из нескольких источников. Например, если title
присутствует в нескольких местах, попытайтесь извлечь его из хотя бы некоторых из них. Это делает извлечение более будущепroof в случае, если некоторые из источников станут недоступными.
Предположим, что meta
из предыдущего примера имеет поле title
, и вы собираетесь его извлечь. Поскольку title
является обязательным полем метаданных, вы должны получить что-то вроде:
title = meta['title']
Если title
исчезнет из meta
в будущем из-за изменений со стороны хостера, извлечение не удастся, так как title
является обязательным полем. Это ожидаемо.
Предположим, что у вас есть другой источник, из которого можно извлечь title
, например HTML-метка og:title
страницы webpage
. В этом случае вы можете предоставить сценарий резервного варианта:
title = meta.get('title') or self._og_search_title(webpage)
Этот код попытается извлечь title
из meta
сначала, и если это не удастся, попытается извлечь og:title
из webpage
.### Регулярные выражения
Захватывающая группа должна быть индикатором того, что она используется где-то в коде. Любая группа, которая не используется, должна быть незахватывающей.
Здесь не захватывайте имя атрибута id
, так как вы не можете использовать его ни для чего.
Правильно:
r'(?:id|ID)=(?P<id>\d+)'
Неправильно:
r'(id|ID)=(?P<id>\d+)'
Когда вы используете регулярные выражения, попытайтесь писать их размытыми, расслабленными и гибкими, игнорируя незначительные части, которые более вероятно изменятся, позволяя как одинарные, так и двойные кавычки для заключённых значений и так далее.
Предположим, что вам нужно извлечь title
из следующего HTML-кода:
<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">some fancy title</span>
Код для этой задачи должен выглядеть примерно так:
title = self._search_regex(
r'<span[^>]+class="title"[^>]*>([^<]+)', webpage, 'title')
Или даже лучше:
title = self._search_regex(
r'<span[^>]+class=(["\'])title\1[^>]*>(?P<title>[^<]+)',
webpage, 'title', group='title')
Обратите внимание, как вы терпимо относитесь к потенциальным изменениям в значении атрибута style
или переходу от использования двойных кавычек к одинарным для атрибута class
:Код точно не должен выглядеть так:
title = self._search_regex(
r'<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">(.*?)</span>',
webpage, 'title', group='title')
Существует мягкий лимит, чтобы держать строки кода меньше 80 символов. Это означает, что он должен соблюдаться, если это возможно, и если это не ухудшает читаемость и поддержку кода.
Например, вы никогда не должны разделять длинные строковые литералы, такие как URL или некоторые другие часто копируемые сущности, на несколько строк, чтобы соответствовать этому лимиту:
Правильно:
'https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
Неправильно:
'https://www.youtube.com/watch?v=FqZTN594JQw&list='
'PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
Извлечение переменных допустимо для уменьшения дублирования кода и улучшения читаемости сложных выражений. Однако вы должны избегать извлечения переменных, которые используются только один раз и перемещения их в противоположные части файла извлечения, что затрудняет чтение линейного потока.
Правильно:
title = self._html_search_regex(r'<title>([^<]+)</title>', webpage, 'title')
Неправильно:
TITLE_RE = r'<title>([^<]+)</title>'
# ...несколько строк кода...
title = self._html_search_regex(TITLE_RE, webpage, 'title')
Несколько запасных значений могут быстро стать неудобными. Сжимайте несколько запасных значений в одно выражение через список шаблонов.#### Пример
Хорошо:
description = self._html_search_meta(
['og:description', 'description', 'twitter:description'],
webpage, 'description', default=None)
Неудобно:
description = (
self._og_search_description(webpage, default=None)
or self._html_search_meta('description', webpage, default=None)
or self._html_search_meta('twitter:description', webpage, default=None))
Методы, поддерживающие список шаблонов: _search_regex
, _html_search_regex
, _og_search_property
, _html_search_meta
.
Всегда перемещайте заключительные круглые скобки после последнего аргумента.
Правильно:
lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
list)
Неправильно:
lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
list,
)
Оберните все извлеченные числовые данные в безопасные функции из youtube_dl/utils.py
: int_or_none
, float_or_none
. Используйте их для конвертации строк в числа. Используйте url_or_none
для безопасной обработки URL.
Используйте traverse_obj
для безопасного извлечения метаданных из распарсенных JSON.
Используйте unified_strdate
для унифицированного извлечения upload_date
или любого поля метаданных типа YYYYMMDD
, unified_timestamp
для унифицированного извлечения timestamp
, parse_filesize
для извлечения filesize
, parse_count
для извлечения полей метаданных типа count
, parse_resolution
, parse_duration
для извлечения duration
, parse_age_limit
для извлечения age_limit
.Изучите youtube_dl/utils.py
для получения дополнительных полезных вспомогательных функций.
При обработке сложного JSON, как часто возвращаемого запросами к API сайта или хранящегося в веб-страницах для "hydration", можно использовать утилиту traverse_obj()
для обработки нескольких значений по умолчанию и для обеспечения ожидаемого типа метаданных. Документация функции определяет, как работает функция: также просмотрите использование в кодовой базе для получения дополнительных примеров.
В этом примере текстовое значение description
или None
извлекается из члена .result.video[0].summary
распарсенного JSON response
, если доступно.
description = traverse_obj(response, ('result', 'video', 0, 'summary', T(compat_str)))
T(...)
является сокращением для литерала множества; если вы не любите людей, которые все еще используют Python 2.6, T(type_or_transformation)
можно записать как литерал множества {type_or_transformation}
.
Некоторые извлечения используют более старую и менее функциональную функцию try_get()
в том же контексте.
description = try_get(response, lambda x: x['result']['video'][0]['summary'], compat_str)
.result.video[0]
распарсенного JSON response
, который ожидается быть JS объектом, распарсенным в dict
, без ошибок, если это не так, или если любые из целевых значений отсутствуют или недействительны.```pythonvideo = traverse_obj(response, ('result', 'video', 0, T(dict))) or {}
description = video.get('summary') duration = float_or_none(video.get('durationMs'), scale=1000) view_count = int_or_none(video.get('views'))
Предположим, вы извлекли JSON таким образом в структуру данных Python с именем `media_json` с помощью, например, методов `_download_json()` или `_parse_json()` класса `InfoExtractor`:
```json
{
"title": "Example video",
"comment": "try extracting this",
"media": [{
"type": "bad",
"size": 320,
"url": "https://some.cdn.site/bad.mp4"
}, {
"type": "streaming",
"url": "https://some.cdn.site/hls.m3u8"
}, {
"type": "super",
"size": 1280,
"url": "https://some.cdn.site/good.webm"
}],
"moreStuff": "more values",
...
}
Тогда код извлечения может собрать различные поля JSON:
...
from ..utils import (
determine_ext,
int_or_none,
T,
traverse_obj,
txt_or_none,
url_or_none,
)
...
...
info_dict = {}
# извлекаем заголовок и описание, если они корректны и не пустые
info_dict.update(traverse_obj(media_json, {
'title': ('title', T(txt_or_none)),
'description': ('comment', T(txt_or_none)),
}))
``` # извлекаем любые распознаваемые форматы медиа
fmts = []
# проходим по списку "media", извлекаем `dict` с желаемыми ключами
for fmt in traverse_obj(media_json, ('media', Ellipsis, {
'format_id': ('type', T(txt_or_none)),
'url': ('url', T(url_or_none)),
'width': ('size', T(int_or_none)), })):
# значения `fmt`, которые были `None`, были удалены
if 'url' not in fmt:
continue
fmt_url = fmt['url'] # известно, что это корректный URL
ext = determine_ext(fmt_url)
if ext == 'm3u8':
fmts.extend(self._extract_m3u8_formats(fmt_url, video_id, 'mp4', fatal=False))
else:
fmt['ext'] = ext
fmts.append(fmt) # Сортируем, выбрасываем исключение, если форматы не найдены
self._sort_formats(fmts)
info_dict['formats'] = fmts
...
Извлекатель выбрасывает исключение вместо случайных сбоев, если структура JSON изменяется так, что форматы не находятся.
youtube-dl старается быть хорошей программой командной строки и, следовательно, должна быть вызываемой из любого языка программирования. Если вы столкнулись с проблемами парсинга его вывода, не стесняйтесь создать отчет. Из программы на Python вы можете интегрировать youtube-dl более мощным образом, например, так:
from __future__ import unicode_literals
import youtube_dl
ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
Вероятно, вы захотите использовать различные опции. Для получения списка доступных опций ознакомьтесь с файлом youtube_dl/YoutubeDL.py
. В качестве отправной точки, если вы хотите перехватить вывод youtube-dl, установите объект logger
.
Вот более полный пример программы, которая выводит только ошибки (и короткое сообщение после завершения загрузки), а также загружает/конвертирует видео в файл mp3:
from __future__ import unicode_literals
import youtube_dl
class MyLogger(object):
def debug(self, msg):
pass
def warning(self, msg):
pass def error(self, msg):
print(msg)
def my_hook(d):
if d['status'] == 'finished':
print('Завершено скачивание, теперь конвертируем ...')
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
'logger': MyLogger(),
'progress_hooks': [my_hook],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
Ошибки и предложения следует сообщать в системе отслеживания ошибок: https://github.com/ytdl-org/youtube-dl/issues (https://yt-dl.org/bug является псевдонимом для этого). Если вы не были приглашены отправить отчет об ошибке или нет других уважительных причин (например, GitHub не принимает отчет об ошибке), пожалуйста, не отправляйте отчеты об ошибках по личной электронной почте. Для обсуждений присоединяйтесь к каналу IRC #youtube-dl на freenode (webchat).
-v
, то есть добавьте флаг -v
к вашей командной строке, скопируйте весь вывод и вставьте его в тело сообщения об ошибке, обрамив ```. Вывод должен выглядеть похожим образом:$ youtube-dl -v <ваша командная строка>
[отладка] Системная конфигурация: []
[отладка] Конфигурация пользователя: []
[отладка] Аргументы командной строки: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj']
[отладка] Кодировки: локаль cp1251, файловая система mbcs, вывод cp866, предпочтения cp1251
[отладка] Версия youtube-dl 2015.12.06
[отладка] Git HEAD: 135392e
[отладка] Python версия 2.6.6 - Windows-2003Server-5.2.3790-SP2
[отладка] exe версии: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
[отладка] Список прокси: {}
...
**Не публикуйте скриншоты подробных логов; только обычный текст допустим.**Вывод (включая первые строки) содержит важную отладочную информацию. Сообщения об ошибках без полного вывода часто не воспроизводимы и поэтому не решаются в кратчайшие сроки, если вообще решаются.
Наконец, пожалуйста, проверьте ваше сообщение об ошибке, чтобы избежать различных распространённых ошибок (вы можете и должны использовать это как проверочный список), перечисленных ниже.
Мы часто получаем сообщения об ошибках, которые трудно понять. Чтобы избежать последующих уточнений, и чтобы помочь участникам, которые не являются носителями английского языка, пожалуйста, подробно опишите ту функцию, которую вы хотите запросить, или ту ошибку, которую вы хотите исправить.
Убедитесь, что:
Если ваш отчёт короче двух строк, он почти наверняка недостаточен, что делает его трудным для нас для понимания. Мы часто слишком вежливы, чтобы закрывать такие сообщения об ошибках, но недостающая информация делает недоразумения вероятными. Как коммиттер, я часто раздражаюсь из-за таких сообщений об ошибках, поскольку единственный возможный способ для меня двигаться вперёд — это снова и снова просить уточнений.Для отчётов об ошибках это означает, что ваш отчёт должен содержать полный вывод youtube-dl при вызове с флагом -v
. Сообщение об ошибке, которое вы получаете для (большинства) ошибок, даже говорит об этом, но вы не поверите, сколько наших сообщений об ошибках не содержат этой информации. Если ваш сервер имеет несколько IP-адресов или вы подозреваете цензуру, добавление --call-home
может быть хорошей идеей для получения дополнительной диагностики. Если ошибка ERROR: Unable to extract ...
и вы не можете воспроизвести её из нескольких стран, добавьте --dump-pages
(предупреждение: это приведёт к значительному объёму вывода, перенаправьте его в файл log.txt
, добавив >log.txt 2>&1
к вашей команде) или загрузите файлы .dump
, которые вы получите при добавлении --write-pages
куда-то.Запросы поддержки сайта должны содержать пример URL. Пример URL — это URL, который вы можете захотеть скачать, например https://www.youtube.com/watch?v=BaW_jenozKc
. На странице должен присутствовать явный видеоролик. За исключением очень специфических обстоятельств, главная страница видео-сервиса (например, https://www.youtube.com/
) не является примером URL.
-label:duplicate
, чтобы сосредоточиться на активных проблемах. Если проблема уже существует, не стесняйтесь написать что-то вроде "Эта проблема затрагивает меня также, версия 2015.01.01. Вот дополнительная информация о проблеме: ...". Хотя некоторые проблемы могут быть старыми, новый пост в них часто стимулирует быструю активность.### Используете ли вы последнюю версию?Перед отчетом о проблеме введите youtube-dl -U
. Это должно сообщить, что вы используете последнюю версию. Около 20% отчетов, которые мы получаем, уже исправлены, но люди используют устаревшие версии. Это касается и запросов на новые функции.
Перед запросом новой функции, пожалуйста, посмотрите на список поддерживаемых опций. Многие запросы на новые функции уже реализованы! Пожалуйста, обязательно укажите вашу работу в отчете о проблеме и подробно объясните, почему существующие похожие опции не решают вашу проблему.
В частности, каждая задача поддержки сайта должна относиться только к услугам на одном сайте (обычно под общим доменом, но всегда использующим одну и ту же технологию backend). Не запрашивайте поддержку для видео пользователей Vimeo, подкастов Белого дома и страниц Google Plus в одной задаче. Также убедитесь, что вы не публикуете отчеты о багах вместе с запросами на новые функции. Как правило, запрос на новую функцию не должен включать выводы youtube-dl, которые не непосредственно связаны с данной функцией. Не публикуйте отчеты о сетевой ошибке вместе с запросом на новый видео сервис.
Может показаться странным, но некоторые отчеты о багах, которые мы получаем, совершенно не связаны с youtube-dl и относятся к другой, или даже к собственной, приложению репортера. Пожалуйста, убедитесь, что вы действительно используете youtube-dl. Если вы используете пользовательский интерфейс для youtube-dl, отправьте отчет о баге разработчику приложения, предоставляющего этот интерфейс. С другой стороны, если ваш пользовательский интерфейс для youtube-dl не работает каким-то образом и вы считаете, что это связано с youtube-dl, не стесняйтесь отправить отчет о баге.
youtube-dl выпускается в общественное достояние авторами.
Этот файл README был первоначально написан Даниелом Болтоном и также выпускается в общественное достояние.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )