Files
brandly/backend_endpoint.py

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)