Skip to content

Instantly share code, notes, and snippets.

@if0rest
Last active March 7, 2025 20:50
Show Gist options
  • Save if0rest/2a9bf4ea65248f06b9aa7b3015d76a59 to your computer and use it in GitHub Desktop.
Save if0rest/2a9bf4ea65248f06b9aa7b3015d76a59 to your computer and use it in GitHub Desktop.
Как настроить yt-dlp и горя не знать.

Очередная инструкция на случай амнезии.


YT-DLP - БАЗИРОВАННАЯ тулза для скачивания контента с медиахостингов, и многие проги ей завидуют хранят под капотом именно её ядро. Оседлав этого жеребца, смотришь на других наездников, как на бедолаг с раздолбанным очком. Приступим.

  1. yt-dlp работает в связке с ffmpeg, поэтому скачиваем свежие релизы первого и второго и распаковываем исполняемые файлы в одну папку.

изображение

  1. Поскольку yt-dlp работает через терминал, чтобы вызывать его из любого места добавим путь к программе в переменную среды Windows PATH.

Note

Напомню: при вызове исполняемого файла в командной строке без указания полного пути до него, Windows сначала шерстит каталоги, перечисленные в переменной среды PATH, и если ничего не находит, пишет:

изображение

Поэтому заходим в Пуск, начинаем печатать «перемен...», как нам уже предлагают пункт «Изменение системных переменных среды», его и выбираем. Далее (можно сразу к картинке):

1) кликаем «Переменные среды...»;
2) дабл-клик по «Path» в блоке «Переменные среды пользователя...»;
3) «Создать» и указываем путь к каталогу с yt-dlp.exe;

изображение

4) После перезагрузки или даже выхода из учётки изменения вступят в силу, и можно будет обращаться по имени:

> yt-dlp <URL>

  1. А теперь самое главное - КОНФИГ. Он нужен, чтобы не указывать нужные ключи всякий раз, когда хотим что-то скачать. У меня он лежит там же, где всё остальное, и называется yt-dlp.conf.
    Его содержимое:
--no-playlist
--no-mtime
--embed-thumbnail
--embed-metadata
--embed-chapters
--merge-output-format "mp4"
#--downloader "aria2c"
#--download-archive archive.txt PLAYLIST_URL
#-I 1:20

# AUDIO ONLY
#--------------------------
#-f "wa[abr<68]/ba[ext=m4a]"
#-o "E:\YouTube\[%(channel)s] %(title)+.200s [%(abr).2dkbs].%(ext)s"

# VIDEO ONLY
#--------------------------
-f "bestvideo*[height<=530][fps<=30]+bestaudio"
--output "E:\YouTube\[%(channel)s] %(title)+.200s (%(height)sp%(fps)d_%(vcodec).4s).%(ext)s"

# SUBS
#--------------------------
#--embed-subs
#--sub-langs "ru, en"
#--sub-format "srt/best"
#--write-subs

# THUMBNAIL ONLY
#--------------------------
#--write-thumbnail
#--convert-thumbnails "jpg"
#--skip-download

# CONNECTION
#--------------------------
#--cookies-from-browser firefox
--no-check-certificates

# INTERESTING
#--------------------------
#-g, --get-url                      / получить прямую ссылку на файл, чтобы скормить плееру
#--download-sections "*1:00-1:20"   / скачать фрагмент по таймкоду с 1:00 по 1:20 (внимание на *)
#-I, --playlist-items 1:20          / скачать диапазон с 1 по 20 видео в плейлисте
#--playlist-reverse                 / скачивать плейлист с конца
#--download-archive                 / ведет учёт скачанных файлов и избегает загрузку ранее скаченного
#--date today-2weeks                / скачать видосы 2-х недельной давности
#-s, --simulate                     / просмотреть, какие видео будут загружены, без их скачивания
#--no-mtime                         / дата изменения файла = дате скачивания
#--mtime (default)                  / дата изменения файла = дате публикации на YouTube
#--replace-in-metadata              / заменяет недопустимые символы в названиях на альтернативные
#--sleep-interval SECONDS           / минимальная задержка в сек перед стартом следующей загрузки
#--max-sleep-interval SECONDS       / максимальная задержка. Min и Max используются СОВМЕСТНО!!
#--sleep-requests 1.5 --min-sleep-interval 60 --max-sleep-interval 90
#--playlist-reverse
#--sponsorblock-mark all
#--sponsorblock-remove "sponsor, selfpromo"
#--extractor-args "youtube:player_client=default,ios" -S hdr:dv,res,vcodec:av1,acodec:opus,br

# OUTPUT TEMPLATE
#--------------------------
#--output "E:\YouTube\%(channel)s\%(playlist)s\[%(epoch>%Y-%m-%d)s] %(video_autonumber)d. %(playlist_index)s. %(title)+.200s-(%(height)sp%(fps).0d_%(vcodec).4s).%(ext)s"
# %(channel)s
# %(playlist)s
# %(epoch>%Y-%m-%d)s
# %(video_autonumber)d
# %(playlist_index)s
# %(title)+.200s
# %(height)sp
# %(fps).0d
# %(vcodec).4s
# %(ext)s

