В 2016 году я оставил работу системным администратором в крупной Тюменской компании и мы вместе с семьей переехали жить в деревню. Как вы сами понимаете здесь нет возможности работать по моей любимой профессии, кроме как заниматься фрилансом. Однако за что я люблю IT, так это за то, что в этой области всегда есть возможность учится и развиваться не смотря ни на что!
Так на старости лет я решил вспомнить, что по образованию полученному почти 20 лет назад я программист и начать снова изучать программирование. А точнее новый (для меня) язык Python. До этого весь мой опыт программирования сводился к написанию небольших web-проектов на php и javascript\jquery, а так же написание скриптов на bash и powershell, в основном для решения различных задач в моей повседневной работе системным администратором. Ах да, был еще Delphi на заре моей карьеры, и даже дипломный проект на нем, но это уже совсем древняя история.
Почему Python
Или даже почему я вновь сел за редактор кода. Во первых это интересно! Во вторых надо тренировать мозги. В третьих старший сын давно просит научить его программировать, а как я его буду учить если сам все забыл. Ну и не последняя причина — потому что появились задачи, которые захотелось решить написав программу самостоятельно.
Питон вообще хотел изучить давно, в том числе для применения в работе сисадмином, поскольку язык весьма мощный и востребованный. Но как то все не складывалось. Спектр применения питона весьма широк, можно писать не только скрипты, но и приложения разного уровня сложности, в том числе для веб или с графическим интерфейсом.
Ну и вообще изучение нового и непонятного — лучшая тренировка для мозга. А с питоном, для меня, все довольно не-интуитивно после php, поэтому мозги шевелятся, инфа гуглится!
Задача — скачать ролик с Youtube по расписанию
У меня никогда не получалось изучать программирование каким-то классическим, последовательным методом. Мне всегда нужна была реальная задача, в ходе решения которой я осваиваю новый язык или новые возможности. Так получилось и с питоном.
Как я уже писал в статье про интернет в деревне — тариф у меня хоть и самый дорогой, но довольно неудобный. На месяц Мегафон предлагает всего 30 Гб. трафика, а полный безлимит наступает только после часу ночи. Если с торентами и закачками файлов этот вопрос легко решается настройкой расписания в клиенте, то вот с ютубом вопрос встал. А нужной информации в Yotube все больше и терять этот канал очень не хочется. Сидеть до часу ночи тоже не всегда удобно, плюс иногда бывает необходимо пересмотреть ролики. Поэтому было принято пиратское решение — ролики выкачивать.
Искать готовое решение не хотелось, раз уж я решил поизучать Python, то решил попробовать на нем. Первым же запросом нашлась готовая библиотека pytube, которая позволяет выкачивать ролики в нужном формате. Довольно простая в использовании. На ее основе и был написан первый простецкий, кривущий скрипт. Опытные программисты наверняка закидают меня тапками за уродский код, но скрипт работает и минимально мою задачу решает. Вот собственно сам код скрипта с небольшими комментариями, а ниже я расскажу как он работает.
#!/usr/bin/env python3 from pytube import YouTube import shutil import os import sys #Записываем pid процесса в файл, чтобы можно было его закрыть скриптом stop.sh with open("/tmp/ytdown.pid","w") as pid: print(str(os.getpid()),file=pid) #Получаем путь где лежит скрипт и файл с ссылками откуда бы он не был запущен dirs=os.path.dirname(sys.argv[0])+"/" #Открываем файл ссылок f = open(dirs+"links.txt",'r') #Читаем строки из файла в переменную strokes = f.readlines() #Переводим указатель в файле в начало f.seek(0) for line in f: try: #Если строка не пустая и это ссылка на ролик в youtube то получаем mp4 в максимальном разрешении и качаем yt = YouTube(line) res = str(yt.filter('mp4')[-1])[23:27] print (res) print(yt.filename) video = yt.get('mp4', res) video.download('/home/dkplayer/Загрузки/youtube/') except ValueError: #Если строка не является ссылкой на ролик то выводим сообщение print("Неверная ссылка или пустая строка") #Удаляем текущую строку из списка strokes.remove(line) #Сохраняем список во временный файл (без текущей строки) with open(dirs+"links1.txt","w") as out: for i in strokes: print(i,file=out) #Копируем временный файл в текущий shutil.copy(dirs+'links1.txt', dirs+'links.txt') f.close
Итак в папке со скриптом лежит файлик links.txt в который я вставляю ссылки на нужные мне ролики, по одной ссылке на строку. Скрипт скачивает ролик в mp4 формате в максимальном доступном разрешении, после чего удаляет строку из файла. Это нужно, чтобы когда прервется работу скрипта и при следующем запуске скрипт на стал закачивать уже скачанные ссылки.
Дальше в крон делаем 2 задания в первом запускаем скрипт в час ночи, во втором запускаем простой bash скрипт, который берёт pid скрипта из файла /tmp/ytdown.pid и прибивает его командой kill. Да, забыл упомянуть, что работает это все конечно же под Linux, под Windows скрипт придется немного модифицировать.
Конечно скрипт кривой и я сам вижу, что многое можно улучшить и упростить, но решил выложить вот такой первоначальный вариант как пример того, что на питон можно даже в таком варианте решать не совсем стандартные задачи потратив на написание и изучение питона всего несколько часов времени.
youtube-dl, есть на GitHub
Есть, но хотелось своего, гибкого, плюс мозги расшевелить немного 🙂
Добрый день можете помочь найти ошибку в коде я переписал ваш код но при запуски выходит ошибка
res = str(yt.filter(‘mp4’)[-1])[23:27]
AttributeError: ‘YouTube’ object has no attribute ‘filter’
Во первых: чтобы найти ошибку в коде, надо как минимум его весь увидеть 🙂 во вторых какая версия python? установлена ли библиотека нужная? Нет ли ошибок синтаксиса? Короче, я итак начинающий пользователь python, и вообще не телепат ни разу 😉
Добрый день версия 2.
Я хотел суда код скинуть но в комментарий не позволяет слишком длинный комментарий и выводит ошибку
Можно выложить на pastebin например, ну а вообще в заголовке написано, что скрипт для python 3