from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from core.config import ( AUDIO_DIR, COVERS_DIR, PHOTOS_DIR_RESPNS, STATIC_DIR, THUMBS_DIR, YT_DIR, ) from core.db import Base, engine from routers import audio, auth, channel, photo, playlist, search, video from search.setup import setup_videos_index @asynccontextmanager async def lifespan(app: FastAPI): setup_videos_index() async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield await engine.dispose() app = FastAPI(lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=[ "http://127.0.0.1:5173", "http://localhost:5173", ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") try: app.mount("/yt", StaticFiles(directory=YT_DIR), name="yt") app.mount("/media", StaticFiles(directory=PHOTOS_DIR_RESPNS), name="media") app.mount("/_thumbs", StaticFiles(directory=THUMBS_DIR), name="_thumbs") app.mount("/_covers", StaticFiles(directory=COVERS_DIR), name="_covers") app.mount("/audio", StaticFiles(directory=AUDIO_DIR), name="audio") except RuntimeError as err: print("[FAIL]: MEDIA DIRECTORY NOT FOUND", err) @app.get("/favicon.ico", include_in_schema=False) async def favicon(): return FileResponse(STATIC_DIR / "favicon.ico") app.include_router(photo.router) app.include_router(video.router) app.include_router(playlist.router) app.include_router(channel.router) app.include_router(audio.router) app.include_router(auth.router) app.include_router(search.router)