Загрузчик YouTube-роликов на Python
@wa1pperЗачастую новички быстро теряют интерес к программированию, потому что не могут сразу применить свои знания на практике и сделать что-то интересное и полезное. Вывод цифр и результатов работы сортировочных алгоритмов в консоль быстро надоедает и утомляет, а знаний на большие проекты в начале пути не хватает. Поэтому в этой статье мы напишем маленькую программу, которая поможет нам автоматизировать процесс скачивания видео YouTube и разберем принципы работы с библиотекой pytube.

В самом начале
Для начала нам надо убедиться, что на компьютере установлена актуальная версия Python и библиотеки pytube. Для этого достаточно последовательно ввести в консоль команды со скриншота ниже. Если в ответ увидели номер версии, то все необходимое уже установлено.

Для установки на Linux поочередно введите в консоль следующие команды:
sudo pip install python3
sudo pip install pytube3
Еще нам понадобится любая удобная IDE, редактор кода или даже онлайн-инструмент наподобие Repl.it, при работе в нем даже не надо будет что-то устанавливать, при первом запуске сервис сам скачает все необходимые пакеты. Я же пишу код в Pycharm Professional.
Приступаем к написанию кода
Для того чтоб лучше понять, что мы хотим от работы нашей программы, изобразим общий алгоритм на блок-схеме. Это максимально простая схема, которая поможет нам понимать, что и в каком порядке мы должны выполнять.

Мы хотим выводить информацию в консоль на русском языке, поэтому в самом начале нашего файла пропишем вот эти три строчки и заодно объявим использование библиотеки pytube:

Затем обратимся к схеме и заметим, что сперва надо спросить пользователя ссылку на скачиваемое видео. Поэтому в следующих двух строках попросим пользователя ввести ссылку, поместим её в переменную link и передадим классу YouTube:

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

Если Вы часто смотрите ролики на YouTube, то наверняка знаете, что каждое видео доступно в нескольких форматах и с разным разрешением. Pytube позволяет нам работать с этими потоками и если мы далее напишим слеующую строку и запустим код, то увидим в консоли все доступные потоки:
#Вывод всех доступных потоков
print(yt.streams)
Мы можем фильтровать потоки, выбирать нужные и уже работать с ними, для этого доступны следующие конструкции:
#Вывод всех аудио-потоков
print(yt.streams.filter(only_audio=True))
#Вывод всех видео-потоков
print(yt.streams.filter(only_video=True))
#Вывод всех progressive-потоков
print(yt.streams.filter(progressive=True))
#progressive-потоки — содержат и аудио и видео потоки, но качеств ограничено в 720p
#dash-потоки — содержат только видео-потоки в высоком качестве
Но мы хотим упростить задачу себе и будем сразу скачивать видео в наилучшем доступном качестве, для этого пишем следующее:

Еще раз обратим внимание на схему и заметим, что первые два пункта мы уже выполнили, теперь остается только скачать видео, для этого достаточно написать всего одну строчку:
ys.download()
У такой конструкции есть несколько минусов. Во-первых, пользователь не видит прогресса и не знает началось ли скачивание и когда оно закончится, во-вторых, видео сохранится в папку с проектом, а не в привычную для пользователя “Загрузки”, поэтому чуть-чуть исправим нашу строку, указав полный путь до необходимой папки, и получим следующее:

Теперь у нас есть информирование о начале и завершении загрузки и все сохраняется по привычному пути.
Весь код можно посмотреть на GitHub, а выглядит он так:

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