from fastapi import APIRouter, Depends, Form, HTTPException, Request from fastapi.responses import RedirectResponse from fastapi.templating import Jinja2Templates from app.db import get_db from app.security.deps import require_auth from app.services import playlist_service, status_service router = APIRouter(prefix="/playlists", tags=["playlists"]) templates = Jinja2Templates(directory="app/templates") @router.get("") async def playlists_index(request: Request, user: dict = Depends(require_auth), db=Depends(get_db)): playlists = playlist_service.list_all(db) sync_times = {p.id: playlist_service.cron_to_time(p.cron_expr) for p in playlists} return templates.TemplateResponse( request, "playlists/index.html", {"playlists": playlists, "sync_times": sync_times} ) @router.post("") async def create_playlist( name: str = Form(...), spotify_url: str = Form(...), sync_time: str = Form(""), no_m3u: bool = Form(False), user: dict = Depends(require_auth), db=Depends(get_db), ): playlist_service.create( db, name=name, spotify_url=spotify_url, cron_expr=playlist_service.time_to_cron(sync_time), no_m3u=no_m3u, ) return RedirectResponse(url="/playlists", status_code=303) @router.get("/{playlist_id}") async def playlist_detail( request: Request, playlist_id: int, user: dict = Depends(require_auth), db=Depends(get_db) ): playlist = playlist_service.get(db, playlist_id) if playlist is None: raise HTTPException(404, "no such playlist") status = None error = None try: status = status_service.playlist_status(db, playlist.name, playlist.spotify_url) except Exception as exc: error = str(exc) return templates.TemplateResponse( request, "playlists/detail.html", { "playlist": playlist, "sync_time": playlist_service.cron_to_time(playlist.cron_expr), "status": status, "error": error, }, ) @router.post("/{playlist_id}") async def update_playlist( playlist_id: int, active: bool = Form(False), sync_time: str = Form(""), no_m3u: bool = Form(False), notes: str = Form(""), user: dict = Depends(require_auth), db=Depends(get_db), ): playlist_service.update( db, playlist_id, active=active, cron_expr=playlist_service.time_to_cron(sync_time), no_m3u=no_m3u, notes=notes or None, ) return RedirectResponse(url=f"/playlists/{playlist_id}", status_code=303) @router.post("/{playlist_id}/delete") async def delete_playlist(playlist_id: int, user: dict = Depends(require_auth), db=Depends(get_db)): playlist_service.delete(db, playlist_id) return RedirectResponse(url="/playlists", status_code=303)