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 PATH Расположение конфигурационного файла;
либо путь к конфигурационному файлу, либо его директории.
--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 Обходить географические ограничения с помощью подмены заголовка X-Forwarded-For
--no-geo-bypass Не обходить географические ограничения с помощью подмены заголовка X-Forwarded-For
--geo-bypass-country CODE Принудительно обходить географические ограничения с явно предоставленным двухбуквенным кодом страны ISO
3166-2
--geo-bypass-ip-block IP_BLOCK Принудительно обходить географические ограничения с явно предоставленным IP-блоком в нотации CIDR
--playlist-start NUMBER Начальное видео плейлиста (по умолчанию 1)
--playlist-end NUMBER Конечное видео плейлиста (по умолчанию последнее)
--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 REGEX Загружать только совпадающие заголовки (регулярное выражение или регистронезависимая подстрока)
--reject-title REGEX Пропускать загрузку для совпадающих заголовков
(регулярное выражение или регистронезависимая подстрока)
--max-downloads NUMBER Прекратить после загрузки NUMBER файлов
--min-filesize SIZE Не загружать видео меньше SIZE (например, 50k или 44.6m)
--max-filesize SIZE Не загружать видео больше SIZE (например, 50k или 44.6m)
--date DATE Загружать только видео, загруженные в эту дату
--datebefore DATE Загружать только видео, загруженные на или до этой даты (то есть включительно)
--dateafter DATE Загружать только видео, загруженные на или после этой даты (то есть включительно)
--min-views COUNT Не загружать видео с менее чем COUNT просмотрами
--max-views COUNT Не загружать видео с более чем COUNT просмотрами
--match-filter FILTER Общий фильтр видео. Укажите любой ключ (см. "ШАБЛОН ВЫВОДА" для списка доступных ключей),
чтобы совпадение происходило при наличии ключа, !key для проверки отсутствия ключа,
key > NUMBER (например, "comment_count > 12", также работает с >=, <, <=, !=, =) для сравнения с числом,
key = 'LITERAL' (например, "uploader = 'Mike Smith'", также работает с !=) для совпадения со строковым литералом,
и & для требования нескольких совпадений. Значения, которые неизвестны, исключаются,
если вы не поставите вопросительный знак (?) после оператора. Например,
чтобы совпадали только видео с более чем 100 лайками и менее 50 дизлайками (или функционал дизлайков недоступен на данном сервисе),
но также имеющие описание, используйте --match-filter "like_count > 100 &
dislike_count <? 50 & description" .
--no-playlist Загружать только видео, если URL относится к видео и плейлисту.
--yes-playlist Загружать плейлист, если URL относится к видео и плейлисту.
--age-limit YEARS Загружать только видео подходящие по возрасту
--download-archive FILE Загружать только видео не перечисленные в архивном файле. Записывать ID всех
загруженных видео в него.
--include-ads Загружать рекламу вместе с видео (экспериментально)
-r, --limit-rate RATE Максимальная скорость загрузки в байтах в секунду (например, 50K или 4.2M)
-R, --retries RETRIES Количество попыток (по умолчанию 10), или "infinite".
--fragment-retries RETRIES Количество попыток для фрагмента (по умолчанию 10), или "infinite" (DASH,
hlsnative и ISM)
--skip-unavailable-fragments Пропускать недоступные фрагменты (DASH,
hlsnative и ISM)
--abort-on-unavailable-fragment Прекратить загрузку при недоступности фрагмента
--keep-fragments Сохранять скачанные фрагменты на диске после завершения загрузки; фрагменты удаляются по умолчанию
--buffer-size SIZE Размер буфера загрузки (например, 1024 или 16K) (по умолчанию 1024)
--no-resize-buffer Не автоматически изменять размер буфера. По умолчанию размер буфера автоматически изменяется от начального значения SIZE.
--http-chunk-size 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 для загрузки ('-' для stdin), один URL на строку. Строки,
начинающиеся с '#', ';' или ']', считаются комментариями и игнорируются.
--id Использовать только ID видео в имени файла
-o, --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 Файл для чтения кук и сохранения куковой базы данных
--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, --quiet Активировать тихий режим
--no-warnings Игнорировать предупреждения
-s, --simulate Не скачивать видео и не записывать ничего на диск
--skip-download Не скачивать видео
-g, --get-url Симулировать, тихий режим но выводить URL
-e, --get-title Симулировать, тихий режим но выводить название
--get-id Симулировать, тихий режим но выводить ID
--get-thumbnail Симулировать, тихий режим но выводить URL миниатюры
--get-description Симулировать, тихий режим но выводить описание видео
--get-duration Симулировать, тихой режим но выводить продолжительность видео
--get-filename Симулировать, тихий режим но выводить имя выходного файла
--get-format Симулировать, тихий режим но выводить выходной формат
-j, --dump-json Симулировать, тихий режим но выводить информацию JSON. См. "ШАБЛОН ВЫВОДА"
для описания доступных ключей.
-J, --dump-single-json Симулировать, тихий режим но выводить информацию JSON для каждого аргумента командной строки.
Если URL относится к плейлисту, выводится вся информация плейлиста в одной строке.
--print-json Быть тихим и выводить информацию о видео как JSON (видео все равно будет скачиваться).
--newline Выводить строку прогресса как новые строки
--no-progress Не выводить строку прогресса
--console-title Отображать прогресс в заголовке консоли
-v, --verbose Выводить различные отладочные сообщения
--dump-pages Выводить закачанные страницы закодированные с использованием base64 для отладки проблем (очень многословно)
--write-pages Записывать промежуточные страницы в файлы в текущей директории для отладки проблем
--print-traffic Отображать отправляемый и получаемый HTTP трафик
-C, --call-home Обращаться к серверу youtube-dl для отладки
--no-call-home НЕ обращаться к серверу youtube-dl для отладки
--encoding ENCODING Принудительно использовать указанную кодировку (экспериментально)
--no-check-certificate Подавлять проверку сертификата HTTPS
--prefer-insecure Использовать незашифрованное соединение для получения информации о видео.
(В настоящее время поддерживается только для YouTube)
--user-agent UA Указать пользовательский агент
--referer URL Указать пользовательский реферер, использовать если доступ к видео ограничен одним доменом
--add-header FIELD:VALUE Указать пользовательский HTTP заголовок и его значение,
разделенные двоеточием ':'. Вы можете использовать этот параметр несколько раз.
--bidi-workaround Обходить проблемы терминалов без поддержки двунаправленного текста. Требует наличия исполняемых файлов bidiv или fribidi в PATH.
--sleep-interval SECONDS Количество секунд для ожидания перед каждой загрузкой при использовании отдельно или нижняя граница диапазона случайного ожидания перед каждой загрузкой (минимальное возможное количество секунд ожидания) при использовании вместе с параметром `--max-sleep-interval`.
--max-sleep-interval SECONDS Верхняя граница диапазона случайного ожидания перед каждой загрузкой (максимальное возможное количество секунд ожидания).
Должен использоваться только вместе с параметром `--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 Войти с этим аккаунтом ID.
-p, --password PASSWORD Пароль аккаунта. Если этот параметр не указан,
youtube-dl запросит пароль интерактивно.
-2, --twofactor TWOFACTOR Код двухфакторной аутентификации.
-n, --netrc Использовать данные аутентификации из файла .netrc.
--video-password PASSWORD Пароль видеоролика (vimeo, youku).
--ap-mso MSO Идентификатор многоканального оператора Adobe Pass (провайдер ТВ),
используйте `--ap-list-mso` для получения списка доступных 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>.+)"`.
Вы можете настроить 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 всегда будет извлекать аудио, не копировать метку времени, использовать прокси и сохранять все видео в директории Movies
в вашем домашнем каталоге:
# Строки, начинающиеся с #, являются комментариями
# Всегда извлекать аудио
-x
# Не копировать метку времени
--no-mtime
# Использовать этот прокси
--proxy 127.0.0.1:3128
# Сохранять все видео в директории Movies в вашем домашнем каталоге
-o ~/Movies/%(title)s.%(ext)s
Обратите внимание, что опции в файле конфигурации такие же, как и опции (или ключи) командной строки, поэтому не должно быть пробелов после -
или --
, например, -o
или --proxy
, но не - o
или -- proxy
.
Вы можете использовать --ignore-config
, если хотите отключить файл конфигурации для конкретного запуска youtube-dl.
Вы также можете использовать --config-location
, если хотите использовать пользовательский файл конфигурации для конкретного запуска youtube-dl.
.netrc
Вы также можете настроить автоматическое хранение учетных данных для экстракторов, поддерживающих аутентификацию (предоставляя логин и пароль с помощью --username
и --password
), чтобы не передавать учетные данные в качестве аргументов командной строки при каждом запуске youtube-dl и предотвращать сохранение паролей в текстовом виде в истории команд оболочки. Вы можете достичь этого, используя файл .netrc
для каждого экстрактора. Для этого вам нужно создать файл .netrc
в вашем $HOME
и ограничить права доступа на чтение/запись только для вас:
touch $HOME/.netrc
chmod a-rwx,u+rw $HOME/.netrc
После этого вы можете добавить учетные данные для экстрактора в следующем формате, где экстрактор — это имя экстрактора в нижнем регистре:
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 или поместить его в файл конфигурации.
На Windows вам также может потребоваться настроить переменную окружения %HOME%
вручную. Например:
set HOME=%USERPROFILE%
Опция -o
позволяет пользователям указать шаблон для имен файлов вывода.
tl;dr: перейти к примерам.
Основное использование заключается в том, чтобы не указывать никаких аргументов шаблона при загрузке одного файла, как в youtube-dl -o funny_video.flv "https://some/video"
. Однако он может содержать специальные последовательности, которые будут заменены при загрузке каждого видео. Специальные последовательности могут быть форматированы согласно операциям форматирования строк Python. Например, %(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
(число): Время начала воспроизведения в секундах, указанное в URLend_time
(число): Время окончания воспроизведения в секундах, указанное в URLformat
(строка): Человекочитаемое описание форматаformat_id
(строка): Код формата, указанный с помощью --format
format_note
(строка): Дополнительная информация о форматеwidth
(число): Ширина видеоheight
(число): Высота видеоresolution
(строка): Текстовое описание ширины и высотыtbr
(число): Средняя скорость передачи данных аудио и видео в KBit/sabr
(число): Средняя скорость передачи данных аудио в KBit/sacodec
(строка): Имя используемого аудиокодекаasr
(число): Частота дискретизации аудио в Герцахvbr
(число): Средняя скорость передачи данных видео в KBit/sfps
(число): Частота кадров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
(строка): Никнейм или идентификатор загрузчика плейлистаДоступны для видео, принадлежащего какой-либо логической главе или разделу:
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 -
.
Текущий шаблон по умолчанию — это %\(title\)s-%\(id\)s.%\(ext\)s
.
В некоторых случаях вы не хотите использовать специальные символы такие как 中, пробелы или &, например при передаче имени загруженного файла на систему Windows или через канал, не поддерживающий 8-битные символы. В таких случаях добавьте флаг -restrict-filenames
, чтобы получить более короткое название.
Если вы используете шаблон вывода внутри файла пакетных команд Windows, то вам нужно экранировать обычные символы процента (%
) удвоением, так что -o "%(title)s-%(id)s.%(ext)s"
должно стать -o "%%(title)s-%%(id)s.%%(ext)s"
. Однако вы не должны изменять символы %
, которые не являются обычными символами, например переменные окружения для расширения должны оставаться нетронутыми: -o "C:\%HOMEPATH%\Desktop\%%(title)s.%%(ext)s"
.
Обратите внимание, что на Windows вам может потребоваться использовать двойные кавычки вместо одинарных.
$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc
youtube-dl test video ''_ä↭𝕐.mp4 # Различные странные символы
$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.mp4 # Простое имя файла
# Загружать видео из плейлиста YouTube в отдельную директорию, индексированную порядковым номером видео в плейлисте
$ youtube-dl -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)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
# Передавать загружаемое видео на стандартный вывод
$ youtube-dl -o - BaW_jenozKc
По умолчанию youtube-dl пытается загрузить лучшее доступное качество, то есть если вы хотите лучшее качество, вам не нужно передавать какие-либо специальные опции; youtube-dl угадает это для вас по умолчанию.
Однако иногда вы можете захотеть загрузить другой формат, например при медленном или непостоянном соединении. Основным механизмом достижения этого является так называемый выбор формата, с помощью которого вы можете явно указать желаемый формат, выбрать форматы на основе некоторых критериев или установить приоритет и многое другое.
Общий синтаксис выбора формата — это --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]"
.
Следующие числовые метаполя можно использовать для сравнений <
, <=
, >
, >=
, '=' (равно), '!=' (не равно):
Также фильтрация работает для сравнений '=' (равно), '^=' (начинается с), '$=' (заканчивается на), '*=' (содержит) и следующих строковых метаполей:
http
, 'https', 'rtsp', 'rtmp', 'rtmpe', 'mms', 'f4m', 'ism', 'http_dash_segments', 'm3u8', 'm3u8_native').Любое строковое сравнение может быть префиксировано отрицанием '!' для получения противоположного сравнения. Например '!*=' означает "не содержит".
Обратите внимание, что ни одно из вышеупомянутых метаполей не гарантируется наличием поскольку это полностью зависит от метаданных полученных конкретным экстрактором; то есть метаданных предоставляемых хостером видеозаписи.
Форматы для которых значение неизвестно исключаются если вы не поставите вопросительный знак ('?') после оператора. Вы можете комбинировать фильтры форматов. Например -f "[height <=? 720][tbr>500]"
выбирает видеозаписи до 720p разрешения (или видеозаписи где высота неизвестна) со скоростью передачи данных не менее 500 KBit/s.
Вы можете объединить видеозапись и аудиозапись двух форматов в один файл с помощью -f <video-format>+<audio-format>
(требуется установленный ffmpeg или avconv). Например -f bestvideo+bestaudio
загрузит лучший формат только с видеозаписью и лучший формат только с аудиозаписью и объединит их вместе с помощью ffmpeg/avconv.
Селекторы форматов также можно группировать с помощью скобок. Например если вы хотите загрузить лучшие mp4 и webm форматы с высотой менее 480p вы можете использовать -f '(mp4,webm)[height<480]'
.
С апреля 2015 года и версии 2015.04.26 youtube-dl использует -f bestvideo+bestaudio/best
как шаблон выбора формата по умолчанию (#5447, #5456). Если установлен ffmpeg или avconv это приводит к отдельной загрузке bestvideo и bestaudio и их объединению вместе в один файл для достижения лучшего общего качества доступного. В противном случае используется best и загружается лучшее доступное качество как единый файл. Best также требуется для видеозаписей не из YouTube так как они не предоставляют аудио и видеозапись в двух разных файлах. Если вы хотите загружать только некоторые DASH-форматы (например если вас не интересуют видеозаписи с разрешением выше 1080p), вы можете добавить -f bestvideo[height<=?1080]+bestaudio/best
в ваш файл конфигурации. Обратите внимание что если вы используете youtube-dl для потоковой передачи на stdout и вероятно перенаправляете его в ваш медиаплеер, то есть явно указываете шаблон вывода как '-o-', youtube-dl все равно использует '-f best' выбор формата чтобы немедленно начать передачу контента вашему плееру и не ждать пока bestvideo и bestaudio будут загружены и объединены.
Если вы хотите сохранить старое поведение выбора формата (до версии youtube-dl 2015.04.26), то есть хотите загружать лучшее доступное качество медиазаписи как единый файл вам следует явно указать ваш выбор с помощью '-f best'. Вы можете добавить его в файл конфигурации чтобы не указывать его каждый раз при запуске youtube-dl.
Обратите внимание что на Windows вам может потребоваться использовать двойные кавычки вместо одинарных.
# Загрузить лучший доступный mp4 формат или любой другой лучший если нет mp4 доступно.
$ youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
# Загрузить лучший доступный формат но не лучше чем 480p.
$ youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]'
# Загрузить лучший формат только с видеозаписью но размером не более 50 МБ.
$ youtube-dl -f 'best[filesize<50M]'
# Загрузить лучший доступный формат через прямую ссылку по протоколу HTTP/HTTPS.
$ 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'. Они принимают даты в двух форматах:
(now|today)[+-][0-9](day|week|month|year)(s)?
Примеры:
# Загружать только видеозаписи загруженные за последние 6 месяцев.
$ youtube-dl --dateafter now-6months
# Загружать только видеозаписи загруженные 1 января 1970 года.
$ youtube-dl --date 19700101
# Загружать только видеозаписи загруженные в десятилетие 200x.
$ youtube-dl --dateafter 20000101 --datebefore 20091231
Если вы следовали нашим инструкциям по ручной установке, вы можете просто выполнить команду 'youtube-dl -U' (или на Linux 'sudo youtube-dl -U').
Если вы использовали 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.
YouTube изменил свой формат плейлистов в марте 2014 года и позже поэтому вам потребуется хотя бы версия youtube-dl 2014.07.25 чтобы скачивать все видеозаписи YouTube.
Если вы установили youtube-dl с помощью менеджера пакетов pip setup.py или tarball обновитесь этим же способом. Обратите внимание что пакеты Ubuntu больше не обновляются. Поскольку мы не связаны с Ubuntu мы мало что можем сделать. Свободно сообщайте об ошибках разработчикам пакетов Ubuntu — все что им нужно сделать это обновить пакет до более свежей версии. См выше способ обновления.
Убедитесь что вы не используете '-o' вместе с любыми из этих опций '-t', '--title', '--id', '-A' или '--auto-number' указанными в командной строке или файле конфигурации. Удалите последние если они указаны.
По умолчанию youtube-dl стремится использовать лучшие опции; если у вас есть убедительные причины считать что эти опции должны быть другими пожалуйста создайте заявку где объясните это. Поэтому обычно нет необходимости и иногда даже вредно копировать длинные строки опций со страниц сайтов. В частности из опций '-citw' регулярно полезна только '-i'.
Большинство людей задающих этот вопрос не знают что теперь по умолчанию 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 или [mp### Выполняется ошибка из-за отсутствия MSVCR100.dll
Чтобы запустить exe, сначала необходимо установить Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package (x86).
Если вы поместите youtube-dl и ffmpeg в ту же директорию, откуда запускаете команду, это сработает, но это довольно неудобно.
Чтобы использовать другую директорию — либо для ffmpeg, либо для youtube-dl, либо для обоих — просто создайте директорию (например, C:\bin
, или C:\Users\<Имя пользователя>\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=
перед идентификатором, либо разделите идентификатор от опций с помощью --
:
youtube-dl -- -wNyEUrxzFU
youtube-dl "https://www.youtube.com/watch?v=-wNyEUrxzFU"
Используйте опцию --cookies
, например --cookies /path/to/cookies/file.txt
.
Чтобы экспортировать cookies из браузера, используйте любое совместимое расширение для экспорта cookies. Например, Get cookies.txt LOCALLY (для Chrome) или cookies.txt (для Firefox).
Обратите внимание, что файл cookies должен быть в формате Mozilla/Netscape, и первая строка файла должна быть либо # HTTP Cookie File
, либо # Netscape HTTP Cookie File
. Убедитесь, что у вас правильный формат новой строки в файле cookies и преобразуйте новую строку при необходимости, чтобы она соответствовала вашей ОС, а именно CRLF
(\r\n
) для Windows и LF
(\n
) для Unix и Unix-подобных систем (Linux, macOS и т.д.). Ошибка HTTP Error 400: Bad Request
при использовании --cookies
может указывать на неверный формат новой строки.
Передача cookies в 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 /path/to/download/archive/file.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) не может указывать один конкретный загрузчик.
Если вы добавите либо --hls-prefer-native
, либо --hls-prefer-ffmpeg
в свой конфиг, подмножество видео будет некорректно загружаться. Вместо этого гораздо лучше создать заявку или pull request, который подробно объяснит, почему встроенный или ffmpeg HLS-загрузчик является лучшим выбором для вашего случая использования.
В соответствии с политикой (а также законностью), youtube-dl не включает поддержку сервисов, специализирующихся на нарушении авторских прав. Как правило, если вы не можете легко найти видео, которое сервис явно имеет право распространять (то есть загруженное создателем, дистрибьютором создателя или опубликованное под свободной лицензией), сервис вероятно не подходит для включения в youtube-dl.
Примечание о том, что сервис не хранит нарушаемый контент, а просто ссылается на тех, кто это делает, является доказательством того, что сервис не должен быть включен в youtube-dl. То же самое относится к любому уведомлению DMCA, когда вся главная страница сервиса заполнена видео, которые он не имеет права распространять. Уведомление о "честном использовании" также не убедительно, если сервис показывает защищенные авторским правом видео целиком без разрешения.
Запросы на поддержку сервисов, которые покупают права на распространение своего контента, абсолютно нормальны. Если есть сомнения, вы можете просто предоставить источник, упоминающий легальную покупку контента.
(Также известно как: Помогите, моя важная заявка не решается!) Команда основных разработчиков youtube-dl довольно мала. Хотя мы делаем все возможное, чтобы решить как можно больше заявок, иногда это может занять довольно много времени. Чтобы ускорить вашу заявку, вот что вы можете сделать:
Во-первых, пожалуйста, сообщите о проблеме в нашем трекере заявок. Это позволяет нам координировать все усилия пользователей и разработчиков и служит единым точкой. К сожалению, проект youtube-dl вырос до таких размеров, что использование личной электронной почты как эффективного канала связи больше не возможно.
Пожалуйста, прочитайте инструкции по сообщению о багах ниже. Многие баги не содержат всей необходимой информации. Если вы можете, предложите прокси, VPN или доступ к оболочке разработчикам youtube-dl. Если вы можете, протестируйте проблему на нескольких компьютерах в разных странах для исключения местной цензуры или проблем с конфигурацией.Если никто не заинтересован в решении вашей проблемы, вы можете взять дело в свои руки и отправить pull request (или уговорить/оплатить кого-то другого сделать это).
Свободно поднимайте проблему время от времени, оставляя небольшой комментарий ("Проблема все еще актуальна в версии youtube-dl ... из Франции, но исправлена из Бельгии"), но не чаще одного раза в месяц. Пожалуйста, не объявляйте свою проблему как важную
или срочную
.
Во-первых, ознакомьтесь со списком поддерживаемых сайтов. Обратите внимание, что иногда сайт может изменить свою схему URL (например, с https://example.com/video/1234567 на https://example.com/v/1234567), и youtube-dl может сообщать о URL службы из этого списка как неподдерживаемом. В этом случае просто сообщите о баге.
Невозможно определить заранее, поддерживается ли URL или нет. Это связано с тем, что youtube-dl содержит общий экстрактор, который соответствует всем URL. Вы можете быть искушены отключить, исключить или удалить общий экстрактор, но общий экстрактор не только позволяет пользователям извлекать видео с множества сайтов, которые внедряют видео из другой службы, но также может использоваться для извлечения видео с службы, которая сама их хостит. Поэтому мы ни рекомендуем, ни поддерживаем отключение, исключение или удаление общего экстрактора.
Если вы хотите узнать, поддерживается ли данный URL, просто вызовите youtube-dl с ним. Если вы не получаете никаких видео обратно, вероятно, URL либо не ссылается на видео, либо неподдерживаем. Вы можете узнать это по выходным данным (если вы запускаете youtube-dl в консоли) или перехватывая исключение UnsupportedError
, если вы запускаете его из программы на Python.
Прежде чем у нас был шаблон заявки, несмотря на наши обширные инструкции по сообщению о багах, около 80% всех заявок были бесполезны. Например, люди использовали древние версии программы с сотнями выпусков назад, из-за простых синтаксических ошибок (не в youtube-dl, а в общем использовании оболочки), потому что проблема уже была сообщена несколько раз ранее, потому что люди не читали сообщения об ошибках даже тогда, когда они говорили "пожалуйста установите ffmpeg", потому что люди не указывали URL-адреса видеороликов и многие другие простые проблемы, которые легко избежать и которые часто были совершенно не связаны с youtube-dl.
youtube-dl — это проект с открытым исходным кодом с слишком малым количеством добровольцев. Поэтому мы предпочитаем тратить время на исправление багов там, где мы уверены, что эти простые проблемы не применимы и где мы можем быть уверены в воспроизведении проблемы без многократных запросов к заявителю. Таким образом, выходные данные youtube-dl -v YOUR_URL_HERE
действительно являются всем необходимым для подачи заявки. Шаблон заявки также направляет вас через некоторые базовые шаги, которые вы можете выполнить самостоятельно, такие как проверка того, что ваша версия youtube-dl актуальна.
Большинству пользователей не нужно собирать youtube-dl; они могут скачать сборки или получить их из своей дистрибутивной системы.
Чтобы запустить youtube-dl как разработчик, вам не нужно ничего собирать. Просто выполните
python -m youtube_dl
Чтобы запустить тесты, просто вызовите ваш любимый тестовый запускатель или выполните тестовый файл напрямую; любой из следующих вариантов работает:
python -m unittest discover
python test/test_download.py
nosetests
Для версий Python 3.6 и выше вы можете использовать pynose для реализации nosetests
. Оригинальный nose не был обновлен для версий 3.10 и выше.
См. пункт 6 руководства по добавлению поддержки нового сайта для того, как запускать тестовые случаи конкретного экстрактора.
Если вы хотите создать собственную сборку youtube-dl, вам понадобятся следующие инструменты:
Если вы хотите добавить поддержку нового сайта, сначала убедитесь, что этот сайт не специализируется на нарушении авторских прав. youtube-dl не поддерживает такие сайты; следовательно pull requests с добавлением поддержки таких сайтов будут отклонены.
После того как вы убедитесь, что сайт распространяет свой контент легально, вы можете следовать этому быстрому списку (предполагая, что ваш сервис называется yourextractor
):
Склонируйте исходный код:
git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git
Создайте новую ветку git:
cd youtube-dl
git checkout -b yourextractor
Начните с этого простого шаблона и сохраните его в youtube_dl/extractor/yourextractor.py
:
# coding: 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': video_id,
'title': title,
'description': self._og_search_description(webpage),
'uploader': self._search_regex(r'<div[^>]+id="uploader"[^>]*>([^<]+)<', webpage, 'uploader', fatal=False),
# TODO дополнительные свойства (см. youtube_dl/extractor/common.py)
}
Добавьте импорт в youtube_dl/extractor/extractors.py
.
Запустите python test/test_download.py TestDownload.test_YourExtractor
. Это должно провалиться сначала, но вы можете постоянно перезапускать его до завершения. Если вы решите добавить более одного теста (фактически тестового случая), переименуйте _TEST
в _TESTS
и сделайте его списком словарей. Тесты будут называться TestDownload.test_YourExtractor
, TestDownload.test_YourExtractor_1
, TestDownload.test_YourExtractor_2
и т.д. Примечание:
IE
only_matching
в словаре теста не учитываются.Ознакомьтесь с youtube_dl/extractor/common.py
для возможных методов помощи и детального описания того, что должен и может возвращать ваш экстрактор. Добавьте тесты и код для тех свойств, которые хотите.
Убедитесь, что ваш код соответствует правилам кодирования youtube-dl и проверьте код с помощью flake8:
$ flake8 youtube_dl/extractor/yourextractor.py
Убедитесь, что ваш код работает под всеми версиями Python, поддерживаемыми youtube-dl: 2.6, 2.7 и 3.2+.
Когда тесты пройдут успешно, добавьте новые файлы и закоммитируйте их и отправьте результаты:
$ git add youtube_dl/extractor/extractors.py
$ git add youtube_dl/extractor/yourextractor.py
$ git commit -m '[yourextractor] Add new extractor'
$ git push origin yourextractor
Наконец создайте pull request. Мы рассмотрим его и объединим.
В любом случае большое спасибо за ваши вклады!
Этот раздел представляет собой руководство по написанию кода экстракторов на языке программирования Python.
Экстракторы по своей природе очень хрупкие объекты поскольку зависят от структуры данных источника предоставленного сторонними хостерами медиаконтента вне вашего контроля и эта структура склонна к изменениям. Ваша задача как разработчика экстрактора заключается не только в написании кода который корректно извлекает ссылки на медиаконтент и метаданные но также минимизировать зависимость от структуры источника и даже предвидеть потенциальные будущие изменения быть готовым к ним. Это важно потому что это позволит экстрактору не ломаться при незначительных изменениях структуры источника таким образом сохраняя работоспособность старых версий youtube-dl. Даже если эта проблема легко решается выпуском новой версии youtube-dl со встроенным исправлением все предыдущие версии становятся сломанными во всех репозиториях и пакетах дистрибутивов которые могут не так быстро получить обновление от нас. Ненужно говорить что некоторые дистрибутивы с непрерывными выпусками могут никогда не получить обновление вообще.
Для работы youtube-dl зависит от метаданных которые ваш экстрактор извлекает и предоставляет youtube-dl выраженных через словарь информации или просто info dict. Только следующие метаполя в info dict считаются обязательными для успешного процесса извлечения:
id
(идентификатор медиаконтента)title
(название медиаконтента)url
(URL для скачивания медиаконтента) или formats
Фактически только последний вариант технически обязателен (то есть если вы не можете определить местоположение скачивания медиаконтента процесс извлечения не имеет никакого смысла). Однако по соглашению youtube-dl также рассматривает id
и title
как обязательные метаполя. Таким образом указанные выше метаполя являются критическими данными без которых процесс извлечения теряет смысл и если одно из них не удается извлечь экстрактор считается полностью сломанным.
Любое поле кроме указанных выше считается опциональным. Это означает что процесс извлечения должен быть терпимым к ситуациям когда источники этих полей могут потенциально быть недоступны (даже если они всегда доступны сейчас) и будущедоказательным чтобы не ломать процесс извлечения обязательных метаполей общего назначения.
Предположим у вас есть некоторый исходный словарь meta
, который вы получили как JSON с HTTP-запроса:
meta = self._download_json(url, video_id)
Предположим на этом этапе структура meta
такова:
{
...
"summary": "some fancy summary text",
...
}
Предположим вы хотите извлечь summary
и поместить его в результирующий info dict как description
. Поскольку description
является опциональным метаполем вы должны быть готовы к тому что этот ключ может отсутствовать в словаре meta
, поэтому его следует извлекать так:
description = meta.get('summary') # правильно
А не так:
description = meta['summary'] # неправильно
Последний вариант приведет к прерыванию процесса извлечения с ошибкой KeyError
, если ключ summary
исчезнет из словаря meta
позже времени но при первом подходе извлечение продолжится с description
, установленным равным None
, что вполне допустимо (помните что None
эквивалентно отсутствию данных).
Аналогично при извлечении опциональных данных со страницы HTML методами _search_regex
, _html_search_regex
или аналогичными следует передавать параметр fatal=False
, например:
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
присутствует в нескольких местах попробуйте извлечь его хотя бы из некоторых из них. Это делает процесс более будущедоказательным на случай если некоторые источники станут недоступными.
Предположим у вас есть словарь meta
из предыдущего примера который содержит ключ title
и вы собираетесь его извлечь. Поскольку title
является обязательным метаполем вы должны закончить чем-то похожим:
title = meta['title']
Если ключ title
исчезнет из словаря meta
в будущем по причине изменений на стороне хостера процесс извлечения будет сломан поскольку title
является обязательным метаполем. Это ожидаемо.
Предположим у вас есть еще один источник откуда можно извлечь title
, например HTML-метатег og:title
страницы webpage
. В этом случае можно предоставить альтернативный вариант:
title = meta.get('title') or self._og_search_title(webpage)
Этот код попробует извлечь значение из словаря 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
](https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl # сортировка, вызов исключения, если форматы отсутствуют
self._sort_formats(fmts)
info_dict['formats'] = fmts
...
Извлекатель вызывает исключение вместо случайных сбоев, если структура JSON изменяется так, что форматы не найдены.
# ИНТЕГРАЦИЯ YOUTUBE-DL
youtube-dl стремится быть хорошей командной строкой, и поэтому его можно вызывать из любой языковой среды программирования. Если у вас возникают проблемы с парсингом его вывода, не стесняйтесь [создать отчет](https://github.com/ytdl-org/youtube-dl/issues/new).
Из программы на Python вы можете интегрировать youtube-dl более мощным образом, как показано ниже:
```python
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 (веб-чат).
Убедитесь, что вы следуете инструкциям, предоставленным ниже и в трекере задач. Полностью заполните соответствующий шаблон задачи. Подумайте, не покрывает ли вашу проблему уже существующая задача: если да, следуйте обсуждению там. Избегайте комментариев к существующим дубликатам задач, так как такие комментарии не добавляют к обсуждению задачи и могут быть расценены как спам.
Пожалуйста, включите полный вывод youtube-dl при запуске с флагом -v
, то есть добавьте флаг -v
к вашей командной строке, скопируйте весь вывод и разместите его в теле задачи, обернув в ``` для лучшего форматирования. Он должен выглядеть примерно так:
$ youtube-dl -v <ваша командная строка>
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj']
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
[debug] youtube-dl version 2015.12.06
[debug] Git HEAD: 135392e
[debug] Python version 2.6.6 - Windows-2003Server-5.2.3790-SP2
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
[debug] Proxy map: {}
...
Не публикуйте скриншоты подробных логов; допустим только простой текст.
Вывод (включая первые строки) содержит важную отладочную информацию. Задачи без полного вывода часто не воспроизводятся и поэтому не решаются в кратчайшие сроки, если вообще когда-либо.
Наконец, пожалуйста, проверьте свою задачу, чтобы избежать различных распространенных ошибок (вы можете и должны использовать это как чек-лист), перечисленных ниже.
Мы часто получаем отчеты об ошибках, которые трудно понять. Чтобы избежать последующих уточнений и помочь участникам, не являющимся носителями английского языка, пожалуйста, подробно объясните, какую функцию вы запрашиваете или какую ошибку хотите исправить.
Убедитесь, что очевидно:
Если ваш отчет короче двух строк, он почти наверняка не содержит некоторых из этих пунктов, что затрудняет нашу реакцию на него. Мы часто слишком вежливы, чтобы сразу закрыть задачу, но недостающая информация может привести к неправильной интерпретации. Как коммиттер сам, я часто раздражен этими задачами, поскольку единственным возможным способом для меня двигаться дальше — это снова и снова просить уточнений.
Для отчетов об ошибках это означает, что ваш отчет должен содержать полный вывод 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.
Убедитесь, что никто еще не открыл задачу, которую вы пытаетесь открыть. Поискайте в верхней части окна или просмотрите GitHub Issues этого репозитория. Изначально используйте поисковый запрос -label:duplicate
, чтобы сосредоточиться на активных задачах. Если такая задача существует, смело пишите что-то вроде "Это также влияет на меня с версией 2015.01.01. Вот дополнительная информация по задаче: ...". Хотя некоторые задачи могут быть старыми, новый пост в них часто стимулирует быструю активность.
Перед тем как сообщить о любой задаче, выполните команду youtube-dl -U
. Это должно сообщить, что вы обновлены до последней версии. Около 20% отчетов, которые мы получаем, уже исправлены, но люди используют устаревшие версии. Это относится и к запросам на новые функции.
Перед тем как запросить новую функцию, быстро взгляните на список поддерживаемых опций. Многие запросы на новые функции касаются функций, которые уже существуют! Пожалуйста, обязательно покажите свою работу в отчете о задаче и подробно объясните, как существующие похожие опции не решают вашу проблему.
Люди хотят решать проблемы и часто думают, что делают нам одолжение, разбивая свои большие проблемы (например, желание пропускать уже загруженные файлы) на конкретные запросы (например, прося нас проверять наличие файла перед загрузкой страницы информации). Однако часто происходит так, что они разбивают проблему на два шага: один простой и один невозможный (или крайне сложный).
Тогда нам представляют очень сложный запрос, когда исходная проблема могла быть решена гораздо проще, например, записывая загруженные ID видео в отдельный файл. Чтобы избежать этого, вы должны включать больший контекст там, где он не очевиден. В частности, каждый запрос на новую функцию, который не состоит в добавлении поддержки нового сайта, должен содержать сценарий использования, который объясняет в какой ситуации недостающая функция была бы полезна.
Некоторые из наших пользователей считают, что есть ограничение на количество задач, которые они могут или должны открывать. Нет никакого ограничения на количество задач, которые они могут или должны открывать. Хотя может показаться привлекательным поместить все свои задачи в один тикет, это означает, что тот, кто решает одну из ваших задач, не может отметить задачу как закрытую. Обычно сообщение о нескольких проблемах приводит к тому, что тикет остается нерешенным, так как никто не хочет атаковать этот монстр, пока кто-то милосердно не разделит задачу на несколько.
В частности, каждая задача по поддержке сайта должна касаться только услуг одного сайта (обычно под общим доменом, но всегда использующих одну и ту же технологию бэкенда). Не запрашивайте поддержку видео пользователей Vimeo, подкастов Белого дома и страниц Google Plus в одной задаче. Также убедитесь, что вы не публикуете отчеты об ошибках вместе с запросами на новые функции. Как правило, запрос на новую функцию не должен включать выводы youtube-dl, которые не непосредственно связаны с запрашиваемой функцией. Не публикуйте отчеты о сетевых ошибках вместе с запросом на новую видеосервис.
Публикуйте только те функции, которые требуются вам (или вашему недееспособному другу, с которым вы можете лично говорить). Не публикуйте функции просто потому, что они кажутся хорошей идеей. Если они действительно полезны, их запросит кто-то, кому они нужны.
Может показаться странным, но некоторые отчеты об ошибках, которые мы получаем, совершенно не связаны с youtube-dl и относятся к другому приложению или даже приложению самого репортера. Пожалуйста, убедитесь, что вы действительно используете youtube-dl. Если вы используете графический интерфейс для youtube-dl, сообщайте об ошибках разработчику фактического приложения, предоставляющего графический интерфейс. С другой стороны, если ваш графический интерфейс для youtube-dl работает некорректно по причине связанной с youtube-dl проблемы, смело сообщайте об ошибке.
youtube-dl выпущен в общественное достояние авторами-правообладателями.
Этот файл README был написан Daniel Bolton и также выпущен в общественное достояние.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )