From 96dadd7e5b149e22423cc8bd950dd86042a6ee5c Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:07:51 +0200 Subject: [PATCH] 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. --- {src => ytsage}/gui/__init__.py | 0 {src => ytsage}/gui/ytsage_gui_analysis.py | 12 ++++---- .../gui/ytsage_gui_dialogs/__init__.py | 16 +++++----- .../ytsage_gui_dialogs/ytsage_dialogs_base.py | 14 ++++----- .../ytsage_dialogs_custom.py | 16 +++++----- .../ytsage_dialogs_ffmpeg.py | 6 ++-- .../ytsage_dialogs_history.py | 10 +++---- .../ytsage_dialogs_selection.py | 2 +- .../ytsage_dialogs_settings.py | 6 ++-- .../ytsage_dialogs_update.py | 14 ++++----- .../ytsage_dialogs_updater.py | 18 +++++------ .../gui/ytsage_gui_format_table.py | 4 +-- {src => ytsage}/gui/ytsage_gui_main.py | 30 +++++++++---------- {src => ytsage}/gui/ytsage_gui_video_info.py | 8 ++--- {src => ytsage}/gui/ytsage_stylesheet.py | 0 15 files changed, 78 insertions(+), 78 deletions(-) rename {src => ytsage}/gui/__init__.py (100%) rename {src => ytsage}/gui/ytsage_gui_analysis.py (97%) rename {src => ytsage}/gui/ytsage_gui_dialogs/__init__.py (63%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py (97%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py (98%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py (97%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py (98%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py (99%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py (99%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py (97%) rename {src => ytsage}/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py (98%) rename {src => ytsage}/gui/ytsage_gui_format_table.py (99%) rename {src => ytsage}/gui/ytsage_gui_main.py (98%) rename {src => ytsage}/gui/ytsage_gui_video_info.py (98%) rename {src => ytsage}/gui/ytsage_stylesheet.py (100%) diff --git a/src/gui/__init__.py b/ytsage/gui/__init__.py similarity index 100% rename from src/gui/__init__.py rename to ytsage/gui/__init__.py diff --git a/src/gui/ytsage_gui_analysis.py b/ytsage/gui/ytsage_gui_analysis.py similarity index 97% rename from src/gui/ytsage_gui_analysis.py rename to ytsage/gui/ytsage_gui_analysis.py index b1bcaa2..0a37739 100644 --- a/src/gui/ytsage_gui_analysis.py +++ b/ytsage/gui/ytsage_gui_analysis.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/__init__.py b/ytsage/gui/ytsage_gui_dialogs/__init__.py similarity index 63% rename from src/gui/ytsage_gui_dialogs/__init__.py rename to ytsage/gui/ytsage_gui_dialogs/__init__.py index c0e8b9f..8bae87b 100644 --- a/src/gui/ytsage_gui_dialogs/__init__.py +++ b/ytsage/gui/ytsage_gui_dialogs/__init__.py @@ -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 diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py similarity index 97% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py index ee159a2..1f5ad26 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py @@ -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 diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py similarity index 98% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py index b254f8a..49de1fd 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_custom.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py similarity index 97% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py index 44eb563..99b79f9 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_ffmpeg.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py similarity index 98% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py index 6c41906..b3987f2 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_history.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py similarity index 99% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py index bead261..1990bd2 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_selection.py @@ -17,7 +17,7 @@ from PySide6.QtWidgets import ( QWidget, ) -from src.utils.ytsage_localization import _ +from ...utils.ytsage_localization import _ class SubtitleSelectionDialog(QDialog): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py similarity index 99% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py index 0d04f29..3b68fd7 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_settings.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py similarity index 97% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py index 5b5d605..1ceca4e 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_update.py @@ -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): diff --git a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py similarity index 98% rename from src/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py rename to ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py index 06853cd..e73a2e8 100644 --- a/src/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_updater.py @@ -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) diff --git a/src/gui/ytsage_gui_format_table.py b/ytsage/gui/ytsage_gui_format_table.py similarity index 99% rename from src/gui/ytsage_gui_format_table.py rename to ytsage/gui/ytsage_gui_format_table.py index bf03cd3..b3794ac 100644 --- a/src/gui/ytsage_gui_format_table.py +++ b/ytsage/gui/ytsage_gui_format_table.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): diff --git a/src/gui/ytsage_gui_main.py b/ytsage/gui/ytsage_gui_main.py similarity index 98% rename from src/gui/ytsage_gui_main.py rename to ytsage/gui/ytsage_gui_main.py index ffc406d..8b6c728 100644 --- a/src/gui/ytsage_gui_main.py +++ b/ytsage/gui/ytsage_gui_main.py @@ -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 diff --git a/src/gui/ytsage_gui_video_info.py b/ytsage/gui/ytsage_gui_video_info.py similarity index 98% rename from src/gui/ytsage_gui_video_info.py rename to ytsage/gui/ytsage_gui_video_info.py index 8ab17f8..f081136 100644 --- a/src/gui/ytsage_gui_video_info.py +++ b/ytsage/gui/ytsage_gui_video_info.py @@ -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): diff --git a/src/gui/ytsage_stylesheet.py b/ytsage/gui/ytsage_stylesheet.py similarity index 100% rename from src/gui/ytsage_stylesheet.py rename to ytsage/gui/ytsage_stylesheet.py