85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
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)
|