Files
navidrome/server/nativeapi/artwork.go

50 lines
1.8 KiB
Go

package nativeapi
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/navidrome/navidrome/log"
"github.com/navidrome/navidrome/model"
)
// refreshableArtworkKinds are the entity kinds a manual re-resolve accepts.
var refreshableArtworkKinds = map[string]bool{
model.KindAlbumArtwork.Prefix(): true,
model.KindArtistArtwork.Prefix(): true,
model.KindPlaylistArtwork.Prefix(): true,
model.KindRadioArtwork.Prefix(): true,
model.KindMediaFileArtwork.Prefix(): true,
}
func (api *Router) addArtworkRoute(r chi.Router) {
r.Post("/artwork/{kind}/{id}/refresh", api.refreshArtwork())
}
// refreshArtwork clears an item's resolved artwork state and re-queues it at Bump priority.
// State is deliberately cleared so a wrong pick disappears immediately (placeholder until re-resolved).
func (api *Router) refreshArtwork() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
kind := chi.URLParam(r, "kind")
id := chi.URLParam(r, "id")
if !refreshableArtworkKinds[kind] {
http.Error(w, "invalid artwork kind", http.StatusBadRequest)
return
}
if err := api.ds.Artwork(ctx).DeleteForItem(kind, id); err != nil {
log.Error(ctx, "Error clearing artwork state", "kind", kind, "id", id, err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
item := model.ArtworkQueueItem{ItemKind: kind, ItemID: id, ImageType: model.ImageTypePrimary,
Priority: model.ArtworkPriorityBump}
if err := api.ds.ArtworkQueue(ctx).Enqueue(item); err != nil {
log.Error(ctx, "Error enqueuing artwork refresh", "kind", kind, "id", id, err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusNoContent)
}
}