Pytube ekran donması ve progressbar kullanımı

Arkadaşlar merhaba bir konuda takıldım

youtubeden video progressbarımın %0 dan baslayarak indirmeye baslıcak %100 olunca da video indirmesi tamamlanacak
Birde playlist var. Ekranlarım cok donuyor yapamıyorum

from pytube import YouTube
from pytube import Playlist

from PyQt5.QtWidgets import QApplication
from untitled import Ui_MainWindow
from PyQt5 import QtWidgets
import sys
import os
from PyQt5.QtWidgets import QMainWindow,QMessageBox
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QProgressBar
from threading import Thread
from pytube.cli import on_progress



from PyQt5.QtWidgets import QFileDialog as filedialog



#1. playlist cekilecek
#2.playlistin donmamasını sağlanacak
#3.progresbarr kullanılacak playlist ile entegreli olacak
#4.


class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.download_button.clicked.connect(self.video_timer)

        self.ui.browse_konum.clicked.connect(self.dosya_yukle)

        self.ui.progressBar.hide()
        self.progress_bar_baslangic = 0


        self.timer = QTimer()
        self.timer.timeout.connect(self.videoYukle)
    def dosya_yukle(self):
        pass

    def video_timer(self):
        self.timer.start(400)
    def videoYukle(self):
        url = self.ui.link_line.text()
        mp4_yukle = YouTube(url)
        mp4_download = mp4_yukle.streams.get_highest_resolution()

        self.ui.progressBar.show()
        if self.progress_bar_baslangic <100:
            self.progress_bar_baslangic+=5
            self.ui.progressBar.setValue(self.progress_bar_baslangic)
            mp4_download.download()

        else:
            self.progress_bar_baslangic = 0
            self.ui.progressBar.setValue(self.progress_bar_baslangic)
        '''

        if self.ui.mp4_radio.isChecked() == True:
            url = self.ui.link_line.text()
            mp4_yukle = YouTube(url,on_progress_callback=on_progress)
            mp4_download = mp4_yukle.streams.get_highest_resolution()
            mp4_download.download() # parantezin içine output_path = burayada konum yazman gerekıyor sonrakı konum
        if self.ui.mp3_radio.isChecked() == True:
            url = self.ui.link_line.text()
            mp3_yukle = YouTube(url)
            mp3_download = mp3_yukle.streams.get_audio_only()
            mp3_download.download()
        '''



        '''
        url = self.ui.link_line.text()
        my_playlist = Playlist(url)


        if my_playlist:


            for playlist in my_playlist.videos:
                playlist.streams.first().download()
        else:
        '''








app = QApplication([])

kullanicilar = Main()
kullanicilar.show()

app.exec_()


Neden QTimer kullanıyorsun ki, diyelim senin QTimer’in çalıştı video yüklemeye başladı, ama daha o videonu yüklemeyi bitiremeden yeniden Qtimer çalşıyor ve yeniden indirmeye çalışıyor, tabi aynı anda bir videoyu bir kaç kez indirmeye çalışıyorsun, o yüzden donma oluyor.
Şöyle anlıyorum ki Qtimer’i progressbar’ın değerini artırma mantığı ile yazmışsın, ama .download() fonksiyonunu da onun içine aldığın için yukarıda bahs etdiğim sorun oluyor

Qtimer kullanmadanda donuyor hocam neden donuyor anlamıyorum

önerebileceğiniz mantık var mı?

videoYukle fonksiyonunu Thread kullanarak çağır.
Öncelikle en üstte threadingi import yap:

from threading import Thread 

videoYukle fonksiyonumuzu thread olarak başlatma için böyle bir fonksiyon oluşturuyoruz:

def videoYukle_Th() :
	Thread( target = self.videoYukle ).start()

Şimdi QTimer’den bu yeni fonksiyonumuzu çağırmalıyız:

self.timer.timeout.connect(self.videoYukle_Th)

Böyle donmaması lazım, bunu dene bir.
Ama progressbar’ın doğru çalışmaya bilir, eğer hata olursa progressbar kısmınını yorum satrı yap, öyle dene.

1 dakıka degısıklık yapıyorm pardon

hocam gondedıgınız kodu denedım de koda sızın ekleme şansınız var mı öyle denıyım yıne dondu

oldu teşekkür ederim eline sağlık

hocam peki son olarak progressbarı nasıl etkin kullanabilirim

mesela playlist listesi var elımde youtubede

progressbar %100 oldugunda 1 video insin
0 oldugunda 2nci video insin

nasıl yapabilirim?

