diff --git a/consts/consts.go b/consts/consts.go index 16400f68d..0da96fe9c 100644 --- a/consts/consts.go +++ b/consts/consts.go @@ -117,6 +117,7 @@ var ( VariousArtists = "Various Artists" VariousArtistsID = fmt.Sprintf("%x", md5.Sum([]byte(strings.ToLower(VariousArtists)))) UnknownArtist = "[Unknown Artist]" + UnknownArtistID = fmt.Sprintf("%x", md5.Sum([]byte(strings.ToLower(UnknownArtist)))) VariousArtistsMbzId = "89ad4ac3-39f7-470e-963a-56509c546377" ServerStart = time.Now() diff --git a/core/artwork/cache_warmer.go b/core/artwork/cache_warmer.go index 95e293fe1..eeb426a03 100644 --- a/core/artwork/cache_warmer.go +++ b/core/artwork/cache_warmer.go @@ -48,7 +48,15 @@ type cacheWarmer struct { wakeSignal chan struct{} } +var ignoredIds = map[string]struct{}{ + consts.VariousArtistsID: {}, + consts.UnknownArtistID: {}, +} + func (a *cacheWarmer) PreCache(artID model.ArtworkID) { + if _, shouldIgnore := ignoredIds[artID.ID]; shouldIgnore { + return + } a.mutex.Lock() defer a.mutex.Unlock() a.buffer[artID] = struct{}{} diff --git a/core/artwork/reader_artist.go b/core/artwork/reader_artist.go index 33079314f..bbaeebef9 100644 --- a/core/artwork/reader_artist.go +++ b/core/artwork/reader_artist.go @@ -42,7 +42,9 @@ func newArtistReader(ctx context.Context, artwork *artwork, artID model.ArtworkI em: em, artist: *ar, } - a.cacheKey.lastUpdate = ar.ExternalInfoUpdatedAt + // TODO Find a way to factor in the ExternalUpdateInfoAt in the cache key. Problem is that it can + // change _after_ retrieving from external sources, making the key invalid + //a.cacheKey.lastUpdate = ar.ExternalInfoUpdatedAt var files []string var paths []string for _, al := range als { @@ -64,10 +66,10 @@ func newArtistReader(ctx context.Context, artwork *artwork, artID model.ArtworkI func (a *artistReader) Key() string { hash := md5.Sum([]byte(conf.Server.Agents + conf.Server.Spotify.ID)) return fmt.Sprintf( - "%s.%x.%t ", + "%s.%t.%x", a.cacheKey.Key(), - hash, conf.Server.EnableExternalServices, + hash, ) } diff --git a/core/external_metadata.go b/core/external_metadata.go index 2b07798d0..745891c67 100644 --- a/core/external_metadata.go +++ b/core/external_metadata.go @@ -180,6 +180,16 @@ func clearName(name string) string { } func (e *externalMetadata) UpdateArtistInfo(ctx context.Context, id string, similarCount int, includeNotPresent bool) (*model.Artist, error) { + artist, err := e.refreshArtistInfo(ctx, id) + if err != nil { + return nil, err + } + + err = e.loadSimilar(ctx, artist, similarCount, includeNotPresent) + return &artist.Artist, err +} + +func (e *externalMetadata) refreshArtistInfo(ctx context.Context, id string) (*auxArtist, error) { artist, err := e.getArtist(ctx, id) if err != nil { return nil, err @@ -188,30 +198,28 @@ func (e *externalMetadata) UpdateArtistInfo(ctx context.Context, id string, simi // If we don't have any info, retrieves it now if artist.ExternalInfoUpdatedAt.IsZero() { log.Debug(ctx, "ArtistInfo not cached. Retrieving it now", "updatedAt", artist.ExternalInfoUpdatedAt, "id", id, "name", artist.Name) - err = e.refreshArtistInfo(ctx, artist) + err := e.populateArtistInfo(ctx, artist) if err != nil { return nil, err } } - // If info is expired, trigger a refresh in the background + // If info is expired, trigger a populateArtistInfo in the background if time.Since(artist.ExternalInfoUpdatedAt) > consts.ArtistInfoTimeToLive { log.Debug("Found expired cached ArtistInfo, refreshing in the background", "updatedAt", artist.ExternalInfoUpdatedAt, "name", artist.Name) go func() { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - err := e.refreshArtistInfo(ctx, artist) + err := e.populateArtistInfo(ctx, artist) if err != nil { log.Error("Error refreshing ArtistInfo", "id", id, "name", artist.Name, err) } }() } - - err = e.loadSimilar(ctx, artist, similarCount, includeNotPresent) - return &artist.Artist, err + return artist, nil } -func (e *externalMetadata) refreshArtistInfo(ctx context.Context, artist *auxArtist) error { +func (e *externalMetadata) populateArtistInfo(ctx context.Context, artist *auxArtist) error { // Get MBID first, if it is not yet available if artist.MbzArtistID == "" { mbid, err := e.ag.GetArtistMBID(ctx, artist.ID, artist.Name) @@ -314,12 +322,11 @@ func (e *externalMetadata) SimilarSongs(ctx context.Context, id string, count in } func (e *externalMetadata) ArtistImage(ctx context.Context, id string) (*url.URL, error) { - artist, err := e.getArtist(ctx, id) + artist, err := e.refreshArtistInfo(ctx, id) if err != nil { return nil, err } - e.callGetImage(ctx, e.ag, artist) if utils.IsCtxDone(ctx) { log.Warn(ctx, "ArtistImage call canceled", ctx.Err()) return nil, ctx.Err()