"""Startup check: verify Blender >= 5.0.1 is available. Run before starting the Celery worker. Exits with code 1 if Blender is missing or below the minimum required version. """ import os import re import subprocess import sys from pathlib import Path MIN_VERSION = (5, 0, 1) MIN_VERSION_STR = ".".join(str(v) for v in MIN_VERSION) def find_blender() -> str: import shutil env_bin = os.environ.get("BLENDER_BIN", "") if env_bin and Path(env_bin).exists(): return env_bin found = shutil.which("blender") return found or "blender" def check_version(): blender_bin = find_blender() if not Path(blender_bin).exists(): print(f"ERROR: Blender not found at {blender_bin}", file=sys.stderr) print( "Mount Blender >= 5.0.1 from the host via:\n" " volumes:\n" " - /opt/blender:/opt/blender:ro", file=sys.stderr, ) sys.exit(1) try: result = subprocess.run( [blender_bin, "--version"], capture_output=True, text=True, timeout=15 ) output = result.stdout or result.stderr or "" except Exception as exc: print(f"ERROR: Could not run Blender: {exc}", file=sys.stderr) sys.exit(1) match = re.search(r"Blender\s+(\d+)\.(\d+)\.(\d+)", output) if not match: print(f"ERROR: Could not parse Blender version from output:\n{output[:200]}", file=sys.stderr) sys.exit(1) version = tuple(int(x) for x in match.groups()) version_str = ".".join(str(v) for v in version) if version < MIN_VERSION: print( f"ERROR: Blender {version_str} < required {MIN_VERSION_STR}.\n" f"Update your host Blender installation.", file=sys.stderr, ) sys.exit(1) print(f"Blender {version_str} OK (>= {MIN_VERSION_STR})") if __name__ == "__main__": check_version()