Как автоматически переименовать загруженный файл из pytube? - PullRequest
1 голос
/ 26 марта 2019

Я новичок в Python и работал только с PHP 5 в прошлом (много лет назад). Как начинающий проект, я подумал, что я сделаю загрузчик YouTube, используя pytube, который позволит вам выбрать, загружать ли видео в высоком качестве или только скачивать аудио с него в формате .mp3.

Ну, я застрял на последней части: изменение расширения на .mp3.

Мне бы хотелось простое и элегантное решение, которое я могу понять, но любая помощь будет оценена.

Я пытался использовать os.rename (), но не уверен, как заставить его работать.

from pytube import YouTube
import os

yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))

print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")

media_type = input()

if media_type == "1":
    video = yt.streams.first()

elif media_type == "2":
    video = yt.streams.filter(only_audio = True).first()

else:
    print("Invalid selection.")

print("Enter the destination (leave blank for current directory)")
destination = str(input(">> "))

video.download(output_path = destination)

if media_type == "2":
    os.rename(yt.title + ".mp4", yt.title + ".mp3")

print(yt.title + "\nHas been successfully downloaded.")

РЕДАКТИРОВАТЬ:

Вчера, когда я попробовал, он висел на последней части, но я просто попытался снова, и через некоторое время я получил это сообщение об ошибке:

Traceback (most recent call last):
  File "Tubey.py", line 42, in <module>
    os.rename(yt.title + ".mp4", yt.title + ".mp3")
FileNotFoundError: [WinError 2] The system cannot find the file specified: "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp4" -> "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp3"

Файл загружен, но не переименован.

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: (вероятно)

Я наконец заработал, в основном благодаря J_H. Спасибо, что миришься с моей некомпетентностью, ты святой. Вот полный код, который наконец добился цели (на тот случай, если у кого-нибудь еще, кто столкнется с этим в будущем, возникнет аналогичная проблема):

from pytube import YouTube
import os

yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))

print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")

media_type = input(">> ")

if media_type == "1":
    video = yt.streams.first()

elif media_type == "2":
    video = yt.streams.filter(only_audio = True).first()

else:
    print("Invalid selection.")

print("Enter the destination (leave blank for current directory)")
destination = str(input(">> ")) or '.'

out_file = video.download(output_path = destination)

if media_type == "2":
    base, ext = os.path.splitext(out_file)
    new_file = base + '.mp3'
    os.rename(out_file, new_file)

print(yt.title + " has been successfully downloaded.")

Я намереваюсь превратить это в долгосрочный проект и расширять сценарий, добавляя больше функций, чем больше я учусь, но пока я удовлетворен. Еще раз спасибо.

1 Ответ

0 голосов
/ 26 марта 2019

Похоже, ваш код работает правильно только тогда, когда ввод пользователя заканчивается косой чертой.

Используйте os.path.join(), чтобы объединить каталог назначения с именем файла. Используйте это выражение по умолчанию пусто в ., текущий каталог:

destination = str(input(">> ")) or '.'

EDIT:

Я надеялся, что ваше предположение, что мы можем предсказать спецификацию выходного файла из заголовка, было правильным. Но нет. Например, yt = YouTube('https://www.youtube.com/watch?v=9bZkp7q19f0') получает музыкальное видео PSY с заголовком, оканчивающимся на 'M/V'. Тем не менее, .download() (вполне разумно) создаст имя файла, содержащее только 'MV', без косой черты.

Вы не должны пытаться предсказать спецификацию выходного файла. Скорее, вы должны хранить возвращаемое значение из .download(), так что вы будете знать наверняка , какова правильная спецификация файла. Вот пример переименования вывода в постоянное имя файла:

>>> out_file = yt.streams.first().download()
>>> os.rename(out_file, 'new.mp3')
>>>

Или, если хотите, вы можете переименовать его в os.path.join('/tmp', 'new.mp3').

Вы также можете проанализировать расширение, используя splitext:

base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)

Вы можете обнаружить, что флаг only_audio - это удобный способ уменьшить полосу пропускания, потребляемую видео, если вы предпочитаете просто получить аудио треки:

yt.streams.filter(only_audio=True).all()
...