He estado intentado pasar el proceso de descarga para los audios de Youtube en un hilo diferente utilizando la librería pafy. Con esta librería se puede utilizar un método llamado "mycb" donde es posible obtener los kbs descargados y los totales para establecer una barra de progreso. Aquí les muestro lo que intento hacer mediante la clase QThread
Con este código el proceso funciona aunque no correctamente ni mucho menos puedo establecer la barra de progreso.
Código (python) [Seleccionar]
from audio import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog,QFileDialog, QMessageBox,QTableWidget,QTableWidgetItem
from PyQt5.QtCore import QThread, pyqtSignal
import getpass, glob, pafy
class DownloadAudio(QThread):
signal_recvd = pyqtSignal(int)
signal_total = pyqtSignal(int)
def download(self, ruta, url):
ruta = ruta
url = url
video = pafy.new(url)
title = video.title
duration = video.duration
dwn = video.getbestaudio()
dwn.download(filepath=ruta, callback=self.mycb, meta=True)
def mycb(self,total, recvd, ratio, rate,eta): #Metodo de la libreria Pafy para saber los kbs recibidos y los totales (con este me apoyo para establecer la barra de progreso)
self.signal_total.emit(total)
self.signal_recvd.emit(recvd)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
self.setFixedSize(920,700)
self.txt_ruta.setText("/home/"+getpass.getuser()+"/Música")
self.tableWidget.setColumnWidth(0, 350)
self.tableWidget.setColumnWidth(1, 350)
self.btn_descargar.clicked.connect(self.download_audio)
self.btn_destino.clicked.connect(self.ruta)
def download_audio(self):
ruta = self.txt_ruta.text()
self.progressBar.setValue(0)
url = self.txt_url.text()
video = pafy.new(url)
title = video.title
duration = video.duration
self.tableWidget.setItem(0,0, QTableWidgetItem(title))
self.tableWidget.setItem(0,1, QTableWidgetItem(duration))
self.calc = DownloadAudio()
self.calc.download(ruta,url)
self.calc.signal_recvd.connect(self.progress)
def progress(self,value):
self.progressBar.setValue(value)
def ruta(self):
path = os.path.normpath(QFileDialog.getExistingDirectory(self))
self.txt_ruta.setText(path)
if __name__ == '__main__':
app = QtWidgets.QApplication([])
window = MainWindow()
window.show()
app.exec_()
Con este código el proceso funciona aunque no correctamente ni mucho menos puedo establecer la barra de progreso.