|
from fastapi import FastAPI |
|
from fastapi.responses import FileResponse |
|
import os |
|
import subprocess |
|
from manim import * |
|
|
|
app = FastAPI() |
|
|
|
@app.get("/") |
|
def read_root(): |
|
return {"message": "Welcome to the Manim API on HuggingFace!"} |
|
|
|
@app.get("/generate") |
|
def generate_animation(): |
|
class PointMovingOnShapes(Scene): |
|
def construct(self): |
|
|
|
circle = Circle(radius=1, color=BLUE) |
|
dot = Dot() |
|
dot2 = dot.copy().shift(RIGHT) |
|
self.add(dot) |
|
|
|
|
|
line = Line([3, 0, 0], [5, 0, 0]) |
|
self.add(line) |
|
|
|
|
|
self.play(GrowFromCenter(circle)) |
|
self.play(Transform(dot, dot2)) |
|
self.play(MoveAlongPath(dot, circle), run_time=2, rate_func=linear) |
|
self.play(Rotating(dot, about_point=[2, 0, 0]), run_time=1.5) |
|
self.wait() |
|
|
|
|
|
output_dir = "/tmp/manim_output" |
|
os.makedirs(output_dir, exist_ok=True) |
|
|
|
|
|
scene = PointMovingOnShapes() |
|
scene.render(directory=output_dir) |
|
|
|
|
|
video_path = os.path.join(output_dir, "media", "videos", "PointMovingOnShapes", "1080p60", "PointMovingOnShapes.mp4") |
|
|
|
|
|
if os.path.exists(video_path): |
|
return FileResponse(video_path) |
|
else: |
|
return {"message": "Error: Animation rendering failed."} |
|
|