import asyncio from contextlib import asynccontextmanager from fastapi.responses import RedirectResponse import uvicorn from fastapi import FastAPI from modules.dropbox.audio import cleanup_audio_url_cache from modules.home.app import home_app from modules.youtube_metadata.app import youtube_metadata_app from server import router as mobile_router from app import gradio_app # your Blocks object import gradio as gr import logging from fastapi import Request from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles logging.basicConfig(level=logging.INFO) app = FastAPI(title="Sanatan AI Unified Server") # Allow all origins (for dev) app.add_middleware( CORSMiddleware, allow_origins=["*"], # or ["https://your-flutter-web-app.com"] allow_credentials=True, allow_methods=["*"], # GET, POST, PUT, DELETE, OPTIONS allow_headers=["*"], # e.g. Authorization, Content-Type ) # Mount mobile endpoints app.include_router(mobile_router, prefix="/api") # Convert Gradio Blocks to ASGI app # app = gr.mount_gradio_app(app, gradio_app,"/sanatan_ai_web") # app = gr.mount_gradio_app(app, youtube_metadata_app,"/yt_web") app = gr.mount_gradio_app(app, home_app,"/web") app.mount("/home", StaticFiles(directory="static", html=True), name="static") # Redirect root URL to /home/ @app.get("/") async def redirect_to_web(): return RedirectResponse(url="/home/") @app.middleware("http") async def log_requests(request: Request, call_next): logging.info(f"Request: {request.method} {request.url}") response = await call_next(request) logging.info(f"Response status: {response.status_code}") return response @asynccontextmanager async def lifespan(app: FastAPI): # Startup code: start cache cleanup asyncio.create_task(cleanup_audio_url_cache()) yield # Shutdown code (optional) can go here if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=7860, reload=False, access_log=False, log_level=logging.WARNING)