Note

Поскольку я по-прежнему стою на том, что пишу ДЛЯ СЕБЯ, будет шизофренией объяснять значение всех команд себе же. Если что-то забыл, чекай документацию.

ИТОГО. Как же это всё работает?

Где-то в системе лежит папка с содержимым:

изображение

Открываем командную строку и обращаемся к yt-dlp, добавляя URL нужного видоса/плейлиста/канала. Делаем это по имени, т.к. уже добавили путь в PATH.

yt-dlp https://www.youtube.com/watch?v=SSVybV2_cW8

Благодаря настроенному конфигу после инициализации запроса начнется скачивание видосов в нужном качестве с нужным обвесом в указанный каталог.

Вуаля!

Note

Решил вычистить конфиг от большинства комментов и перенести сюда в виде заметок.

Нужно запомнить всего три команды:

-U - обновляет yt-dlp до актуальной версии. Если видео не хочет скачиваться или скачивается медленно.
-F - анализирует переданный URL и показывает доступные варианты скачивания.
-f - скачивает выбранный формат.

https://dtf.ru/howto/2026499-kak-polzovatsya-yt-dlp


СОКРАТИТЬ ИМЯ yt-dlp до yt С ПОМОЩЬЮ SYMLINK:

  1. В командной строке из под админа находим папку c yt-dlp.
  2. Пишем:
mklink yt.exe yt-dlp.exe
  1. В каталоге создается символьная ссылка на yt-dlp.exe. Теперь можем вызывать:
yt <URL>

explorer_KChtYiWa6p


КОНВЕРТАЦИЯ КЛИПА В AUDIO-ONLY

Пытаюсь вспомнить, что же меня так зацепило в идиотской идее автора скачать видеоклип, а затем извлечь из него аудиодорожку с последующей её конвертацией. Вероятно, сама возможность так сделать. Наверняка этому есть обоснованное применение, которое я пока не догнал.

-x, --extract-audio     Convert video files to audio-only files
-c, --continue          Resume partially downloaded files/fragments (default)
-i, --ignore-errors     Ignore download & postprocessing errors. Download will be considered successful
-w, --no-overwrites     Do not overwrite any files
--audio-quality         Specify quality when converting audio with -x. Insert value between 0 (best) and 10
(worst) or specific bitrate like 128K (default 5)

The result:

yt-dlp <URL> -xciw -f "bestaudio/best" --audio-quality 0 --audio-format mp3 --embed-thumbnail --embed-metadata -o "%(title)s.%(ext)s"

If video doesn’t have artist in the title, use following output template instead:
-o "%(creator,uploader,channel)s - %(title)s.%(ext)s"

https://blog.elijahlopez.ca/posts/yt-dlp-audio-download/


--sleep-interval SECONDS         минимальная задержка в сек перед стартом следующей загрузки
--max-sleep-interval SECONDS     максимальная задержка. Min и Max используются СОВМЕСТНО!!

Задавая минимальный и максимальный интервалы, фактический выбирается случайным образом. Рассмотрите также возможность добавления --sleep-requests:
--sleep-requests 1.5 --min-sleep-interval 60 --max-sleep-interval 90

yt-dlp/yt-dlp#10128 (comment)


Or, are you asking to convert unicode characters to their "equivalent" ASCII counterparts when using --restrict-filenames? yt-dlp/yt-dlp#1330 (comment)

