File size: 1,576 Bytes
b390c67
 
 
 
7cb600e
b390c67
 
 
 
 
 
 
 
 
7cb600e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b390c67
7cb600e
 
 
 
 
 
 
 
 
 
 
b390c67
7cb600e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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):
            # Define the circle and dot
            circle = Circle(radius=1, color=BLUE)
            dot = Dot()
            dot2 = dot.copy().shift(RIGHT)
            self.add(dot)

            # Create a line
            line = Line([3, 0, 0], [5, 0, 0])
            self.add(line)

            # Animate the circle, dot, and 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()

    # Directory to save rendered video
    output_dir = "/tmp/manim_output"
    os.makedirs(output_dir, exist_ok=True)

    # Rendering the scene to a video file
    scene = PointMovingOnShapes()
    scene.render(directory=output_dir)

    # Path to the rendered video file (manim by default saves as .mp4)
    video_path = os.path.join(output_dir, "media", "videos", "PointMovingOnShapes", "1080p60", "PointMovingOnShapes.mp4")

    # Return the video file as a response
    if os.path.exists(video_path):
        return FileResponse(video_path)
    else:
        return {"message": "Error: Animation rendering failed."}