55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.responses import FileResponse
|
|
import os
|
|
|
|
from backend.core.config import settings
|
|
from backend.api.endpoints import playlists, search, stream, lyrics
|
|
|
|
app = FastAPI(title=settings.APP_NAME)
|
|
|
|
# CORS setup
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=settings.BACKEND_CORS_ORIGINS,
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Include Routers
|
|
app.include_router(playlists.router, prefix=f"{settings.API_V1_STR}", tags=["playlists"])
|
|
app.include_router(search.router, prefix=f"{settings.API_V1_STR}", tags=["search"])
|
|
app.include_router(stream.router, prefix=f"{settings.API_V1_STR}", tags=["stream"])
|
|
app.include_router(lyrics.router, prefix=f"{settings.API_V1_STR}", tags=["lyrics"])
|
|
|
|
# Serve Static Frontend (Production Mode)
|
|
if settings.CACHE_DIR.parent.name == "backend":
|
|
# assuming running from root
|
|
STATIC_DIR = "static"
|
|
else:
|
|
STATIC_DIR = "../static"
|
|
|
|
if os.path.exists(STATIC_DIR):
|
|
app.mount("/_next", StaticFiles(directory=os.path.join(STATIC_DIR, "_next")), name="next_assets")
|
|
|
|
@app.get("/{full_path:path}")
|
|
async def serve_spa(full_path: str):
|
|
file_path = os.path.join(STATIC_DIR, full_path)
|
|
if os.path.isfile(file_path):
|
|
return FileResponse(file_path)
|
|
|
|
index_path = os.path.join(STATIC_DIR, "index.html")
|
|
if os.path.exists(index_path):
|
|
return FileResponse(index_path)
|
|
|
|
return {"error": "Frontend not found"}
|
|
else:
|
|
@app.get("/")
|
|
def read_root():
|
|
return {"message": "Spotify Clone Backend Running (Frontend not built/mounted)"}
|
|
|
|
@app.get("/health")
|
|
def health_check():
|
|
return {"status": "ok"}
|