from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel import uuid import datetime # Inicialización de la API de prueba (FastAPI) app = FastAPI( title="Design MD Render API", description="Motor central que expone las variables de marca para Remotion", version="1.0.0" ) # --- Modelos Pydantic (Validación de Esquema) --- class DesignMDModel(BaseModel): primary_color: str secondary_color: str text_color: str base_font: str logo_url: str frame_thickness: int class RenderJobRequest(BaseModel): company_id: str raw_video_url: str platform_format: str # Ej: '9:16' (Reels/TikTok) o '1:1' (Facebook/IG) custom_text: str class RenderJobResponse(BaseModel): job_id: str status: str estimated_time: int message: str # --- Endpoints --- @app.get("/api/companies/{company_id}/design-md", response_model=DesignMDModel) async def get_design_md(company_id: str): """ Simula la obtención de las directrices estrictas de marca ("Design MD") desde PostgreSQL. Remotion consultará este Endpoint para sus props. """ # En un entorno real, ejecutaríamos: SELECT * FROM design_md WHERE company_id = company_id # Simulamos la respuesta de la base de datos: return DesignMDModel( primary_color="#D946EF", # Fuchsia secondary_color="#1E1B4B", # Deep Indigo text_color="#FFFFFF", base_font="Inter", logo_url="https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg", frame_thickness=16 ) @app.post("/api/render", response_model=RenderJobResponse) async def request_automated_render(req: RenderJobRequest): """ Endpoint para que la UI o un webhook solicite un nuevo render. Aquí se enviaría un mensaje a una cola (ej. RabbitMQ, Redis, Celery) para que un Worker inicie la compilación de Remotion en la nube. """ job_id = str(uuid.uuid4()) # 1. Obtenemos el DesignMD vinculado a la compañía # design_md = get_design_md_from_db(req.company_id) # 2. Preparamos el payload (props) para el bundle de Remotion: # remotion_props = { # "videoUrl": req.raw_video_url, # "designMD": design_md, # "textOverlay": req.custom_text # } # 3. Enqueue Job # queue.push(job_id, remotion_props, req.platform_format) return RenderJobResponse( job_id=job_id, status="queued", estimated_time=45, message="El trabajo ha sido enviado al motor de renderizado basado en lambdas/contenedores." ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)