Остановка загрузки видео через yotube-dl
Я делаю приложения на PyQt5 и Yotube-dl для скачивания видео. Я выделил процесс загрузки в отдельный поток, но мне нужно уметь его прерывать по нажатию кнопки Отмена. Я сделал кнопку и назначил отдельный обработчик события, который меняет значение while цикла на false. Такой код взял из книги
. Только когда я во время загрузки нажимаю отмена выдает ошибку
ERROR: m3u8 download detected but ffmpeg or avconv could not be found. Please install one.
я скачал ffmpeg но ничего не изменилось.
import os
from PyQt5 import QtCore, QtGui, QtWidgets
import youtube_dl
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(600, 500)
MainWindow.setMinimumSize(QtCore.QSize(600, 500))
MainWindow.setMaximumSize(QtCore.QSize(1200, 1000))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../../../../../Downloads/youtube.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("background-color: rgb(62, 62, 62);\n"
"background-color: rgb(30, 30, 30);")
MainWindow.setTabShape(QtWidgets.QTabWidget.Triangular)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.url_line = QtWidgets.QLineEdit(self.centralwidget)
self.url_line.setGeometry(QtCore.QRect(30, 30, 500, 30))
self.url_line.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
self.url_line.setAutoFillBackground(False)
self.url_line.setStyleSheet("font: 12pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);\n"
"border: 1px solid red;")
self.url_line.setText("")
self.url_line.setReadOnly(False)
self.url_line.setCursorMoveStyle(QtCore.Qt.LogicalMoveStyle)
self.url_line.setClearButtonEnabled(True)
self.url_line.setObjectName("url_line")
self.path_line = QtWidgets.QLineEdit(self.centralwidget)
self.path_line.setGeometry(QtCore.QRect(30, 80, 425, 30))
self.path_line.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 12pt \"Times New Roman\";\n"
"border: 1px solid red;")
self.path_line.setText("")
self.path_line.setClearButtonEnabled(True)
self.path_line.setObjectName("path_line")
self.quality_label = QtWidgets.QLabel(self.centralwidget)
self.quality_label.setGeometry(QtCore.QRect(30, 170, 110, 25))
self.quality_label.setStyleSheet("font: 10pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);")
self.quality_label.setAlignment(QtCore.Qt.AlignCenter)
self.quality_label.setObjectName("quality_label")
self.quality_box = QtWidgets.QComboBox(self.centralwidget)
self.quality_box.setGeometry(QtCore.QRect(200, 170, 193, 23))
self.quality_box.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 10pt \"Times New Roman\";")
self.quality_box.setEditable(False)
self.quality_box.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
self.quality_box.setObjectName("quality_box")
self.quality_box.addItem("")
self.download_but = QtWidgets.QPushButton(self.centralwidget)
self.download_but.setGeometry(QtCore.QRect(100, 350, 150, 28))
self.download_but.setStyleSheet("font: 75 12pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);")
self.download_but.setObjectName("download_but")
self.stop_but = QtWidgets.QPushButton(self.centralwidget)
self.stop_but = QtWidgets.QPushButton(self.centralwidget)
self.stop_but.setGeometry(QtCore.QRect(300, 350, 150, 28))
self.stop_but.setStyleSheet("font: 75 12pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);")
self.path_but = QtWidgets.QPushButton(self.centralwidget)
self.path_but.setGeometry(QtCore.QRect(470, 80, 60, 30))
self.path_but.setStyleSheet("background-color: rgb(255, 255, 255);")
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("../../../рабочий стол обои/Find.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.path_but.setIcon(icon1)
self.path_but.setObjectName("path_but")
self.info_label = QtWidgets.QLabel(self.centralwidget)
self.info_label.setGeometry(QtCore.QRect(0, 460, 600, 20))
self.info_label.setStyleSheet("font: 75 12pt \"Times New Roman\";")
self.info_label.setText("")
self.info_label.setAlignment(QtCore.Qt.AlignCenter)
self.info_label.setObjectName("info_label")
self.download = QtWidgets.QProgressBar(self.centralwidget)
self.download.setGeometry(QtCore.QRect(30, 400, 550, 25))
self.download.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 10pt \"Times New Roman\";")
self.download.setProperty("value", 24)
self.download.setObjectName("download")
self.format_video = QtWidgets.QLabel(self.centralwidget)
self.format_video.setGeometry(QtCore.QRect(30, 220, 110, 25))
self.format_video.setStyleSheet("font: 10pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);")
self.format_video.setObjectName("format_video")
self.format_video_box = QtWidgets.QComboBox(self.centralwidget)
self.format_video_box.setGeometry(QtCore.QRect(200, 220, 68, 23))
self.format_video_box.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 10pt \"Times New Roman\";")
self.format_video_box.setEditable(False)
self.format_video_box.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
self.format_video_box.setObjectName("format_video_box")
self.format_video_box.addItem("")
self.save_path = QtWidgets.QRadioButton(self.centralwidget)
self.save_path.setGeometry(QtCore.QRect(30, 130, 150, 20))
self.save_path.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 10pt \"Times New Roman\";")
self.save_path.setObjectName("save_path")
self.sub = QtWidgets.QLabel(self.centralwidget)
self.sub.setGeometry(QtCore.QRect(30, 270, 110, 25))
self.sub.setStyleSheet("font: 10pt \"Times New Roman\";\n"
"color: rgb(255, 0, 0);")
self.sub.setObjectName("sub")
self.sub_box = QtWidgets.QComboBox(self.centralwidget)
self.sub_box.setGeometry(QtCore.QRect(200, 270, 135, 23))
self.sub_box.setStyleSheet("color: rgb(255, 0, 0);\n"
"font: 10pt \"Times New Roman\";")
self.sub_box.setEditable(False)
self.sub_box.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
self.sub_box.setObjectName("sub_box")
self.sub_box.addItem("")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Youtube downloader"))
self.url_line.setPlaceholderText(_translate("MainWindow", "Вставьте URL ссылку на видео"))
self.path_line.setPlaceholderText(_translate("MainWindow", "Выберите папку для видео"))
self.quality_label.setText(_translate("MainWindow", "Качество видео"))
self.quality_box.setItemText(0, _translate("MainWindow", "Лучшее видео и аудио"))
self.download_but.setText(_translate("MainWindow", "Скачать"))
self.stop_but.setText(_translate("MainWidow", "Отмена"))
self.path_but.setText(_translate("MainWindow", "Путь"))
self.format_video.setText(_translate("MainWindow", "Формат видео"))
self.format_video_box.setItemText(0, _translate("MainWindow", "MP4"))
self.save_path.setText(_translate("MainWindow", "Сохранить путь"))
self.sub.setText(_translate("MainWindow", "Субтитры"))
self.sub_box.setItemText(0, _translate("MainWindow", "Без субтитров"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.download_fold = None
self.options = {}
self.download_but.clicked.connect(self.start)
self.path_but.clicked.connect(self.get_folder)
self.stop_but.clicked.connect(self.stop_on)
self.dow = MyThread()
self.dow.mysignal.connect(self.handler)
def get_folder(self):
self.download_fold = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку для видео")
self.path_line.setText(str(self.download_fold))
os.chdir(self.download_fold)
def ydl_opt(self):
pass
def start(self):
if len(self.url_line.text()) > 5:
if self.download_fold != None:
self.dow.init_args(self.url_line.text(), self.options)
self.dow.start()
self.locker(True)
else:
QtWidgets.QMessageBox.warning(self, 'Ошибка', 'Вы не указали папку')
else:
QtWidgets.QMessageBox.warning(self, 'Ошибка', "Вы не указали URL ссылку!")
def stop_on (self):
if self.dow.isRunning():
self.dow.running = False
else:
QtWidgets.QMessageBox.warning(self, 'Ошибка', 'Процесс скачивания не запущен')
def progress_bar(self):
pass
def locker(self, value):
if value:
for el in [self.path_but, self.url_line, self.format_video_box,
self.quality_box, self.sub_box, self.save_path]:
el.setDisabled(value)
def handler(self, value):
if value == 'finish':
self.locker(False)
else:
self.info_label.setText(value)
class MyThread(QtCore.QThread):
mysignal = QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
self.url = None
self.options = None
self.running = False
def run(self):
self.mysignal.emit('Процесс скачивания запущен')
self.running = True
while self.running:
with youtube_dl.YoutubeDL(self.options) as ydl:
ydl.download([self.url])
self.mysignal.emit('Процесс скачивания завершен')
self.mysignal.emit('finish')
def init_args(self, url, options):
self.url = url
self.options = options
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())