Refactor GUI package structure and update imports

Moved all files from src/gui/ to ytsage/gui/ and updated import statements to use relative imports within the new package structure. This improves modularity and prepares the codebase for distribution as a proper Python package.
This commit is contained in:
oop7
2026-01-25 14:07:51 +02:00
parent 4fb9815ac6
commit 96dadd7e5b
15 changed files with 78 additions and 78 deletions
@@ -5,14 +5,14 @@ import subprocess
from PySide6.QtCore import QMetaObject, Qt, Q_ARG, QThread, Signal
from PySide6.QtWidgets import QMessageBox
from src.core.ytsage_utils import validate_video_url, parse_yt_dlp_error
from src.core.ytsage_yt_dlp import get_yt_dlp_path
from src.utils.ytsage_constants import SUBPROCESS_CREATIONFLAGS
from src.utils.ytsage_localization import _
from src.utils.ytsage_logger import logger
from ..core.ytsage_utils import validate_video_url, parse_yt_dlp_error
from ..core.ytsage_yt_dlp import get_yt_dlp_path
from ..utils.ytsage_constants import SUBPROCESS_CREATIONFLAGS
from ..utils.ytsage_localization import _
from ..utils.ytsage_logger import logger
if TYPE_CHECKING:
from src.gui.ytsage_gui_main import YTSageApp
from .ytsage_gui_main import YTSageApp
class AnalysisThread(QThread):
@@ -12,18 +12,18 @@ This package contains all dialog classes organized by functionality:
"""
# Re-export all dialog classes for backward compatibility
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_base import AboutDialog, LogWindow
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_custom import CustomOptionsDialog, TimeRangeDialog
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_ffmpeg import FFmpegCheckDialog, FFmpegInstallThread
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_history import HistoryDialog
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_selection import (
from .ytsage_dialogs_base import AboutDialog, LogWindow
from .ytsage_dialogs_custom import CustomOptionsDialog, TimeRangeDialog
from .ytsage_dialogs_ffmpeg import FFmpegCheckDialog, FFmpegInstallThread
from .ytsage_dialogs_history import HistoryDialog
from .ytsage_dialogs_selection import (
PlaylistSelectionDialog,
SponsorBlockCategoryDialog,
SubtitleSelectionDialog,
)
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_settings import AutoUpdateSettingsDialog, DownloadSettingsDialog
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_update import AutoUpdateThread, UpdateThread, VersionCheckThread, YTDLPUpdateDialog
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_updater import UpdaterTabWidget
from .ytsage_dialogs_settings import AutoUpdateSettingsDialog, DownloadSettingsDialog
from .ytsage_dialogs_update import AutoUpdateThread, UpdateThread, VersionCheckThread, YTDLPUpdateDialog
from .ytsage_dialogs_updater import UpdaterTabWidget
__all__ = [
# Base dialogs
@@ -19,13 +19,13 @@ from PySide6.QtWidgets import (
QWidget,
)
from src import __version__ as APP_VERSION
from src.utils.ytsage_localization import _
from ... import __version__ as APP_VERSION
from ...utils.ytsage_localization import _
from src.core.ytsage_ffmpeg import get_ffmpeg_path
from src.core.ytsage_utils import _version_cache, check_ffmpeg, get_ffmpeg_version, get_ytdlp_version, get_deno_version, refresh_version_cache
from src.core.ytsage_yt_dlp import check_ytdlp_installed, get_yt_dlp_path
from src.core.ytsage_deno import check_deno_installed, get_deno_path
from ...core.ytsage_ffmpeg import get_ffmpeg_path
from ...core.ytsage_utils import _version_cache, check_ffmpeg, get_ffmpeg_version, get_ytdlp_version, get_deno_version, refresh_version_cache
from ...core.ytsage_yt_dlp import check_ytdlp_installed, get_yt_dlp_path
from ...core.ytsage_deno import check_deno_installed, get_deno_path
class LogWindow(QDialog):
@@ -459,7 +459,7 @@ class AboutDialog(QDialog):
# Only show path if it's not the fallback "deno" and the file exists
if deno_path and deno_path != "deno":
from pathlib import Path
from src.utils.ytsage_constants import DENO_APP_BIN_PATH
from ...utils.ytsage_constants import DENO_APP_BIN_PATH
# Check if the path is our managed binary
if Path(deno_path).resolve() == DENO_APP_BIN_PATH.resolve():
deno_path_text = deno_path
@@ -29,16 +29,16 @@ from PySide6.QtWidgets import (
QWidget,
)
from src.core.ytsage_yt_dlp import get_yt_dlp_path
from src.core.ytsage_utils import update_auto_update_settings
from src.utils.ytsage_constants import YTDLP_DOCS_URL
from src.utils.ytsage_config_manager import ConfigManager
from src.utils.ytsage_localization import LocalizationManager, _
from src.utils.ytsage_logger import logger
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_updater import UpdaterTabWidget
from ...core.ytsage_yt_dlp import get_yt_dlp_path
from ...core.ytsage_utils import update_auto_update_settings
from ...utils.ytsage_constants import YTDLP_DOCS_URL
from ...utils.ytsage_config_manager import ConfigManager
from ...utils.ytsage_localization import LocalizationManager, _
from ...utils.ytsage_logger import logger
from .ytsage_dialogs_updater import UpdaterTabWidget
if TYPE_CHECKING:
from src.gui.ytsage_gui_main import YTSageApp # only for type hints (no runtime import)
from ..ytsage_gui_main import YTSageApp # only for type hints (no runtime import)
class CommandWorker(QObject):
@@ -9,9 +9,9 @@ from PySide6.QtCore import Qt, QThread, Signal
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QDialog, QHBoxLayout, QLabel, QPushButton, QVBoxLayout
from src.core.ytsage_ffmpeg import auto_install_ffmpeg, check_ffmpeg_installed
from src.utils.ytsage_constants import ICON_PATH
from src.utils.ytsage_localization import _
from ...core.ytsage_ffmpeg import auto_install_ffmpeg, check_ffmpeg_installed
from ...utils.ytsage_constants import ICON_PATH
from ...utils.ytsage_localization import _
class FFmpegInstallThread(QThread):
@@ -37,13 +37,13 @@ from PySide6.QtWidgets import (
QApplication
)
from src.utils.ytsage_history_manager import HistoryManager
from src.utils.ytsage_constants import APP_THUMBNAILS_DIR, SUBPROCESS_CREATIONFLAGS
from src.utils.ytsage_localization import _
from src.utils.ytsage_logger import logger
from ...utils.ytsage_history_manager import HistoryManager
from ...utils.ytsage_constants import APP_THUMBNAILS_DIR, SUBPROCESS_CREATIONFLAGS
from ...utils.ytsage_localization import _
from ...utils.ytsage_logger import logger
if TYPE_CHECKING:
from src.gui.ytsage_gui_main import YTSageApp
from ..ytsage_gui_main import YTSageApp
class HistoryLoaderThread(QThread):
@@ -17,7 +17,7 @@ from PySide6.QtWidgets import (
QWidget,
)
from src.utils.ytsage_localization import _
from ...utils.ytsage_localization import _
class SubtitleSelectionDialog(QDialog):
@@ -27,9 +27,9 @@ from PySide6.QtWidgets import (
QVBoxLayout,
)
from src.utils.ytsage_logger import logger
from src.utils.ytsage_localization import _
from src.utils.ytsage_config_manager import ConfigManager
from ...utils.ytsage_logger import logger
from ...utils.ytsage_localization import _
from ...utils.ytsage_config_manager import ConfigManager
class DownloadSettingsDialog(QDialog):
@@ -14,16 +14,16 @@ from packaging import version
from PySide6.QtCore import Qt, QThread, QTimer, Signal
from PySide6.QtWidgets import QDialog, QHBoxLayout, QLabel, QProgressBar, QPushButton, QVBoxLayout
from src.core.ytsage_utils import get_ytdlp_version
from src.core.ytsage_yt_dlp import get_yt_dlp_path
from src.utils.ytsage_constants import OS_NAME, SUBPROCESS_CREATIONFLAGS, YTDLP_APP_BIN_PATH, YTDLP_DOWNLOAD_URL
from src.utils.ytsage_config_manager import ConfigManager
from src.utils.ytsage_localization import LocalizationManager
from ...core.ytsage_utils import get_ytdlp_version
from ...core.ytsage_yt_dlp import get_yt_dlp_path
from ...utils.ytsage_constants import OS_NAME, SUBPROCESS_CREATIONFLAGS, YTDLP_APP_BIN_PATH, YTDLP_DOWNLOAD_URL
from ...utils.ytsage_config_manager import ConfigManager
from ...utils.ytsage_localization import LocalizationManager
# Shorthand for localization
_ = LocalizationManager.get_text
from src.utils.ytsage_localization import _
from src.utils.ytsage_logger import logger
from ...utils.ytsage_localization import _
from ...utils.ytsage_logger import logger
class VersionCheckThread(QThread):
@@ -23,25 +23,25 @@ from PySide6.QtWidgets import (
QWidget,
)
from src.core.ytsage_utils import (
from ...core.ytsage_utils import (
get_auto_update_settings,
get_ffmpeg_version_direct,
update_auto_update_settings,
)
from src.core.ytsage_yt_dlp import get_yt_dlp_path
from src.core.ytsage_deno import check_deno_update, upgrade_deno
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_update import YTDLPUpdateDialog
from src.utils.ytsage_config_manager import ConfigManager
from src.utils.ytsage_localization import _
from src.utils.ytsage_logger import logger
from src.utils.ytsage_constants import (
from ...core.ytsage_yt_dlp import get_yt_dlp_path
from ...core.ytsage_deno import check_deno_update, upgrade_deno
from .ytsage_dialogs_update import YTDLPUpdateDialog
from ...utils.ytsage_config_manager import ConfigManager
from ...utils.ytsage_localization import _
from ...utils.ytsage_logger import logger
from ...utils.ytsage_constants import (
FFMPEG_7Z_VERSION_URL,
OS_NAME,
SUBPROCESS_CREATIONFLAGS,
)
if TYPE_CHECKING:
from src.gui.ytsage_gui_dialogs.ytsage_dialogs_custom import CustomOptionsDialog
from .ytsage_dialogs_custom import CustomOptionsDialog
# Helper functions for FFmpeg version checking (copied from removed ytsage_ffmpeg_updater.py)
@@ -4,10 +4,10 @@ from PySide6.QtCore import QObject, Qt, Signal
from PySide6.QtGui import QColor, QFontMetrics
from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QHeaderView, QSizePolicy, QTableWidget, QTableWidgetItem, QWidget
from src.utils.ytsage_localization import _
from ..utils.ytsage_localization import _
if TYPE_CHECKING:
from src.gui.ytsage_gui_main import YTSageApp
from .ytsage_gui_main import YTSageApp
class FormatSignals(QObject):
@@ -28,12 +28,12 @@ from PySide6.QtWidgets import (
QWidget,
)
from src import __version__ as APP_VERSION
from src.core.ytsage_downloader import DownloadThread, SignalManager # Import downloader related classes
from src.core.ytsage_utils import check_ffmpeg, load_saved_path, parse_yt_dlp_error, save_path, should_check_for_auto_update, validate_video_url
from src.core.ytsage_yt_dlp import get_yt_dlp_path, setup_ytdlp # Import the new yt-dlp functions
from src.core.ytsage_deno import get_deno_path, setup_deno # Import the new Deno functions
from src.gui.ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__init__.py
from .. import __version__ as APP_VERSION
from ..core.ytsage_downloader import DownloadThread, SignalManager # Import downloader related classes
from ..core.ytsage_utils import check_ffmpeg, load_saved_path, parse_yt_dlp_error, save_path, should_check_for_auto_update, validate_video_url
from ..core.ytsage_yt_dlp import get_yt_dlp_path, setup_ytdlp # Import the new yt-dlp functions
from ..core.ytsage_deno import get_deno_path, setup_deno # Import the new Deno functions
from .ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__init__.py
AboutDialog,
AutoUpdateThread,
CustomOptionsDialog,
@@ -44,10 +44,10 @@ from src.gui.ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__
TimeRangeDialog,
YTDLPUpdateDialog,
)
from src.gui.ytsage_gui_format_table import FormatTableMixin
from src.gui.ytsage_gui_video_info import VideoInfoMixin
from src.gui.ytsage_gui_analysis import AnalysisMixin
from src.utils.ytsage_constants import (
from .ytsage_gui_format_table import FormatTableMixin
from .ytsage_gui_video_info import VideoInfoMixin
from .ytsage_gui_analysis import AnalysisMixin
from ..utils.ytsage_constants import (
ICON_PATH,
SOUND_PATH,
SUBPROCESS_CREATIONFLAGS,
@@ -55,11 +55,11 @@ from src.utils.ytsage_constants import (
AUDIO_EXTENSIONS,
SUBTITLE_EXTENSIONS,
)
from src.utils.ytsage_logger import logger
from src.utils.ytsage_config_manager import ConfigManager
from src.utils.ytsage_localization import LocalizationManager, _
from src.utils.ytsage_history_manager import HistoryManager
from src.gui.ytsage_stylesheet import StyleSheet
from ..utils.ytsage_logger import logger
from ..utils.ytsage_config_manager import ConfigManager
from ..utils.ytsage_localization import LocalizationManager, _
from ..utils.ytsage_history_manager import HistoryManager
from .ytsage_stylesheet import StyleSheet
from concurrent.futures import ThreadPoolExecutor, as_completed
@@ -10,15 +10,15 @@ from PySide6.QtCore import Qt, QThread, Signal
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget
from src.gui.ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__init__.py
from .ytsage_gui_dialogs import ( # use of src\gui\ytsage_gui_dialogs\__init__.py
SponsorBlockCategoryDialog,
SubtitleSelectionDialog,
)
from src.utils.ytsage_localization import _
from src.utils.ytsage_logger import logger
from ..utils.ytsage_localization import _
from ..utils.ytsage_logger import logger
if TYPE_CHECKING:
from src.gui.ytsage_gui_main import YTSageApp
from .ytsage_gui_main import YTSageApp
class ThumbnailDownloadThread(QThread):