navidrome/model/artwork_id.go

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

124 lines
2.4 KiB
Go
Raw Normal View History

2022-12-19 19:59:24 +01:00
package model
import (
"errors"
"fmt"
"strconv"
2022-12-19 19:59:24 +01:00
"strings"
"time"
2022-12-19 19:59:24 +01:00
)
2023-01-17 23:26:48 +01:00
type Kind struct {
prefix string
name string
}
func (k Kind) String() string {
return k.name
}
2022-12-19 19:59:24 +01:00
var (
2023-01-17 23:26:48 +01:00
KindMediaFileArtwork = Kind{"mf", "media_file"}
KindArtistArtwork = Kind{"ar", "artist"}
KindAlbumArtwork = Kind{"al", "album"}
KindPlaylistArtwork = Kind{"pl", "playlist"}
2022-12-19 19:59:24 +01:00
)
2023-01-17 23:26:48 +01:00
var artworkKindMap = map[string]Kind{
KindMediaFileArtwork.prefix: KindMediaFileArtwork,
KindArtistArtwork.prefix: KindArtistArtwork,
KindAlbumArtwork.prefix: KindAlbumArtwork,
KindPlaylistArtwork.prefix: KindPlaylistArtwork,
2022-12-27 23:05:40 +01:00
}
2022-12-19 19:59:24 +01:00
type ArtworkID struct {
Kind Kind
ID string
LastUpdate time.Time
2022-12-19 19:59:24 +01:00
}
func (id ArtworkID) String() string {
2022-12-27 22:36:13 +01:00
if id.ID == "" {
return ""
}
s := fmt.Sprintf("%s-%s", id.Kind.prefix, id.ID)
if lu := id.LastUpdate.Unix(); lu > 0 {
return fmt.Sprintf("%s_%x", s, lu)
}
return s + "_0"
2022-12-19 19:59:24 +01:00
}
func NewArtworkID(kind Kind, id string, lastUpdate *time.Time) ArtworkID {
artID := ArtworkID{kind, id, time.Time{}}
if lastUpdate != nil {
artID.LastUpdate = *lastUpdate
}
return artID
}
2022-12-19 19:59:24 +01:00
func ParseArtworkID(id string) (ArtworkID, error) {
2022-12-27 23:05:40 +01:00
parts := strings.SplitN(id, "-", 2)
2022-12-27 17:36:23 +01:00
if len(parts) != 2 {
2022-12-19 19:59:24 +01:00
return ArtworkID{}, errors.New("invalid artwork id")
}
kind, ok := artworkKindMap[parts[0]]
if !ok {
2022-12-19 19:59:24 +01:00
return ArtworkID{}, errors.New("invalid artwork kind")
}
parsedID := ArtworkID{
Kind: kind,
ID: parts[1],
}
parts = strings.SplitN(parts[1], "_", 2)
if len(parts) == 2 {
if parts[1] != "0" {
lastUpdate, err := strconv.ParseInt(parts[1], 16, 64)
if err != nil {
return ArtworkID{}, err
}
parsedID.LastUpdate = time.Unix(lastUpdate, 0)
}
parsedID.ID = parts[0]
}
return parsedID, nil
2022-12-19 19:59:24 +01:00
}
2022-12-20 17:27:40 +01:00
func MustParseArtworkID(id string) ArtworkID {
artID, err := ParseArtworkID(id)
if err != nil {
panic(artID)
}
return artID
}
2022-12-19 19:59:24 +01:00
func artworkIDFromAlbum(al Album) ArtworkID {
return ArtworkID{
Kind: KindAlbumArtwork,
ID: al.ID,
LastUpdate: al.UpdatedAt,
2022-12-19 19:59:24 +01:00
}
}
func artworkIDFromMediaFile(mf MediaFile) ArtworkID {
return ArtworkID{
Kind: KindMediaFileArtwork,
ID: mf.ID,
LastUpdate: mf.UpdatedAt,
2022-12-19 19:59:24 +01:00
}
}
2022-12-28 19:37:13 +01:00
func artworkIDFromPlaylist(pls Playlist) ArtworkID {
return ArtworkID{
Kind: KindPlaylistArtwork,
ID: pls.ID,
LastUpdate: pls.UpdatedAt,
2022-12-28 19:37:13 +01:00
}
}
2022-12-31 22:58:07 +01:00
func artworkIDFromArtist(ar Artist) ArtworkID {
return ArtworkID{
Kind: KindArtistArtwork,
ID: ar.ID,
}
}