From b3144798f441bf5353ca7382d3c91c61997cd02c Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Wed, 7 Jan 2026 18:13:43 +0200 Subject: [PATCH 01/23] Add Flatpak-specific desktop file and env var to build Introduces creation of a Flatpak-specific desktop file with correct Exec and Icon fields. Adds DENO_APP_BIN_PATH environment variable to Flatpak manifest and updates install commands to use the new desktop file. --- .github/workflows/build-linux.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 194e601..bf7182f 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -392,6 +392,21 @@ jobs: # Define manifest ID APP_ID="io.github.oop7.YTSage" + # Create a specific desktop file for Flatpak + # - Exec must be 'ytsage' (in path), not /usr/bin/ytsage + # - Icon must match the App ID (io.github.oop7.YTSage) + cat > flatpak.desktop < ytsage_flatpak.json < Date: Wed, 7 Jan 2026 18:14:05 +0200 Subject: [PATCH 02/23] Add env var override for DENO_APP_BIN_PATH on Linux Allows DENO_APP_BIN_PATH to be set via environment variable, supporting Flatpak and custom setups. Also ensures parent directories for both yt-dlp and deno binaries are created if custom paths are set. --- src/utils/ytsage_constants.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/utils/ytsage_constants.py b/src/utils/ytsage_constants.py index 2f4d7b2..d1a6a8c 100644 --- a/src/utils/ytsage_constants.py +++ b/src/utils/ytsage_constants.py @@ -166,7 +166,13 @@ def get_asset_path(asset_relative_path: str) -> Path: else: # Linux DENO_DOWNLOAD_URL: str = "https://github.com/denoland/deno/releases/latest/download/deno-x86_64-unknown-linux-gnu.zip" DENO_SHA256_URL: str = "https://github.com/denoland/deno/releases/latest/download/deno-x86_64-unknown-linux-gnu.zip.sha256sum" - DENO_APP_BIN_PATH: Path = APP_BIN_DIR / "deno" + + # Check for environment variable override (critical for Flatpak support) + _deno_env_path = os.environ.get("DENO_APP_BIN_PATH") + if _deno_env_path: + DENO_APP_BIN_PATH: Path = Path(_deno_env_path) + else: + DENO_APP_BIN_PATH: Path = APP_BIN_DIR / "deno" # FFmpeg download links (Essentials build - always latest version) FFMPEG_7Z_DOWNLOAD_URL = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.7z" @@ -203,4 +209,8 @@ def get_asset_path(asset_relative_path: str) -> Path: # Ensure custom yt-dlp directory exists if set if OS_NAME not in ["Windows", "Darwin"]: - YTDLP_APP_BIN_PATH.parent.mkdir(parents=True, exist_ok=True) + # Ensure parent directories exist for custom paths + if "YTDLP_APP_BIN_PATH" in globals(): + YTDLP_APP_BIN_PATH.parent.mkdir(parents=True, exist_ok=True) + if "DENO_APP_BIN_PATH" in globals(): + DENO_APP_BIN_PATH.parent.mkdir(parents=True, exist_ok=True) From 1e5157bbadd87bcd9a070cd0162bec487e29799d Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sat, 17 Jan 2026 22:06:10 +0200 Subject: [PATCH 03/23] Sync with the beta branch --- .github/workflows/release-all.yml | 59 ++++++++++++++++--------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/.github/workflows/release-all.yml b/.github/workflows/release-all.yml index 7e0fdef..5699b51 100644 --- a/.github/workflows/release-all.yml +++ b/.github/workflows/release-all.yml @@ -1,28 +1,31 @@ -name: Create All Releases - -on: - workflow_dispatch: - inputs: - version: - description: 'Version name for the release (e.g., 1.0.0)' - required: true - type: string - -jobs: - release-windows: - uses: ./.github/workflows/build-windows.yml - with: - version: ${{ inputs.version }} - secrets: inherit - - release-linux: - uses: ./.github/workflows/build-linux.yml - with: - version: ${{ inputs.version }} - secrets: inherit - - release-macos: - uses: ./.github/workflows/build-macos.yml - with: - version: ${{ inputs.version }} - secrets: inherit +name: Create All Releases + +on: + workflow_dispatch: + inputs: + version: + description: 'Version name for the release (e.g., 1.0.0)' + required: true + type: string + +permissions: + contents: write + +jobs: + release-windows: + uses: ./.github/workflows/build-windows.yml + with: + version: ${{ inputs.version }} + secrets: inherit + + release-linux: + uses: ./.github/workflows/build-linux.yml + with: + version: ${{ inputs.version }} + secrets: inherit + + release-macos: + uses: ./.github/workflows/build-macos.yml + with: + version: ${{ inputs.version }} + secrets: inherit From 92c5484ffe96a9753f19d3df9bd11da08f845ccc Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:33:15 +0200 Subject: [PATCH 04/23] Update Linux build workflow for PEP 517 and cx_Freeze Switch pip install to use PEP 517 (pyproject.toml) instead of requirements.txt and update cache key accordingly. Refactor cx_Freeze setup to use new asset paths, add entry point script, and adjust include_files for correct packaging structure. --- .github/workflows/build-linux.yml | 32 ++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index bf7182f..bb05ae1 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -49,7 +49,7 @@ jobs: path: | venv ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- @@ -67,7 +67,7 @@ jobs: python -m venv venv source venv/bin/activate python -m pip install --upgrade pip - pip install --no-cache-dir -r requirements.txt + pip install --no-cache-dir . pip install --no-cache-dir cx_Freeze - name: Prepare build variables @@ -82,6 +82,13 @@ jobs: - name: Create cx_Freeze setup script (Linux) shell: bash run: | + # Create entry point script + cat > ytsage_entry.py <<'ENTRY' + from ytsage.main import main + if __name__ == "__main__": + main() + ENTRY + cat > setup_cxfreeze.py <<'PY' import os import sys @@ -92,26 +99,26 @@ jobs: # Prepare include_files list include_files_list = [ - ("src", "src"), - ("assets/branding/icons", "lib/assets/branding/icons"), - ("assets/Icon", "lib/assets/Icon"), - ("assets/sound", "lib/assets/sound"), - ("languages", "lib/languages"), + ("ytsage/assets/Icon", "lib/assets/Icon"), + ("ytsage/assets/sound", "lib/assets/sound"), + ("ytsage/languages", "lib/languages"), + ("branding/icons", "lib/assets/branding/icons"), ("ytsage.desktop", "share/applications/ytsage.desktop"), - ("assets/branding/icons/icon.png", "share/pixmaps/ytsage.png"), + ("branding/icons/icon.png", "share/pixmaps/ytsage.png"), ] build_exe_options = dict( optimize=2, packages=[ + "ytsage", "PySide6.QtCore", "PySide6.QtGui", "PySide6.QtWidgets", + "PySide6.QtMultimedia", "requests", "PIL", "packaging", "markdown", - "pyglet", "loguru", "setuptools", ], @@ -125,7 +132,6 @@ jobs: "PySide6.QtXml", "PySide6.QtSql", "PySide6.QtHelp", - "PySide6.QtMultimedia", "PySide6.QtQml", "PySide6.QtQuick", "PySide6.QtWebEngineCore", @@ -144,9 +150,9 @@ jobs: include_files=include_files_list, # Bundle all dependencies - avoid system library references bin_includes=[], - bin_excludes=[], - # Important: include system libs to avoid external dependencies - replace_paths=[("*", "")], + bin_excludesytsage_entry.py", + target_name="ytsage", + icon="*", "")], ) executables = [ From d41fc149b2d0a72c64bb0347f1fce8bc32f35bf3 Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:33:48 +0200 Subject: [PATCH 05/23] Update macOS build workflow for pyproject and new structure Switches dependency installation from requirements.txt to pyproject.toml and updates pip cache key accordingly. Refactors cx_Freeze setup to use a new entry point, adjusts included files and paths to match the updated project structure, and updates icon file references. --- .github/workflows/build-macos.yml | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 5531531..3621e82 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -50,7 +50,7 @@ jobs: venv ~/.cache/pip ~/Library/Caches/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- @@ -60,7 +60,7 @@ jobs: python -m venv venv source venv/bin/activate python -m pip install --upgrade pip - pip install --no-cache-dir -r requirements.txt + pip install --no-cache-dir . pip install --no-cache-dir cx_Freeze dmgbuild - name: Prepare build variables @@ -80,6 +80,13 @@ jobs: - name: Create cx_Freeze setup script shell: bash run: | + # Create entry point script + cat > ytsage_entry.py <<'ENTRY' + from ytsage.main import main + if __name__ == "__main__": + main() + ENTRY + cat > setup_cxfreeze.py <<'PY' import os from cx_Freeze import setup, Executable @@ -89,14 +96,15 @@ jobs: build_exe_options = dict( optimize=2, packages=[ + "ytsage", "PySide6.QtCore", "PySide6.QtGui", "PySide6.QtWidgets", + "PySide6.QtMultimedia", "requests", "PIL", "packaging", "markdown", - "pyglet", "loguru", "setuptools", ], @@ -110,7 +118,6 @@ jobs: "PySide6.QtXml", "PySide6.QtSql", "PySide6.QtHelp", - "PySide6.QtMultimedia", "PySide6.QtQml", "PySide6.QtQuick", "PySide6.QtWebEngineCore", @@ -127,19 +134,18 @@ jobs: "tests", ], include_files=[ - ("src", "src"), - ("assets/branding/icons", "lib/assets/branding/icons"), - ("assets/Icon", "lib/assets/Icon"), - ("assets/sound", "lib/assets/sound"), - ("languages", "lib/languages"), + ("ytsage/assets/Icon", "lib/assets/Icon"), + ("ytsage/assets/sound", "lib/assets/sound"), + ("ytsage/languages", "lib/languages"), + ("branding/icons", "lib/assets/branding/icons"), ], ) executables = [ Executable( - script="main.py", + script="ytsage_entry.py", target_name=f"YTSage-v{version}", - icon="assets/branding/icons/icon.icns", + icon="branding/icons/icon.icns", ) ] @@ -150,7 +156,7 @@ jobs: options={ "build_exe": build_exe_options, "bdist_mac": { - "iconfile": "assets/branding/icons/icon.icns", + "iconfile": "branding/icons/icon.icns", "bundle_name": f"YTSage-v{version}", }, "bdist_dmg": { From e32bb6ace5b2c324112c83c8f1f8fe81bd6cd591 Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:34:49 +0200 Subject: [PATCH 06/23] Update Windows build workflow for pyproject and asset paths Switch pip cache and install to use pyproject.toml instead of requirements.txt. Update cx_Freeze setup to use a new entry point, adjust included packages and asset paths to reflect new project structure, and update icon path. --- .github/workflows/build-windows.yml | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index b64a4b3..6d2dba4 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -49,7 +49,7 @@ jobs: path: | venv ~\AppData\Local\pip\Cache - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- @@ -59,7 +59,7 @@ jobs: python -m venv venv .\venv\Scripts\Activate.ps1 python -m pip install --upgrade pip - pip install --no-cache-dir -r requirements.txt + pip install --no-cache-dir . pip install --no-cache-dir cx_Freeze - name: Prepare build variables @@ -72,6 +72,14 @@ jobs: - name: Create cx_Freeze setup script shell: powershell run: | + # Create entry point script + $entryContent = @' + from ytsage.main import main + if __name__ == "__main__": + main() + '@ + Set-Content -Path "ytsage_entry.py" -Value $entryContent + # Create setup script for cx_Freeze New-Item -Path "setup_cxfreeze.py" -ItemType File -Force Add-Content -Path "setup_cxfreeze.py" -Value "import os" @@ -82,14 +90,15 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value "build_exe_options = dict(" Add-Content -Path "setup_cxfreeze.py" -Value " optimize=2," Add-Content -Path "setup_cxfreeze.py" -Value " packages=[" + Add-Content -Path "setup_cxfreeze.py" -Value ' "ytsage",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtCore",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtGui",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWidgets",' + Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",' Add-Content -Path "setup_cxfreeze.py" -Value ' "requests",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL",' Add-Content -Path "setup_cxfreeze.py" -Value ' "packaging",' Add-Content -Path "setup_cxfreeze.py" -Value ' "markdown",' - Add-Content -Path "setup_cxfreeze.py" -Value ' "pyglet",' Add-Content -Path "setup_cxfreeze.py" -Value ' "loguru",' Add-Content -Path "setup_cxfreeze.py" -Value ' "setuptools",' Add-Content -Path "setup_cxfreeze.py" -Value " ]," @@ -103,7 +112,6 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtXml",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSql",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtHelp",' - Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQml",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQuick",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWebEngineCore",' @@ -120,20 +128,19 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value ' "tests",' Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value " include_files=[" - Add-Content -Path "setup_cxfreeze.py" -Value ' ("src", "src"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/branding/icons", "lib/assets/branding/icons"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/Icon", "lib/assets/Icon"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/sound", "lib/assets/sound"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("languages", "lib/languages"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/assets/Icon", "lib/assets/Icon"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/assets/sound", "lib/assets/sound"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/languages", "lib/languages"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("branding/icons", "lib/assets/branding/icons"),' Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value ")" Add-Content -Path "setup_cxfreeze.py" -Value "" Add-Content -Path "setup_cxfreeze.py" -Value "executables = [" Add-Content -Path "setup_cxfreeze.py" -Value " Executable(" - Add-Content -Path "setup_cxfreeze.py" -Value ' script="main.py",' + Add-Content -Path "setup_cxfreeze.py" -Value ' script="ytsage_entry.py",' Add-Content -Path "setup_cxfreeze.py" -Value ' target_name=f"YTSage-v{version}.exe",' Add-Content -Path "setup_cxfreeze.py" -Value ' base="gui",' - Add-Content -Path "setup_cxfreeze.py" -Value ' icon="assets/branding/icons/YTSage.ico",' + Add-Content -Path "setup_cxfreeze.py" -Value ' icon="branding/icons/YTSage.ico",' Add-Content -Path "setup_cxfreeze.py" -Value " )" Add-Content -Path "setup_cxfreeze.py" -Value "]" Add-Content -Path "setup_cxfreeze.py" -Value "" From d05ca74db28ad210ca449bb8767564b768bd9487 Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:46:10 +0200 Subject: [PATCH 07/23] Fix build config for Linux workflow Corrected script path to 'ytsage_entry.py', updated icon path, and fixed configuration for including system libraries and binary excludes in the build-linux.yml workflow. --- .github/workflows/build-linux.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index bb05ae1..ba1e06f 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -150,16 +150,16 @@ jobs: include_files=include_files_list, # Bundle all dependencies - avoid system library references bin_includes=[], - bin_excludesytsage_entry.py", - target_name="ytsage", - icon="*", "")], + bin_excludes=[], + # Important: include system libs to avoid external dependencies + replace_paths=[("*", "")], ) executables = [ Executable( - script="main.py", + script="ytsage_entry.py", target_name="ytsage", - icon="assets/branding/icons/icon.png", + icon="branding/icons/icon.png", ) ] From 08c2255fbaaece7bba030ad2fc26de7607f53aa5 Mon Sep 17 00:00:00 2001 From: Mohamed <110548351+oop7@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:56:58 +0200 Subject: [PATCH 08/23] Update icon path in build scripts Changed the icon installation path from assets/branding/icons/icon.png to branding/icons/icon.png in Linux packaging steps to reflect updated directory structure. --- .github/workflows/build-linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index ba1e06f..f03692b 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -263,7 +263,7 @@ jobs: # Install desktop file and icon install -m 0644 ${workspace_root}/ytsage.desktop %{buildroot}/usr/share/applications/ytsage.desktop - install -m 0644 ${workspace_root}/assets/branding/icons/icon.png %{buildroot}/usr/share/pixmaps/ytsage.png + install -m 0644 ${workspace_root}/branding/icons/icon.png %{buildroot}/usr/share/pixmaps/ytsage.png %files /opt/ytsage @@ -343,7 +343,7 @@ jobs: # Desktop file and icon install -m 0644 ytsage.desktop "$pkgroot/usr/share/applications/ytsage.desktop" - install -m 0644 assets/branding/icons/icon.png "$pkgroot/usr/share/pixmaps/ytsage.png" + install -m 0644 branding/icons/icon.png "$pkgroot/usr/share/pixmaps/ytsage.png" # Control file cat > "$pkgroot/DEBIAN/control" < Date: Sun, 25 Jan 2026 15:53:27 +0200 Subject: [PATCH 09/23] Include PySide6.QtNetwork in build workflows Moved PySide6.QtNetwork from the excludes to the includes list in build workflows for Linux, macOS, and Windows. This ensures the QtNetwork module is bundled during packaging. --- .github/workflows/build-linux.yml | 2 +- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index f03692b..f06de53 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -115,6 +115,7 @@ jobs: "PySide6.QtGui", "PySide6.QtWidgets", "PySide6.QtMultimedia", + "PySide6.QtNetwork", "requests", "PIL", "packaging", @@ -124,7 +125,6 @@ jobs: ], excludes=[ "PySide6.QtBluetooth", - "PySide6.QtNetwork", "PySide6.QtOpenGL", "PySide6.QtPrintSupport", "PySide6.QtSvg", diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 3621e82..e07755e 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -101,6 +101,7 @@ jobs: "PySide6.QtGui", "PySide6.QtWidgets", "PySide6.QtMultimedia", + "PySide6.QtNetwork", "requests", "PIL", "packaging", @@ -110,7 +111,6 @@ jobs: ], excludes=[ "PySide6.QtBluetooth", - "PySide6.QtNetwork", "PySide6.QtOpenGL", "PySide6.QtPrintSupport", "PySide6.QtSvg", diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 6d2dba4..ca70cbc 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -95,6 +95,7 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtGui",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWidgets",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",' + Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtNetwork",' Add-Content -Path "setup_cxfreeze.py" -Value ' "requests",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL",' Add-Content -Path "setup_cxfreeze.py" -Value ' "packaging",' @@ -104,7 +105,6 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value " excludes=[" Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtBluetooth",' - Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtNetwork",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtOpenGL",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtPrintSupport",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSvg",' From 7e57cd6e46a05cf146fe953fb657245fce8d277a Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:33:41 +0200 Subject: [PATCH 10/23] Revert recent changes back to sync with beta branch This reverts commit 1e5157bbadd87bcd9a070cd0162bec487e29799d. --- .github/workflows/build-linux.yml | 38 ++++++++++++----------------- .github/workflows/build-macos.yml | 32 ++++++++++-------------- .github/workflows/build-windows.yml | 31 +++++++++-------------- 3 files changed, 41 insertions(+), 60 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index f06de53..bf7182f 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -49,7 +49,7 @@ jobs: path: | venv ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }} + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- @@ -67,7 +67,7 @@ jobs: python -m venv venv source venv/bin/activate python -m pip install --upgrade pip - pip install --no-cache-dir . + pip install --no-cache-dir -r requirements.txt pip install --no-cache-dir cx_Freeze - name: Prepare build variables @@ -82,13 +82,6 @@ jobs: - name: Create cx_Freeze setup script (Linux) shell: bash run: | - # Create entry point script - cat > ytsage_entry.py <<'ENTRY' - from ytsage.main import main - if __name__ == "__main__": - main() - ENTRY - cat > setup_cxfreeze.py <<'PY' import os import sys @@ -99,32 +92,32 @@ jobs: # Prepare include_files list include_files_list = [ - ("ytsage/assets/Icon", "lib/assets/Icon"), - ("ytsage/assets/sound", "lib/assets/sound"), - ("ytsage/languages", "lib/languages"), - ("branding/icons", "lib/assets/branding/icons"), + ("src", "src"), + ("assets/branding/icons", "lib/assets/branding/icons"), + ("assets/Icon", "lib/assets/Icon"), + ("assets/sound", "lib/assets/sound"), + ("languages", "lib/languages"), ("ytsage.desktop", "share/applications/ytsage.desktop"), - ("branding/icons/icon.png", "share/pixmaps/ytsage.png"), + ("assets/branding/icons/icon.png", "share/pixmaps/ytsage.png"), ] build_exe_options = dict( optimize=2, packages=[ - "ytsage", "PySide6.QtCore", "PySide6.QtGui", "PySide6.QtWidgets", - "PySide6.QtMultimedia", - "PySide6.QtNetwork", "requests", "PIL", "packaging", "markdown", + "pyglet", "loguru", "setuptools", ], excludes=[ "PySide6.QtBluetooth", + "PySide6.QtNetwork", "PySide6.QtOpenGL", "PySide6.QtPrintSupport", "PySide6.QtSvg", @@ -132,6 +125,7 @@ jobs: "PySide6.QtXml", "PySide6.QtSql", "PySide6.QtHelp", + "PySide6.QtMultimedia", "PySide6.QtQml", "PySide6.QtQuick", "PySide6.QtWebEngineCore", @@ -157,9 +151,9 @@ jobs: executables = [ Executable( - script="ytsage_entry.py", + script="main.py", target_name="ytsage", - icon="branding/icons/icon.png", + icon="assets/branding/icons/icon.png", ) ] @@ -263,7 +257,7 @@ jobs: # Install desktop file and icon install -m 0644 ${workspace_root}/ytsage.desktop %{buildroot}/usr/share/applications/ytsage.desktop - install -m 0644 ${workspace_root}/branding/icons/icon.png %{buildroot}/usr/share/pixmaps/ytsage.png + install -m 0644 ${workspace_root}/assets/branding/icons/icon.png %{buildroot}/usr/share/pixmaps/ytsage.png %files /opt/ytsage @@ -343,7 +337,7 @@ jobs: # Desktop file and icon install -m 0644 ytsage.desktop "$pkgroot/usr/share/applications/ytsage.desktop" - install -m 0644 branding/icons/icon.png "$pkgroot/usr/share/pixmaps/ytsage.png" + install -m 0644 assets/branding/icons/icon.png "$pkgroot/usr/share/pixmaps/ytsage.png" # Control file cat > "$pkgroot/DEBIAN/control" < ytsage_entry.py <<'ENTRY' - from ytsage.main import main - if __name__ == "__main__": - main() - ENTRY - cat > setup_cxfreeze.py <<'PY' import os from cx_Freeze import setup, Executable @@ -96,21 +89,20 @@ jobs: build_exe_options = dict( optimize=2, packages=[ - "ytsage", "PySide6.QtCore", "PySide6.QtGui", "PySide6.QtWidgets", - "PySide6.QtMultimedia", - "PySide6.QtNetwork", "requests", "PIL", "packaging", "markdown", + "pyglet", "loguru", "setuptools", ], excludes=[ "PySide6.QtBluetooth", + "PySide6.QtNetwork", "PySide6.QtOpenGL", "PySide6.QtPrintSupport", "PySide6.QtSvg", @@ -118,6 +110,7 @@ jobs: "PySide6.QtXml", "PySide6.QtSql", "PySide6.QtHelp", + "PySide6.QtMultimedia", "PySide6.QtQml", "PySide6.QtQuick", "PySide6.QtWebEngineCore", @@ -134,18 +127,19 @@ jobs: "tests", ], include_files=[ - ("ytsage/assets/Icon", "lib/assets/Icon"), - ("ytsage/assets/sound", "lib/assets/sound"), - ("ytsage/languages", "lib/languages"), - ("branding/icons", "lib/assets/branding/icons"), + ("src", "src"), + ("assets/branding/icons", "lib/assets/branding/icons"), + ("assets/Icon", "lib/assets/Icon"), + ("assets/sound", "lib/assets/sound"), + ("languages", "lib/languages"), ], ) executables = [ Executable( - script="ytsage_entry.py", + script="main.py", target_name=f"YTSage-v{version}", - icon="branding/icons/icon.icns", + icon="assets/branding/icons/icon.icns", ) ] @@ -156,7 +150,7 @@ jobs: options={ "build_exe": build_exe_options, "bdist_mac": { - "iconfile": "branding/icons/icon.icns", + "iconfile": "assets/branding/icons/icon.icns", "bundle_name": f"YTSage-v{version}", }, "bdist_dmg": { diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index ca70cbc..b64a4b3 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -49,7 +49,7 @@ jobs: path: | venv ~\AppData\Local\pip\Cache - key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }} + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- @@ -59,7 +59,7 @@ jobs: python -m venv venv .\venv\Scripts\Activate.ps1 python -m pip install --upgrade pip - pip install --no-cache-dir . + pip install --no-cache-dir -r requirements.txt pip install --no-cache-dir cx_Freeze - name: Prepare build variables @@ -72,14 +72,6 @@ jobs: - name: Create cx_Freeze setup script shell: powershell run: | - # Create entry point script - $entryContent = @' - from ytsage.main import main - if __name__ == "__main__": - main() - '@ - Set-Content -Path "ytsage_entry.py" -Value $entryContent - # Create setup script for cx_Freeze New-Item -Path "setup_cxfreeze.py" -ItemType File -Force Add-Content -Path "setup_cxfreeze.py" -Value "import os" @@ -90,21 +82,20 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value "build_exe_options = dict(" Add-Content -Path "setup_cxfreeze.py" -Value " optimize=2," Add-Content -Path "setup_cxfreeze.py" -Value " packages=[" - Add-Content -Path "setup_cxfreeze.py" -Value ' "ytsage",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtCore",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtGui",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWidgets",' - Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",' - Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtNetwork",' Add-Content -Path "setup_cxfreeze.py" -Value ' "requests",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PIL",' Add-Content -Path "setup_cxfreeze.py" -Value ' "packaging",' Add-Content -Path "setup_cxfreeze.py" -Value ' "markdown",' + Add-Content -Path "setup_cxfreeze.py" -Value ' "pyglet",' Add-Content -Path "setup_cxfreeze.py" -Value ' "loguru",' Add-Content -Path "setup_cxfreeze.py" -Value ' "setuptools",' Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value " excludes=[" Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtBluetooth",' + Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtNetwork",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtOpenGL",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtPrintSupport",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSvg",' @@ -112,6 +103,7 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtXml",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtSql",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtHelp",' + Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtMultimedia",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQml",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtQuick",' Add-Content -Path "setup_cxfreeze.py" -Value ' "PySide6.QtWebEngineCore",' @@ -128,19 +120,20 @@ jobs: Add-Content -Path "setup_cxfreeze.py" -Value ' "tests",' Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value " include_files=[" - Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/assets/Icon", "lib/assets/Icon"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/assets/sound", "lib/assets/sound"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("ytsage/languages", "lib/languages"),' - Add-Content -Path "setup_cxfreeze.py" -Value ' ("branding/icons", "lib/assets/branding/icons"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("src", "src"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/branding/icons", "lib/assets/branding/icons"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/Icon", "lib/assets/Icon"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("assets/sound", "lib/assets/sound"),' + Add-Content -Path "setup_cxfreeze.py" -Value ' ("languages", "lib/languages"),' Add-Content -Path "setup_cxfreeze.py" -Value " ]," Add-Content -Path "setup_cxfreeze.py" -Value ")" Add-Content -Path "setup_cxfreeze.py" -Value "" Add-Content -Path "setup_cxfreeze.py" -Value "executables = [" Add-Content -Path "setup_cxfreeze.py" -Value " Executable(" - Add-Content -Path "setup_cxfreeze.py" -Value ' script="ytsage_entry.py",' + Add-Content -Path "setup_cxfreeze.py" -Value ' script="main.py",' Add-Content -Path "setup_cxfreeze.py" -Value ' target_name=f"YTSage-v{version}.exe",' Add-Content -Path "setup_cxfreeze.py" -Value ' base="gui",' - Add-Content -Path "setup_cxfreeze.py" -Value ' icon="branding/icons/YTSage.ico",' + Add-Content -Path "setup_cxfreeze.py" -Value ' icon="assets/branding/icons/YTSage.ico",' Add-Content -Path "setup_cxfreeze.py" -Value " )" Add-Content -Path "setup_cxfreeze.py" -Value "]" Add-Content -Path "setup_cxfreeze.py" -Value "" From 518bd20e542a12c40384cf26ae2fefd62b365747 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Sat, 7 Mar 2026 20:58:31 +0200 Subject: [PATCH 11/23] Bump version to 5.0.0 Promote package from beta to stable by updating version strings from 5.0.0b5 to 5.0.0 in pyproject.toml and ytsage/__init__.py. Prepares the project for the 5.0.0 release. --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5ead99f..6f1876e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.0.0b5" +version = "5.0.0" description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index b44f066..3a60c10 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.0.0b5" +__version__ = "5.0.0" __author__ = "oop7" From 7bf62c542c8a7bb765b30f6eb6f08b8ad830c26a Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:18:42 +0200 Subject: [PATCH 12/23] Bump version to 5.0.3 Update package version from 5.0.2b to 5.0.3 in pyproject.toml and ytsage/__init__.py to prepare the 5.0.3 release. --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c2f7f9d..73f6236 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.0.2b" +version = "5.0.3" description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index f2c4957..578e99c 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.0.2b" +__version__ = "5.0.3" __author__ = "oop7" From 938cc9be468e7b84566bdcc4730222be8fef353e Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Thu, 14 May 2026 15:54:07 +0300 Subject: [PATCH 13/23] Bump version to 5.1.0 Update package version from 5.0.10b to 5.1.0 in pyproject.toml and ytsage/__init__.py to prepare for the 5.1.0 release. --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 22ed937..b702c7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.0.10b" +version = "5.1.0" description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index f8faf4e..11805bd 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.0.10b" +__version__ = "5.1.0" __author__ = "oop7" From 2aa8c023f462f4c49d7a279e6f8c60da76cff152 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 25 May 2026 14:01:31 +0300 Subject: [PATCH 14/23] Point README links to readme-translations/ Update README links to reference translation files under the readme-translations/ directory. Adjusted the language list and the translations table to use readme-translations/ paths and corrected the English link to README.md. This organizes translation links to a dedicated folder. --- README.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 50e7545..a6ba173 100644 --- a/README.md +++ b/README.md @@ -17,20 +17,20 @@ Download videos in any quality, extract audio, fetch subtitles, and more. ### 🌍 README Languages -English: [EN](../README.md) -| Arabic: [AR](README.ar.md) -| German: [DE](README.de.md) -| Spanish: [ES](README.es.md) -| French: [FR](README.fr.md) -| Hindi: [HI](README.hi.md) -| Indonesian: [ID](README.id.md) -| Italian: [IT](README.it.md) -| Japanese: [JA](README.ja.md) -| Polish: [PL](README.pl.md) -| Portuguese: [PT](README.pt.md) -| Russian: [RU](README.ru.md) -| Turkish: [TR](README.tr.md) -| Chinese: [ZH](README.zh.md) +English: [EN](README.md) +| Arabic: [AR](readme-translations/README.ar.md) +| German: [DE](readme-translations/README.de.md) +| Spanish: [ES](readme-translations/README.es.md) +| French: [FR](readme-translations/README.fr.md) +| Hindi: [HI](readme-translations/README.hi.md) +| Indonesian: [ID](readme-translations/README.id.md) +| Italian: [IT](readme-translations/README.it.md) +| Japanese: [JA](readme-translations/README.ja.md) +| Polish: [PL](readme-translations/README.pl.md) +| Portuguese: [PT](readme-translations/README.pt.md) +| Russian: [RU](readme-translations/README.ru.md) +| Turkish: [TR](readme-translations/README.tr.md) +| Chinese: [ZH](readme-translations/README.zh.md)

