<# .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