46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
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})
|