import logging import traceback from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from app.core.config import settings from app.api.endpoints import admin, auth, bandcamp, billing, lastfm, manual_import, playlist_fix, playlists, profile, recommendations, timeline, youtube_music app = FastAPI(title="Vynl API", version="1.0.0", redirect_slashes=False) app.add_middleware( CORSMiddleware, allow_origins=[settings.FRONTEND_URL], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(admin.router, prefix="/api") app.include_router(auth.router, prefix="/api") app.include_router(billing.router, prefix="/api") app.include_router(playlists.router, prefix="/api") app.include_router(playlist_fix.router, prefix="/api") app.include_router(recommendations.router, prefix="/api") app.include_router(youtube_music.router, prefix="/api") app.include_router(manual_import.router, prefix="/api") app.include_router(lastfm.router, prefix="/api") app.include_router(bandcamp.router, prefix="/api") app.include_router(profile.router, prefix="/api") app.include_router(timeline.router, prefix="/api") logger = logging.getLogger("app") @app.middleware("http") async def log_errors(request: Request, call_next): try: response = await call_next(request) if response.status_code >= 400: logger.warning(f"{request.method} {request.url.path} -> {response.status_code}") return response except Exception as e: logger.error(f"{request.method} {request.url.path} -> 500: {e}\n{traceback.format_exc()}") return JSONResponse(status_code=500, content={"detail": "Internal server error"}) @app.get("/api/health") async def health(): return {"status": "ok", "app": "vynl"}