# 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."} from fastapi import FastAPI from fastapi.responses import JSONResponse import os from manim import * from pyuploadcare import Uploadcare import shutil app = FastAPI() UPLOADCARE_PUBLIC_KEY = os.environ.get("key") UPLOADCARE_SECRET_KEY = os.environ.get("secret") uploadcare = Uploadcare(public_key=UPLOADCARE_PUBLIC_KEY, secret_key=UPLOADCARE_SECRET_KEY) @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) scene.render() # Path to the rendered video file (Manim saves as .mp4) video_path = os.path.join("/tmp/", "media", "videos", "PointMovingOnShapes", "1080p60", "PointMovingOnShapes.mp4") if os.path.exists(video_path): try: # Upload the video file to Uploadcare uploaded_file = uploadcare.upload(video_path) # Get the CDN URL of the uploaded file file_url = uploaded_file.cdn_url # Return the URL as a JSON response return JSONResponse(content={"file_url": file_url}) except Exception as e: return JSONResponse(content={"error": f"Upload failed: {str(e)}"}, status_code=500) else: return JSONResponse(content={"message": "Error: Animation rendering failed."}, status_code=500)