package model import ( "errors" "fmt" "strings" "golang.org/x/exp/slices" ) type Kind struct{ prefix string } var ( KindMediaFileArtwork = Kind{"mf"} KindAlbumArtwork = Kind{"al"} KindPlaylistArtwork = Kind{"pl"} ) var artworkKindList = []string{ KindAlbumArtwork.prefix, KindMediaFileArtwork.prefix, KindPlaylistArtwork.prefix, } type ArtworkID struct { Kind Kind ID string } func (id ArtworkID) String() string { if id.ID == "" { return "" } return fmt.Sprintf("%s-%s", id.Kind.prefix, id.ID) } func ParseArtworkID(id string) (ArtworkID, error) { parts := strings.SplitN(id, "-", 2) if len(parts) != 2 { return ArtworkID{}, errors.New("invalid artwork id") } if !slices.Contains(artworkKindList, parts[0]) { return ArtworkID{}, errors.New("invalid artwork kind") } return ArtworkID{ Kind: Kind{parts[0]}, ID: parts[1], }, nil } func MustParseArtworkID(id string) ArtworkID { artID, err := ParseArtworkID(id) if err != nil { panic(artID) } return artID } func artworkIDFromAlbum(al Album) ArtworkID { return ArtworkID{ Kind: KindAlbumArtwork, ID: al.ID, } } func artworkIDFromMediaFile(mf MediaFile) ArtworkID { return ArtworkID{ Kind: KindMediaFileArtwork, ID: mf.ID, } }