- Inno-Setup-Installer (packaging/playtube.iss): installiert pro Benutzer nach %LOCALAPPDATA%\Programs\Playtube, feste AppId -> jede neue Version ueberschreibt die vorhandene Installation an Ort und Stelle, raeumt den alten _internal-Ordner auf und beendet laufende Playtube-Prozesse vor dem Kopieren - Updater: installierte Kopie nimmt das kleine Patch (Versionseintrag in "Apps & Features" wird nachgezogen), portable Kopie wechselt per stillem Setup in die regulaere Installation; Patch nur bei passender PySide6-Version (steht im Dateinamen), sonst Setup; Aufraeumen des heruntergeladenen Installers - Einzelinstanz-Schutz (playtube/single_instance.py): zwei Prozesse auf demselben Browser-Profil liessen auf YouTube alle Icons verschwinden; ein zweiter Start holt jetzt das laufende Fenster nach vorn (auch .play-Patchdateien werden weitergereicht) - build.ps1 baut den Installer mit, Release-Pipeline haengt ihn an jedes Release - README: Installation, Update-Ablauf, Troubleshooting fuer fehlende Icons
98 lines
5.2 KiB
PowerShell
98 lines
5.2 KiB
PowerShell
# Baut Playtube.exe mit PyInstaller und sorgt dafuer, dass auch der QtWebEngine-
|
|
# Hilfsprozess (der eigentlich den Ton ausgibt) den Namen "Playtube" traegt, damit er
|
|
# im Taskmanager und - so weit von der jeweiligen Windows-Version respektiert - im
|
|
# Lautstaerkemixer nicht als "QtWebEngineProcess" auftaucht.
|
|
#
|
|
# Aufruf (im Projekt-Root, mit aktivierter venv):
|
|
# powershell -ExecutionPolicy Bypass -File packaging\build.ps1
|
|
#
|
|
# Optional: rcedit (https://github.com/electron/rcedit) im PATH oder unter
|
|
# packaging\rcedit.exe ablegen, dann werden Icon + Versionsinfo des umbenannten
|
|
# Hilfsprozesses ebenfalls auf "Playtube" gesetzt (sonst bleibt intern "QtWebEngineProcess"
|
|
# stehen, nur der Dateiname aendert sich - Windows zeigt dann meist trotzdem den
|
|
# Dateinamen "PlaytubeHelper" an).
|
|
|
|
param(
|
|
# Ueberspringt den Bau des Setup-Installers (Playtube-Setup-vX.Y.Z.exe, benoetigt Inno Setup 6).
|
|
[switch]$SkipInstaller
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$root = Split-Path -Parent $PSScriptRoot
|
|
Set-Location $root
|
|
|
|
Write-Host "==> Baue Playtube.exe mit PyInstaller ..." -ForegroundColor Cyan
|
|
pyinstaller packaging\playtube.spec --noconfirm --distpath dist --workpath build
|
|
if ($LASTEXITCODE -ne 0) { throw "PyInstaller-Build fehlgeschlagen." }
|
|
|
|
$distDir = Join-Path $root "dist\Playtube"
|
|
$internalDir = Join-Path $distDir "_internal"
|
|
$searchRoot = if (Test-Path $internalDir) { $internalDir } else { $distDir }
|
|
|
|
$engineProcess = Get-ChildItem -Path $searchRoot -Recurse -Filter "QtWebEngineProcess.exe" -ErrorAction SilentlyContinue | Select-Object -First 1
|
|
if (-not $engineProcess) {
|
|
Write-Warning "QtWebEngineProcess.exe wurde im Build nicht gefunden - Audio-/Taskmanager-Branding des Hilfsprozesses wird uebersprungen."
|
|
} else {
|
|
$helperPath = Join-Path $engineProcess.Directory.FullName "PlaytubeHelper.exe"
|
|
Copy-Item $engineProcess.FullName $helperPath -Force
|
|
Write-Host "==> Hilfsprozess kopiert nach $helperPath" -ForegroundColor Cyan
|
|
|
|
$rcedit = Get-Command rcedit -ErrorAction SilentlyContinue
|
|
$rceditLocal = Join-Path $PSScriptRoot "rcedit.exe"
|
|
if ($rcedit) {
|
|
$rceditExe = $rcedit.Source
|
|
} elseif (Test-Path $rceditLocal) {
|
|
$rceditExe = $rceditLocal
|
|
} else {
|
|
$rceditExe = $null
|
|
}
|
|
|
|
if ($rceditExe) {
|
|
Write-Host "==> Patche Icon/Versionsinfo des Hilfsprozesses mit rcedit ..." -ForegroundColor Cyan
|
|
& $rceditExe $helperPath --set-icon "$root\assets\icon.ico"
|
|
& $rceditExe $helperPath --set-version-string "FileDescription" "Playtube"
|
|
& $rceditExe $helperPath --set-version-string "ProductName" "Playtube"
|
|
& $rceditExe $helperPath --set-version-string "CompanyName" "Playtube"
|
|
& $rceditExe $helperPath --set-version-string "OriginalFilename" "PlaytubeHelper.exe"
|
|
} else {
|
|
Write-Host "Hinweis: rcedit nicht gefunden - Hilfsprozess heisst jetzt 'PlaytubeHelper.exe'," -ForegroundColor Yellow
|
|
Write-Host "seine interne Versionsinfo/Icon bleibt aber 'QtWebEngineProcess'. Fuer volles" -ForegroundColor Yellow
|
|
Write-Host "Branding: rcedit von https://github.com/electron/rcedit/releases laden und" -ForegroundColor Yellow
|
|
Write-Host "als packaging\rcedit.exe ablegen, dann dieses Skript erneut ausfuehren." -ForegroundColor Yellow
|
|
}
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host "Fertig! Die App liegt unter dist\Playtube\Playtube.exe" -ForegroundColor Green
|
|
|
|
# --- Setup-Installer (Inno Setup) ------------------------------------------------------
|
|
# Baut aus dist\Playtube den Installer dist\installer\Playtube-Setup-vX.Y.Z.exe. Ein und
|
|
# derselbe Installer richtet Playtube erstmalig ein UND aktualisiert spaeter eine
|
|
# vorhandene Installation an Ort und Stelle (feste AppId) - es gibt nie mehrere Versionen.
|
|
if (-not $SkipInstaller) {
|
|
$versionLine = Select-String -Path (Join-Path $root "playtube\__init__.py") -Pattern '__version__\s*=\s*"([^"]+)"' | Select-Object -First 1
|
|
if (-not $versionLine) { throw "Konnte __version__ in playtube\__init__.py nicht lesen." }
|
|
$version = $versionLine.Matches[0].Groups[1].Value
|
|
|
|
$isccCandidates = @(
|
|
(Get-Command iscc -ErrorAction SilentlyContinue | ForEach-Object { $_.Source }),
|
|
(Join-Path $env:LOCALAPPDATA "Programs\Inno Setup 6\ISCC.exe"),
|
|
(Join-Path ${env:ProgramFiles(x86)} "Inno Setup 6\ISCC.exe"),
|
|
(Join-Path $env:ProgramFiles "Inno Setup 6\ISCC.exe")
|
|
)
|
|
$iscc = $isccCandidates | Where-Object { $_ -and (Test-Path $_) } | Select-Object -First 1
|
|
|
|
if (-not $iscc) {
|
|
Write-Host ""
|
|
Write-Host "Hinweis: Inno Setup 6 nicht gefunden - Setup-Installer wird uebersprungen." -ForegroundColor Yellow
|
|
Write-Host "Installieren: winget install --id JRSoftware.InnoSetup -e" -ForegroundColor Yellow
|
|
Write-Host "(oder mit -SkipInstaller diesen Schritt bewusst auslassen)" -ForegroundColor Yellow
|
|
} else {
|
|
Write-Host ""
|
|
Write-Host "==> Baue Setup-Installer (Version $version) mit Inno Setup ..." -ForegroundColor Cyan
|
|
& $iscc "/DAppVersion=$version" (Join-Path $PSScriptRoot "playtube.iss")
|
|
if ($LASTEXITCODE -ne 0) { throw "Inno-Setup-Build fehlgeschlagen." }
|
|
Write-Host "Fertig! Installer: dist\installer\Playtube-Setup-v$version.exe" -ForegroundColor Green
|
|
}
|
|
}
|