from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import HTMLResponse from app.api.routes import jobs, clips, renders from app.frontend import HTML as FRONTEND_HTML @asynccontextmanager async def lifespan(app: FastAPI): yield app = FastAPI( title="ClipForge", description="Self-hosted AI video clipper", version="0.1.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(jobs.router, prefix="/api") app.include_router(clips.router, prefix="/api") app.include_router(renders.router, prefix="/api") @app.get("/", response_class=HTMLResponse) async def root(): return FRONTEND_HTML @app.get("/health") async def health(): return {"status": "ok", "service": "clipforge"}