Unicode already has the concept of "equivalent" characters; and you can tell yt-dlp to replace them using NFKC normalization (We could consider using this as default when --restrict-filenames is given)

  1. Unicode normalization: The format type U can be used for NFC unicode normalization. The alternate form flag (#) changes the normalization to NFD and the conversion flag + can be used for NFKC/NFKD compatibility equivalence normalization. Eg: %(title)+.100U is NFKC

If you want more characters to be replaced, use --replace-in-metadata.
yt-dlp/yt-dlp#1330 (comment)


Use the 02d flags instead of the s conversion type (string).
The d signifies that it is an integer decimal type, the 0 that it should be padded with 0's, and the 2 that it should be 2 digits in length.

yt-dlp -o "S%(season_number)02d - E%(episode_number)02d - %(episode)s - %(id)s.%(ext)s" <URL>

https://askubuntu.com/a/1305098


There's no way to easily rename previously renamed files. If you grabbed the metadata with --write-info-json then you have the a file with most of the variables available at least.


--extractor-args "youtube:player_client=ios;player_skip=webpage"
yt-dlp/yt-dlp#10085 (comment)


FORMAT SELECTION

Формат Потоки
b* ?ВИДЕО ?АУДИО
b ВИДЕО+АУДИО
bv ВИДЕО
bv* ВИДЕО ?АУДИО
ba АУДИО
ba* АУДИО ?ВИДЕО

Полезно к ознакомлению:

--no-playlist --no-mtime --no-check-certificates --embed-metadata --embed-chapters --embed-thumbnail --merge-output-format mp4
-f 'ba[abr<66][ext=m4a]/ba[abr<66][acodec=opus]/ba[ext=m4a]' -o 'E:\YouTube\%(title)+.200s [%(abr).2dkbs].%(ext)s'
--alias "dest" "-o 'E:\YouTube\[%(uploader)s] %(title)+.200s (%(height)sp%(fps)d_%(vcodec).4s).%(ext)s'"
--alias "vk" "-f url720p --no-embed-metadata --no-embed-chapters --no-embed-thumbnail -o 'E:\YouTube\%(title)+.200s [%(format_id)s].%(ext)s'"
--alias "yt" "-f bv*[height<=720][fps<=30]+ba --dest"
--alias "shorts" "-f bv*[height<=1290][fps<=30]+ba --dest"
--alias "1080p30" "-f bv*[height<=1080][fps<=30]+ba[ext=m4a]"
--alias "480p" "-f bv*[height<=480]+ba[ext=m4a]"
--alias "subs" "--sub-langs ru,en --sub-format srt/best --embed-subs --write-subs"
--alias "thumbs" "--skip-download --write-thumbnail --convert-thumbnails jpg" # Download nothing, only thumbnails and convert it to JPG
--alias "cooks" "--cookies-from-browser firefox"
--alias "que" "-a 'C:\OffProgramFiles\yt-dlp\queue.txt'" # Скачать все видео из списка URL-ов
# PLAYLIST
#--------------------------
#--max-downloads N # для больших плейлистов; ограничить кол-во скачиваемого
#-I, --playlist-items 1:20 # скачать диапазон с 1 по 20 видео в плейлисте
#-a, --batch-file list.txt # скачать список видео из файла.txt (1 строчка - 1 url)
#--playlist-reverse # скачивать плейлист с конца
#--date today-2weeks # скачать видосы 2-х недельной давности
#--match-filter "duration > 600" <URL> # скачать видео продолжительности более 600 сек
#--download-archive "C:\archive.txt" # ведет учёт скаченного, игнорируя ранее скаченное
# INTERESTING
#--------------------------
#-g, --get-url # получить прямую ссылку на файл, чтобы скормить плееру
#-s, --simulate # просмотреть, какие видео будут загружены, без их скачивания
#--download-sections "*1:00-1:20" # скачать фрагмент по таймкоду с 1:00 по 1:20
#--no-mtime # дата изменения файла = дате скачивания
#--mtime (default) # дата изменения файла = дате публикации на YouTube
#--replace-in-metadata # заменяет недопустимые символы в названиях на альтернативные
#--downloader aria2c # для многопоточной загрузки (нужно предварительно скачать)
#--sponsorblock-mark all
#--sponsorblock-remove "sponsor, selfpromo"
#--extractor-args "youtube:player_client=default,ios" -S hdr:dv,res,vcodec:av1,acodec:opus,br
#-S +size,+br,+res,+fps equivalent to -f worst
#-S +size # скачать видео наименьшего размера
#-f bestvideo+best+bestaudio --video-multistreams --audio-multistreams # download and merge all 3 given format: 2 video and 2 audio streams in result.
#-f bestvideo+best+bestaudio --no-video-multistreams # download and merge only bestvideo and bestaudio, best is ignored since another format containing a video stream (bestvideo) has already been selected. The order of the formats is therefore important.
#-f best+bestaudio --no-audio-multistreams # will download only best.
#-f bestaudio+best --no-audio-multistreams # will ignore best and download only bestaudio.
# b*, best*: Select the best quality format that contains either a video or an audio or both (i.e.; vcodec!=none or acodec!=none)
# b, best: Select the best quality format that contains both video and audio. Equivalent to best*[vcodec!=none][acodec!=none]
#--print '[%(uploader)s] %(title)s |> %(webpage_url)s' URL >> "C:\OffProgramFiles\yt-dlp\downloaded.txt"
# CONNECTION
#--------------------------
#--cookies-from-browser firefox
#--print http_headers
#--no-check-certificates
#--sleep-interval SECONDS # минимальная задержка в сек перед стартом следующей загрузки
#--max-sleep-interval SECONDS # максимальная задержка. Min и Max используются СОВМЕСТНО!!
# Задавая минимальный и максимальный интервалы, фактический интервал выбирается случайным образом. Рассмотрите также возможность добавления --sleep-requests.
#--sleep-requests 1.5 --min-sleep-interval 60 --max-sleep-interval 90
# OUTPUT TEMPLATE
#--------------------------
#--output "E:\YouTube\%(channel)s\%(playlist)s\[%(epoch>%Y-%m-%d)s] %(video_autonumber)d. %(playlist_index)s. %(title)+.200s-(%(height)sp%(fps).0d_%(vcodec).4s).%(ext)s"
# %(channel)s
# %(playlist)s
# %(epoch>%Y-%m-%d)s
# %(video_autonumber)d
# %(playlist_index)s
# %(title)+.200s
# %(height)sp
# %(fps).0d
# %(vcodec).4s
# %(format_id)s # Format Code - column ID in formats table
# %(ext)s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment