Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mf2kATMtqVABHSYdxJMnim
101 lines
3.8 KiB
Python
101 lines
3.8 KiB
Python
"""`rtg verifier` : tout ce dont RTG a besoin est-il installé ?
|
|
|
|
Pour chaque élément manquant, la commande à taper sur ce système.
|
|
"""
|
|
import importlib
|
|
import platform
|
|
import subprocess
|
|
import sys
|
|
|
|
from rtg.outils import dire, programme
|
|
|
|
SYSTEME = {"Darwin": "mac", "Windows": "windows"}.get(platform.system(), "linux")
|
|
|
|
# Commande d'installation par système, pour chaque programme externe.
|
|
INSTALLER = {
|
|
"exiftool": {"mac": "brew install exiftool", "linux": "sudo apt install libimage-exiftool-perl",
|
|
"windows": "winget install OliverBetz.ExifTool"},
|
|
"ffmpeg": {"mac": "brew install ffmpeg", "linux": "sudo apt install ffmpeg",
|
|
"windows": "winget install Gyan.FFmpeg"},
|
|
}
|
|
|
|
# Modules Python : (nom à importer, nom du paquet, indispensable ?)
|
|
MODULES = [
|
|
("folium", "folium", True), ("gpxpy", "gpxpy", True), ("jinja2", "jinja2", True),
|
|
("markdown2", "markdown2", True), ("numpy", "numpy", True), ("pandas", "pandas", True),
|
|
("PIL", "pillow", True), ("pillow_heif", "pillow-heif", False),
|
|
]
|
|
|
|
|
|
def _version(cmd):
|
|
try:
|
|
r = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
|
|
return (r.stdout or r.stderr).strip().splitlines()[0]
|
|
except Exception:
|
|
return ""
|
|
|
|
|
|
def verifier():
|
|
"""Affiche le bilan ; renvoie True si l'essentiel est là."""
|
|
ok = True
|
|
dire(f"Système : {platform.system()} {platform.release()} ({platform.machine()})")
|
|
|
|
v = sys.version_info
|
|
if v >= (3, 10):
|
|
dire(f"✅ Python {v.major}.{v.minor}.{v.micro}")
|
|
else:
|
|
ok = False
|
|
dire(f"❌ Python {v.major}.{v.minor} : il faut Python 3.10 ou plus récent")
|
|
|
|
manquants = []
|
|
for module, paquet, indispensable in MODULES:
|
|
try:
|
|
importlib.import_module(module)
|
|
except ImportError:
|
|
if indispensable:
|
|
ok = False
|
|
manquants.append(paquet)
|
|
dire(f"❌ Module Python {paquet} absent")
|
|
else:
|
|
dire(f"⚠️ Module Python {paquet} absent : les photos HEIC de l'iPhone seront ignorées")
|
|
if manquants:
|
|
dire(f" → réinstaller RTG avec pipx (il installe les modules), ou : "
|
|
f"python3 -m pip install {' '.join(manquants)}")
|
|
if not manquants:
|
|
dire("✅ Modules Python")
|
|
if sys.version_info < (3, 11):
|
|
try:
|
|
importlib.import_module("tomli")
|
|
except ImportError:
|
|
ok = False
|
|
dire("❌ Module Python tomli absent (nécessaire avant Python 3.11)")
|
|
|
|
if programme("exiftool"):
|
|
dire(f"✅ exiftool {_version(['exiftool', '-ver'])}")
|
|
else:
|
|
ok = False
|
|
dire(f"❌ exiftool absent (positions GPS des photos et vidéos) → {INSTALLER['exiftool'][SYSTEME]}")
|
|
|
|
if programme("ffmpeg") and programme("ffprobe"):
|
|
dire(f"✅ {_version(['ffmpeg', '-version'])[:60]}")
|
|
enc = subprocess.run(["ffmpeg", "-hide_banner", "-encoders"], capture_output=True, text=True).stdout
|
|
for nom, role in (("libx265", "1080p HEVC"), ("libx264", "720p H.264")):
|
|
if nom in enc:
|
|
dire(f" ✅ {nom} ({role})")
|
|
else:
|
|
ok = False
|
|
dire(f" ❌ {nom} absent de ce ffmpeg ({role}) → installer un ffmpeg complet : "
|
|
f"{INSTALLER['ffmpeg'][SYSTEME]}")
|
|
if SYSTEME == "mac":
|
|
if "hevc_videotoolbox" in enc:
|
|
dire(" ✅ VideoToolbox (encodeur « matériel », facultatif)")
|
|
else:
|
|
dire(" ⚠️ VideoToolbox absent : seul l'encodeur « processeur » sera disponible")
|
|
else:
|
|
ok = False
|
|
dire(f"❌ ffmpeg absent (vidéos et aperçus) → {INSTALLER['ffmpeg'][SYSTEME]}")
|
|
|
|
dire()
|
|
dire("✅ Tout est prêt." if ok else "❌ Il manque des éléments : voir les lignes ❌ ci-dessus.")
|
|
return ok
|