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

163 lines
4.8 KiB
Python

"""
ReelForge FastAPI Application
Main FastAPI app with all routers and middleware.
Run this script to start the FastAPI server:
uv run python api/app.py
Or with custom settings:
uv run python api/app.py --host 0.0.0.0 --port 8080 --reload
"""
import argparse
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
# Parse command line arguments
parser = argparse.ArgumentParser(description="Start ReelForge API Server")
parser.add_argument("--host", default="0.0.0.0", help="Host to bind to")
parser.add_argument("--port", type=int, default=8000, help="Port to bind to")
parser.add_argument("--reload", action="store_true", help="Enable auto-reload")
args = parser.parse_args()
# Print startup banner
print(f"""
╔══════════════════════════════════════════════════════════════╗
║ ReelForge API Server ║
╚══════════════════════════════════════════════════════════════╝
Starting server at http://{args.host}:{args.port}
API Docs: http://{args.host}:{args.port}/docs
ReDoc: http://{args.host}:{args.port}/redoc
Press Ctrl+C to stop the server
""")
# Start server
uvicorn.run(
"api.app:app",
host=args.host,
port=args.port,
reload=args.reload,
)