Öncelikle progressbar’ın değerini neye uygun değiştireceksin, yani video yüklenirken 100de kaçının yüklendiğini nasıl bileceksin ki, ona uygun progressbar’ın değerini değiştiresin. Pytube böyle bir yüzdelik döndürüyormu? Onu bulmak lazım. Ha progressbar olmadan nasıl yaparız dersen ona bir fikrim ola bilir.

hocam progressbar fikri vardı bende

ama senin bir fikrin varsa lütfen alayım cünkü pc bana bakıyor ben ona:(

hocam birde mesela line edit veya labeller boşsa hata verdirmek istiyorum messagebox ile
fakat fonksiyon thread ile çalıştığı için direk program kapanıyor
buna da bir çözüm var mıdır?

şunu bir dene bakalım çalışıyormu.
thread içerisinden arayüz elemanlarina direkt erişince hatalar oluyor.o yüzden pyqtSignal() ile yapmak lazım.

from pytube import YouTube
from pytube import Playlist

from PyQt5.QtWidgets import QApplication
from untitled import Ui_MainWindow
from PyQt5 import QtWidgets
import sys
import os
from PyQt5.QtWidgets import QMainWindow,QMessageBox
from PyQt5.QtCore import QTimer, pyqtSignal
from PyQt5.QtWidgets import QProgressBar
from threading import Thread
from pytube.cli import on_progress



from PyQt5.QtWidgets import QFileDialog as filedialog



#1. playlist cekilecek
#2.playlistin donmamasını sağlanacak
#3.progresbarr kullanılacak playlist ile entegreli olacak
#4.


class Main(QMainWindow):
    
    signal_Msj = pyqtSignal()
    
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.download_button.clicked.connect(self.video_timer)

        self.ui.browse_konum.clicked.connect(self.dosya_yukle)

        self.ui.progressBar.hide()
        # self.progress_bar_baslangic = 0
        self.video_yuklenme = False
        
        self.signal_Msj.connect(self.msj_goster)


        self.timer = QTimer()
        self.timer.timeout.connect(self.videoYukle_Th)
    def dosya_yukle(self):
        pass
    
    def msj_goster(self):
        QMessageBox.information(self,'Mesaj Başlık','Gösterilecek mesaj metni')

    def video_timer(self):
        self.timer.start(400)
        
    def videoYukle_Th(self):
        if not self.video_yuklenme:   # yani şu anda video yüklenmiyorsa , yükleme başlatsin
            Thread(target=self.videoYukle).start()
        
    def videoYukle(self):
        self.video_yuklenme = True
        
        url = self.ui.link_line.text()
        mp4_yukle = YouTube(url)
        mp4_download = mp4_yukle.streams.get_highest_resolution()

        mp4_download.download()

        self.video_yuklenme = False
        
        
        self.signal_Msj.emit()  # message box olduğu fonksiyonun çalışması için sinyal yolluyoruz
        
        
        

        # self.ui.progressBar.show()
        # if self.progress_bar_baslangic <100:
        #     self.progress_bar_baslangic+=5
        #     self.ui.progressBar.setValue(self.progress_bar_baslangic)
        #     mp4_download.download()
        # 
        # else:
        #     self.progress_bar_baslangic = 0
        #     self.ui.progressBar.setValue(self.progress_bar_baslangic)
        '''

        if self.ui.mp4_radio.isChecked() == True:
            url = self.ui.link_line.text()
            mp4_yukle = YouTube(url,on_progress_callback=on_progress)
            mp4_download = mp4_yukle.streams.get_highest_resolution()
            mp4_download.download() # parantezin içine output_path = burayada konum yazman gerekıyor sonrakı konum
        if self.ui.mp3_radio.isChecked() == True:
            url = self.ui.link_line.text()
            mp3_yukle = YouTube(url)
            mp3_download = mp3_yukle.streams.get_audio_only()
            mp3_download.download()
        '''



        '''
        url = self.ui.link_line.text()
        my_playlist = Playlist(url)


        if my_playlist:


            for playlist in my_playlist.videos:
                playlist.streams.first().download()
        else:
        '''




app = QApplication([])

kullanicilar = Main()
kullanicilar.show()

app.exec_()

şuralara ekleme yaptim:

from pytube import YouTube
from pytube import Playlist

from PyQt5.QtWidgets import QApplication, QFileDialog
from untitled import Ui_MainWindow
from PyQt5 import QtWidgets
import sys
import os
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QProgressBar
from threading import Thread
from pytube.cli import on_progress

from PyQt5.QtWidgets import QFileDialog as filedialog


# 1. playlist cekilecek
# 2.playlistin donmamasını sağlanacak
# 3.progresbarr kullanılacak playlist ile entegreli olacak


class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setWindowTitle("Youtube")

        self.ui.download_button.clicked.connect(self.videoYukle_Th)
        self.ui.download_button.clicked.connect(self.videoYuklee)


        self.ui.browse_konum.clicked.connect(self.dosya_yukle)

        self.ui.progressBar.hide()
        self.progress_bar_baslangic = 0

        self.timer = QTimer()
        self.timer.timeout.connect(self.videoYukle)

        self.ui.label_5.hide()
        self.ui.mp4_radio.hide()
        self.ui.mp3_radio.hide()

        self.ui.link_line.textChanged.connect(self.link_kontrol)





    def link_kontrol(self):
        self.ui.label_5.show()
        self.ui.mp4_radio.show()
        self.ui.mp3_radio.show()
        if self.ui.link_line.text() == "":
            self.ui.label_5.hide()
            self.ui.mp3_radio.hide()
            self.ui.mp4_radio.hide()
        else:
            #self.ui.progressBar.show()
            pass


    def videoYukle_Th(self):
        Thread(target=self.videoYukle, daemon=True).start()
    def videoYuklee(self): # aşagıdakı fonksıyon videoYukle threadle calıstıgı ıcın messagebox hata verdırdı bunun yerıne başka bir fonksıyonla çağırdık
        if self.ui.label_4.text() == "":
            messagebox = QMessageBox()
            messagebox.setIcon(QMessageBox.Warning)
            messagebox.setWindowTitle("Hedef dizini")
            messagebox.setText(
                "Lütfen hedef dizinini boş bırakma")
            messagebox.setStandardButtons(QMessageBox.Ok)
            buton_ok = messagebox.button(QMessageBox.Ok)
            buton_ok.setText("Tamam")
            messagebox.exec_()
        elif self.ui.link_line.text() == "":
            messagebox = QMessageBox()
            messagebox.setIcon(QMessageBox.Warning)
            messagebox.setWindowTitle("Link hatası")
            messagebox.setText(
                "Lütfen link alanını boş bırakma")
            messagebox.setStandardButtons(QMessageBox.Ok)
            buton_ok = messagebox.button(QMessageBox.Ok)
            buton_ok.setText("Tamam")
            messagebox.exec_()





    def dosya_yukle(self):
        file_dialog = QFileDialog()
        self.file_dialog_yukle = file_dialog.getExistingDirectory(self, "Select") # dosyayı seçtik
        self.ui.label_4.setText(self.file_dialog_yukle) # labele yazdırdık

    def videoYukle(self):

        label_4 = self.ui.label_4.text()
        url = self.ui.link_line.text()
        my_playlist = Playlist(url)

        if label_4 != "":

            if self.ui.mp4_radio.isChecked() == True:
                if my_playlist:

                    for playlist in my_playlist.videos:
                        playlist.streams.filter(progressive=True).order_by('resolution').desc().first().download(output_path=self.file_dialog_yukle)
                mp4_yukle = YouTube(url, on_progress_callback=on_progress)


                mp4_download = mp4_yukle.streams.get_highest_resolution()
                mp4_download.download(output_path=self.file_dialog_yukle)  # parantezin içine output_path = burayada konum yazman gerekıyor sonrakı konum
            else:
                pass
            if self.ui.mp3_radio.isChecked() == True:
                if my_playlist:
                    for playlist in my_playlist.videos:
                        playlist.streams.filter(only_audio=True).first().download(output_path=self.file_dialog_yukle)
                url = self.ui.link_line.text()
                mp3_yukle = YouTube(url)
                mp3_download = mp3_yukle.streams.get_audio_only()
                mp3_download.download(output_path=self.file_dialog_yukle)



            else:
                pass

        else:
            #self.ui.statusBar.showMessage("HATA VAR HEDEF DİZİNİ GİRMEDİN",1000)
            #self.ui.statusBar.setStyleSheet("background-color : white")
            pass

kodlarım bu sekılde ınceler mısın playlist felan ekledım dosya konumları vs.

Attığın kodda "gostterılecek metın " messagebox sureklı cıkıyor threadıng calıstıgı ıcın oluyormu ? tamam dıyorum yine ekrana cıkıyor

Qmessagebox ben örnek olarak ekledim, senin nerede kullanacağını ben bilmiyorum.

Şunun yerini değiştirerek nerede çıkmasını sağalaya bilirsin.

eline sağlık hocam teşekkür ederim