I'm making a GUI program capable of downloading a video or audio from YouTube with the user being able to choose the resolution or bitrate.
I want to add the functioning of the progress bar that was already defined in "Ui_MainWindow". I know I must use QThread and Signal from the PySide6 library, but all my attempts so far have been unsuccessful. Every help is welcome.
Follow the code below:
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()
I already know that I must create a class with QThread for the progress of the progress bar to work, but I was not successful.