from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager import logging from dotenv import load_dotenv from app.db.session import engine from app.db.base import Base from app.routes import auth, videos, transcription, translation, voice_cloning, video_processing, profile # Load environment variables from .env file load_dotenv() # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): try: # Create database directory logger.info("Starting application initialization...") storage_dir = Path("/app/storage/db") storage_dir.mkdir(parents=True, exist_ok=True) logger.info(f"Created storage directory: {storage_dir}") # Import all models to ensure they're registered with Base # Only create tables if database doesn't exist (for development) # In production, use Alembic migrations instead db_path = storage_dir / "db.sqlite" if not db_path.exists(): logger.info("Database file doesn't exist, creating initial tables...") Base.metadata.create_all(bind=engine) else: logger.info("Database file exists, skipping table creation (use Alembic for migrations)") logger.info("Database initialization completed") yield except Exception as e: logger.error(f"Error during application startup: {e}") raise app = FastAPI( title="AI Video Dubbing API", description="Backend API for AI-powered video dubbing with voice cloning and translation", version="1.0.0", lifespan=lifespan ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], allow_headers=["*"], expose_headers=["*"] ) # Include routers app.include_router(auth.router, prefix="/auth", tags=["Authentication"]) app.include_router(profile.router, prefix="/profile", tags=["Profile"]) app.include_router(videos.router, prefix="/videos", tags=["Videos"]) app.include_router(transcription.router, prefix="/transcription", tags=["Transcription"]) app.include_router(translation.router, prefix="/translation", tags=["Translation"]) app.include_router(voice_cloning.router, prefix="/voice", tags=["Voice Cloning"]) app.include_router(video_processing.router, prefix="/process", tags=["Video Processing"]) @app.get("/") async def root(): return { "title": "AI Video Dubbing API", "documentation": "/docs", "health": "/health" } @app.get("/health") async def health_check(): return { "status": "healthy", "service": "AI Video Dubbing API", "database": "connected" } @app.get("/test") async def test_endpoint(): logger.info("Test endpoint called") return { "message": "API is working correctly", "timestamp": "2024-01-01T00:00:00Z", "status": "success" } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)