Files
vynl/backend/app/main.py
root 7abec6de7c Add Tier 2 features: Playlist Generator, Artist Deep Dive, Music Timeline
- Playlist Generator: describe a vibe, get a 15-30 song playlist, save or copy as text
- Artist Deep Dive: click any artist name for influences, best album, hidden gems, similar artists
- Music Timeline: visual decade breakdown of your taste with AI insight
- Nav updates: Create Playlist, Timeline links
2026-03-31 18:50:23 -05:00

53 lines
1.8 KiB
Python

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"}