import os import subprocess from pathlib import Path from .moviepy_renderer import MoviePyRenderer from .base_renderer import BaseRenderer, RendererInput class RustRenderer(BaseRenderer): def __init__(self): self.rust_bin = self._find_rust_bin() self.fallback = MoviePyRenderer() def _find_rust_bin(self): patterns = [ Path("target/debug/darkmedia-x"), Path("target/release/darkmedia-x"), Path("../../engine/target/debug/darkmedia-x"), Path("../../engine/target/release/darkmedia-x"), ] for p in patterns: if p.exists(): return p return None def is_available(self): return self.rust_bin is not None and self.rust_bin.exists() def render(self, input_data: RendererInput) -> bool: if not self.is_available(): print(" ⚠️ Rust binaire non trouvé, fallback MoviePy") return self.fallback.render(input_data) story_dir = input_data.output_path.parent story_name = story_dir.name if story_dir else "unknown" env = os.environ.copy() env["SELECTED_STORY"] = story_name try: result = subprocess.run( [str(self.rust_bin)], env=env, cwd=story_dir.parent if story_dir else Path.cwd(), capture_output=True, text=True, timeout=600 ) if result.returncode == 0: output_video = story_dir / "final_video.mp4" if output_video.exists(): print(f" ✅ Vidéo générée par Rust: {output_video.name}") return True except Exception as e: print(f" ⚠️ Erreur Rust: {e}") print(" ⚠️ Échec Rust, fallback MoviePy") return self.fallback.render(input_data)