""" 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, )