Files
RoadTripsGenerator/Scripts/genere_site.sh
T
FabriceandClaude Opus 5.5 97b936fd3e Refonte : templates, balades, photos web, aperçus, carte globale
- Mise en page sortie du Python : Scripts/templates/ (Jinja2 + CSS/JS
  communs copiés dans assets/ de chaque voyage)
- Voyages rangés dans un sous-dossier (Balades/…) : rubriques sur
  l'accueil, 2 plus récents par rubrique, pages voyages.html et
  balades.html
- prepare_web.py : photos allégées (photos_web/) et images d'aperçu
  des vidéos (apercus/)
- Voyage d'une seule journée : la page du voyage est la carte du jour
- Carte globale de l'accueil (OpenStreetMap) : voyages du site + cartes
  Google My Maps récupérées (mymaps.txt, _mymaps/), moto par voyage
  (moto.txt)
- KML par voyage pour My Maps
- compress.sh : réencode une sortie illisible (encodage interrompu) ;
  repli automatique sur l'autre qualité dans la page
- Corrections : CSV vide (voyage sans photo), racine de genere_site.sh,
  fichiers ._ de macOS
- README réécrit, commentaires allégés

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mf2kATMtqVABHSYdxJMnim
2026-10-09 11:08:01 +00:00

190 lines
6.5 KiB
Bash
Executable File

#!/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