Хорошо, это интересно.
Здесь начинается настоящая проблема.
download = video_stream[video_quality].download(filepath=save_location, callback=self.Handel_Progress, )
Здесь вы вызываете download
функцию video_stream
объекта, который принимает filepath
в качестве аргумента для местоположения файла, но не принимает имя файла, потому что, очевидно, файл будет сохранен с фактическим именем.
Root Причина вашей проблемы:
Если вы посмотрите на определение функции download
, вы обнаружите, что если файл существует с таким же именем, он вообще не будет загружать файл.
Теперь приходит часть, как вы убедитесь, что она загружается, несмотря ни на что:
Есть две вещи, которые вам нужно сделать:
Проверить если файл с таким именем существует или нет, а если и существует, то добавьте 1
в конце имени файла непосредственно перед расширением. Поэтому, если существует abc.mp4
, сохраните abc1.mp4
. [Я расскажу вам, как справиться со сценарием, когда abc.mp4
, abc1.mp4
и т. Д. Существует, но сейчас давайте вернемся к проблеме.]
Как пройти имя файла (abc1.mp4
) для метода загрузки?
Следующий фрагмент кода будет обрабатывать оба. Я добавил комментарии для вашего понимания.
import os
import re
import pafy
from pafy.util import xenc
# this function is used by pafy to generate file name while saving,
# so im using the same function to get the file name which I will use to check
# if file exists or not
# DO NOT CHANGE IT
def generate_filename(title, extension):
max_length = 251
""" Generate filename. """
ok = re.compile(r'[^/]')
if os.name == "nt":
ok = re.compile(r'[^\\/:*?"<>|]')
filename = "".join(x if ok.match(x) else "_" for x in title)
if max_length:
max_length = max_length + 1 + len(extension)
if len(filename) > max_length:
filename = filename[:max_length - 3] + '...'
filename += "." + extension
return xenc(filename)
def get_file_name_for_saving(save_location, full_name):
file_path_with_name = os.path.join(save_location, full_name)
# file exists, add 1 in the end, otherwise return filename as it is
if os.path.exists(file_path_with_name):
split = file_path_with_name.split(".")
file_path_with_name = ".".join(split[:-1]) + "1." + split[-1]
return file_path_with_name
def Download(self):
video_url = self.lineEdit.text()
save_location = self.lineEdit_2.text()
if video_url == '' or save_location == '':
QMessageBox.warning(self, "Data Error", "Provide a Valid Video URL or save Location")
else:
# video file
video = pafy.new(video_url)
# available video streams
video_stream = video.streams
video_quality = self.comboBox.currentIndex()
# video title/name
video_name = video.title
# take out the extension of the file from video stream
extension = video_stream[video_quality].extension
# fullname with extension
full_name = generate_filename(video_name, extension)
final_path_with_file_name = get_file_name_for_saving(save_location, full_name)
download = video_stream[video_quality].download(filepath=final_path_with_file_name,
callback=self.Handel_Progress, )
Дайте мне знать, если у вас возникнут вопросы.