darkmedia-x-api / engine /renderers /rust_renderer.py
cybermedia's picture
Upload folder using huggingface_hub
343eed9 verified
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)