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 beets_service, genre_fix, library_edit, retag router = APIRouter(prefix="/library", tags=["library"]) templates = Jinja2Templates(directory="app/templates") @router.get("") async def library_index(request: Request, grouping: str | None = None, user: dict = Depends(require_auth)): items = beets_service.query_items(grouping=grouping) return templates.TemplateResponse( request, "library/index.html", {"items": items, "grouping": grouping} ) @router.get("/track/{item_id}") async def track_detail(request: Request, item_id: int, user: dict = Depends(require_auth)): item = beets_service.get_item(item_id) if item is None: raise HTTPException(404, "no such track") return templates.TemplateResponse( request, "library/track_detail.html", {"item": item, "editable_fields": library_edit.EDITABLE_FIELDS}, ) @router.post("/track/{item_id}") async def update_track( request: Request, item_id: int, user: dict = Depends(require_auth), db=Depends(get_db), ): form = await request.form() changes = { field: value for field, value in form.items() if field in library_edit.EDITABLE_FIELDS and value != "" } changed_by = user.get("email") or user.get("sub", "unknown") changed = await library_edit.update_track_fields(db, item_id, changes, changed_by) return RedirectResponse(url=f"/library/track/{item_id}?changed={len(changed)}", status_code=303) @router.post("/track/{item_id}/genre") async def set_genre( item_id: int, artist: str = Form(...), genre: str = Form(...), user: dict = Depends(require_auth), ): changed_by = user.get("email") or user.get("sub", "unknown") await genre_fix.set_artist_genre(artist, genre, changed_by) return RedirectResponse(url=f"/library/track/{item_id}", status_code=303) @router.post("/track/{item_id}/retag") async def retag_track( item_id: int, url: str = Form(...), keep_genre: bool = Form(False), user: dict = Depends(require_auth), ): item = beets_service.get_item(item_id) if item is None: raise HTTPException(404, "no such track") changed_by = user.get("email") or user.get("sub", "unknown") await retag.retag_from_url(item["path"], url, changed_by, keep_genre=keep_genre) return RedirectResponse(url=f"/library/track/{item_id}", status_code=303)