package metadata
import (
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
"github.com/navidrome/navidrome/plugins/pdk/go/types"
)
type ArtistRef = types.ArtistRef
type SongRef = types.SongRef
type MetadataAgentError string
const (
MetadataAgentErrorRetryLater MetadataAgentError = "agent(retry_later)"
)
func (e MetadataAgentError) Error() string { return string(e) }
type AlbumImagesResponse struct {
Images []ImageInfo `json:"images"`
}
type AlbumInfoResponse struct {
Name string `json:"name"`
MBID string `json:"mbid"`
Description string `json:"description"`
URL string `json:"url"`
}
type AlbumRequest struct {
Name string `json:"name"`
Artist string `json:"artist"`
MBID string `json:"mbid,omitempty"`
}
type ArtistBiographyResponse struct {
Biography string `json:"biography"`
}
type ArtistImagesResponse struct {
Images []ImageInfo `json:"images"`
}
type ArtistMBIDRequest struct {
ID string `json:"id"`
Name string `json:"name"`
}
type ArtistMBIDResponse struct {
MBID string `json:"mbid"`
}
type ArtistRequest struct {
ID string `json:"id"`
Name string `json:"name"`
MBID string `json:"mbid,omitempty"`
}
type ArtistURLResponse struct {
URL string `json:"url"`
}
type ImageInfo struct {
URL string `json:"url"`
Size int32 `json:"size"`
}
type SimilarArtistsRequest struct {
ID string `json:"id"`
Name string `json:"name"`
MBID string `json:"mbid,omitempty"`
Limit int32 `json:"limit"`
}
type SimilarArtistsResponse struct {
Artists []types.ArtistRef `json:"artists"`
}
type SimilarSongsByAlbumRequest struct {
ID string `json:"id"`
Name string `json:"name"`
Artist string `json:"artist"`
MBID string `json:"mbid,omitempty"`
Count int32 `json:"count"`
}
type SimilarSongsByArtistRequest struct {
ID string `json:"id"`
Name string `json:"name"`
MBID string `json:"mbid,omitempty"`
Count int32 `json:"count"`
}
type SimilarSongsByTrackRequest struct {
ID string `json:"id"`
Name string `json:"name"`
Artist string `json:"artist"`
MBID string `json:"mbid,omitempty"`
Count int32 `json:"count"`
}
type SimilarSongsResponse struct {
Songs []types.SongRef `json:"songs"`
}
type TopSongsRequest struct {
ID string `json:"id"`
Name string `json:"name"`
MBID string `json:"mbid,omitempty"`
Count int32 `json:"count"`
}
type TopSongsResponse struct {
Songs []types.SongRef `json:"songs"`
}
type Metadata interface{}
type ArtistMBIDProvider interface {
GetArtistMBID(ArtistMBIDRequest) (*ArtistMBIDResponse, error)
}
type ArtistURLProvider interface {
GetArtistURL(ArtistRequest) (*ArtistURLResponse, error)
}
type ArtistBiographyProvider interface {
GetArtistBiography(ArtistRequest) (*ArtistBiographyResponse, error)
}
type SimilarArtistsProvider interface {
GetSimilarArtists(SimilarArtistsRequest) (*SimilarArtistsResponse, error)
}
type ArtistImagesProvider interface {
GetArtistImages(ArtistRequest) (*ArtistImagesResponse, error)
}
type ArtistTopSongsProvider interface {
GetArtistTopSongs(TopSongsRequest) (*TopSongsResponse, error)
}
type AlbumInfoProvider interface {
GetAlbumInfo(AlbumRequest) (*AlbumInfoResponse, error)
}
type AlbumImagesProvider interface {
GetAlbumImages(AlbumRequest) (*AlbumImagesResponse, error)
}
type SimilarSongsByTrackProvider interface {
GetSimilarSongsByTrack(SimilarSongsByTrackRequest) (*SimilarSongsResponse, error)
}
type SimilarSongsByAlbumProvider interface {
GetSimilarSongsByAlbum(SimilarSongsByAlbumRequest) (*SimilarSongsResponse, error)
}
type SimilarSongsByArtistProvider interface {
GetSimilarSongsByArtist(SimilarSongsByArtistRequest) (*SimilarSongsResponse, error)
}
var (
artistMBIDImpl func(ArtistMBIDRequest) (*ArtistMBIDResponse, error)
artistURLImpl func(ArtistRequest) (*ArtistURLResponse, error)
artistBiographyImpl func(ArtistRequest) (*ArtistBiographyResponse, error)
similarArtistsImpl func(SimilarArtistsRequest) (*SimilarArtistsResponse, error)
artistImagesImpl func(ArtistRequest) (*ArtistImagesResponse, error)
artistTopSongsImpl func(TopSongsRequest) (*TopSongsResponse, error)
albumInfoImpl func(AlbumRequest) (*AlbumInfoResponse, error)
albumImagesImpl func(AlbumRequest) (*AlbumImagesResponse, error)
similarSongsByTrackImpl func(SimilarSongsByTrackRequest) (*SimilarSongsResponse, error)
similarSongsByAlbumImpl func(SimilarSongsByAlbumRequest) (*SimilarSongsResponse, error)
similarSongsByArtistImpl func(SimilarSongsByArtistRequest) (*SimilarSongsResponse, error)
)
func Register(impl Metadata) {
if p, ok := impl.(ArtistMBIDProvider); ok {
artistMBIDImpl = p.GetArtistMBID
}
if p, ok := impl.(ArtistURLProvider); ok {
artistURLImpl = p.GetArtistURL
}
if p, ok := impl.(ArtistBiographyProvider); ok {
artistBiographyImpl = p.GetArtistBiography
}
if p, ok := impl.(SimilarArtistsProvider); ok {
similarArtistsImpl = p.GetSimilarArtists
}
if p, ok := impl.(ArtistImagesProvider); ok {
artistImagesImpl = p.GetArtistImages
}
if p, ok := impl.(ArtistTopSongsProvider); ok {
artistTopSongsImpl = p.GetArtistTopSongs
}
if p, ok := impl.(AlbumInfoProvider); ok {
albumInfoImpl = p.GetAlbumInfo
}
if p, ok := impl.(AlbumImagesProvider); ok {
albumImagesImpl = p.GetAlbumImages
}
if p, ok := impl.(SimilarSongsByTrackProvider); ok {
similarSongsByTrackImpl = p.GetSimilarSongsByTrack
}
if p, ok := impl.(SimilarSongsByAlbumProvider); ok {
similarSongsByAlbumImpl = p.GetSimilarSongsByAlbum
}
if p, ok := impl.(SimilarSongsByArtistProvider); ok {
similarSongsByArtistImpl = p.GetSimilarSongsByArtist
}
}
const NotImplementedCode int32 = -2
func _NdGetArtistMbid() int32 {
if artistMBIDImpl == nil {
return NotImplementedCode
}
var input ArtistMBIDRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := artistMBIDImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetArtistUrl() int32 {
if artistURLImpl == nil {
return NotImplementedCode
}
var input ArtistRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := artistURLImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetArtistBiography() int32 {
if artistBiographyImpl == nil {
return NotImplementedCode
}
var input ArtistRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := artistBiographyImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetSimilarArtists() int32 {
if similarArtistsImpl == nil {
return NotImplementedCode
}
var input SimilarArtistsRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := similarArtistsImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetArtistImages() int32 {
if artistImagesImpl == nil {
return NotImplementedCode
}
var input ArtistRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := artistImagesImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetArtistTopSongs() int32 {
if artistTopSongsImpl == nil {
return NotImplementedCode
}
var input TopSongsRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := artistTopSongsImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetAlbumInfo() int32 {
if albumInfoImpl == nil {
return NotImplementedCode
}
var input AlbumRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := albumInfoImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetAlbumImages() int32 {
if albumImagesImpl == nil {
return NotImplementedCode
}
var input AlbumRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := albumImagesImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetSimilarSongsByTrack() int32 {
if similarSongsByTrackImpl == nil {
return NotImplementedCode
}
var input SimilarSongsByTrackRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := similarSongsByTrackImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetSimilarSongsByAlbum() int32 {
if similarSongsByAlbumImpl == nil {
return NotImplementedCode
}
var input SimilarSongsByAlbumRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := similarSongsByAlbumImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}
func _NdGetSimilarSongsByArtist() int32 {
if similarSongsByArtistImpl == nil {
return NotImplementedCode
}
var input SimilarSongsByArtistRequest
if err := pdk.InputJSON(&input); err != nil {
pdk.SetError(err)
return -1
}
output, err := similarSongsByArtistImpl(input)
if err != nil {
pdk.SetError(err)
return -1
}
if err := pdk.OutputJSON(output); err != nil {
pdk.SetError(err)
return -1
}
return 0
}