Files

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