Installation • @@ -366,13 +366,13 @@ YTSage supports **14 languages** for global accessibility. Select your preferred | Language | File | Language | File | |----------|------|----------|------| -| 🇺🇸 English | [README.md](README.md) | 🇪🇸 Spanish | [README.es.md](README.es.md) | -| 🇸🇦 Arabic | [README.ar.md](README.ar.md) | 🇫🇷 French | [README.fr.md](README.fr.md) | -| 🇩🇪 German | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | -| 🇮🇩 Indonesian | [README.id.md](README.id.md) | 🇮🇹 Italian | [README.it.md](README.it.md) | -| 🇯🇵 Japanese | [README.ja.md](README.ja.md) | 🇵🇱 Polish | [README.pl.md](README.pl.md) | -| 🇧🇷 Portuguese | [README.pt.md](README.pt.md) | 🇷🇺 Russian | [README.ru.md](README.ru.md) | -| 🇹🇷 Turkish | [README.tr.md](README.tr.md) | 🇨🇳 Chinese | [README.zh.md](README.zh.md) | +| 🇺🇸 English | [README.md](README.md) | 🇪🇸 Spanish | [readme-translations/README.es.md](readme-translations/README.es.md) | +| 🇸🇦 Arabic | [readme-translations/README.ar.md](readme-translations/README.ar.md) | 🇫🇷 French | [readme-translations/README.fr.md](readme-translations/README.fr.md) | +| 🇩🇪 German | [readme-translations/README.de.md](readme-translations/README.de.md) | 🇮🇳 Hindi | [readme-translations/README.hi.md](readme-translations/README.hi.md) | +| 🇮🇩 Indonesian | [readme-translations/README.id.md](readme-translations/README.id.md) | 🇮🇹 Italian | [readme-translations/README.it.md](readme-translations/README.it.md) | +| 🇯🇵 Japanese | [readme-translations/README.ja.md](readme-translations/README.ja.md) | 🇵🇱 Polish | [readme-translations/README.pl.md](readme-translations/README.pl.md) | +| 🇧🇷 Portuguese | [readme-translations/README.pt.md](readme-translations/README.pt.md) | 🇷🇺 Russian | [readme-translations/README.ru.md](readme-translations/README.ru.md) | +| 🇹🇷 Turkish | [readme-translations/README.tr.md](readme-translations/README.tr.md) | 🇨🇳 Chinese | [readme-translations/README.zh.md](readme-translations/README.zh.md) | > 💡 **Want to contribute a translation?** Check out the [Contributing](#contributing) section to help us add more languages! From e1a2fe52c6c35dee5f6ebc6dac3fe3a5cdfba2c1 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 25 May 2026 14:02:39 +0300 Subject: [PATCH 15/23] Fix README link path in Arabic translation Update the English README link in readme-translations/README.ar.md to point to the repository root (../README.md) so the language table correctly references the top-level README. --- readme-translations/README.ar.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme-translations/README.ar.md b/readme-translations/README.ar.md index 4a16982..5aa4e37 100644 --- a/readme-translations/README.ar.md +++ b/readme-translations/README.ar.md @@ -366,7 +366,7 @@ python -m ytsage.main | اللغة | الملف | اللغة | الملف | |----------|------|----------|------| -| 🇺🇸 الإنجليزية | [README.md](README.md) | 🇪🇸 الإسبانية | [README.es.md](README.es.md) | +| 🇺🇸 الإنجليزية | [README.md](../README.md) | 🇪🇸 الإسبانية | [README.es.md](README.es.md) | | 🇸🇦 العربية | [README.ar.md](README.ar.md) | 🇫🇷 الفرنسية | [README.fr.md](README.fr.md) | | 🇩🇪 الألمانية | [README.de.md](README.de.md) | 🇮🇳 الهندية | [README.hi.md](README.hi.md) | | 🇮🇩 الإندونيسية | [README.id.md](README.id.md) | 🇮🇹 الإيطالية | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ python -m ytsage.main **البدائل الآمنة:** - ✅ **استخدم تثبيت pip:** `pip install ytsage` (موصى به) -- ✅ **البناء من المصدر:** باتباع هذا [الدليل](.github/CI_CD_README.md) +- ✅ **البناء من المصدر:** باتباع هذا [الدليل](../.github/CI_CD_README.md) - ✅ **إضافة التطبيق للقائمة البيضاء** في برنامج الحماية لديك. #### 🍎 macOS: "The app is damaged and can’t be opened" @@ -546,7 +546,7 @@ YTSage/ ## 📜 الرخصة -هذا المشروع مرخص بموجب رخصة MIT - راجع ملف [LICENSE](LICENSE) لمزيد من التفاصيل. +هذا المشروع مرخص بموجب رخصة MIT - راجع ملف [LICENSE](../LICENSE) لمزيد من التفاصيل. ## 🙏 شكر وتقدير From d3c3094880373829df02ddb921d6354ca7d082bc Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 25 May 2026 14:02:55 +0300 Subject: [PATCH 16/23] Fix translated README links to root Update links in readme-translations/*.md so they point to the project root (prepend ../). Adjusted references for README.md, .github/CI_CD_README.md and LICENSE across the translation files so links resolve correctly from the readme-translations directory. --- readme-translations/README.de.md | 6 +++--- readme-translations/README.es.md | 6 +++--- readme-translations/README.fr.md | 6 +++--- readme-translations/README.hi.md | 6 +++--- readme-translations/README.id.md | 6 +++--- readme-translations/README.it.md | 6 +++--- readme-translations/README.ja.md | 6 +++--- readme-translations/README.pl.md | 6 +++--- readme-translations/README.pt.md | 6 +++--- readme-translations/README.ru.md | 6 +++--- readme-translations/README.tr.md | 6 +++--- readme-translations/README.zh.md | 6 +++--- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/readme-translations/README.de.md b/readme-translations/README.de.md index 3d03b7d..006c657 100644 --- a/readme-translations/README.de.md +++ b/readme-translations/README.de.md @@ -366,7 +366,7 @@ YTSage unterstützt **14 Sprachen** für globale Barrierefreiheit. Wählen Sie I | Sprache | Datei | Sprache | Datei | |----------|------|----------|------| -| 🇺🇸 Englisch | [README.md](README.md) | 🇪🇸 Spanisch | [README.es.md](README.es.md) | +| 🇺🇸 Englisch | [README.md](../README.md) | 🇪🇸 Spanisch | [README.es.md](README.es.md) | | 🇸🇦 Arabisch | [README.ar.md](README.ar.md) | 🇫🇷 Französisch | [README.fr.md](README.fr.md) | | 🇩🇪 Deutsch | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonesisch | [README.id.md](README.id.md) | 🇮🇹 Italienisch | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Einige Antivirenprogramme können `.exe`-Dateien als Fehlalarm (False Positive) **Sichere Alternativen:** - ✅ **Verwenden Sie die pip-Installation:** `pip install ytsage` (Empfohlen) -- ✅ **Aus dem Quellcode bauen**: Folgen Sie diesem [Leitfaden](.github/CI_CD_README.md) +- ✅ **Aus dem Quellcode bauen**: Folgen Sie diesem [Leitfaden](../.github/CI_CD_README.md) - ✅ **App auf die Whitelist setzen** in Ihrer Antiviren-Software. #### 🍎 macOS: "Die App ist beschädigt und kann nicht geöffnet werden" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Lizenz -Dieses Projekt steht unter der MIT-Lizenz – weitere Details finden Sie in der Datei [LICENSE](LICENSE). +Dieses Projekt steht unter der MIT-Lizenz – weitere Details finden Sie in der Datei [LICENSE](../LICENSE). ## 🙏 Danksagungen diff --git a/readme-translations/README.es.md b/readme-translations/README.es.md index 9455c21..7a29166 100644 --- a/readme-translations/README.es.md +++ b/readme-translations/README.es.md @@ -366,7 +366,7 @@ YTSage soporta **14 idiomas** para accesibilidad global. Selecciona tu idioma pr | Idioma | Archivo | Idioma | Archivo | |----------|------|----------|------| -| 🇺🇸 Inglés | [README.md](README.md) | 🇪🇸 Español | [README.es.md](README.es.md) | +| 🇺🇸 Inglés | [README.md](../README.md) | 🇪🇸 Español | [README.es.md](README.es.md) | | 🇸🇦 Árabe | [README.ar.md](README.ar.md) | 🇫🇷 Francés | [README.fr.md](README.fr.md) | | 🇩🇪 Alemán | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonesio | [README.id.md](README.id.md) | 🇮🇹 Italiano | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Algunos programas antivirus pueden marcar archivos `.exe` como falsos positivos. **Alternativas seguras:** - ✅ **Usa la instalación de pip:** `pip install ytsage` (Recomendado) -- ✅ **Construye desde el código fuente**: siguiendo esta [guía](.github/CI_CD_README.md) +- ✅ **Construye desde el código fuente**: siguiendo esta [guía](../.github/CI_CD_README.md) - ✅ **Añade la aplicación a la lista blanca** en tu software antivirus. #### 🍎 macOS: "La aplicación está dañada y no se puede abrir" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Licencia -Este proyecto está bajo la Licencia MIT - mira el archivo [LICENSE](LICENSE) para más detalles. +Este proyecto está bajo la Licencia MIT - mira el archivo [LICENSE](../LICENSE) para más detalles. ## 🙏 Agradecimientos diff --git a/readme-translations/README.fr.md b/readme-translations/README.fr.md index 89d6e46..1a5bfe3 100644 --- a/readme-translations/README.fr.md +++ b/readme-translations/README.fr.md @@ -366,7 +366,7 @@ YTSage prend en charge **14 langues** pour une accessibilité mondiale. Sélecti | Langue | Fichier | Langue | Fichier | |----------|------|----------|------| -| 🇺🇸 Anglais | [README.md](README.md) | 🇪🇸 Espagnol | [README.es.md](README.es.md) | +| 🇺🇸 Anglais | [README.md](../README.md) | 🇪🇸 Espagnol | [README.es.md](README.es.md) | | 🇸🇦 Arabe | [README.ar.md](README.ar.md) | 🇫🇷 Français | [README.fr.md](README.fr.md) | | 🇩🇪 Allemand | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonésien | [README.id.md](README.id.md) | 🇮🇹 Italien | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Certains logiciels antivirus peuvent signaler les fichiers `.exe` comme de faux **Alternatives sûres :** - ✅ **Utilisez l'installation pip :** `pip install ytsage` (recommandé) -- ✅ **Compiler à partir des sources** : en suivant ce [guide](.github/CI_CD_README.md) +- ✅ **Compiler à partir des sources** : en suivant ce [guide](../.github/CI_CD_README.md) - ✅ **Mettre l'application en liste blanche** dans votre logiciel antivirus. #### 🍎 macOS : "L'application est endommagée et ne peut pas être ouverte" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Licence -Ce projet est sous licence MIT - voir le fichier [LICENSE](LICENSE) pour plus de détails. +Ce projet est sous licence MIT - voir le fichier [LICENSE](../LICENSE) pour plus de détails. ## 🙏 Remerciements diff --git a/readme-translations/README.hi.md b/readme-translations/README.hi.md index 28c7d8f..18588ed 100644 --- a/readme-translations/README.hi.md +++ b/readme-translations/README.hi.md @@ -366,7 +366,7 @@ YTSage वैश्विक पहुँच के लिए **14 भाषा | भाषा | फ़ाइल | भाषा | फ़ाइल | |----------|------|----------|------| -| 🇺🇸 अंग्रेज़ी | [README.md](README.md) | 🇪🇸 स्पेनिश | [README.es.md](README.es.md) | +| 🇺🇸 अंग्रेज़ी | [README.md](../README.md) | 🇪🇸 स्पेनिश | [README.es.md](README.es.md) | | 🇸🇦 अरबी | [README.ar.md](README.ar.md) | 🇫🇷 फ्रेंच | [README.fr.md](README.fr.md) | | 🇩🇪 जर्मन | [README.de.md](README.de.md) | 🇮🇳 हिंदी | [README.hi.md](README.hi.md) | | 🇮🇩 इंडोनेशियाई | [README.id.md](README.id.md) | 🇮🇹 इतालवी | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ YTSage वैश्विक पहुँच के लिए **14 भाषा **सुरक्षित विकल्प:** - ✅ **pip स्थापना का उपयोग करें:** `pip install ytsage` (अनुशंसित) -- ✅ **स्रोत से बिल्ड करें**: इस [गाइड](.github/CI_CD_README.md) का पालन करते हुए +- ✅ **स्रोत से बिल्ड करें**: इस [गाइड](../.github/CI_CD_README.md) का पालन करते हुए - ✅ **एप्लिकेशन को व्हाइटलिस्ट करें** अपने एंटीवायरस सॉफ़्टवेयर में। #### 🍎 macOS: "ऐप क्षतिग्रस्त है और खोला नहीं जा सकता" @@ -546,7 +546,7 @@ YTSage/ ## 📜 लाइसेंस -यह प्रोजेक्ट MIT लाइसेंस के तहत है - विवरण के लिए [LICENSE](LICENSE) फ़ाइल देखें। +यह प्रोजेक्ट MIT लाइसेंस के तहत है - विवरण के लिए [LICENSE](../LICENSE) फ़ाइल देखें। ## 🙏 धन्यवाद diff --git a/readme-translations/README.id.md b/readme-translations/README.id.md index 29cf9c7..fbdc95a 100644 --- a/readme-translations/README.id.md +++ b/readme-translations/README.id.md @@ -366,7 +366,7 @@ YTSage mendukung **14 bahasa** untuk jangkauan global. Pilih bahasa pilihan Anda | Bahasa | File | Bahasa | File | |----------|------|----------|------| -| 🇺🇸 Inggris | [README.md](README.md) | 🇪🇸 Spanyol | [README.es.md](README.es.md) | +| 🇺🇸 Inggris | [README.md](../README.md) | 🇪🇸 Spanyol | [README.es.md](README.es.md) | | 🇸🇦 Arab | [README.ar.md](README.ar.md) | 🇫🇷 Prancis | [README.fr.md](README.fr.md) | | 🇩🇪 Jerman | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonesia | [README.id.md](README.id.md) | 🇮🇹 Italia | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Beberapa perangkat lunak antivirus mungkin menandai file `.exe` sebagai positif **Opsi Aman:** - ✅ **Gunakan instalasi pip:** `pip install ytsage` (direkomendasikan) -- ✅ **Build dari sumber**: Mengikuti [panduan](.github/CI_CD_README.md) ini +- ✅ **Build dari sumber**: Mengikuti [panduan](../.github/CI_CD_README.md) ini - ✅ **Whitelist aplikasi** di perangkat lunak antivirus Anda. #### 🍎 macOS: "App is damaged and can’t be opened" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Lisensi -Proyek ini dilisensikan di bawah Lisensi MIT - lihat file [LICENSE](LICENSE) untuk detailnya. +Proyek ini dilisensikan di bawah Lisensi MIT - lihat file [LICENSE](../LICENSE) untuk detailnya. ## 🙏 Terima Kasih diff --git a/readme-translations/README.it.md b/readme-translations/README.it.md index 3201b59..499552b 100644 --- a/readme-translations/README.it.md +++ b/readme-translations/README.it.md @@ -366,7 +366,7 @@ YTSage supporta **14 lingue** per una portata globale. Scegli la tua lingua pref | Lingua | File | Lingua | File | |----------|------|----------|------| -| 🇺🇸 Inglese | [README.md](README.md) | 🇪🇸 Spagnolo | [README.es.md](README.es.md) | +| 🇺🇸 Inglese | [README.md](../README.md) | 🇪🇸 Spagnolo | [README.es.md](README.es.md) | | 🇸🇦 Arabo | [README.ar.md](README.ar.md) | 🇫🇷 Francese | [README.fr.md](README.fr.md) | | 🇩🇪 Tedesco | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonesiano | [README.id.md](README.id.md) | 🇮🇹 Italiano | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Alcuni software antivirus potrebbero contrassegnare i file `.exe` come falsi pos **Opzioni sicure:** - ✅ **Usa l'installazione tramite pip:** `pip install ytsage` (consigliato) -- ✅ **Compila dai sorgenti**: Seguendo questa [guida](.github/CI_CD_README.md) +- ✅ **Compila dai sorgenti**: Seguendo questa [guida](../.github/CI_CD_README.md) - ✅ **Aggiungi l'applicazione alla whitelist** nel tuo software antivirus. #### 🍎 macOS: "L’app è danneggiata e non può essere aperta" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Licenza -Questo progetto è rilasciato sotto Licenza MIT - vedi il file [LICENSE](LICENSE) per i dettagli. +Questo progetto è rilasciato sotto Licenza MIT - vedi il file [LICENSE](../LICENSE) per i dettagli. ## 🙏 Ringraziamenti diff --git a/readme-translations/README.ja.md b/readme-translations/README.ja.md index dfc7fef..ceceebb 100644 --- a/readme-translations/README.ja.md +++ b/readme-translations/README.ja.md @@ -366,7 +366,7 @@ YTSage はグローバルに対応するため、**14 言語**をサポートし | 言語 | ファイル | 言語 | ファイル | |----------|------|----------|------| -| 🇺🇸 英語 | [README.md](README.md) | 🇪🇸 スペイン語 | [README.es.md](README.es.md) | +| 🇺🇸 英語 | [README.md](../README.md) | 🇪🇸 スペイン語 | [README.es.md](README.es.md) | | 🇸🇦 アラビア語 | [README.ar.md](README.ar.md) | 🇫🇷 フランス語 | [README.fr.md](README.fr.md) | | 🇩🇪 ドイツ語 | [README.de.md](README.de.md) | 🇮🇳 ヒンディー語 | [README.hi.md](README.hi.md) | | 🇮🇩 インドネシア語 | [README.id.md](README.id.md) | 🇮🇹 イタリア語 | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ YTSage はグローバルに対応するため、**14 言語**をサポートし **安全な選択肢:** - ✅ **pip インストールを使用する:** `pip install ytsage` (推奨) -- ✅ **ソースからビルドする**: この[ガイド](.github/CI_CD_README.md)に従ってください。 +- ✅ **ソースからビルドする**: この[ガイド](../.github/CI_CD_README.md)に従ってください。 - ✅ **アプリケーションをホワイトリストに追加する** (アンチウイルスソフトウェアの設定)。 #### 🍎 macOS: 「アプリが破損しているため開けません」 @@ -546,7 +546,7 @@ YTSage/ ## 📜 ライセンス -このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は [LICENSE](LICENSE) ファイルを参照してください。 +このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は [LICENSE](../LICENSE) ファイルを参照してください。 ## 🙏 謝辞 diff --git a/readme-translations/README.pl.md b/readme-translations/README.pl.md index a8c78e5..5209c92 100644 --- a/readme-translations/README.pl.md +++ b/readme-translations/README.pl.md @@ -366,7 +366,7 @@ YTSage obsługuje **14 języków**. Wybierz preferowany język w **Custom Option | Język | Plik | Język | Plik | |----------|------|----------|------| -| 🇺🇸 Angielski | [README.md](README.md) | 🇪🇸 Hiszpański | [README.es.md](README.es.md) | +| 🇺🇸 Angielski | [README.md](../README.md) | 🇪🇸 Hiszpański | [README.es.md](README.es.md) | | 🇸🇦 Arabski | [README.ar.md](README.ar.md) | 🇫🇷 Francuski | [README.fr.md](README.fr.md) | | 🇩🇪 Niemiecki | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonezyjski | [README.id.md](README.id.md) | 🇮🇹 Włoski | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Niektóre programy antywirusowe mogą oznaczać pliki `.exe` jako fałszywe alar **Bezpieczne alternatywy:** - ✅ **Użyj instalacji przez pip:** `pip install ytsage` (zalecane) -- ✅ **Zbuduj ze źródeł**: Postępując zgodnie z tym [przewodnikiem](.github/CI_CD_README.md) +- ✅ **Zbuduj ze źródeł**: Postępując zgodnie z tym [przewodnikiem](../.github/CI_CD_README.md) - ✅ **Dodaj aplikację do wyjątków** w swoim programie antywirusowym. #### 🍎 macOS: "Aplikacja jest uszkodzona i nie można jej otworzyć" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Licencja -Ten projekt jest udostępniany na licencji MIT - zobacz plik [LICENSE](LICENSE), aby poznać szczegóły. +Ten projekt jest udostępniany na licencji MIT - zobacz plik [LICENSE](../LICENSE), aby poznać szczegóły. ## 🙏 Podziękowania diff --git a/readme-translations/README.pt.md b/readme-translations/README.pt.md index c12531f..ab8dd05 100644 --- a/readme-translations/README.pt.md +++ b/readme-translations/README.pt.md @@ -366,7 +366,7 @@ O YTSage suporta **14 idiomas** para alcance global. Escolha o seu idioma prefer | Idioma | Arquivo | Idioma | Arquivo | |----------|------|----------|------| -| 🇺🇸 Inglês | [README.md](README.md) | 🇪🇸 Espanhol | [README.es.md](README.es.md) | +| 🇺🇸 Inglês | [README.md](../README.md) | 🇪🇸 Espanhol | [README.es.md](README.es.md) | | 🇸🇦 Árabe | [README.ar.md](README.ar.md) | 🇫🇷 Francês | [README.fr.md](README.fr.md) | | 🇩🇪 Alemão | [README.de.md](README.de.md) | 🇮🇳 Hindi | [README.hi.md](README.hi.md) | | 🇮🇩 Indonésio | [README.id.md](README.id.md) | 🇮🇹 Italiano | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Alguns softwares antivírus podem sinalizar arquivos `.exe` como falsos positivo **Opções Seguras:** - ✅ **Use a instalação via pip:** `pip install ytsage` (recomendado) -- ✅ **Compile a partir do código-fonte**: Seguindo este [guia](.github/CI_CD_README.md) +- ✅ **Compile a partir do código-fonte**: Seguindo este [guia](../.github/CI_CD_README.md) - ✅ **Adicione o aplicativo à lista de permissões** do seu software antivírus. #### 🍎 macOS: "App está danificado e não pode ser aberto" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Licença -Este projeto é licenciado sob a Licença MIT - consulte o arquivo [LICENSE](LICENSE) para mais detalhes. +Este projeto é licenciado sob a Licença MIT - consulte o arquivo [LICENSE](../LICENSE) para mais detalhes. ## 🙏 Agradecimentos diff --git a/readme-translations/README.ru.md b/readme-translations/README.ru.md index c31ef25..4930fd1 100644 --- a/readme-translations/README.ru.md +++ b/readme-translations/README.ru.md @@ -366,7 +366,7 @@ YTSage поддерживает **14 языков**. Выберите нужны | Язык | Файл | Язык | Файл | |----------|------|----------|------| -| 🇺🇸 Английский | [README.md](README.md) | 🇪🇸 Испанский | [README.es.md](README.es.md) | +| 🇺🇸 Английский | [README.md](../README.md) | 🇪🇸 Испанский | [README.es.md](README.es.md) | | 🇸🇦 Арабский | [README.ar.md](README.ar.md) | 🇫🇷 Французский | [README.fr.md](README.fr.md) | | 🇩🇪 Немецкий | [README.de.md](README.de.md) | 🇮🇳 Хинди | [README.hi.md](README.hi.md) | | 🇮🇩 Индонезийский | [README.id.md](README.id.md) | 🇮🇹 Итальянский | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ YTSage поддерживает **14 языков**. Выберите нужны **Безопасные варианты:** - ✅ **Установка через pip:** `pip install ytsage` (рекомендуется) -- ✅ **Сборка из исходников**: Инструкция [здесь](.github/CI_CD_README.md) +- ✅ **Сборка из исходников**: Инструкция [здесь](../.github/CI_CD_README.md) - ✅ **Добавить в исключения** антивируса. #### 🍎 macOS: "App is damaged and cannot be opened" @@ -537,7 +537,7 @@ YTSage/ ## 📜 Лицензия -Проект распространяется под лицензией MIT — подробности в файле [LICENSE](LICENSE). +Проект распространяется под лицензией MIT — подробности в файле [LICENSE](../LICENSE). ## 🙏 Благодарности diff --git a/readme-translations/README.tr.md b/readme-translations/README.tr.md index 48ca27e..80791df 100644 --- a/readme-translations/README.tr.md +++ b/readme-translations/README.tr.md @@ -366,7 +366,7 @@ YTSage, küresel erişim için **14 dili** destekler. Tercih ettiğiniz dili **C | Dil | Dosya | Dil | Dosya | |----------|------|----------|------| -| 🇺🇸 İngilizce | [README.md](README.md) | 🇪🇸 İspanyolca | [README.es.md](README.es.md) | +| 🇺🇸 İngilizce | [README.md](../README.md) | 🇪🇸 İspanyolca | [README.es.md](README.es.md) | | 🇸🇦 Arapça | [README.ar.md](README.ar.md) | 🇫🇷 Fransızca | [README.fr.md](README.fr.md) | | 🇩🇪 Almanca | [README.de.md](README.de.md) | 🇮🇳 Hintçe | [README.hi.md](README.hi.md) | | 🇮🇩 Endonezce | [README.id.md](README.id.md) | 🇮🇹 İtalyanca | [README.it.md](README.it.md) | @@ -410,7 +410,7 @@ Bazı antivirüs yazılımları `.exe` dosyalarını yanlış pozitif olarak iş **Güvenli Seçenekler:** - ✅ **pip kurulumunu kullanın:** `pip install ytsage` (önerilir) -- ✅ **Kaynaktan derleyin**: Bu [kılavuzu](.github/CI_CD_README.md) takip ederek +- ✅ **Kaynaktan derleyin**: Bu [kılavuzu](../.github/CI_CD_README.md) takip ederek - ✅ **Uygulamayı antivirüs yazılımınızın beyaz listesine ekleyin**. #### 🍎 macOS: "Uygulama hasarlı ve açılamıyor" @@ -546,7 +546,7 @@ YTSage/ ## 📜 Lisans -Bu proje MIT Lisansı altında lisanslanmıştır - detaylar için [LICENSE](LICENSE) dosyasına bakın. +Bu proje MIT Lisansı altında lisanslanmıştır - detaylar için [LICENSE](../LICENSE) dosyasına bakın. ## 🙏 Teşekkürler diff --git a/readme-translations/README.zh.md b/readme-translations/README.zh.md index c467eab..a81c76c 100644 --- a/readme-translations/README.zh.md +++ b/readme-translations/README.zh.md @@ -360,7 +360,7 @@ YTSage 支持 **14 种语言**。您可以在 **Custom Options → Language** | 语言 | 文件 | 语言 | 文件 | |----------|------|----------|------| -| 🇺🇸 英语 | [README.md](README.md) | 🇪🇸 西班牙语 | [README.es.md](README.es.md) | +| 🇺🇸 英语 | [README.md](../README.md) | 🇪🇸 西班牙语 | [README.es.md](README.es.md) | | 🇸🇦 阿拉伯语 | [README.ar.md](README.ar.md) | 🇫🇷 法语 | [README.fr.md](README.fr.md) | | 🇩🇪 德语 | [README.de.md](README.de.md) | 🇮🇳 印地语 | [README.hi.md](README.hi.md) | | 🇮🇩 印尼语 | [README.id.md](README.id.md) | 🇮🇹 意大利语 | [README.it.md](README.it.md) | @@ -400,7 +400,7 @@ YTSage 支持 **14 种语言**。您可以在 **Custom Options → Language** **安全建议:** - ✅ **通过 pip 安装:** `pip install ytsage`(推荐) -- ✅ **自行构建**: 参照 [CI_CD 指南](.github/CI_CD_README.md) +- ✅ **自行构建**: 参照 [CI_CD 指南](../.github/CI_CD_README.md) - ✅ **添加排除项**。 #### 🍎 macOS: "应用已损坏,无法打开" @@ -500,7 +500,7 @@ YTSage/ ## 📜 许可证 -本项目基于 MIT 许可证分发 - 详情请参阅 [LICENSE](LICENSE) 文件。 +本项目基于 MIT 许可证分发 - 详情请参阅 [LICENSE](../LICENSE) 文件。 ## 🙏 鸣谢 From e76d47412d1bf05a4b38be9e1279812073f0dc16 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 25 May 2026 14:04:12 +0300 Subject: [PATCH 17/23] Correct path for localized README creation Fix README contribution instructions to point new translations to the readme-translations/ directory. Previously the docs suggested creating README..md at the repo root; this change clarifies that localized files should be placed under readme-translations/README..md to keep translations organized. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6ba173..5272e7a 100644 --- a/README.md +++ b/README.md @@ -468,7 +468,7 @@ We welcome contributions! Here’s how you can help: - Update the relevant localized README file (e.g., `readme-translations/README.fr.md`) - Keep app strings synced by editing `ytsage/languages/.json` -- If your language is missing, start from `README.md` and create `README..md` +- If your language is missing, start from `README.md` and create `readme-translations/README..md`

📂 Project Structure From 831e66a5b9eea0897a04b9234e43e8fb05fd9890 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 25 May 2026 14:04:32 +0300 Subject: [PATCH 18/23] Include readme-translations in MANIFEST Add a recursive-include rule for the readme-translations directory to MANIFEST.in so translated README files are included in source distributions (sdist) and packaged with releases. --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index bd19fb6..2fd4b77 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,6 @@ include README.md include LICENSE include pyproject.toml +recursive-include readme-translations * recursive-include ytsage/assets * recursive-include ytsage/languages * From 4bc43174b620ca731e5a84ef07f8c764bd830e25 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Wed, 1 Jul 2026 13:42:10 +0300 Subject: [PATCH 19/23] Release YTSage 5.2.0 Bump the project and package version from 5.2.0b to 5.2.0. --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 481af62..4da8f65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.2.0b" +version = "5.2.0" description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index 67d4aed..e3a8480 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.2.0b" +__version__ = "5.2.0" __author__ = "oop7" From 7089c61d6e3c7f54df1357f8fbc393747f70c818 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:04:45 +0300 Subject: [PATCH 20/23] ci: add star history workflow --- .github/workflows/star-history.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/star-history.yml diff --git a/.github/workflows/star-history.yml b/.github/workflows/star-history.yml new file mode 100644 index 0000000..28f9b04 --- /dev/null +++ b/.github/workflows/star-history.yml @@ -0,0 +1,28 @@ +name: Star History + +on: + schedule: + - cron: '0 3 * * 0' # every Sunday at 03:00 UTC + workflow_dispatch: # allow manual run + +permissions: + contents: write + +jobs: + generate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Generate Star History Chart + uses: narayann7/star-history-action@v1 + with: + repos: ${{ github.repository }} + + + - name: Commit chart + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add . + git diff --quiet && git diff --staged --quiet || (git commit -m "chore: update star history chart" && git push) \ No newline at end of file From a61f9722e66ac141bf406cfe6909883c022b71f0 Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:41:33 +0300 Subject: [PATCH 21/23] Bump: version to 5.4.5 --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 83250f6..4de973c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.3.0b" +version = "5.4.5 " description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index 3f8489c..5142be0 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.3.0b" +__version__ = "5.4.5 " __author__ = "oop7" From b3e00e7fe71cb244fb555ccf0ab268d53701946d Mon Sep 17 00:00:00 2001 From: oop7 <110548351+oop7@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:46:04 +0300 Subject: [PATCH 22/23] remove the extra space --- pyproject.toml | 2 +- ytsage/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4de973c..373cb95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ytsage" -version = "5.4.5 " +version = "5.4.5" description = "Modern YouTube downloader with a clean PySide6 interface." authors = [ { name = "oop7", email = "oop7_support@proton.me" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index 5142be0..761f792 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -4,5 +4,5 @@ A modern, user-friendly YouTube video downloader built with PySide6. """ -__version__ = "5.4.5 " +__version__ = "5.4.5" __author__ = "oop7" From ad3ecd5e51ad10387ab7c847041846e9faf7ddfb Mon Sep 17 00:00:00 2001 From: Adamdev-AI Date: Wed, 5 Aug 2026 20:56:08 +0300 Subject: [PATCH 23/23] Fix about window crash when gathering system info (#130) --- .../ytsage_gui_dialogs/ytsage_dialogs_base.py | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py index 8be46b4..4578a71 100644 --- a/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py +++ b/ytsage/gui/ytsage_gui_dialogs/ytsage_dialogs_base.py @@ -5,7 +5,7 @@ from datetime import datetime -from PySide6.QtCore import Qt, QThread, QTimer, Signal, QUrl +from PySide6.QtCore import Qt, QThread, QTimer, Signal, QUrl, QThreadPool from PySide6.QtGui import QDesktopServices from PySide6.QtWidgets import ( QDialog, @@ -36,44 +36,46 @@ class SystemInfoThread(QThread): info_ready = Signal(dict) def run(self): - info = {} - - # yt-dlp Status - ytdlp_found = check_ytdlp_installed() - info['ytdlp_found'] = ytdlp_found - info['ytdlp_version'] = get_ytdlp_version() - info['ytdlp_path'] = get_yt_dlp_path() if ytdlp_found else None - - # yt-dlp cache status - ytdlp_cache = _version_cache.get("ytdlp", {}) - info['ytdlp_last_check'] = ytdlp_cache.get("last_check", 0) - - # FFmpeg Status - ffmpeg_found = check_ffmpeg() - info['ffmpeg_found'] = ffmpeg_found - info['ffmpeg_version'] = get_ffmpeg_version() if ffmpeg_found else _('about.not_available') - info['ffmpeg_path'] = get_ffmpeg_path() if ffmpeg_found else None - - # FFmpeg cache status - ffmpeg_cache = _version_cache.get("ffmpeg", {}) - info['ffmpeg_last_check'] = ffmpeg_cache.get("last_check", 0) - - # Deno Status - deno_found = check_deno_installed() - info['deno_found'] = deno_found - info['deno_version'] = get_deno_version() if deno_found else _('about.not_available') - info['deno_path'] = get_deno_path() if deno_found else None - - # Deno cache status - deno_cache = _version_cache.get("deno", {}) - info['deno_last_check'] = deno_cache.get("last_check", 0) - - # Check integration with yt-dlp if both are present - info['integration_status'] = False - if deno_found and ytdlp_found: - info['integration_status'] = check_ytdlp_deno_integration() - - self.info_ready.emit(info) + def get_info(): + info = {} + + # yt-dlp Status + ytdlp_found = check_ytdlp_installed() + info['ytdlp_found'] = ytdlp_found + info['ytdlp_version'] = get_ytdlp_version() + info['ytdlp_path'] = get_yt_dlp_path() if ytdlp_found else None + + # yt-dlp cache status + ytdlp_cache = _version_cache.get("ytdlp", {}) + info['ytdlp_last_check'] = ytdlp_cache.get("last_check", 0) + + # FFmpeg Status + ffmpeg_found = check_ffmpeg() + info['ffmpeg_found'] = ffmpeg_found + info['ffmpeg_version'] = get_ffmpeg_version() if ffmpeg_found else _('about.not_available') + info['ffmpeg_path'] = get_ffmpeg_path() if ffmpeg_found else None + + # FFmpeg cache status + ffmpeg_cache = _version_cache.get("ffmpeg", {}) + info['ffmpeg_last_check'] = ffmpeg_cache.get("last_check", 0) + + # Deno Status + deno_found = check_deno_installed() + info['deno_found'] = deno_found + info['deno_version'] = get_deno_version() if deno_found else _('about.not_available') + info['deno_path'] = get_deno_path() if deno_found else None + + # Deno cache status + deno_cache = _version_cache.get("deno", {}) + info['deno_last_check'] = deno_cache.get("last_check", 0) + + # Check integration with yt-dlp if both are present + info['integration_status'] = False + if deno_found and ytdlp_found: + info['integration_status'] = check_ytdlp_deno_integration() + + self.info_ready.emit(info) + QThreadPool.globalInstance().start(get_info) class LogWindow(QDialog):