python-GPX-traceEtCompteurV.../gpx_video.ps1
2026-09-23 19:01:24 +02:00

82 lines
3.0 KiB
PowerShell

<#
.SYNOPSIS
Lance gpx_video.py sur toutes les traces GPX du répertoire courant.
.DESCRIPTION
Utilise le venv .venv situé à côté de ce script (il est créé et les
dépendances de requirements.txt installées s'il n'existe pas encore).
Chaque fichier *.gpx du répertoire courant produit une ou plusieurs vidéos
MP4 du même nom : noms des villes zoomés (--zoom-villes) et découpage en
morceaux d'au plus 20 villes (--villes-par-morceau 20).
Les arguments supplémentaires sont transmis tels quels à gpx_video.py ; une
autre option de découpage (--morceaux, --duree-morceau, --villes-par-morceau)
ou --sans-villes remplace le découpage par défaut.
.EXAMPLE
.\gpx_video.ps1
.\gpx_video.ps1 --duree 90
.\gpx_video.ps1 --villes-par-morceau 10
#>
$ErrorActionPreference = 'Stop'
$code = 0
try {
$racine = $PSScriptRoot
$venv = Join-Path $racine '.venv'
$python = Join-Path $venv 'Scripts\python.exe'
$script = Join-Path $racine 'gpx_video.py'
if (-not (Test-Path $python)) {
Write-Host "Création du venv dans $venv ..."
& python -m venv $venv
if ($LASTEXITCODE -ne 0) { throw "Échec de la création du venv." }
& $python -m pip install --upgrade pip
& $python -m pip install -r (Join-Path $racine 'requirements.txt')
if ($LASTEXITCODE -ne 0) { throw "Échec de l'installation des dépendances." }
}
if (-not (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
throw "ffmpeg introuvable dans le PATH."
}
$traces = @(Get-ChildItem -Path (Get-Location) -Filter '*.gpx' -File | Sort-Object Name)
if ($traces.Count -eq 0) {
throw "Aucun fichier .gpx dans $(Get-Location)."
}
# Options par défaut, placées avant celles de l'utilisateur. Le découpage
# par villes est omis si l'utilisateur en choisit un autre (options
# exclusives) ou désactive les villes.
$defaut = @('--zoom-villes')
$autreDecoupage = @($args | Where-Object {
$_ -match '^--(morceaux|duree-morceau|villes-par-morceau|sans-villes)(=|$)' })
if ($autreDecoupage.Count -eq 0) { $defaut += @('--villes-par-morceau', '20') }
$echecs = @()
$i = 0
foreach ($trace in $traces) {
$i++
Write-Host "[$i/$($traces.Count)] $($trace.Name)" -ForegroundColor Cyan
& $python $script $trace.FullName @defaut @args
if ($LASTEXITCODE -ne 0) { $echecs += $trace.Name }
}
if ($echecs.Count -gt 0) {
throw "Échec pour : $($echecs -join ', ')"
}
Write-Host "Terminé : $($traces.Count) trace(s) traitée(s)." -ForegroundColor Green
}
catch {
Write-Host "ERREUR : $($_.Exception.Message)" -ForegroundColor Red
$code = 1
}
# Laisse la fenêtre ouverte en cas d'échec (lancement par double-clic ou
# « Exécuter avec PowerShell »), sauf en mode non interactif.
if ($code -ne 0 -and [Environment]::UserInteractive -and
-not ([Environment]::GetCommandLineArgs() -match '^-NonI')) {
Read-Host "Appuyez sur Entrée pour fermer" | Out-Null
}
exit $code