sanatan_ai / main.py
vikramvasudevan's picture
Upload folder using huggingface_hub
1a9eef9 verified
raw
history blame
2.32 kB
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
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
logging.basicConfig(level=logging.INFO)
app = FastAPI(title="Sanatan AI Unified Server")
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
# 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)