pytube mit progressbar

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Hallo, ich möchte einen Youtube-Video-Downloader machen. Er klappt soweit schon und jetzt möchte ich noch ein progressfenster machen.
am Ende gibt es ein Array, mit den einzelnen Links zu den verschiedenen Videos. Die progressbar soll den Vortschritt des Downloads von allen Videos anzeigen. Mit dem Befehl youtubevideo.filesize bekommt man die bitgröße des videos. Die gesamte Bitgröße habe ich auch bereits, allerdings weißß ich nicht, wie ich ein neues Fenster öffnen kann, in welchem ich dann den Vortschritt realisieren kann.

Code: Alles auswählen

# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QTextBrowser, QMenuBar, QMenu, QProgressBar
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QRect, Qt, QCoreApplication
import sys
from threading import Thread
from pytube import YouTube


class Fenster(QWidget):
    def __init__(self):
        super().__init__()
        self.youtube_links = []
        self.init_me()

    def init_me(self):
        self.setObjectName("MainWindow")
        self.resize(754, 778)
        self.setWindowTitle("YoutubeDownloader by Jakob Priesner")
        self.setWindowIcon(QIcon('youtube.png'))

        self.textBrowser = QTextBrowser(self)
        self.textBrowser.setGeometry(QRect(0, 30, 781, 51))
        self.textBrowser.setObjectName("textBrowser")
        self.textBrowser.setHtml("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
                                "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
                                "p, li { white-space: pre-wrap; }\n"
                                "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.8pt; font-weight:400; font-style:normal;\">\n"
                                "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:16pt; font-weight:600; color:#aa0000;\">YouTube - DOWNLOADER</span></p></body></html>")

        self.label = QLabel(self)
        self.label.setGeometry(QRect(10, 110, 711, 31))
        self.label.setText("Willkommen im Youtube-Downloader von Jakob.\n"
                           "Füge unten einfach alle Links ein und drück auf herunterladen.")
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setObjectName("label")
        self.lineEdit = QLineEdit(self)
        self.lineEdit.setGeometry(QRect(30, 270, 481, 41))
        self.lineEdit.setPlaceholderText("Video-Link")
        self.lineEdit.setObjectName("lineEdit")

        self.pushButton = QPushButton(self)
        self.pushButton.setGeometry(QRect(540, 270, 181, 41))
        self.pushButton.setText("Add")
        self.pushButton.setShortcut("")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.add_video)

        self.label_2 = QLabel(self)
        self.label_2.setGeometry(QRect(40, 340, 251, 16))
        self.label_2.setText("Folgende Videos werden heruntergeladen:")
        self.label_2.setObjectName("label_2")

        self.label_3 = QTextBrowser(self)
        self.label_3.setGeometry(QRect(30, 370, 691, 261))
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")

        self.pushButton_2 = QPushButton(self)
        self.pushButton_2.setGeometry(QRect(540, 670, 181, 41))
        self.pushButton_2.setText("herunterladen")
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.herunterladen)
        #self.pushButton_2.clicked.connect(self.close)

        self.lineEdit_2 = QLineEdit(self)
        self.lineEdit_2.setGeometry(QRect(30, 190, 691, 41))
        self.lineEdit_2.setPlaceholderText("Download-Pfad")
        self.lineEdit_2.setObjectName("lineEdit_2")


        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 754, 26))
        self.menubar.setObjectName("menubar")
        self.menuExit = QMenu(self.menubar)
        self.menuExit.setObjectName("menuExit")
        self.menuExit.setTitle("Exit")

        #self.setMenuBar(self.menubar)
        self.menubar.addAction(self.menuExit.menuAction())
        self.show()

    def add_video(self):
        if self.lineEdit.text() is not '':
            self.youtube_links.append(self.lineEdit.text())
            content = ""
            for item in self.youtube_links:
                content += item + "\n"
            self.label_3.setText(content)
            self.lineEdit.setText("")
        else:
            self.label_3.setText("Ungültige Eingeibe!")


    def herunterladen(self):
        print("herunterladen")
        self.youtube_links = youtube_links
        self.videos_size = 0
        self.progress = 0
        self.youtube_links = list(set(self.youtube_links))
        print("festgelegt")
        DOWNLOAD_PATH = self.lineEdit_2.text()
        print(self.youtube_links)
        for item in self.youtube_links:
            self.videos_size += item.filesize
        for item in self.youtube_links:
            YouTube(item).streams.filter(progressive=True, file_extension='mp4').last().download(DOWNLOAD_PATH)

    def close(self):
        app.exec_()


