import asyncio from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.middleware.sessions import SessionMiddleware from app.config import settings from app.database import engine, apply_migrations from app.models import Base from app.routers import auth, player, admin, voting, stats from app import spotify from app.history_poller import start_poller Base.metadata.create_all(bind=engine) apply_migrations() @asynccontextmanager async def lifespan(app: FastAPI): task = asyncio.create_task(start_poller()) yield task.cancel() app = FastAPI(title="Spotify Cantina", lifespan=lifespan) app.add_middleware(SessionMiddleware, secret_key=settings.SECRET_KEY) app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="app/templates") app.include_router(auth.router) app.include_router(player.router) app.include_router(admin.router) app.include_router(voting.router) app.include_router(stats.router) @app.get("/", response_class=HTMLResponse) def index(request: Request): if not spotify.is_authenticated(): return RedirectResponse(url="/auth/login") return templates.TemplateResponse("index.html", {"request": request})