Как в Linux скачать youtube ролик? Скрипт на Python 3

скрипт Linux скачать youtube python 3

В 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 скрипт придется немного модифицировать.

Конечно скрипт кривой и я сам вижу, что многое можно улучшить и упростить, но решил выложить вот такой первоначальный вариант как пример того, что на питон можно даже в таком варианте решать не совсем стандартные задачи потратив на написание и изучение питона всего несколько часов времени.

Оцените статью
Добавить комментарий

Внимание! Нажимая кнопку "Отправить комментарий" вы соглашаетесь с политикой конфиденциальности сайта.

  1. rsp

    youtube-dl, есть на GitHub

    Ответить
    1. dkplayer автор

      Есть, но хотелось своего, гибкого, плюс мозги расшевелить немного 🙂

      Ответить
  2. Артём

    Добрый день можете помочь найти ошибку в коде я переписал ваш код но при запуски выходит ошибка

    res = str(yt.filter(‘mp4’)[-1])[23:27]
    AttributeError: ‘YouTube’ object has no attribute ‘filter’

    Ответить
    1. dkplayer автор

      Во первых: чтобы найти ошибку в коде, надо как минимум его весь увидеть 🙂 во вторых какая версия python? установлена ли библиотека нужная? Нет ли ошибок синтаксиса? Короче, я итак начинающий пользователь python, и вообще не телепат ни разу 😉

      Ответить
  3. Артём

    Добрый день версия 2.
    Я хотел суда код скинуть но в комментарий не позволяет слишком длинный комментарий и выводит ошибку

    Ответить
    1. dkplayer автор

      Можно выложить на pastebin например, ну а вообще в заголовке написано, что скрипт для python 3

      Ответить