Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 2,691 Bytes
4289ed3 9bf7fc2 86d056b 9bf7fc2 07505ba 4aebf77 9bf7fc2 ee2e962 1a9eef9 86d056b 9609347 9bf7fc2 9609347 86d056b 554dd77 86d056b 554dd77 1a9eef9 9609347 ee2e962 9bf7fc2 9609347 9bf7fc2 2cfcf56 9609347 2cfcf56 4aebf77 ee2e962 4aebf77 9bf7fc2 4aebf77 9bf7fc2 9609347 4289ed3 9609347 f394afd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import asyncio
from contextlib import asynccontextmanager
from fastapi.responses import RedirectResponse
from modules.firebase.listener import start_firestore_listener
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
from contextlib import asynccontextmanager
logging.basicConfig(level=logging.INFO)
@asynccontextmanager
async def fn_lifespan(app: FastAPI):
logging.info("π Starting Firestore listener...")
start_firestore_listener()
yield
logging.info("π Firestore listener shutdown (no explicit cleanup needed).")
app = FastAPI(title="Sanatan AI Unified Server",lifespan=fn_lifespan)
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)
|