navidrome/core/artwork/reader_album.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

75 lines
1.9 KiB
Go
Raw Normal View History

2022-12-27 17:36:23 +01:00
package artwork
import (
"context"
2023-01-18 02:37:10 +01:00
"crypto/md5"
"fmt"
2022-12-27 17:36:23 +01:00
"io"
"strings"
"time"
"github.com/navidrome/navidrome/conf"
"github.com/navidrome/navidrome/core"
2022-12-27 17:36:23 +01:00
"github.com/navidrome/navidrome/core/ffmpeg"
"github.com/navidrome/navidrome/model"
)
type albumArtworkReader struct {
2022-12-27 22:36:13 +01:00
cacheKey
2022-12-27 17:36:23 +01:00
a *artwork
em core.ExternalMetadata
2022-12-27 17:36:23 +01:00
album model.Album
}
func newAlbumArtworkReader(ctx context.Context, artwork *artwork, artID model.ArtworkID, em core.ExternalMetadata) (*albumArtworkReader, error) {
2022-12-27 17:36:23 +01:00
al, err := artwork.ds.Album(ctx).Get(artID.ID)
if err != nil {
return nil, err
}
a := &albumArtworkReader{
a: artwork,
em: em,
2022-12-27 17:36:23 +01:00
album: *al,
}
2022-12-27 22:36:13 +01:00
a.cacheKey.artID = artID
a.cacheKey.lastUpdate = al.UpdatedAt
2022-12-27 17:36:23 +01:00
return a, nil
}
2023-01-18 02:37:10 +01:00
func (a *albumArtworkReader) Key() string {
var hash [16]byte
if conf.Server.EnableExternalServices {
hash = md5.Sum([]byte(conf.Server.Agents + conf.Server.CoverArtPriority))
}
return fmt.Sprintf(
"%s.%x.%t",
a.cacheKey.Key(),
hash,
conf.Server.EnableExternalServices,
)
}
2022-12-27 17:36:23 +01:00
func (a *albumArtworkReader) LastUpdated() time.Time {
return a.album.UpdatedAt
}
func (a *albumArtworkReader) Reader(ctx context.Context) (io.ReadCloser, string, error) {
var ff = a.fromCoverArtPriority(ctx, a.a.ffmpeg, conf.Server.CoverArtPriority)
2022-12-28 16:19:52 +01:00
return selectImageReader(ctx, a.artID, ff...)
2022-12-27 17:36:23 +01:00
}
func (a *albumArtworkReader) fromCoverArtPriority(ctx context.Context, ffmpeg ffmpeg.FFmpeg, priority string) []sourceFunc {
2022-12-27 17:36:23 +01:00
var ff []sourceFunc
for _, pattern := range strings.Split(strings.ToLower(priority), ",") {
pattern = strings.TrimSpace(pattern)
switch {
case pattern == "embedded":
ff = append(ff, fromTag(a.album.EmbedArtPath), fromFFmpegTag(ctx, ffmpeg, a.album.EmbedArtPath))
case pattern == "external":
ff = append(ff, fromAlbumExternalSource(ctx, a.album, a.em))
case a.album.ImageFiles != "":
ff = append(ff, fromExternalFile(ctx, a.album.ImageFiles, pattern))
2022-12-27 17:36:23 +01:00
}
}
return ff
}