示例#1
0
文件: call.py 项目: KoleckOLP/yt-dl
def loadpath(s="show"):
    # old mess
    global settings, fdir
    pffmpeg = glob.glob(f"{spath}/ffmpeg*")
    pffprobe = glob.glob(f"{spath}/ffprobe*")
    if (not pffmpeg and not pffprobe):
        fdir = False
    else:
        fdir = True
    # new stuff
    if (os.path.exists(settingsPath)):
        settings = Settings.fromJson(settingsPath)
    else:
        firstrun()

    if (s == "show"):
        print(Style.BRIGHT + "audio is saved to: " + Style.RESET_ALL, end="")
        print(settings.Youtubedl.audioDir)
        print(Style.BRIGHT + "video is saved to: " + Style.RESET_ALL, end="")
        print(settings.Youtubedl.videoDir + "\n")
示例#2
0
文件: gui5.py 项目: KoleckOLP/yt-dl
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        uic.loadUi("gui5.ui", self)

        self.show()

        self.setAcceptDrops(True)

        def messagePopup(title, icon, text, callf=None):
            msg = QMessageBox(
            )  # Pylance is being stupid, I had to disable Type checking.
            msg.setWindowTitle(title)
            msg.setIcon(icon)
            msg.setText(text)
            if callf is not None:
                msg.setStandardButtons(
                    QMessageBox.Ok | QMessageBox.Cancel
                )  # F**k pylance it says that this line is wrong anf that int can't bd a button, there is not int.
                msg.buttonClicked.connect(callf)
            msg.exec_()

        def SaveDefaultConfig(i):
            text: str = i.text().lower()
            if "ok" in text:
                nonlocal settings
                settings = Settings.loadDefault()
                settings.toJson(settingsPath)
            else:
                exit()

        def status(
                s=""
        ):  # shows status message and changes color of the status bar.
            self.statusBar().showMessage(s)
            if s == "Ready.":
                self.statusBar().setStyleSheet("background-color: #00BB00")
            elif s == "Busy.":
                self.statusBar().setStyleSheet("background-color: #FF6600")
            else:
                self.statusBar().setStyleSheet("background-color: #A9A9A9")

        def process_start(cmd: List[str], output_console):
            if (sys.platform.startswith("win")):  # (os.name == "nt"):
                process = subprocess.Popen(
                    cmd,
                    stdout=subprocess.PIPE,
                    stderr=subprocess.STDOUT,
                    creationflags=0x08000000,
                    universal_newlines=True,
                    encoding="utf8"
                )  # this one does not check if another process is running
            else:  # (sys.platform.startswith(("linux", "darwin", "freebsd"))): #(os.name == "posix"): #other oeses should be fine with this
                process = subprocess.Popen(cmd,
                                           stdout=subprocess.PIPE,
                                           stderr=subprocess.STDOUT,
                                           universal_newlines=True,
                                           errors="ignore")
            while True:
                test = process.stdout.readline()
                if not test:
                    break
                test = str(test)
                if "\\n" in test:
                    test = test.replace("\\n", "\n")
                output_console.insertPlainText(test)
                self.scrollbar = output_console.verticalScrollBar()
                self.scrollbar.setValue(self.scrollbar.maximum())
                QtWidgets.QApplication.processEvents()
            print("\a")
            output_console.insertPlainText("#yt-dl# Process has finished.\n\n")
            QtWidgets.QApplication.processEvents()
            self.scrollbar = output_console.verticalScrollBar()
            self.scrollbar.setValue(self.scrollbar.maximum())

        def openFolder(loc=""):
            if (sys.platform.startswith("win")):
                os.system(f"start {loc}")
            elif (sys.platform.startswith(
                ("darwin", "haiku"))):  # haiku support :3
                os.system(f"open {loc}")
            else:  # (sys.platform.startswith(("linux", "freebsd"))): #hoping that other OSes use xdg-open
                os.system(f"xdg-open {loc}")

        # region ===== startup =====
        pffmpeg = glob.glob(f"{spath}/ffmpeg*")
        pffprobe = glob.glob(f"{spath}/ffprobe*")
        if (not pffmpeg and not pffprobe):
            fdir = False
        else:
            fdir = True

        if (os.path.exists(settingsPath)):
            settings = Settings.fromJson(settingsPath)
        else:
            messagePopup(
                "Settings error", QMessageBox.Critical,
                "You are missing a config file,\nPress OK to load default config.",
                SaveDefaultConfig)

        self.setWindowTitle(f"yt-dl {ver}")

        self.tabWidget.setCurrentIndex(
            settings.defaultTab
        )  # the code will not get here if settings is undefined.

        global running
        running = False
        status("Ready.")

        # endregion

        # region ==========🎶AUDIO🎶==========
        def Audio():
            global running
            if not running:
                running = True
                status("Busy.")
                self.tabWidget.setTabText(0, "*Audio")

                self.aud_output_console.setHtml(
                    "")  # clearing the output_console

                url = self.aud_url_bar.text()
                if self.aud_playlist_checkbox.isChecked():
                    numb = self.aud_playlist_bar.text()
                else:
                    numb = None

                if (numb is None):
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.audioDir}%(title)s.%(ext)s",
                        "--no-playlist", "-x", "--prefer-ffmpeg"
                    ], ["--audio-format", "mp3", f"{url}"]]
                elif (numb == ""):
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.audioDir}%(playlist_index)s. %(title)s.%(ext)s",
                        "--yes-playlist", "-i", "-x", "--prefer-ffmpeg"
                    ], ["--audio-format", "mp3", f"{url}"]]
                else:
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.audioDir}%(playlist_index)s. %(title)s.%(ext)s",
                        "--yes-playlist", "-i", "--playlist-items", f"{numb}",
                        "-x", "--prefer-ffmpeg"
                    ], ["--audio-format", "mp3", f"{url}"]]

                floc = [f"--ffmpeg-location", f"{spath}"]
                if (fdir is True):
                    cmd = cmd[0] + floc + cmd[1]
                else:
                    cmd = cmd[0] + cmd[1]

                self.aud_output_console.insertPlainText(
                    "#yt-dl# starting youtube-dl please wait...\n")

                process_start(cmd, self.aud_output_console)

                running = False
                status("Ready.")
                self.tabWidget.setTabText(0, "Audio")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def aud_playlist_bar_toggle():
            self.aud_playlist_bar.setEnabled(
                self.aud_playlist_checkbox.isChecked())
            if (self.aud_playlist_checkbox.isChecked()):
                self.aud_playlist_bar.setStyleSheet(
                    "background-color: #909090;")
            else:
                self.aud_playlist_bar.setStyleSheet(
                    "background-color: #707070;")

        def aud_open():
            openFolder(settings.Youtubedl.audioDir)

        # =====aud_controls=====#
        self.aud_folder_button.clicked.connect(aud_open)
        self.aud_download_button.clicked.connect(Audio)
        self.aud_playlist_checkbox.clicked.connect(aud_playlist_bar_toggle)
        self.aud_output_console.setHtml(
            "#yt-dl# Welcome to yt-dl-gui (Audio) paste a link and hit download."
        )

        # endregion

        # region ==========📼VIDEO📼==========
        def Video():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.tabWidget.setTabText(1, "*Video")

                self.vid_output_console.setHtml(
                    "")  # clearing the output_console.

                url = self.vid_url_bar.text()
                if self.vid_playlist_checkbox.isChecked():
                    numb = self.vid_playlist_bar.text()
                else:
                    numb = None

                if (numb is None):
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.videoDir}%(title)s.%(ext)s", "-f"
                    ], ["--no-playlist", f"{url}"]]
                elif (numb == ""):
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.videoDir}%(playlist_index)s. %(title)s.%(ext)s",
                        "-f"
                    ], ["--yes-playlist", f"{url}"]]
                else:
                    cmd = [[
                        "youtube-dl", "-o",
                        f"{settings.Youtubedl.videoDir}%(playlist_index)s. %(title)s.%(ext)s",
                        "-f"
                    ],
                           [
                               "--yes-playlist", "--playlist-items", f"{numb}",
                               f"{url}"
                           ]]

                if self.vid_best_radio.isChecked():
                    qual = ["bestvideo+bestaudio"]
                elif self.vid_custom_radio.isChecked():
                    qual = [self.vid_quality_bar.text()]
                else:
                    qual = ["best"]

                floc = [f"--ffmpeg-location", f"{spath}"]
                if (fdir is True):
                    cmd = cmd[0] + qual + floc + cmd[1]
                else:
                    cmd = cmd[0] + qual + cmd[1]

                self.vid_output_console.insertPlainText(
                    "#yt-dl# starting youtube-dl please wait...\n")

                process_start(cmd, self.vid_output_console)

                running = False
                status("Ready.")
                self.tabWidget.setTabText(1, "Video")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def vid_quality():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.vid_output_console.setHtml(
                    "")  # clearing the output_console

                url = self.vid_url_bar.text()
                cmd = ["youtube-dl", "-F", "--no-playlist", f"{url}"]

                self.vid_output_console.insertPlainText(
                    "#yt-dl# starting yt-dl please wait...\n")

                process_start(cmd, self.vid_output_console)

                running = False
                status("Ready.")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def vid_playlist_bar_toggle():
            self.vid_playlist_bar.setEnabled(
                self.vid_playlist_checkbox.isChecked())
            if (self.vid_playlist_checkbox.isChecked()):
                self.vid_playlist_bar.setStyleSheet(
                    "background-color: #909090;")
            else:
                self.vid_playlist_bar.setStyleSheet(
                    "background-color: #707070;")

        def vid_quality_bar_toggle():
            self.vid_quality_bar.setEnabled(self.vid_custom_radio.isChecked())
            if (self.vid_custom_radio.isChecked()):
                self.vid_quality_bar.setStyleSheet(
                    "background-color: #909090;")
            else:
                self.vid_quality_bar.setStyleSheet(
                    "background-color: #707070;")

        def vid_open():
            openFolder(settings.Youtubedl.videoDir)

        # =====vid_controls=====#
        self.vid_folder_button.clicked.connect(vid_open)
        self.vid_download_button.clicked.connect(Video)
        self.vid_quality_button.clicked.connect(vid_quality)
        self.vid_playlist_checkbox.clicked.connect(vid_playlist_bar_toggle)
        self.vid_custom_radio.toggled.connect(vid_quality_bar_toggle)
        self.vid_output_console.setHtml(
            "#yt-dl# Welcome to yt-dl-gui (Video) paste a link and hit download."
        )

        # endregion

        # region ==========📑SUBS📑==========
        def Subs():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.tabWidget.setTabText(2, "*Subs")

                temp = tempfile.mkdtemp() + os.path.sep

                self.sub_output_console.setHtml(
                    "")  # clearing the output_console.

                url = self.sub_url_bar.text()

                cmd = [[], []]

                if self.sub_playlist_checkbox.isChecked():
                    if self.sub_playlist_bar.text() == "":
                        cmd[0] = [
                            "youtube-dl", "-o", f"{temp}%(title)s.%(ext)s",
                            "--yes-playlist", "--write-sub", "--write-auto-sub"
                        ]
                    else:
                        numb = self.sub_playlist_bar.text()
                        cmd[0] = [
                            "youtube-dl", "-o", f"{temp}%(title)s.%(ext)s",
                            "--yes-playlist", "--playlist-items", f"{numb}",
                            "--write-sub", "--write-auto-sub"
                        ]
                else:
                    cmd[0] = [
                        "youtube-dl", "-o", f"{temp}%(title)s.%(ext)s",
                        "--no-playlist", "--write-sub", "--write-auto-sub"
                    ]

                cmd[1] = ["--sub-format", "vtt", "--skip-download", f"{url}"]

                lang = None

                if self.sub_lang_checkbox.isChecked():
                    lang = self.sub_lang_bar.text()

                floc = [f"--ffmpeg-location", f"{spath}"]
                if (fdir is True):
                    if lang is not None:
                        cmd = cmd[0] + lang + floc + cmd[1]
                    else:
                        cmd = cmd[0] + floc + cmd[1]
                else:
                    if lang is not None:
                        cmd = cmd[0] + lang + cmd[1]
                    else:
                        cmd = cmd[0] + cmd[1]

                self.sub_output_console.insertPlainText(
                    "#yt-dl# starting yt-dl please wait...\n")

                process_start(cmd, self.sub_output_console)

                subpath = glob.glob(f"{temp}*.vtt")
                os.makedirs(settings.Youtubedl.videoDir, exist_ok=True)

                for item in subpath:
                    namei = os.path.basename(item)
                    namei = namei[:-3]
                    newsubpath = f"{settings.Youtubedl.videoDir}{namei}srt"  # I don't like this fix to a complain about var type
                    if os.path.isfile(newsubpath):
                        self.sub_output_console.insertPlainText(
                            f"#yt-dl# file {item} already exists skipping...\n"
                        )
                    else:
                        cmd = ["-i", f"{item}", f"{newsubpath}"]

                        floc = [
                            f"{spath+os.path.sep+'ffmpeg'}", "-hide_banner"
                        ]
                        if (fdir is True):
                            cmd = floc + cmd
                        else:
                            cmd = ["ffmpeg", "-hide_banner"] + cmd

                        self.sub_output_console.insertPlainText(
                            "#yt-dl# starting ffmpeg please wait...\n")

                        process_start(cmd, self.sub_output_console)

                running = False
                status("Ready.")
                self.tabWidget.setTabText(2, "Subs")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def sub_lang():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.sub_output_console.setHtml(
                    "")  # clearing the output_console

                url = self.sub_url_bar.text()
                cmd = ["youtube-dl", "--list-subs", "--no-playlist", f"{url}"]

                process_start(cmd, self.sub_output_console)

                running = False
                status("Ready.")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def sub_playlist_bar_toggle():
            self.sub_lang_button.setEnabled(
                not self.sub_playlist_checkbox.isChecked())
            self.sub_playlist_bar.setEnabled(
                self.sub_playlist_checkbox.isChecked())
            if (self.sub_playlist_checkbox.isChecked()):
                self.sub_playlist_bar.setStyleSheet(
                    "background-color: #909090;")
            else:
                self.sub_playlist_bar.setStyleSheet(
                    "background-color: #707070;")

        def sub_lang_bar_toggle():
            self.sub_lang_bar.setEnabled(self.sub_lang_checkbox.isChecked())
            if (self.sub_lang_checkbox.isChecked()):
                self.sub_lang_bar.setStyleSheet("background-color: #909090;")
            else:
                self.sub_lang_bar.setStyleSheet("background-color: #707070;")

        # =====sub_controls=====#
        self.sub_folder_button.clicked.connect(vid_open)
        self.sub_download_button.clicked.connect(Subs)
        self.sub_lang_button.clicked.connect(sub_lang)
        self.sub_playlist_checkbox.toggled.connect(sub_playlist_bar_toggle)
        self.sub_lang_checkbox.toggled.connect(sub_lang_bar_toggle)
        self.sub_output_console.setHtml(
            "#yt-dl# Welcome to yt-dl-gui (Subtitles) paste a link and hit download."
        )

        # endregion

        # region ==========💿RE-ENCODE💿==========
        def Reencode():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.tabWidget.setTabText(3, "*Re-encode")

                self.ree_output_console.setHtml(
                    "")  # clearing the output_console

                location = self.ree_location_bar.text()
                videoc = self.ree_videoc_bar.text()
                videoq = self.ree_videoq_bar.text()
                audioc = self.ree_audioc_bar.text()
                audiob = self.ree_audiob_bar.text()
                append = self.ree_append_bar.text()

                if location[-2:] == os.path.sep + "*":  # whole folder
                    VidsToRender = glob.glob(location)
                else:
                    VidsToRender = [f"{location}"]
                for video in VidsToRender:
                    if os.path.isfile(os.path.splitext(video)[0] + append):
                        self.ree_output_console.insertPlainText(
                            f"#yt-dl# file {video} already exists skipping...\n"
                        )
                    else:
                        cmd = [[
                            "-hwaccel", "auto", "-i", f"{video}", "-map",
                            "0:v?", "-map", "0:a?", "-map", "0:s?"
                        ], ["-max_muxing_queue_size", "9999", "-b:v", "0K"],
                               [f"{os.path.splitext(video)[0]+append}"]]

                        # //Video Quality\\#
                        if "," in videoq:
                            VQsplit = videoq.split(",")
                        else:
                            VQsplit = [videoq, videoq, videoq]
                        # //Video Codec\\#
                        if (videoc == "libx265"):
                            VideoCodec = ["-c:v", f"{videoc}"]
                            quality = [
                                "-crf", f"{int(VQsplit[0])-1}", "-qmin",
                                f"{int(VQsplit[1])-1}", "-qmax",
                                f"{int(VQsplit[2])-1}"
                            ]
                            Vformat = ["-vf", "format=yuv420p"]
                            cmd = [
                                cmd[0] + VideoCodec + quality + cmd[1] +
                                Vformat, cmd[2]
                            ]
                        elif (videoc == "copy"):
                            VideoCodec = [f"-c:v", f"{videoc}"]
                            cmd = [cmd[0] + VideoCodec + cmd[1], cmd[2]]
                        elif (videoc == "remove"):
                            VideoCodec = ["-vn"]
                            cmd = [cmd[0] + VideoCodec + cmd[1], cmd[2]]
                        elif (videoc == "hevc_nvenc"):
                            VideoCodec = ["-c:v", f"{videoc}"]
                            quality = [
                                "-rc:v", "vbr", "-qmin", f"{int(VQsplit[1])}",
                                "-qmax", f"{int(VQsplit[2])}", "-bf", "1"
                            ]
                            Vformat = ["-vf", "format=yuv420p"]
                            cmd = [
                                cmd[0] + VideoCodec + quality + cmd[1] +
                                Vformat, cmd[2]
                            ]
                        elif (videoc == "h264_nvenc"):
                            VideoCodec = ["-c:v", f"{videoc}"]
                            quality = [
                                "-rc:v", "vbr", "-qmin", f"{int(VQsplit[1])}",
                                "-qmax", f"{int(VQsplit[2])}"
                            ]
                            Vformat = ["-vf", "format=yuv420p"]
                            cmd = [
                                cmd[0] + VideoCodec + quality + cmd[1] +
                                Vformat, cmd[2]
                            ]
                        else:
                            VideoCodec = ["-c:v", f"{videoc}"]
                            quality = [
                                "-cq", f"{int(VQsplit[0])-1}", "-qmin",
                                f"{int(VQsplit[1])-1}", "-qmax",
                                f"{int(VQsplit[2])-1}"
                            ]
                            Vformat = ["-vf", "format=yuv420p"]
                            cmd = [
                                cmd[0] + VideoCodec + quality + cmd[1] +
                                Vformat, cmd[2]
                            ]
                        # //Audio\\#
                        if (audioc == "remove"):
                            AudioEverything = ["-an"]
                            cmd = [cmd[0] + AudioEverything, cmd[1]]
                        else:
                            AudioEverything = [
                                "-c:a", f"{audioc}", "-strict", "-2", "-b:a",
                                f"{audiob}"
                            ]
                            cmd = [cmd[0] + AudioEverything, cmd[1]]
                        # //Subtitles\\#
                        if (videoc == "remove"):
                            cmd = cmd[0] + cmd[1]
                        else:
                            SubsC = ["-c:s", "copy"]
                            cmd = cmd[0] + SubsC + cmd[1]

                        floc = [
                            f"{spath+os.path.sep+'ffmpeg'}", "-hide_banner"
                        ]
                        if (fdir is True):
                            cmd = floc + cmd
                        else:
                            cmd = ["ffmpeg", "-hide_banner"] + cmd

                        process_start(cmd, self.ree_output_console)
                        # print(cmd)

                running = False
                status("Ready.")
                self.tabWidget.setTabText(3, "Re-encode")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def ree_settings():
            if self.ree_settings_combobox.currentIndex() == 4:  # custom
                self.ree_videoc_bar.setText(settings.Ffmpeg.videoCodec)
                self.ree_videoq_bar.setText(settings.Ffmpeg.videoQuality)
                self.ree_audioc_bar.setText(settings.Ffmpeg.audioCodec)
                self.ree_audiob_bar.setText(settings.Ffmpeg.audioBitrate)
                self.ree_append_bar.setText(settings.Ffmpeg.append)
            elif self.ree_settings_combobox.currentIndex() == 0:  # hevc_opus
                self.ree_videoc_bar.setText("libx265")
                self.ree_videoq_bar.setText("24,24,24")
                self.ree_audioc_bar.setText("opus")
                self.ree_audiob_bar.setText("190k")
                self.ree_append_bar.setText("_hevcopus.mkv")
            elif self.ree_settings_combobox.currentIndex() == 1:  # h264_nvenc
                self.ree_videoc_bar.setText("h264_nvenc")
                self.ree_videoq_bar.setText("24,24,24")
                self.ree_audioc_bar.setText("aac")
                self.ree_audiob_bar.setText("190k")
                self.ree_append_bar.setText("_nvenc.mov")
            elif self.ree_settings_combobox.currentIndex() == 2:  # hevc_nvenc
                self.ree_videoc_bar.setText("hevc_nvenc")
                self.ree_videoq_bar.setText("24,24,24")
                self.ree_audioc_bar.setText("opus")
                self.ree_audiob_bar.setText("190k")
                self.ree_append_bar.setText("_henc.mkv")
            elif self.ree_settings_combobox.currentIndex() == 3:  # mp3
                self.ree_videoc_bar.setText("remove")
                self.ree_videoq_bar.setText("none")
                self.ree_audioc_bar.setText("mp3")
                self.ree_audiob_bar.setText("190k")
                self.ree_append_bar.setText(".mp3")

        def ree_settings_save():
            settings.Ffmpeg.videoCodec = self.ree_videoc_bar.text()
            settings.Ffmpeg.audioCodec = self.ree_audioc_bar.text()
            settings.Ffmpeg.videoQuality = self.ree_videoq_bar.text()
            settings.Ffmpeg.audioBitrate = self.ree_audiob_bar.text()
            settings.Ffmpeg.append = self.ree_append_bar.text()
            settings.defaultCodec = self.ree_settings_combobox.currentIndex()
            settings.toJson(settingsPath)

        def ree_choose():
            self.ree_location_bar.setText(QFileDialog.getOpenFileName()[0])

        def ree_open():
            location = self.ree_location_bar.text()
            openFolder(os.path.dirname(location))

        # =====ree_controls=====#
        self.ree_settings_combobox.addItem(
            "hevc_opus")  # setting up items in combo list
        self.ree_settings_combobox.addItem("h264_nvenc")
        self.ree_settings_combobox.addItem("hevc_nvenc")
        self.ree_settings_combobox.addItem("mp3")
        self.ree_settings_combobox.addItem("custom")
        self.ree_settings_combobox.setCurrentIndex(settings.defaultCodec)
        ree_settings()  # load option on startup
        self.ree_choose_button.clicked.connect(ree_choose)
        self.ree_reencode_button.clicked.connect(Reencode)
        self.ree_folder_button.clicked.connect(ree_open)
        self.ree_settings_combobox.activated.connect(ree_settings)
        self.ree_settings_button.clicked.connect(ree_settings_save)
        self.ree_output_console.setHtml(
            "#yt-dl# Welcome to yt-dl-gui (Re-encode) paste a link and hit download."
        )
        # self.ree_location_bar.setDragEnabled(True)
        self.ree_location_bar.setAcceptDrops(True)

        # endregion

        # region ==========🔄UPDATE🔄==========
        def update_yt_dl():
            cmd = ["git", "pull", "--recurse-submodules"]
            process_start(cmd, self.upd_output_console)

        def update_depend():
            pips = settings.Python.pip.split(" ")
            cmd = [
                f"{settings.Python.python}", "-m", "pip", "install", "-U",
                "pip"
            ]
            process_start(cmd, self.upd_output_console)
            cmd = pips + ["install", "-U", "-r", "req-gui5.txt"]
            process_start(cmd, self.upd_output_console)

        def Update():
            global running
            if running is False:
                running = True
                status("Busy.")

                self.tabWidget.setTabText(4, "*Update")

                self.upd_output_console.setHtml(
                    "")  # clearing the output_console

                if self.upd_update_combobox.currentIndex() == 1:
                    update_yt_dl()
                elif self.upd_update_combobox.currentIndex() == 2:
                    update_depend()
                else:
                    update_yt_dl()
                    update_depend()

                running = False
                status("Ready.")
                self.tabWidget.setTabText(4, "Update")
            else:
                messagePopup("Process warning", QMessageBox.Warning,
                             "One process already running!")

        def upd_auto_toggle():  # autoupdate is not a thing tho
            settings.autoUpdate = not settings.autoUpdate
            settings.toJson(settingsPath)
            self.upd_auto_button.setText(
                f"Autoupdate=\"{settings.autoUpdate}\"")

        # ======upd_controls======#
        self.upd_update_combobox.addItem(
            "All")  # setting up items in combo list
        self.upd_update_combobox.addItem("yt-dl")
        self.upd_update_combobox.addItem("dependencies")
        if (sys.platform.startswith("haiku")):
            self.upd_update_combobox.setCurrentIndex(1)
        '''
        #region (branch switching code)
        branches = os.listdir(spath+".git/refs/heads")
        for branch in branches:
            self.upd_branch_combobox.addItem(branch)
        
        process = subprocess.Popen(["git", "rev-parse", "--abbrev-ref", "HEAD"], stdout=subprocess.PIPE)
        gcurb = str(process.stdout.read())
        curb = "Current branch: "+curb[2:-3]
        self.upd_branch_label.setText(curb)
        #endregion
        '''

        QtWidgets.QApplication.processEvents()
        if settings.autoUpdate:
            self.tabWidget.setCurrentIndex(4)
            Update()

        self.upd_update_button.clicked.connect(Update)
        # self.upd_branch_button.clicked.connect(upd_branch)
        self.upd_auto_button.setText(f"Autoupdate=\"{settings.autoUpdate}\"")
        self.upd_auto_button.clicked.connect(upd_auto_toggle)

        # endregion

        # region ==========📈SETTINGS📈==========
        def set_save():
            settings.Youtubedl.audioDir = self.set_audio_bar.text()
            settings.Youtubedl.videoDir = self.set_videos_bar.text()
            settings.Python.python = self.set_py_bar.text()
            settings.Python.pip = self.set_pip_bar.text()
            settings.Youtubedl.fromPip = self.set_ydpip_checkbox.isChecked()
            settings.autoUpdate = self.set_aup_checkbox.isChecked()
            settings.Ffmpeg.audioCodec = self.set_Acodec_bar.text()
            settings.Ffmpeg.videoCodec = self.set_Vcodec_bar.text()
            settings.Ffmpeg.audioBitrate = self.set_Abit_bar.text()
            settings.Ffmpeg.videoQuality = self.set_Vqual_bar.text()
            settings.Ffmpeg.append = self.set_Append_bar.text()
            settings.defaultTab = self.set_Tab_combobox.currentIndex()

            settings.toJson(settingsPath)

        def set_load(audio, video, py, pip, ydpip, aup, acodec, vcodec, abit,
                     vqual, append, tab):
            self.set_audio_bar.setText(audio)
            self.set_videos_bar.setText(video)
            self.set_py_bar.setText(py)
            self.set_pip_bar.setText(pip)
            self.set_ydpip_checkbox.setChecked(ydpip)
            self.set_aup_checkbox.setChecked(aup)
            self.set_Acodec_bar.setText(acodec)
            self.set_Vcodec_bar.setText(vcodec)
            self.set_Abit_bar.setText(abit)
            self.set_Vqual_bar.setText(vqual)
            self.set_Append_bar.setText(append)
            self.set_Tab_combobox.setCurrentIndex(tab)

        def set_makeScript(
        ):  # I had an issue getting the venv working with gui
            if (sys.platform.startswith("win")):
                f = open("yt-dl_gui.vbs", "w")
                f.write(
                    f"Set WshShell = CreateObject(\"WScript.Shell\")\nWshShell.Run \"cmd /c cd /d {spath} & pythonw.exe gui.py\", 0\nSet WshShell = Nothing"
                )
                f.close()
                f = open("yt-dl_gui.bat", "w")
                f.write(f"@echo off\n\nstart /b pythonw.exe gui5.py")
                f.close()
            else:  # (sys.platform.startswith(("linux", "darwin", "freebsd"))):
                f = open("yt-dl", "w")
                f.write(
                    f"#!/bin/sh\n\ncd {spath} && {settings.Python.python} gui5.py"
                )
                f.close()

        def set_open():
            openFolder(spath)

        # =====set_controls=====#
        self.set_loadcur_button.clicked.connect(lambda: set_load(
            settings.Youtubedl.audioDir, settings.Youtubedl.videoDir, settings.
            Python.python, settings.Python.pip, settings.Youtubedl.fromPip,
            settings.autoUpdate, settings.Ffmpeg.audioCodec, settings.Ffmpeg.
            videoCodec, settings.Ffmpeg.audioBitrate, settings.Ffmpeg.
            videoQuality, settings.Ffmpeg.append, settings.defaultTab))
        self.set_loaddef_button.clicked.connect(lambda: set_load(
            audioDirDefault, videoDirDefault, "python", "pip", True, False,
            "opus", "libx265", "190k", "24,24,24", "_custom.mkv", 0))
        self.set_folder_button.clicked.connect(set_open)
        self.set_launch_button.clicked.connect(set_makeScript)
        self.set_save_button.clicked.connect(set_save)
        self.set_Tab_combobox.addItem(
            "Audio")  # setting up items in combo list
        self.set_Tab_combobox.addItem("Video")
        self.set_Tab_combobox.addItem("Subs")
        self.set_Tab_combobox.addItem("Re-encode")
        self.set_Tab_combobox.addItem("Update")
        self.set_Tab_combobox.addItem("Settings")
        self.set_Tab_combobox.addItem("About")
        set_load(settings.Youtubedl.audioDir, settings.Youtubedl.videoDir,
                 settings.Python.python, settings.Python.pip,
                 settings.Youtubedl.fromPip, settings.autoUpdate,
                 settings.Ffmpeg.audioCodec, settings.Ffmpeg.videoCodec,
                 settings.Ffmpeg.audioBitrate, settings.Ffmpeg.videoQuality,
                 settings.Ffmpeg.append, settings.defaultTab)
        # endregion

        # region ==========🎓ABOUT🎓==========
        self.about_box.setHtml(
            f"<p style=\"font-size: 20px; white-space: pre\">HorseArmored Inc. (C){year}<br>"
            + f"Version: {ver} gui5 ({curb} branch)<br>" +
            f"Last updated on: {lstupdt}<br>" +
            f"My webpage: <a href=\"https://koleckolp.comli.com\">https://koleckolp.comli.com</a><br>"
            +
            f"Project page: <a href=\"https://github.com/KoleckOLP/yt-dl\">https://github.com/KoleckOLP/yt-dl</a><br>"
            +
            f"need help? ask here: <a href=\"https://github.com/KoleckOLP/yt-dl\">https://discord.gg/W88375j</a><br>"
            + f"youtube-dl (C)2008-2011 Ricardo Garcia Gonzalez<br>" +
            f"                 (C)2011-{year} youtube-dl developers<br>" +
            f"ffmpeg (C)2000-{year} FFmpeg team<br>" +
            f"Thanks to <a href=\"https://github.com/kangalioo\">kangalioo</a> who always helps a ton!<br>"
            +
            f"Thanks to <a href=\"https://github.com/siscodeorg\">siscode</a> for featuring my project<br>"
            + f"and helping me improve it.<br>" +
            f"You can read the changelog: <a href=\"https://github.com/KoleckOLP/yt-dl/blob/master/changelog.md\">here</a></pre></p>"
        )