"""`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