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

+25
View File
@@ -121,3 +121,28 @@ def test_deuxieme_passage_ne_refait_rien(site_test, capsys):
sortie = capsys.readouterr().out
assert "Aucun nouvel encodage" in sortie
assert "0 réduite(s)" in sortie
def test_reencodage_selon_reglages(site_test):
"""Les réglages relus dans les vidéos ; seule la version dont les réglages
ont changé est refaite, et rien quand ils n'ont pas changé."""
from rtg import video
racine, voyage = site_test
cfg = config.reglages_voyage(str(voyage), config.reglages_site(str(racine)))
a = sources.analyser(str(voyage), cfg)
assert video.compresser(str(voyage), cfg, a)
hd, sd = video.sorties(str(voyage), a.videos[0])
assert video.reglages_fichier(hd) == ("HEVC", 26.0)
assert video.reglages_fichier(sd) == ("H.264", 25.0)
dates = (os.path.getmtime(hd), os.path.getmtime(sd))
config.modifier_toml(str(voyage / "voyage.toml"), {"video": {"crf_hevc": 30}})
cfg = config.reglages_voyage(str(voyage), config.reglages_site(str(racine)))
assert video.compresser(str(voyage), cfg, a, refaire="differentes")
assert video.reglages_fichier(hd) == ("HEVC", 30.0)
assert os.path.getmtime(sd) == dates[1] # 720p inchangé
dates = (os.path.getmtime(hd), os.path.getmtime(sd))
assert video.compresser(str(voyage), cfg, a, refaire="differentes")
assert (os.path.getmtime(hd), os.path.getmtime(sd)) == dates # rien à refaire
bilan = video.bilan_compression(str(voyage))
assert bilan["1080p"]["reglages"] == {("HEVC", 30.0): 1}
+19
View File
@@ -219,3 +219,22 @@ def test_derriere_le_serveur_web(voyage_sans_heures, tmp_path, monkeypatch):
finally:
srv.shutdown()
serveur.ENV.globals["base"] = ""
def test_aide(client):
appel, racine, voyage = client
code, html = appel("/aide")
assert code == 200 and "Prise en main" in html and 'href="/aide/generer"' in html
code, html = appel("/aide/generer?panneau=1")
assert "<h1>Générer</h1>" in html and "CRF" in html
code, html = appel("/aide/index?panneau=1")
assert 'hx-get="/aide/sources?panneau=1"' in html # liens internes au panneau
code, html = appel("/aide/nexistepas")
assert "introuvable" in html
# Chaque lien entre pages d'aide mène à une page qui existe
import glob, re as _re
dossier = os.path.join(os.path.dirname(serveur.__file__), "aide")
sujets = {os.path.basename(f)[:-3] for f in glob.glob(os.path.join(dossier, "*.md"))}
for f in glob.glob(os.path.join(dossier, "*.md")):
for cible in _re.findall(r"\]\(([a-z]+)\.md\)", open(f, encoding="utf-8").read()):
assert cible in sujets, (f, cible)