Files
AI-Video/api/app.py
2025-11-07 16:59:12 +08:00

134 lines
3.6 KiB
Python

"""
ReelForge FastAPI Application
Main FastAPI app with all routers and middleware.
"""
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from loguru import logger
from api.config import api_config
from api.tasks import task_manager
from api.dependencies import shutdown_reelforge
# Import routers
from api.routers import (
health_router,
llm_router,
tts_router,
image_router,
content_router,
video_router,
tasks_router,
files_router,
)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
Application lifespan manager
Handles startup and shutdown events.
"""
# Startup
logger.info("🚀 Starting ReelForge API...")
await task_manager.start()
logger.info("✅ ReelForge API started successfully\n")
yield
# Shutdown
logger.info("🛑 Shutting down ReelForge API...")
await task_manager.stop()
await shutdown_reelforge()
logger.info("✅ ReelForge API shutdown complete")
# Create FastAPI app
app = FastAPI(
title="ReelForge API",
description="""
## ReelForge - AI Video Generation Platform API
### Features
- 🤖 **LLM**: Large language model integration
- 🔊 **TTS**: Text-to-speech synthesis
- 🎨 **Image**: AI image generation
- 📝 **Content**: Automated content generation
- 🎬 **Video**: End-to-end video generation
### Video Generation Modes
- **Sync**: `/api/video/generate/sync` - For small videos (< 30s)
- **Async**: `/api/video/generate/async` - For large videos with task tracking
### Getting Started
1. Check health: `GET /health`
2. Generate narrations: `POST /api/content/narration`
3. Generate video: `POST /api/video/generate/sync` or `/async`
4. Track task progress: `GET /api/tasks/{task_id}`
""",
version="0.1.0",
docs_url=api_config.docs_url,
redoc_url=api_config.redoc_url,
openapi_url=api_config.openapi_url,
lifespan=lifespan,
)
# Add CORS middleware
if api_config.cors_enabled:
app.add_middleware(
CORSMiddleware,
allow_origins=api_config.cors_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
logger.info(f"CORS enabled for origins: {api_config.cors_origins}")
# Include routers
# Health check (no prefix)
app.include_router(health_router)
# API routers (with /api prefix)
app.include_router(llm_router, prefix=api_config.api_prefix)
app.include_router(tts_router, prefix=api_config.api_prefix)
app.include_router(image_router, prefix=api_config.api_prefix)
app.include_router(content_router, prefix=api_config.api_prefix)
app.include_router(video_router, prefix=api_config.api_prefix)
app.include_router(tasks_router, prefix=api_config.api_prefix)
app.include_router(files_router, prefix=api_config.api_prefix)
@app.get("/")
async def root():
"""Root endpoint with API information"""
return {
"service": "ReelForge API",
"version": "0.1.0",
"docs": api_config.docs_url,
"health": "/health",
"api": {
"llm": f"{api_config.api_prefix}/llm",
"tts": f"{api_config.api_prefix}/tts",
"image": f"{api_config.api_prefix}/image",
"content": f"{api_config.api_prefix}/content",
"video": f"{api_config.api_prefix}/video",
"tasks": f"{api_config.api_prefix}/tasks",
}
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"api.app:app",
host=api_config.host,
port=api_config.port,
reload=api_config.reload,
)