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 }