diff --git a/config.py b/config.py index 40cb088..16172c1 100644 --- a/config.py +++ b/config.py @@ -51,11 +51,7 @@ DEFAULT_CONFIG = { "ignore_config": False, "remux_mkv": False, "embed_metadata": False, - "use_ffmpeg_location": False, - "cookies_from_browser": { - "enabled": False, - "browser": "chrome" - } + "use_ffmpeg_location": False }, "hide_default_presets": False, "enable_adn_tab": False, diff --git a/dialogs.py b/dialogs.py index faeaee4..de06f77 100644 --- a/dialogs.py +++ b/dialogs.py @@ -4,10 +4,10 @@ Dialog-Klassen für den Video Download Helper """ import os import subprocess -from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QFormLayout, QLineEdit, QTextEdit, - QPushButton, QComboBox, QCheckBox, QTabWidget, QWidget, - QHBoxLayout, QGroupBox, QLabel, QDialogButtonBox, - QFileDialog, QMessageBox) +from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QFormLayout, QLineEdit, QTextEdit, + QPushButton, QComboBox, QCheckBox, QTabWidget, QWidget, + QHBoxLayout, QGroupBox, QLabel, QDialogButtonBox, + QFileDialog, QMessageBox, QRadioButton, QButtonGroup) from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from config import get_base_path, SERIES_TEMPLATE @@ -148,27 +148,89 @@ class PresetDialog(QDialog): # Tab 4: Authentifizierung auth_tab = QWidget() - auth_layout = QFormLayout() - - # Login-Felder + auth_layout = QVBoxLayout() + + # Radio-Button-Gruppe für Authentifizierungsmethode + auth_method_label = QLabel("Authentifizierungsmethode:") + auth_layout.addWidget(auth_method_label) + + self.auth_button_group = QButtonGroup() + self.auth_none_radio = QRadioButton("Keine Authentifizierung") + self.auth_userpass_radio = QRadioButton("Username/Passwort") + self.auth_cookies_radio = QRadioButton("Cookies vom Browser") + + self.auth_button_group.addButton(self.auth_none_radio, 0) + self.auth_button_group.addButton(self.auth_userpass_radio, 1) + self.auth_button_group.addButton(self.auth_cookies_radio, 2) + + auth_layout.addWidget(self.auth_none_radio) + auth_layout.addWidget(self.auth_userpass_radio) + auth_layout.addWidget(self.auth_cookies_radio) + + # Username/Passwort-Gruppe + self.userpass_group = QGroupBox("Username/Passwort") + userpass_layout = QFormLayout() + self.username_edit = QLineEdit(self.preset_data.get("username", "")) - self.username_edit.setPlaceholderText("Optional: Benutzername für Login (-u)") - auth_layout.addRow("Benutzername:", self.username_edit) - + self.username_edit.setPlaceholderText("Benutzername für Login (-u)") + userpass_layout.addRow("Benutzername:", self.username_edit) + pw_hbox = QHBoxLayout() self.password_edit = QLineEdit(self.preset_data.get("password", "")) self.password_edit.setEchoMode(QLineEdit.Password) - self.password_edit.setPlaceholderText("Optional: Passwort für Login (-p)") + self.password_edit.setPlaceholderText("Passwort für Login (-p)") self.show_pw_cb = QCheckBox("Passwort anzeigen") self.show_pw_cb.toggled.connect(self.toggle_password_visible) pw_hbox.addWidget(self.password_edit) pw_hbox.addWidget(self.show_pw_cb) - auth_layout.addRow("Passwort:", pw_hbox) - + userpass_layout.addRow("Passwort:", pw_hbox) + pw_hint = QLabel("Hinweis: Passwörter werden im Klartext lokal gespeichert!") pw_hint.setStyleSheet("color: red;") - auth_layout.addRow(pw_hint) - + userpass_layout.addRow(pw_hint) + + self.userpass_group.setLayout(userpass_layout) + auth_layout.addWidget(self.userpass_group) + + # Cookies-Gruppe + self.cookies_group = QGroupBox("Cookies vom Browser") + cookies_layout = QFormLayout() + + self.browser_combo = QComboBox() + self.browser_combo.addItem("Chrome", "chrome") + self.browser_combo.addItem("Firefox", "firefox") + cookies_layout.addRow("Browser:", self.browser_combo) + + cookies_hint = QLabel("Nutzt Cookies aus dem angegebenen Browser (--cookies-from-browser)") + cookies_layout.addRow(cookies_hint) + + self.cookies_group.setLayout(cookies_layout) + auth_layout.addWidget(self.cookies_group) + + # Verbinde Radio-Buttons mit Update-Methode + self.auth_button_group.buttonToggled.connect(self.update_auth_fields_state) + + # Bestimme, welche Methode initial ausgewählt werden soll + cookies_enabled = self.preset_data.get("cookies_from_browser", {}).get("enabled", False) + has_username = bool(self.preset_data.get("username", "")) + has_password = bool(self.preset_data.get("password", "")) + + if cookies_enabled: + self.auth_cookies_radio.setChecked(True) + # Browser auswählen + browser = self.preset_data.get("cookies_from_browser", {}).get("browser", "chrome") + idx = self.browser_combo.findData(browser) + if idx >= 0: + self.browser_combo.setCurrentIndex(idx) + elif has_username or has_password: + self.auth_userpass_radio.setChecked(True) + else: + self.auth_none_radio.setChecked(True) + + # Initial state setzen + self.update_auth_fields_state() + + auth_layout.addStretch() auth_tab.setLayout(auth_layout) tabs.addTab(auth_tab, "Authentifizierung") @@ -283,6 +345,14 @@ class PresetDialog(QDialog): def toggle_password_visible(self, checked): self.password_edit.setEchoMode(QLineEdit.Normal if checked else QLineEdit.Password) + def update_auth_fields_state(self): + """Aktiviert/Deaktiviert die Authentifizierungs-Gruppen basierend auf Radio-Button-Auswahl.""" + is_userpass = self.auth_userpass_radio.isChecked() + is_cookies = self.auth_cookies_radio.isChecked() + + self.userpass_group.setEnabled(is_userpass) + self.cookies_group.setEnabled(is_cookies) + def toggle_format_selection(self, checked): # Diese Methode setzt Flags, wenn die Format-Auswahl aktiviert wird pass @@ -292,6 +362,10 @@ class PresetDialog(QDialog): self.dual_audio_group.setEnabled(checked) def get_preset_data(self): + # Bestimme Authentifizierungsmethode + is_userpass = self.auth_userpass_radio.isChecked() + is_cookies = self.auth_cookies_radio.isChecked() + return { "name": self.name_edit.text(), "description": self.description_edit.text(), @@ -303,8 +377,12 @@ class PresetDialog(QDialog): "episode": self.episode_edit.text(), "custom_path": self.custom_path_edit.text(), "is_audio": self.is_audio_cb.isChecked(), - "username": self.username_edit.text(), - "password": self.password_edit.text(), + "username": self.username_edit.text() if is_userpass else "", + "password": self.password_edit.text() if is_userpass else "", + "cookies_from_browser": { + "enabled": is_cookies, + "browser": self.browser_combo.currentData() if is_cookies else "chrome" + }, "referer": self.referer_edit.text(), "hls_ffmpeg": self.hls_ffmpeg_cb.isChecked(), "sublang": self.sublang_edit.text(), @@ -441,30 +519,6 @@ class OptionenDialog(QDialog): flags_layout.addWidget(self.cb_use_ffmpeg_location) flags_layout.addWidget(QLabel("Nutzt den konfigurierten FFmpeg-Pfad für yt-dlp.")) - # Cookies from Browser - self.cb_cookies_from_browser = QCheckBox("--cookies-from-browser") - cookies_config = self.selected_flags.get("cookies_from_browser", {"enabled": False, "browser": "chrome"}) - self.cb_cookies_from_browser.setChecked(cookies_config.get("enabled", False)) - self.cb_cookies_from_browser.toggled.connect(self.toggle_browser_combo) - flags_layout.addWidget(self.cb_cookies_from_browser) - - # Browser-Auswahl - browser_layout = QHBoxLayout() - browser_layout.addWidget(QLabel("Browser:")) - self.browser_combo = QComboBox() - self.browser_combo.addItem("Chrome", "chrome") - self.browser_combo.addItem("Firefox", "firefox") - # Vorbelegen - browser = cookies_config.get("browser", "chrome") - idx = self.browser_combo.findData(browser) - if idx >= 0: - self.browser_combo.setCurrentIndex(idx) - self.browser_combo.setEnabled(self.cb_cookies_from_browser.isChecked()) - browser_layout.addWidget(self.browser_combo) - browser_layout.addStretch() - flags_layout.addLayout(browser_layout) - flags_layout.addWidget(QLabel("Nutzt Cookies aus dem angegebenen Browser.")) - tab_flags.setLayout(flags_layout) tabs.addTab(tab_flags, "yt-dlp-Flags") @@ -472,7 +526,7 @@ class OptionenDialog(QDialog): tab_info = QWidget() info_layout = QVBoxLayout() info_text = ( - "Version: 1.4
" + "Version: 2.0
" "© 2025 Akamaru
" "Sourcecode: https://git.ponywave.de/Akamaru/video-download-helper
" "Erstellt mit Hilfe von Claude, GPT & Gemini" @@ -540,10 +594,6 @@ class OptionenDialog(QDialog): file_path = dialog.selectedFiles()[0] self.ffmpeg_path_input.setText(file_path) - def toggle_browser_combo(self, checked): - """Aktiviert/Deaktiviert die Browser-ComboBox basierend auf der Checkbox.""" - self.browser_combo.setEnabled(checked) - def get_values(self): return ( self.output_dir_input.text(), @@ -552,11 +602,7 @@ class OptionenDialog(QDialog): "ignore_config": self.cb_ignore_config.isChecked(), "remux_mkv": self.cb_remux_mkv.isChecked(), "embed_metadata": self.cb_embed_metadata.isChecked(), - "use_ffmpeg_location": self.cb_use_ffmpeg_location.isChecked(), - "cookies_from_browser": { - "enabled": self.cb_cookies_from_browser.isChecked(), - "browser": self.browser_combo.currentData() - } + "use_ffmpeg_location": self.cb_use_ffmpeg_location.isChecked() }, self.hide_defaults_cb.isChecked(), self.mkvmerge_path_input.text(), diff --git a/main.py b/main.py index e63d32b..384f7aa 100644 --- a/main.py +++ b/main.py @@ -521,8 +521,8 @@ class MainWindow(QMainWindow): # FFmpeg-Pfad if flags.get("use_ffmpeg_location") and self.config.get("ffmpeg_path"): cmd.extend(["--ffmpeg-location", self.config.get("ffmpeg_path")]) - # Cookies from Browser - cookies_config = flags.get("cookies_from_browser", {}) + # Cookies from Browser (aus Preset) + cookies_config = preset.get("cookies_from_browser", {}) if isinstance(cookies_config, dict) and cookies_config.get("enabled", False): browser = cookies_config.get("browser", "chrome") cmd.extend(["--cookies-from-browser", browser]) @@ -755,8 +755,8 @@ class MainWindow(QMainWindow): # FFmpeg-Pfad if flags.get("use_ffmpeg_location") and self.config.get("ffmpeg_path"): extra_args.extend(["--ffmpeg-location", self.config.get("ffmpeg_path")]) - # Cookies from Browser - cookies_config = flags.get("cookies_from_browser", {}) + # Cookies from Browser (aus Preset) + cookies_config = preset.get("cookies_from_browser", {}) if isinstance(cookies_config, dict) and cookies_config.get("enabled", False): browser = cookies_config.get("browser", "chrome") extra_args.extend(["--cookies-from-browser", browser]) @@ -1011,8 +1011,8 @@ class MainWindow(QMainWindow): extra_args.extend(["--downloader", "ffmpeg", "--hls-use-mpegts"]) if flags.get("use_ffmpeg_location") and self.config.get("ffmpeg_path"): extra_args.extend(["--ffmpeg-location", self.config.get("ffmpeg_path")]) - # Cookies from Browser - cookies_config = flags.get("cookies_from_browser", {}) + # Cookies from Browser (aus Preset) + cookies_config = preset.get("cookies_from_browser", {}) if isinstance(cookies_config, dict) and cookies_config.get("enabled", False): browser = cookies_config.get("browser", "chrome") extra_args.extend(["--cookies-from-browser", browser])