main.py
Rama main · réplica de lectura del repositorio original.
import asyncio
from contextlib import asynccontextmanager, suppress
from fastapi import FastAPI
from src.router import v1_router
from src.utils.draft_downloader import download_draft
from src.utils.logger import logger
from src.middlewares import PrepareMiddleware, ResponseMiddleware, TraceContextMiddleware, UploadSizeGuardMiddleware
@asynccontextmanager
async def lifespan(app: FastAPI):
from src.utils.deferred_delete import deferred_delete_background_loop
from src.utils.draft_cleanup import draft_cleanup_background_loop
cleanup_task = asyncio.create_task(draft_cleanup_background_loop())
deferred_delete_task = asyncio.create_task(deferred_delete_background_loop())
try:
yield
finally:
for bg_task in (cleanup_task, deferred_delete_task):
bg_task.cancel()
with suppress(asyncio.CancelledError):
await bg_task
# 1. 创建 FastAPI 应用
app: FastAPI = FastAPI(title="CapCut Mate API", version="1.0", lifespan=lifespan)
# 2. 注册路由
app.include_router(router=v1_router, prefix="/openapi/capcut-mate", tags=["capcut-mate"])
# 3. 添加中间件(最后注册的 TraceContextMiddleware 最先处理请求,用于 W3C trace_id)
app.add_middleware(middleware_class=PrepareMiddleware)
# 必须注册在 ResponseMiddleware 之前(后注册者在外层),超限异常才能被转换成统一响应信封
app.add_middleware(middleware_class=UploadSizeGuardMiddleware)
app.add_middleware(middleware_class=ResponseMiddleware)
app.add_middleware(middleware_class=TraceContextMiddleware)
# 4. 打印所有路由
for r in app.routes:
# 1. 取 HTTP 方法列表
methods = getattr(r, "methods", None) or [getattr(r, "method", "WS")]
# 2. 安全地取路径
path = getattr(r, "path", "<unknown>")
# 3. 安全地取函数名
name = getattr(r, "name", "<unnamed>")
logger.info("Route: %s %s -> %s", ",".join(sorted(methods)), path, name)
logger.info("CapCut Mate API")
# 5. 启动
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=30000, log_config=None, log_level="info")