YouTube Video Downloader python - PullRequest
       42

YouTube Video Downloader python

0 голосов
/ 29 марта 2020

Я сделал менеджер загрузки видео с YouTube. Он загружает видео, но при загрузке того же видео я сталкиваюсь с одной проблемой: он не загружается снова. Как я могу скачать его снова с таким же названием, как пи c .png и отправить Pic1.png. Как я могу это сделать?

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 = pafy.new(video_url)
        video_stream = video.streams
        video_quality = self.comboBox.currentIndex()

        download = video_stream[video_quality].download(filepath=save_location, callback=self.Handel_Progress, )

1 Ответ

0 голосов
/ 30 марта 2020

Хорошо, это интересно.

Здесь начинается настоящая проблема.

    download = video_stream[video_quality].download(filepath=save_location, callback=self.Handel_Progress, )

Здесь вы вызываете download функцию video_stream объекта, который принимает filepath в качестве аргумента для местоположения файла, но не принимает имя файла, потому что, очевидно, файл будет сохранен с фактическим именем.

Root Причина вашей проблемы:

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

Теперь приходит часть, как вы убедитесь, что она загружается, несмотря ни на что:

Есть две вещи, которые вам нужно сделать:

  1. Проверить если файл с таким именем существует или нет, а если и существует, то добавьте 1 в конце имени файла непосредственно перед расширением. Поэтому, если существует abc.mp4, сохраните abc1.mp4. [Я расскажу вам, как справиться со сценарием, когда abc.mp4, abc1.mp4 и т. Д. Существует, но сейчас давайте вернемся к проблеме.]

  2. Как пройти имя файла (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, )

Дайте мне знать, если у вас возникнут вопросы.

...