загрузить mp3 с YouTube

Как загрузить mp3 с YouTube бесплатно?

Сегодня ночью услужливый Youtube следуя какой-то своей логике включил в режиме автовоспроизведения трек «‘Back To The 80’s’ | Best of Synthwave And Retro Electro Music Mix for 2 Hours | Vol. 9«, который как-то уж очень хорошо «зашел» — причем настолько, что я задумался, как загрузить mp3 с YouTube? Погуглил варианты, и наткнулся на вот это решение — однако, как оказалось позже — оно платное, а в бесплатной версии рассчитано на одну загрузку. Беда-печаль, подумал я, а потом вспомнил что вопрос загрузки видео с Youtube решал когда-то давно, а переконвертировать видео в аудио — не так и сложно 😉 Давайте разберемся как.

Собственно, в основе лежат две библиотеки: PyTube и Moviepy, каждая из которых решает свою задачу: скачивание с Youtube, и — конвертацию mp4 в mp3. Осталось привести это в порядок 🙂

  1. #Подключаем нужные библиотеки
  2. from pytube import YouTube
  3. from moviepy.editor import *
  4. import re
  5. import os
  6.  
  7. #Получаем ссылку на видео
  8. link = str(input('Введите ссылку на видео: '))
  9.  
  10. #Получаем ссылку - куда сохранять видео
  11. save_link = input('Куда сохранять видео?: ')
  12.  
  13. #Создаем регулярку, которая будет разбивать введенный адрес сохранения
  14. regxp = '[\w-]+[\w:]'
  15. result = re.findall(regxp, save_link) #Разбиваем адрес, куда сохраняем видео на составляющие без обратного слеша
  16.  
  17. #И конвертируем адрес сохранения под требования Python - с двумя слешами
  18. final_link = '\\\\'.join(result) #Добавляем двойной слеш после каждой папки (под формат Python)
  19. name = YouTube(link).title
  20. print('Сохраняем видео...', name)
  21. video_for = YouTube(link).streams.first()
  22. video_for.download(final_link)
  23. print('Видео сохранено... \n Конвертируем в .mp3')
  24. video = VideoFileClip(os.path.join(save_link, name + '.mp4'))
  25. video.audio.write_audiofile(os.path.join(final_link, final_link, name + '.mp3'))
  26.  
  27. print(name + '.mp3 готов :)')

Важно!
Если в процессе использования библиотеки у вас возникнет ошибка в стиле:

1934981897662a3d7069259_000001

не паникуйте, а просто исправьте файл extract.py. Строку 279 с текстом:

parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)

комментируем, а вместо нее пишем:

parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats) if "signatureCipher" in formats[i]

после чего ошибка исчезает 😉
Если вам лениво ковыряться в коде — можете скачать скорректированный файл по ссылке и вставить его по адресу: c:\Users\user_name\appdata\Local\Programs\Python\Python37-32\Lib\site-packages\pytube\

Спасибо за внимание. По вопросу, который звучит как «загрузить mp3 с YouTube» — все 🙂 Как всегда — вопросы можно задавать на почту или в Telegram 🙂

UPF: библиотека Pytube иногда глючит в определении имени получаемого с Youtube файла, а потом код иногда дает сбой. Переработал код — теперь мы сохраняем файл с Youtube под временным именем, после чего конвертируем в .mp3 и переименовываем — опять таки, в какое-то общее имя (в данном случае: «Youtube_music»). Кроме этого добавил проверку на существование файла с подобным именем — если имя есть, добавляем в конец случайное число. Получилось грубовато, но в результате нескольких сотен проверок не было ни одного сбоя, что по своему радует 🙂 И да — обновленный код — ниже:

  1. from pytube import YouTube
  2. from moviepy.editor import *
  3. import re
  4. import os.path
  5. import random
  6.  
  7. link = str(input('Введите ссылку на видео: '))
  8. save_link = input('Куда сохранять видео?: ')
  9.  
  10. regxp = '[\w-]+[\w:]'
  11. result = re.findall(regxp, save_link) #Разбиваем адрес, куда сохраняем видео на составляющие без обратного слеша
  12.  
  13. #И конвертируем адрес сохранения под требования Python - с двумя слешами
  14. final_link = '\\\\'.join(result) #Добавляем двойной слеш после каждой папки (под формат Python)
  15. #name = str(youtube_video)
  16. #filename = str(Youtube_video)
  17. name = YouTube(link).title
  18. print('Сохраняем видео...', name)
  19. video_for = YouTube(link).streams.first()
  20. video_for.download(final_link)
  21. video_for.download(output_path=final_link, filename='Youtube_video')
  22. print('Видео сохранено... \n Конвертируем в .mp3')
  23.  
  24. video = VideoFileClip(os.path.join(save_link, 'Youtube_video.mp4'))
  25.  
  26. if os.path.isfile('Youtube_music.mp3')== True:
  27.     random_number = int(random.randrange(1, 10000))
  28.     new_name = str('Youtube_music') + str(random_number) + str('.mp3')
  29.     video.audio.write_audiofile(os.path.join(final_link, final_link, new_name))
  30. else:
  31.     video.audio.write_audiofile(os.path.join(final_link, final_link, 'Youtube_music' + '.mp3'))
  32. print('Все готово :) ')