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

+19 -1
View File
@@ -83,7 +83,15 @@ def a_jour(sortie, source, force=False):
def coeurs_performance():
"""Cœurs « performance » sur Apple Silicon (les cœurs d'efficience
ralentiraient tout le pool de threads x265), sinon tous les cœurs."""
ralentiraient tout le pool de threads x265), sinon les cœurs utilisables
(dans un conteneur : ceux qui lui sont attribués)."""
if hasattr(os, "sched_getaffinity") and sys.platform != "darwin":
try:
n = len(os.sched_getaffinity(0))
quota = _quota_cgroup()
return max(1, min(n, quota) if quota else n)
except OSError:
pass
if sys.platform == "darwin":
for cle in ("hw.perflevel0.logicalcpu", "hw.logicalcpu"):
r = subprocess.run(["sysctl", "-n", cle], capture_output=True, text=True)
@@ -92,6 +100,16 @@ def coeurs_performance():
return os.cpu_count() or 4
def _quota_cgroup():
"""Limite de processeurs d'un conteneur (cgroup v2 « cpu.max »), ou None."""
try:
with open("/sys/fs/cgroup/cpu.max") as f:
quota, periode = f.read().split()
return None if quota == "max" else max(1, int(int(quota) / int(periode)))
except (OSError, ValueError):
return None
def taille_lisible(octets):
for unite in ("o", "Ko", "Mo", "Go"):
if octets < 1024 or unite == "Go":