Ctrl K
ComunidadGuías…

main.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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")