Files
SageTube/.github/CI_CD_README.md
T
Viren Hirpara e9de913b47 v4.9.0 - Refactor (#41)
* fix imports
remove unused imports
use full import path
sort import (1. Standard Library, 2. Third-Party, 3. Local) in alphabetic.

* - remove: Method 3 from src.core.ytsage_downlader:cleanup_subtitle_file
  - it could delete the subtitle file of other movies if it present in same directory as it scane recursively.

- refactor: migrate from os.path to pathlib.Path for path handling
  - Replaced os.path methods with pathlib.Path to improve readability,
  - avoid repeatation.
  - cross-platform compatibility, and maintain cleaner code.

- improve: enhance code readability
  - Standardized string literals to use double quotes for consistency
  - Removed unnecessary spaces to maintain cleaner formatting
  - Applied code formatting for better readability and maintainability

* - add: ytsage_constants.py file for one place to store all constants.

- imporve: return type hint for function.

- remove: src/gui/ytsage_gui_dialogs.py file to avoid repetation
  - src/gui/dialogs is renamed to src/gui/ytsage_gui_dialogs for same naming convection. (future import will remains same)
  - use of src/gui/ytsage_gui_dialogs/__init__.py to import the dilogs modules.

- change: variable self.parent to self._parent so it does not overwrite the parent()
  - add type hint checking.

* - refactor: QMetaObject.invokeMethod to Signal
  - I encounter error with incokeMethod. Could not solve it.
  - So, Changed it to Signal to match app code language.

- implement: the ytsage_constants.py to code
  - remove: unnecessary logic
  - remove: repetitive code logic.

- update: yt-dlp logic for src\gui\ytsage_gui_dialogs\ytsage_dialogs_update:_update_binary
  - yt-dlp update logic will use `yt-dlp -U`

* refactor: remove unused imports and streamline code formatting across multiple files

* - **refactor: drop `pygame` in favor of built-in `PySide6` sound**

- Removed `pygame` dependency (too heavy just for notifications).
- Replaced with `QSoundEffect`, which is lightweight and built into `PySide6`.
- Dropped `pygame.mixer` + threading → Qt handles async playback.
- Implemented sound playback with `QUrl.fromLocalFile()` and `.play()`.
- Added `setVolume(0.9)` as a configurable example.
- Converted notification sound from `.mp3` to `.wav` (only format supported).

* **refactor(utils): simplify logger module**
  - Moved `logger` to `src.utils`
  - Removed unnecessary import checks (logger is always available)
  - Replaced `raise` statements with error logging to prevent crashes
  - Use `logger.exception()` in `except` blocks to capture traceback (logged as error)

**style: remove redundant str() in f-strings**
  - Dropped explicit `str()` calls inside f-strings
  - f-strings already call `str()` under the hood

**chore: add type hints for GUI mixins**
  - Added type hints for `FormatTableMixin` (`src.gui.ytsage_gui_format_table`)
  - Added type hints for `VideoInfoMixin` (`src.gui.ytsage_gui_video_info`)
  - Improves autocomplete and type safety in IDEs

* - **introduce the `ytsage_config_manager.py` module to manage app setting.**
  - Loads settings from a JSON config file (`APP_CONFIG_FILE`).
  - Creates the config file with default values if missing or corrupt.
  - Retrieves, sets, and deletes settings using simple dot-separated keys.
  - Provides safe error handling with logging instead of raising exceptions.
  - Persists updates back to disk automatically.

- **Usage**
```python
from src.utils.ytsage_config_manager import ConfigManager

download_path = ConfigManager.get("download_path")

ConfigManager.set("download_path", "D:/Downloads")

last_check = ConfigManager.get("cached_versions.ytdlp.last_check")

ConfigManager.delete("cached_versions.ffmpeg.path")
```

* **Refactore: pkg_resources with importlib.metadata.version**
  - UserWarning: pkg_resources is deprecated as an API.
  - See https://setuptools.pypa.io/en/latest/pkg_resources.html.
  - The pkg_resources package is slated for removal as early as 2025-11-30.

* **refactore: notification sound**
  - `QSoundEffect` is chnaged back to `pyglet` as per mainter `@oop7` choise.
  - simplify the logic.

* remove: import check, it should always work.

* **fix: runtime error**
  - yt_dlp moved from `--excludes` to `--packages` in `build-windows.yml`
  - In frozen build, logger will not log to consol. insted will log to file.
  - In frozen build, `app_dir` is next to `.exe` file.

* chang back to checking import for ytdlp

* Bump version to 4.8.1

Update version references from 4.8.0b to 4.8.1 in __init__.py, main app, and About dialog to reflect the new release.

* Update asset paths in build workflows

Changed asset inclusion and screenshot removal paths from 'assets' to 'lib/assets' in Linux, macOS, and Windows build workflows to reflect new directory structure and ensure screenshots are excluded from packaged builds.

* Bump version to 4.8.2

Update version references from 4.8.1 to 4.8.2 in source files and documentation to prepare for a new patch release.

* Fix asset include path in Windows build workflow

Corrects the syntax for including asset files in the build-windows.yml workflow by changing 'assets,lib/assets' to 'assets=lib/assets'. This ensures assets are properly mapped during the build process.

* Update release tag examples in CI/CD README

Changed the example git tag commands from v4.8.0 and v4.8.2 to v4.8.1 for consistency in the CI/CD documentation.

* Fix include-files mapping in Windows build workflow

Changed the cx_Freeze --include-files argument from '=' to ':' for source:destination mapping in build-windows.yml. This resolves an issue where '=' was treated as a literal path, ensuring assets are correctly copied to the destination directory.

* Remove redundant comments in build-windows workflow

Deleted comments explaining the colon usage for source:destination mapping in the cx_Freeze CLI, as the mapping is already clear from the context.

* Refactor Windows build to use cx_Freeze setup script

Replaces direct cx_Freeze CLI calls with dynamically generated setup scripts for both standard and FFmpeg builds. This improves maintainability and flexibility of build configuration in the GitHub Actions workflow.

* Bump version to 4.8.3

Updated version references from 4.8.2 to 4.8.3 in __init__.py, main app, and About dialog to reflect the new release.

* revert(build): move yt_dlp from --packages to --excludes in build-windows.yml

---------

Co-authored-by: Your Name <mohamed.mohamed112@ai.mnu.edu.eg>
2025-09-09 23:01:19 +03:00

3.8 KiB

YTSage CI/CD Workflow

This repository uses GitHub Actions to automatically build and release YTSage for multiple platforms when version tags are pushed.

How It Works

Trigger

The workflow is triggered when you push a git tag that starts with v (e.g., v4.8.0, v4.9.1).

Build Process

  1. Setup: Uses Python 3.13.6 on all platforms
  2. Builds: Creates platform-specific executables using cx_Freeze
  3. Packages: Generates native package formats for each platform
  4. Release: Creates a draft GitHub release with all artifacts

Usage

Creating a Release

  1. Update version in your source code if needed

  2. Commit your changes:

    git add .
    git commit -m "Release v4.8.0"
    
  3. Create and push a tag:

    git tag v4.8.0
    git push origin v4.8.0
    
  4. Watch the action: Go to Actions tab in GitHub to monitor progress

  5. Review draft release: Once complete, check the Releases section for the draft

Release Artifacts

The workflow creates the following files based on the platform:

Windows

  • YTSage-v{version}-portable.zip - Standard portable version
  • YTSage-v{version}-ffmpeg-portable.zip - FFmpeg bundle portable

Linux

  • YTSage-v{version}-{arch}.AppImage - AppImage portable
  • YTSage-v{version}-{arch}.rpm - RPM package
  • YTSage-v{version}-{arch}.deb - Debian package

macOS

  • YTSage-v{version}-{arch}.app.zip - Zipped application bundle
  • YTSage-v{version}-{arch}.dmg - Disk image installer

Workflow Features

Multi-Platform Support

  • Windows: Uses PowerShell scripts with cx_Freeze
  • Linux: Uses Bash scripts with cx_Freeze, creates AppImage, RPM, and DEB
  • macOS: Matrix build for both Intel (x64) and Apple Silicon (arm64)

Automatic Version Detection

  • Extracts version from git tag (removes 'v' prefix)
  • Names all artifacts consistently across platforms

Caching

  • Python dependencies are cached to speed up builds
  • Virtual environment is cached between runs

Error Handling

  • Comprehensive error checking at each step
  • Detailed logging for troubleshooting
  • Artifact verification before upload

Security

  • Uses official GitHub Actions
  • No external dependencies
  • Secure token handling

Manual Intervention

After Workflow Completion

  1. Review the draft release in GitHub
  2. Test the artifacts if needed
  3. Edit release notes if desired
  4. Publish the release when ready

Troubleshooting

If the workflow fails:

  1. Check the Actions logs for error details
  2. Ensure all required files are present
  3. Verify the tag format is correct (v*)
  4. Check that dependencies are properly listed

Configuration

Modifying the Workflow

The workflow files are located in .github/workflows/:

  • build-windows.yml - Windows builds
  • build-linux.yml - Linux builds
  • build-macos.yml - macOS builds

Key Configuration Options

  • PYTHON_VERSION: Python version (currently 3.13.6)
  • Artifact naming patterns
  • Release note templates
  • Build optimization settings

Adding New Build Types

To add new platform packages:

  1. Create or modify workflow files in .github/workflows/
  2. Target the appropriate OS runner (windows-latest, ubuntu-latest, macos-latest)
  3. Use cx_Freeze or PyInstaller for packaging
  4. Package the build output in platform-native formats
  5. Upload the artifacts and include them in the release

Notes

  • All builds use cx_Freeze for packaging
  • FFmpeg binaries are bundled where needed
  • Screenshots are removed from builds to reduce size
  • Draft releases allow for review before publication
  • macOS builds run on both Intel and Apple Silicon runners

Example Tag Commands

# For a new release
git tag v4.8.1
git push origin v4.8.1

# For a patch release
git tag v4.8.1
git push origin v4.8.1

# To delete a tag (if needed)
git tag -d v4.8.1
git push origin :refs/tags/v4.8.1