# 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) | |
def read_root(): | |
return {"message": "Welcome to the Manim API on HuggingFace!"} | |
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) | |