import os from fastapi import FastAPI from pydantic import BaseModel from starlette.responses import JSONResponse from supabase import create_client from src.components.vidgen import VideoCreator supabase_url = os.getenv('SUPABASE_URL') supabase_key = os.getenv('SUPABASE_KEY') supabase = create_client(supabase_url, supabase_key) app = FastAPI() RESOURCES_DIR = "resources" os.makedirs(RESOURCES_DIR, exist_ok=True) def upload_to_supabase(video_path, bucket_name="JewelmirrorVideoGeneration"): try: with open(video_path, 'rb') as f: file_name = os.path.basename(video_path) supabase.storage.from_(bucket_name).upload(file_name, f) public_url = supabase.storage.from_(bucket_name).get_public_url(file_name) return public_url except Exception as e: print(f"Error uploading to Supabase: {str(e)}") return None class VideoGenerator(BaseModel): necklace_image: str necklace_try_on_output_images: list[str] clothing_output_images: list[str] makeup_output_images: list[str] store_name: str import requests import tempfile def download_image(url): """ Download an image from the web and save it as a temporary file. :param url: URL of the image. :return: Path to the temporary file. """ try: response = requests.get(url, stream=True) response.raise_for_status() temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png") with open(temp_file.name, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) return temp_file.name except Exception as e: print(f"Error downloading image from {url}: {str(e)}") return None @app.post("/create-video/") async def create_video(request: VideoGenerator): try: temp_files = { 'necklace': download_image(request.necklace_image), 'necklace_tryon': [download_image(url) for url in request.necklace_try_on_output_images], 'clothing': [download_image(url) for url in request.clothing_output_images], 'makeup': [download_image(url) for url in request.makeup_output_images] } if any(file is None for files in temp_files.values() for file in (files if isinstance(files, list) else [files])): return JSONResponse(content={"status": "error", "message": "Failed to download all required images."}, status_code=400) intro_path = f"{RESOURCES_DIR}/intro/ChamundiJewelsMandir_intro.mp4" output_path = f"{RESOURCES_DIR}/temp_video/video_{os.urandom(8).hex()}.mp4" font_path = f"{RESOURCES_DIR}/fonts/PlayfairDisplay-VariableFont_wght.ttf" audio_path = f"{RESOURCES_DIR}/audio/TraditionalIndianVlogMusic.mp3" video_creator = VideoCreator( intro_video_path=intro_path, necklace_image=temp_files['necklace'], nto_outputs=temp_files['necklace_tryon'], nto_cto_outputs=temp_files['clothing'], makeup_outputs=temp_files['makeup'], font_path=font_path, output_path=output_path, audio_path=audio_path ) # Generate video video_creator.create_final_video() # Upload to Supabase url = upload_to_supabase(video_path=output_path) response = { "status": "success", "message": "Video created successfully", "public_url": url } for files in temp_files.values(): if isinstance(files, list): for file in files: if os.path.exists(file): os.unlink(file) elif os.path.exists(files): os.unlink(files) os.remove(output_path) return JSONResponse(content=response, status_code=200) except Exception as e: raise e @app.get("/resources") async def get_infromation(): music = os.listdir(RESOURCES_DIR + "/audio") fonts = os.listdir(RESOURCES_DIR + "/fonts") intro = os.listdir(RESOURCES_DIR + "/intro") json = {"music": music, "fonts": fonts, "intro": intro} return JSONResponse(content=json, status_code=200) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)