class Progress():
    def __init__(self):
        super().__init__()
        self.youtube_links = []
        self.init_me()

    def init_me(self):
        self.setObjectName("Dialog")
        self.resize(706, 183)
        self.setWindowIcon(QIcon('youtube.png'))
        self.setWindowTitle("Download")

        self.progressBar = QProgressBar(Dialog)
        self.progressBar.setGeometry(QtCore.QRect(60, 120, 581, 31))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setTextVisible(True)
        self.progressBar.setOrientation(QtCore.Qt.Horizontal)
        self.progressBar.setInvertedAppearance(False)
        self.progressBar.setObjectName("progressBar")

        self.textEdit = QtWidgets.QTextEdit(Dialog)
        self.textEdit.setGeometry(QtCore.QRect(60, 60, 581, 31))
        self.textEdit.setObjectName("textEdit")
        self.textEdit.setText("Aktuell wird heruntergelade:")

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(60, 30, 271, 16))
        self.label.setObjectName("label")

        self.show()




app = QApplication(sys.argv)
w = Fenster()
sys.exit(app.exec_())
Vielen Dank für Eure Hilfe!
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

Hi, ich würde für das zweite Fenster eine eigene Klasse schreiben. Diese dann in der Hauptfenster Klasse instanzieren und den Fortschritt an die Progressbar übergeben.
IT-News ohne Werbung
https://www.it-feedo.de
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

Was mir noch eingefallen ist. Du müsstest dich noch mit dem threading beschäftigen. Sonst wird die ProgressBar im neuen Fenster erst nach dem Download geupdatet.
IT-News ohne Werbung
https://www.it-feedo.de
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

So ich nochmal =)
Hab das mal in meinen Youtube Downloader eingebaut (Ist noch lange nicht fertig, funktioniert aber schon)
Wenn du magst, kannst du ja auch mein Projekt fortsetzen. Ansonsten, kopier dir alles was du brauchst.

https://github.com/MP1337/SimpleYoutubeDownloaderQT

Bild
IT-News ohne Werbung
https://www.it-feedo.de
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Vielen DanK! Das mit dem threading wollte ich dann machen. Wo mein problem liegt ist, dass ich den Vortschritt vom downloaden mehrerer Videos anzeigen. Da weiß ich nicht, wie ich das machen soll
Benutzeravatar
mp1337
User
Beiträge: 23
Registriert: Dienstag 5. Mai 2020, 16:33
Kontaktdaten:

Möchtest du pro Download eine Progressbar ? Also bei 10 Filmen ein Fenster mit 10 Progressbars?
Ich würde zwei Progressbars in einem Fenster machen. Aktueller Download + Gesamtfortschritt.
Beides mit meinem Beispiel ohne Probleme zu lösen.
IT-News ohne Werbung
https://www.it-feedo.de
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Um mehrere Videos gleichzeitig herunterzuladen, braucht man mehrere Threads und mehrere Fortschrittsbalken.
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

mp1337 hat geschrieben: Donnerstag 24. September 2020, 11:35 Möchtest du pro Download eine Progressbar ? Also bei 10 Filmen ein Fenster mit 10 Progressbars?
Ich würde zwei Progressbars in einem Fenster machen. Aktueller Download + Gesamtfortschritt.
Beides mit meinem Beispiel ohne Probleme zu lösen.
okay, dann mach ich das mal mit deinem Projekt. Ich wollte eigentlich nur einen gesamtfortschritt
Antworten