Spaces:
Sleeping
Sleeping
| 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) |