如何结合Pytube和PySide6 Progress Bar? [重复]

问题描述 投票:0回答:0

我正在制作一个能够从 YouTube 下载视频或音频的 GUI 程序,用户可以选择分辨率或比特率。

我想添加已经在“Ui_MainWindow”中定义的进度条的功能。我知道我必须使用 PySide6 库中的 QThread 和 Signal,但到目前为止我的所有尝试都没有成功。 欢迎任何帮助。

按照以下代码:

from PySide6 import QtWidgets
from PySide6.QtWidgets import(QApplication,QMainWindow,QWidget, QProgressBar)
from PySide6.QtCore import *
from PySide6.QtGui import *
import pytube
from pytube import YouTube
import sys
import os
import requests

from mainscreen_ui import Ui_MainWindow

class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.setWindowTitle("YouTube Downloader")

        self.comboBox_resolucao.clear()
        self.comboBox_2.clear()

        self.comboBox_resolucao.setEnabled(False)
        self.comboBox_2.setEnabled(False)

        #Define o diretório inicial
        diretorio = str(sys.path[0])
        self.label_diretorio.setText(diretorio)

        #Se o botão "Button_pesquisa" for precionado executa a funçao "get_video_info"
        self.Button_pesquisa.clicked.connect(self.get_video_info)

        #Se o botão "Button_iniciar_video" for precionado executa a funçao ""
        self.Button_iniciar_video.clicked.connect(self.download_video)

        #Se o botão "Button_iniciar_audio" for precionado executa a funçao ""
        self.Button_iniciar_audio.clicked.connect(self.download_audio)

        #Se o botão "Button_diretorio" for precionado executa a funçao "select_diretorio"
        self.Button_diretorio.clicked.connect(self.select_diretorio)

        self.progressBar.setValue(0)

    def select_diretorio(self):

        #Atribui a variável diretorio o local que o usuário escolher
        diretorio = str(QtWidgets.QFileDialog.getExistingDirectory())

        #Exibe o diretório escolhido
        self.label_diretorio.setText(diretorio)

    def get_video_info(self):

        #Seta os locais de Informações como vazios
        self.label_tituloyt.setText("")
        self.label_tituloyt_2.setText("")
        self.label_thumb.clear()
        self.label_thumb_2.clear()

        self.comboBox_resolucao.clear()
        self.comboBox_2.clear()

        #Recebe o link digitado 
        url = self.lineEdit_link.text()

        try:
            video = YouTube(url)
        except pytube.exceptions.PytubeError:
            QtWidgets.QMessageBox.critical(
                self,
                "Erro",
                "Não foi possível obter informações sobre o vídeo. Verifique se o link é válido e se está conectado à internet.",
                QtWidgets.QMessageBox.Ok
            )
            return

        #Carrega a URL do link
        urlthumbnail = video.thumbnail_url

        #Exibe a imagem do Link
        imagem = QImage()
        imagem.loadFromData(requests.get(urlthumbnail).content)
        self.label_thumb.setPixmap(QPixmap(imagem))
        self.label_thumb_2.setPixmap(QPixmap(imagem))

        #Exibe o título do vídeo 
        self.label_tituloyt.setText(video.title)
        self.label_tituloyt_2.setText(video.title)

        # Adicionando resoluçoes para a comboBox_resolucao"
        stream_query = video.streams.filter(progressive=True, file_extension='mp4')
        self.comboBox_resolucao.clear()
        for stream in stream_query:
            self.comboBox_resolucao.addItem(str(stream.resolution))
        self.comboBox_resolucao.setEnabled(True)

        # Adicionando qualidades para a comboBox_2"
        stream_query = video.streams.filter(only_audio=True).order_by('abr').desc()
        self.comboBox_2.clear()
        for stream in stream_query:
            self.comboBox_2.addItem(str(stream.abr) + " (" + str(stream.mime_type) + ")")
        self.comboBox_2.setEnabled(True)

    def download_video(self):

        #Recebe o diretório e adiciona umm local específico de salvamento
        diretorionalabel = self.label_diretorio.text()+'/YouTubeDownloader/Vídeos'

        url = self.lineEdit_link.text()
        video = YouTube(url)

        stream_query = video.streams.filter(progressive=True, file_extension='mp4')
        selected_resoluçao = self.comboBox_resolucao.currentText()

        # Verifica se já existe um arquivo com o mesmo nome no diretório
        nome_arquivo = f"{video.title}_{selected_resoluçao}.mp4"
        numero_sequencial = 1
        while os.path.exists(os.path.join(diretorionalabel, nome_arquivo)):
            nome_arquivo = f"{video.title}_{selected_resoluçao}_{numero_sequencial}.mp4"
            numero_sequencial += 1
 
        # Faz o download do vídeo e salva com o nome verificado
        for stream in stream_query:
            if str(stream.resolution) == selected_resoluçao:
                self.progressBar.setValue(0)
                stream.download(output_path=diretorionalabel, filename=nome_arquivo)
                return
 
    def download_audio(self):
        # Recebe o diretório e adiciona um local específico de salvamento
        diretorionalabel = os.path.join(self.label_diretorio.text(), 'YouTubeDownloader', 'Áudios')

        url = self.lineEdit_link.text()
        video = YouTube(url)

        # Define a stream do áudio em formato mp4
        stream_query = video.streams.filter(only_audio=True, file_extension='mp4')
        selected_ab_bitrate = self.comboBox_2.currentText()

        # Verifica se já existe um arquivo com o mesmo nome no diretório
        nome_arquivo = f"{video.title}_{selected_ab_bitrate}.mp3"
        numero_sequencial = 1
        while os.path.exists(os.path.join(diretorionalabel, nome_arquivo)):
            nome_arquivo = f"{video.title}_{selected_ab_bitrate}_{numero_sequencial}.mp3"
            numero_sequencial += 1

        # Faz o download do áudio e salva com o nome verificado
        for stream in stream_query:
            if str(stream.abr) == selected_ab_bitrate:
                stream.download(output_path=diretorionalabel, filename=nome_arquivo)
                return


if __name__ == "__main__":
    app = QApplication(sys.argv)
    janela = MainWindow()
    janela.show()
    app.exec()

我已经知道我必须用QThread创建一个类来使进度条的进度起作用,但我没有成功。

python pyside pyside2 qthread pyside6
© www.soinside.com 2019 - 2024. All rights reserved.