#!/bin/bash # ============================================================================= # GÉNÉRATION DU SITE — enchaîne toutes les étapes # # Pour chaque voyage : # 1. extraction_infos.sh → CSV des positions GPS des photos et vidéos # 2. compress.sh → vidéos web (1080p HEVC + 720p H.264) # 3. prepare_web.py → photos allégées et images d'aperçu des vidéos # 4. genere_carte.py → pages et cartes du voyage # Puis une fois : genere_index_general.py → page d'accueil du site. # # Un voyage est un dossier qui contient au moins un de rushs/, routes/, # photos/. Il peut être rangé un niveau plus bas, dans un dossier de # regroupement (Balades/Aisne-06-2026). Une étape sans matière est sautée. # # À lancer depuis la racine du site (le dossier qui contient les voyages) : # ../RoadTripsGenerator/Scripts/genere_site.sh # tous # ../RoadTripsGenerator/Scripts/genere_site.sh Ete-2026 # un seul # ../RoadTripsGenerator/Scripts/genere_site.sh Balades/Vexin-10-2026 # # Variables : # ROOT=chemin racine du site (défaut : dossier courant) # SKIP_COMPRESS=1 ne lance pas compress.sh # + celles de compress.sh (JOBS, ENCODER…) et de prepare_web.py (WEB_PX…) # ============================================================================= set -uo pipefail shopt -s nullglob SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" ROOT="${ROOT:-$PWD}" SKIP_COMPRESS="${SKIP_COMPRESS:-0}" cd "$ROOT" || { echo "❌ Racine introuvable : $ROOT"; exit 1; } ROOT="$PWD" export RT_RACINE="$ROOT" # cible du bouton « Retour » des voyages for s in extraction_infos.sh compress.sh prepare_web.py genere_carte.py genere_index_general.py; do if [ ! -f "$SCRIPT_DIR/$s" ]; then echo "❌ Script manquant : $SCRIPT_DIR/$s" exit 1 fi [ -x "$SCRIPT_DIR/$s" ] || chmod +x "$SCRIPT_DIR/$s" 2>/dev/null done # Dossiers qui ne sont jamais des voyages ni des regroupements. ignore() { case "$1" in Scripts|RoadTripsGenerator|html|assets|videos|photos|photos_web|apercus|rushs|routes) return 0 ;; _*|.*) return 0 ;; esac return 1 } # ok | lien_casse | absent. Un lien symbolique cassé ressemble à un lien valide # dans `ls -l`, mais `test -d` renvoie faux : on le signale à part. etat_dossier() { if [ -d "$1" ]; then echo ok elif [ -L "$1" ]; then echo lien_casse else echo absent fi } resoudre_lien() { python3 -c 'import os,sys p = sys.argv[1] print(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(p)), os.readlink(p))))' "$1" 2>/dev/null \ || readlink "$1" 2>/dev/null || echo "?" } # Vrai si le dossier a au moins un sous-dossier exploitable. Signale au passage # les liens cassés et les sous-dossiers manquants (dans $DETAILS). DETAILS="" est_voyage() { local dir="$1" sub presents=0 DETAILS="" for sub in rushs routes photos; do case "$(etat_dossier "$dir/$sub")" in ok) presents=$((presents + 1)) ;; lien_casse) echo "🔗 $dir/$sub : LIEN SYMBOLIQUE CASSÉ" echo " pointe vers : $(resoudre_lien "$dir/$sub")" echo " (disque externe non branché, ou dossier déplacé ?)" DETAILS="$DETAILS $sub(lien cassé)" ;; absent) DETAILS="$DETAILS $sub(absent)" ;; esac done [ "$presents" -gt 0 ] } echo "==================================================" echo " GÉNÉRATION DU SITE" echo " Racine : $ROOT" echo "==================================================" echo # --- Sélection des voyages --------------------------------------------------- voyages=() ajoute() { voyages+=("$1") [ -n "$DETAILS" ] && echo "⚠️ $1 : sous-dossier(s) indisponible(s) :$DETAILS — étape(s) sautée(s)" } if [ "$#" -gt 0 ]; then for d in "$@"; do d="${d%/}" if [ ! -d "$d" ]; then echo "❌ $d : ce dossier n'existe pas."; continue; fi if est_voyage "$d"; then ajoute "$d" else echo "❌ $d : aucun de rushs/ routes/ photos/ n'est utilisable :$DETAILS"; fi done else for d in */; do d="${d%/}" ignore "$d" && continue if est_voyage "$d"; then ajoute "$d" else # Pas un voyage : peut-être un regroupement (Balades/…). for s in "$d"/*/; do s="${s%/}" ignore "$(basename "$s")" && continue est_voyage "$s" && ajoute "$s" done fi done fi if [ "${#voyages[@]}" -eq 0 ]; then echo echo "❌ Aucun voyage à traiter." echo " Un voyage doit contenir au moins un de : rushs/ routes/ photos/" exit 1 fi echo echo "📁 ${#voyages[@]} voyage(s) à traiter : ${voyages[*]}" echo # --- Traitement -------------------------------------------------------------- ok=0; ko=0 T0=$(date +%s) for dir in "${voyages[@]}"; do echo "==================================================" echo "▶ $dir" echo "==================================================" if ! "$SCRIPT_DIR/extraction_infos.sh" "$dir"; then echo "❌ Extraction échouée sur $dir — voyage ignoré." ko=$((ko + 1)); echo; continue fi if [ "$SKIP_COMPRESS" = "1" ]; then echo "⏭️ Compression sautée (SKIP_COMPRESS=1)" elif [ "$(etat_dossier "$dir/rushs")" != "ok" ]; then echo "⏭️ Compression sautée : pas de dossier rushs/ utilisable." elif ! "$SCRIPT_DIR/compress.sh" "$dir"; then echo "⚠️ Compression incomplète sur $dir — on continue avec les vidéos disponibles." fi # Non bloquant : sans photos web ni aperçus, les pages utilisent les originaux. "$SCRIPT_DIR/prepare_web.py" "$dir" || echo "⚠️ Préparation web incomplète sur $dir — on continue." if ! "$SCRIPT_DIR/genere_carte.py" "$dir"; then echo "❌ Génération des cartes échouée sur $dir." ko=$((ko + 1)); echo; continue fi ok=$((ok + 1)) echo "✅ $dir terminé" echo done echo "==================================================" echo "▶ Index général" echo "==================================================" "$SCRIPT_DIR/genere_index_general.py" "$ROOT" T1=$(date +%s); EL=$((T1 - T0)) echo echo "==================================================" printf " ✅ %d voyage(s) généré(s)" "$ok" [ "$ko" -gt 0 ] && printf ", ❌ %d en échec" "$ko" printf " — %d min %02d s\n" $((EL / 60)) $((EL % 60)) echo " 🌍 Ouvre index.html à la racine du site." echo "==================================================" [ "$ko" -gt 0 ] && exit 1 exit 0