Administration native sur le Mac, réencodage sélectif et aide intégrée

- admin.sh : RTG lancé directement sur le Mac (plus de conteneur), nginx
  joint l'interface par host.docker.internal:8765 ; variante conteneur
  conservée (admin-docker.sh, docker-compose-conteneur.yml)
- Compression : réglages lus dans les fichiers (CRF, codec), refaire
  seulement le 1080p ou le 720p, seulement si les réglages ont changé ;
  réglages vidéo propres à chaque voyage ; « Compression actuelle » affichée
- Plus d'arrêt automatique après 2 h d'inactivité (--arret-inactif, 0 par défaut) ;
  arrêt propre qui attend la fin des encodages en cours
- Aide contextuelle dans l'interface (rtg/interface/aide) ; README centré
  sur l'installation et la mise en place
- Cœurs attribués au conteneur détectés (cgroup) et signalés

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mf2kATMtqVABHSYdxJMnim
This commit is contained in:
FabriceandClaude Opus 5.5 committed 2026-10-19 05:32:05 +00:00
1 parent b54ae69b19
commit ada3d76f50
38 files changed
+1067 -264

No files matched your search

+12 -5
View File
@@ -46,8 +46,11 @@ def _sources_disponibles(voyage, liste):
return True
def generer_voyage(voyage, racine, site_cfg, compression=True, force=False, suivi=None):
"""Toute la chaîne pour un voyage. `suivi(evenement)` (interface) reçoit
def generer_voyage(voyage, racine, site_cfg, compression=True, force=False, suivi=None,
paliers=("hd", "sd"), refaire="manquantes", force_videos=None):
"""Toute la chaîne pour un voyage. `force` refait photos web et pages, et
aussi les vidéos sauf si force_videos=False (l'interface choisit alors les
vidéos à refaire par `refaire`). `suivi(evenement)` (interface) reçoit
{"etape": …} au début de chaque étape et {"video": …} pendant la compression."""
cfg = reglages_voyage(voyage, site_cfg)
nom = os.path.relpath(voyage, racine)
@@ -80,7 +83,8 @@ def generer_voyage(voyage, racine, site_cfg, compression=True, force=False, suiv
if suivi:
def progression(fichier, etat, pct, rang):
suivi({"video": fichier, "etat": etat, "pct": pct, "rang": rang})
video.compresser(voyage, cfg, a, force=force, progression=progression)
video.compresser(voyage, cfg, a, force=force if force_videos is None else force_videos,
progression=progression, paliers=paliers, refaire=refaire)
elif not compression:
dire("⏭️ Compression sautée.")
@@ -92,7 +96,8 @@ def generer_voyage(voyage, racine, site_cfg, compression=True, force=False, suiv
return ok
def generer(racine, voyages=None, compression=True, force=False, mymaps_maj=False, suivi=None):
def generer(racine, voyages=None, compression=True, force=False, mymaps_maj=False, suivi=None,
paliers=("hd", "sd"), refaire="manquantes", force_videos=None):
racine = os.path.abspath(racine)
cfg = reglages_site(racine)
liste = [os.path.abspath(v) for v in voyages] if voyages else decouvrir(racine)
@@ -100,7 +105,9 @@ def generer(racine, voyages=None, compression=True, force=False, mymaps_maj=Fals
dire("❌ Aucun voyage trouvé (dossiers avec routes/, photos/, rushs/ ou voyage.toml).")
return False
dire(f"📁 {len(liste)} voyage(s) : {', '.join(os.path.relpath(v, racine) for v in liste)}\n")
echecs = [v for v in liste if not generer_voyage(v, racine, cfg, compression, force, suivi)]
echecs = [v for v in liste
if not generer_voyage(v, racine, cfg, compression, force, suivi, paliers, refaire,
force_videos)]
verifier_arret()
if suivi:
suivi({"etape": "Accueil", "voyage": ""})