Add generic-mode URL validation and UI

Introduce a "generic_mode" option to allow validating/downloading from non-YouTube sites and wire it through the UI, config, and validation logic. Key changes:

- Add generic_mode default to ConfigManager and persist setting from DownloadSettingsDialog (checkbox + help text).
- Extend validate_video_url to accept a generic_mode flag and allow any http/https URL with a domain when enabled; pass this flag from Analysis and Download flows.
- Update YTSageApp to load/save generic_mode, update URL placeholder and settings tooltip behavior, and refresh tooltip when settings change.
- Improve robustness in FormatTableMixin: handle None/incorrect types for format_note, abr, resolution, ext, and codec values to avoid type errors and ensure consistent display.
- Add localization entries for generic mode, placeholder, and related help text across multiple language files and update the in-app default localization strings.

These changes enable broader site support via yt-dlp while hardening UI format handling and keeping user settings persistent.
This commit is contained in:
oop7
2026-03-12 11:10:10 +02:00
parent a98dad0a33
commit 9afca46c5d
21 changed files with 152 additions and 30 deletions
@@ -195,6 +195,24 @@ class DownloadSettingsDialog(QDialog):
speed_group_box.setLayout(speed_layout)
layout.addWidget(speed_group_box)
# --- Generic Mode Section ---
generic_mode_group_box = QGroupBox(_("settings.generic_mode"))
generic_mode_layout = QVBoxLayout()
self.generic_mode_enabled = ConfigManager.get("generic_mode") or False
self.generic_mode_checkbox = QCheckBox(_("settings.enable_generic_mode"))
self.generic_mode_checkbox.setChecked(self.generic_mode_enabled)
generic_mode_layout.addWidget(self.generic_mode_checkbox)
generic_mode_help_label = QLabel(_("settings.generic_mode_help"))
generic_mode_help_label.setWordWrap(True)
generic_mode_help_label.setStyleSheet("color: #cccccc; margin: 5px; font-size: 11px;")
generic_mode_layout.addWidget(generic_mode_help_label)
generic_mode_group_box.setLayout(generic_mode_layout)
layout.addWidget(generic_mode_group_box)
# --- Output Format Settings Section ---
output_format_group_box = QGroupBox(_("settings.output_format_settings"))
output_format_layout = QVBoxLayout()
@@ -349,6 +367,10 @@ class DownloadSettingsDialog(QDialog):
"""Returns whether force output format is enabled."""
return self.force_format_checkbox.isChecked()
def get_generic_mode_enabled(self) -> bool:
"""Returns whether generic mode is enabled."""
return self.generic_mode_checkbox.isChecked()
def get_preferred_format(self) -> str:
"""Returns the selected preferred format (lowercase)."""
format_map = {0: "mp4", 1: "webm", 2: "mkv"}
@@ -405,6 +427,8 @@ class DownloadSettingsDialog(QDialog):
def accept(self) -> None:
"""Override accept to save format settings."""
try:
ConfigManager.set("generic_mode", self.get_generic_mode_enabled())
# Save output format settings
force_format = self.get_force_format_enabled()
preferred_format = self.get_preferred_format()