lyrics

lyrics
git clone git://brookjeynes.dev/bjeynes/lyrics.git
Log | Files | Refs

release-cover.go (2050B)


      1 package server
      2 
      3 import (
      4 	"context"
      5 	"errors"
      6 	"fmt"
      7 	"lyrics/internal/db"
      8 	"lyrics/internal/domain"
      9 	"lyrics/internal/external/musicbrainz"
     10 	"lyrics/internal/server/htmx"
     11 	releasecover "lyrics/internal/server/ui/partials/release-cover"
     12 	"net/http"
     13 	"strconv"
     14 )
     15 
     16 func (ss *ServerState) ReleaseCover(w http.ResponseWriter, r *http.Request) {
     17 	logger := ss.logger.With("handler", "ReleaseCover")
     18 
     19 	idStr := r.PathValue("id")
     20 	id, err := strconv.Atoi(idStr)
     21 	if err != nil {
     22 		logger.Error("failed to convert release id to integer", "id", idStr, "err", err)
     23 		htmx.HxError(w, http.StatusBadRequest, err.Error())
     24 		return
     25 	}
     26 
     27 	slug := r.PathValue("slug")
     28 	logger = logger.With("id", id, "slug", slug)
     29 
     30 	release, err := db.Release(ss.db, domain.ReleaseID(id))
     31 	if err != nil {
     32 		logger.Error("failed to get release", "err", err)
     33 		htmx.HxError(w, http.StatusInternalServerError, fmt.Sprintf("failed to query for release '%s'", slug))
     34 		return
     35 	}
     36 
     37 	releaseTitle := release.Title
     38 	if release.LatinTitle != nil {
     39 		releaseTitle = *release.LatinTitle
     40 	}
     41 
     42 	if domain.Slug(releaseTitle) != slug {
     43 		w.WriteHeader(http.StatusNotFound)
     44 		return
     45 	}
     46 
     47 	status := releasecover.ReleaseCoverStatusNoMBID
     48 	var cover *musicbrainz.CoverArt
     49 	if release.MusicBrainzReleaseID != nil {
     50 		cover, err = musicbrainz.FetchCoverArt(
     51 			r.Context(),
     52 			string(*release.MusicBrainzReleaseID),
     53 			musicbrainz.CoverArtQualitySmall,
     54 		)
     55 		if err != nil {
     56 			logger.Error("failed to get release cover art", "err", err)
     57 			status = releasecover.ReleaseCoverStatusError
     58 		} else if cover == nil {
     59 			status = releasecover.ReleaseCoverStatusNotFound
     60 		} else {
     61 			status = releasecover.ReleaseCoverStatusFound
     62 		}
     63 	}
     64 
     65 	err = releasecover.ReleaseCover(releasecover.ReleaseCoverParams{
     66 		Release:  release,
     67 		CoverArt: cover,
     68 		Status:   status,
     69 	}).Render(r.Context(), w)
     70 	if err != nil {
     71 		if errors.Is(err, context.Canceled) {
     72 			return
     73 		}
     74 
     75 		logger.Error("failed to render release page", "err", err)
     76 		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
     77 		return
     78 	}
     79 }