Switch Windows build to ZIP only, remove MSI setup scripts

Updated CI/CD documentation and workflow to generate only ZIP portable versions for Windows, removing MSI installer support. Deleted setup.py and setup-ffmpeg.py scripts for MSI builds, and refactored workflow to use cx_Freeze CLI for ZIP packaging. Documentation and artifact instructions now reflect ZIP-only distribution.
This commit is contained in:
Your Name
2025-08-27 20:02:22 +03:00
parent 4a425661f7
commit 44b69d99e9
4 changed files with 89 additions and 359 deletions
+82 -114
View File
@@ -55,79 +55,38 @@ jobs:
pip install --no-cache-dir cx_Freeze
pip install --no-cache-dir yt-dlp
- name: Update version in setup files
- name: Prepare build variables
shell: powershell
run: |
$version = "${{ steps.get_version.outputs.VERSION }}"
Write-Host "Updating version to: $version"
# Update setup.py
$setupContent = Get-Content "build/windows/setup.py" -Raw
$setupContent = $setupContent -replace 'version="[^"]*"', "version=`"$version`""
$setupContent = $setupContent -replace 'target_name="[^"]*"', "target_name=`"YTSage-v$version.exe`""
Set-Content "build/windows/setup.py" -Value $setupContent
# Update setup-ffmpeg.py
$setupFFmpegContent = Get-Content "build/windows/setup-ffmpeg.py" -Raw
$setupFFmpegContent = $setupFFmpegContent -replace 'version="[^"]*"', "version=`"$version`""
$setupFFmpegContent = $setupFFmpegContent -replace 'target_name="[^"]*"', "target_name=`"YTSage-v$version-ffmpeg.exe`""
Set-Content "build/windows/setup-ffmpeg.py" -Value $setupFFmpegContent
Write-Host "Version updated in setup files (build script auto-detects version)"
echo "VERSION=$version" >> $env:GITHUB_ENV
Write-Host "Prepared build variables for version: $version"
- name: Build Standard Version (MSI only)
- name: Build Standard Version (ZIP)
shell: powershell
run: |
.\venv\Scripts\Activate.ps1
Write-Host "Building Standard Version..."
$version = "$env:VERSION"
Write-Host "Building Standard Version v$version ..."
# Clean previous build artifacts
if (Test-Path "build\exe.*") { Remove-Item "build\exe.*" -Recurse -Force }
if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force }
if (Test-Path "dist") { Remove-Item "dist" -Recurse -Force }
# Build executable
python build\windows\setup.py build
# Build MSI installer with error handling
Write-Host "Building standard MSI installer..."
Write-Host "Current working directory: $(Get-Location)"
Write-Host "Setup.py path: $(Resolve-Path 'build\windows\setup.py')"
# Run with maximum verbosity to capture any hidden errors
python build\windows\setup.py bdist_msi --verbose
if ($LASTEXITCODE -eq 0) {
Write-Host "Standard MSI build completed successfully"
# List MSI files created
Write-Host "MSI files in dist directory after standard build:"
if (Test-Path "dist") {
$msiFiles = Get-ChildItem -Path "dist" -Filter "*.msi"
if ($msiFiles) {
$msiFiles | ForEach-Object { Write-Host " $($_.Name)" }
} else {
Write-Host " No MSI files found! Attempting alternative build method..."
# Alternative approach: try building without excludes that might cause issues
Write-Host "Retrying MSI build with simplified configuration..."
python build\windows\setup.py bdist_msi --skip-build
if (Test-Path "dist/*.msi") {
Write-Host "Alternative MSI build succeeded!"
Get-ChildItem -Path "dist" -Filter "*.msi" | ForEach-Object { Write-Host " $($_.Name)" }
} else {
Write-Host "ERROR: MSI creation failed completely. Build directory contents:"
if (Test-Path "build") {
Get-ChildItem -Path "build" -Recurse | ForEach-Object { Write-Host " $($_.FullName)" }
}
exit 1
}
}
} else {
Write-Host " No dist directory found!"
exit 1
}
} else {
Write-Host "Error building standard MSI - exit code: $LASTEXITCODE"
exit 1
}
# Build executable using cx_Freeze CLI
cxfreeze main.py `
--target-dir "dist\YTSage" `
--base-name Win32GUI `
--icon "assets\branding\icons\YTSage.ico" `
--target-name "YTSage-v$version.exe" `
--optimize 2 `
--packages "PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,requests,PIL,packaging,markdown,playsound3,loguru,setuptools" `
--excludes "PySide6.QtBluetooth,PySide6.QtNetwork,PySide6.QtOpenGL,PySide6.QtPrintSupport,PySide6.QtSvg,PySide6.QtTest,PySide6.QtXml,PySide6.QtSql,PySide6.QtHelp,PySide6.QtMultimedia,PySide6.QtQml,PySide6.QtQuick,PySide6.QtWebEngineCore,PIL.ImageDraw,PIL.ImageFont,numpy,scipy,wx,pandas,tkinter,yt_dlp,unittest,test,tests" `
--include-files "src/:src/" `
--include-files "assets/Icon/icon.png:assets/Icon/icon.png" `
--include-files "assets/sound/notification.mp3:assets/sound/notification.mp3" `
--include-files "assets/branding/icons/YTSage.ico:YTSage.ico"
- name: Setup FFmpeg for bundle
shell: powershell
@@ -179,71 +138,82 @@ jobs:
exit 1
}
- name: Build FFmpeg Version (MSI only)
- name: Build FFmpeg Version (ZIP)
shell: powershell
run: |
.\venv\Scripts\Activate.ps1
Write-Host "Building FFmpeg Version..."
$version = "$env:VERSION"
Write-Host "Building FFmpeg Version v$version ..."
# Clean previous build artifacts
if (Test-Path "build\exe.*") { Remove-Item "build\exe.*" -Recurse -Force }
if (Test-Path "build\bdist.*") { Remove-Item "build\bdist.*" -Recurse -Force }
# Build executable with FFmpeg
python build\windows\setup-ffmpeg.py build
# Build MSI installer with FFmpeg and error handling
Write-Host "Building FFmpeg MSI installer..."
python build\windows\setup-ffmpeg.py bdist_msi
if ($LASTEXITCODE -eq 0) {
Write-Host "FFmpeg MSI build completed successfully"
# List MSI files created
Write-Host "MSI files in dist directory after FFmpeg build:"
if (Test-Path "dist") {
Get-ChildItem -Path "dist" -Filter "*.msi" | ForEach-Object { Write-Host " $($_.Name)" }
}
} else {
Write-Host "Error building FFmpeg MSI - exit code: $LASTEXITCODE"
exit 1
# Prepare optional FFmpeg include arguments
$ffinc1 = ""
$ffinc2 = ""
$ffinc3 = ""
if ($env:FFMPEG_PATH) {
$ffmpegExe = Join-Path $env:FFMPEG_PATH "ffmpeg.exe"
$ffprobeExe = Join-Path $env:FFMPEG_PATH "ffprobe.exe"
$ffplayExe = Join-Path $env:FFMPEG_PATH "ffplay.exe"
if (Test-Path $ffmpegExe) { $ffinc1 = "--include-files `"$ffmpegExe:ffmpeg.exe`"" }
if (Test-Path $ffprobeExe) { $ffinc2 = "--include-files `"$ffprobeExe:ffprobe.exe`"" }
if (Test-Path $ffplayExe) { $ffinc3 = "--include-files `"$ffplayExe:ffplay.exe`"" }
}
# Build executable with FFmpeg using cx_Freeze CLI
cxfreeze main.py `
--target-dir "dist\YTSage-FFmpeg" `
--base-name Win32GUI `
--icon "assets\branding\icons\YTSage.ico" `
--target-name "YTSage-v$version-ffmpeg.exe" `
--optimize 2 `
--packages "PySide6.QtCore,PySide6.QtGui,PySide6.QtWidgets,requests,PIL,packaging,markdown,playsound3,loguru,setuptools" `
--excludes "PySide6.QtBluetooth,PySide6.QtNetwork,PySide6.QtOpenGL,PySide6.QtPrintSupport,PySide6.QtSvg,PySide6.QtTest,PySide6.QtXml,PySide6.QtSql,PySide6.QtHelp,PySide6.QtMultimedia,PySide6.QtQml,PySide6.QtQuick,PySide6.QtWebEngineCore,PIL.ImageDraw,PIL.ImageFont,numpy,scipy,wx,pandas,tkinter,yt_dlp,unittest,test,tests" `
--include-files "src/:src/" `
--include-files "assets/Icon/icon.png:assets/Icon/icon.png" `
--include-files "assets/sound/notification.mp3:assets/sound/notification.mp3" `
--include-files "assets/branding/icons/YTSage.ico:YTSage.ico" `
$ffinc1 $ffinc2 $ffinc3
- name: Prepare release artifacts
- name: Package and prepare release artifacts (ZIPs)
shell: powershell
run: |
$version = "${{ steps.get_version.outputs.VERSION }}"
Write-Host "Preparing artifacts for version: $version"
Write-Host "Preparing ZIP artifacts for version: $version"
New-Item -ItemType Directory -Path "artifacts" -Force
# List all files in dist directory first
# List dist directories
Write-Host "Files in dist directory:"
if (Test-Path "dist") {
Get-ChildItem -Path "dist" -Recurse | ForEach-Object { Write-Host " $($_.FullName)" }
} else {
Write-Host " No dist directory found!"
}
# Find and copy standard build artifacts from dist directory
# Look for any MSI file that doesn't contain "ffmpeg" in the name
$standardMsi = Get-ChildItem -Path "dist" -Filter "*.msi" | Where-Object { $_.Name -notlike "*ffmpeg*" -and $_.Name -notlike "*FFmpeg*" } | Select-Object -First 1
if ($standardMsi) {
Copy-Item $standardMsi.FullName "artifacts\YTSage-v$version.msi"
Write-Host "Copied: $($standardMsi.Name) -> YTSage-v$version.msi"
} else {
Write-Host "Warning: Standard MSI not found"
# List all MSI files for debugging
Write-Host "Available MSI files:"
Get-ChildItem -Path "dist" -Filter "*.msi" | ForEach-Object { Write-Host " $($_.Name)" }
exit 1
}
# Find and copy FFmpeg build artifacts from dist directory
# Look for any MSI file that contains "ffmpeg" or "FFmpeg" in the name
$ffmpegMsi = Get-ChildItem -Path "dist" -Filter "*.msi" | Where-Object { $_.Name -like "*ffmpeg*" -or $_.Name -like "*FFmpeg*" } | Select-Object -First 1
if ($ffmpegMsi) {
Copy-Item $ffmpegMsi.FullName "artifacts\YTSage-v$version-ffmpeg.msi"
Write-Host "Copied: $($ffmpegMsi.Name) -> YTSage-v$version-ffmpeg.msi"
# Create Standard ZIP
$standardDist = Join-Path (Get-Location) "dist\YTSage"
if (Test-Path $standardDist) {
$stdZip = "artifacts\YTSage-v$version.zip"
if (Test-Path $stdZip) { Remove-Item $stdZip -Force }
Compress-Archive -Path "$standardDist\*" -DestinationPath $stdZip -CompressionLevel Optimal
Write-Host "Created: $(Resolve-Path $stdZip)"
} else {
Write-Host "Warning: FFmpeg MSI not found"
Write-Host "Warning: Standard dist folder not found at $standardDist"
}
# Create FFmpeg ZIP
$ffmpegDist = Join-Path (Get-Location) "dist\YTSage-FFmpeg"
if (Test-Path $ffmpegDist) {
$ffZip = "artifacts\YTSage-v$version-ffmpeg.zip"
if (Test-Path $ffZip) { Remove-Item $ffZip -Force }
Compress-Archive -Path "$ffmpegDist\*" -DestinationPath $ffZip -CompressionLevel Optimal
Write-Host "Created: $(Resolve-Path $ffZip)"
} else {
Write-Host "Warning: FFmpeg dist folder not found at $ffmpegDist"
}
# List all artifacts
@@ -273,30 +243,28 @@ jobs:
## Downloads
### Standard Version
- **YTSage-v${{ steps.get_version.outputs.VERSION }}.msi** - Windows Installer (Downloads FFmpeg when needed)
### Standard Version (ZIP)
- **YTSage-v${{ steps.get_version.outputs.VERSION }}.zip** Portable ZIP (downloads FFmpeg on first use if needed)
### FFmpeg Bundle Version
- **YTSage-v${{ steps.get_version.outputs.VERSION }}-ffmpeg.msi** - Windows Installer with FFmpeg included
### FFmpeg Bundle Version (ZIP)
- **YTSage-v${{ steps.get_version.outputs.VERSION }}-ffmpeg.zip** Portable ZIP with FFmpeg included
## Installation Instructions
## Installation / Usage
### MSI Installer
1. Download the `.msi` file
2. Double-click to run the installer
3. Follow the installation wizard
4. YTSage will be available in your Start Menu
1. Download the `.zip` file you want.
2. Right-click the ZIP, choose Properties, and if you see "Unblock", check it and Apply.
3. Extract the ZIP to a folder (e.g., `C:\Apps\YTSage`).
4. Run `YTSage-v${{ steps.get_version.outputs.VERSION }}.exe` inside the extracted folder.
## System Requirements
- Windows 10/11 (64-bit)
- .NET Framework (usually pre-installed)
- Internet connection for yt-dlp updates
## Notes
- **Standard version**: Downloads FFmpeg automatically when needed
- **FFmpeg bundle**: Includes FFmpeg binaries for offline use
- **Standard version**: Downloads FFmpeg automatically when needed.
- **FFmpeg bundle**: Includes FFmpeg binaries for offline use.
---