Остановка загрузки видео через 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_())

Ответы (0 шт):