456 lines
12 KiB
Go
456 lines
12 KiB
Go
|
|
// Code generated by ndpgen. DO NOT EDIT.
|
||
|
|
//
|
||
|
|
// This file contains export wrappers for the MetadataAgent capability.
|
||
|
|
// It is intended for use in Navidrome plugins built with TinyGo.
|
||
|
|
//
|
||
|
|
//go:build wasip1
|
||
|
|
|
||
|
|
package metadata
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
|
||
|
|
)
|
||
|
|
|
||
|
|
// AlbumImagesResponse is the response for GetAlbumImages.
|
||
|
|
type AlbumImagesResponse struct {
|
||
|
|
// Images is the list of album images.
|
||
|
|
Images []ImageInfo `json:"images"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// AlbumInfoResponse is the response for GetAlbumInfo.
|
||
|
|
type AlbumInfoResponse struct {
|
||
|
|
// Name is the album name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the album.
|
||
|
|
MBID string `json:"mbid"`
|
||
|
|
// Description is the album description/notes.
|
||
|
|
Description string `json:"description"`
|
||
|
|
// URL is the external URL for the album.
|
||
|
|
URL string `json:"url"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// AlbumRequest is the common request for album-related functions.
|
||
|
|
type AlbumRequest struct {
|
||
|
|
// Name is the album name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// Artist is the album artist name.
|
||
|
|
Artist string `json:"artist"`
|
||
|
|
// MBID is the MusicBrainz ID for the album (if known).
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistBiographyResponse is the response for GetArtistBiography.
|
||
|
|
type ArtistBiographyResponse struct {
|
||
|
|
// Biography is the artist biography text.
|
||
|
|
Biography string `json:"biography"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistImagesResponse is the response for GetArtistImages.
|
||
|
|
type ArtistImagesResponse struct {
|
||
|
|
// Images is the list of artist images.
|
||
|
|
Images []ImageInfo `json:"images"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistMBIDRequest is the request for GetArtistMBID.
|
||
|
|
type ArtistMBIDRequest struct {
|
||
|
|
// ID is the internal Navidrome artist ID.
|
||
|
|
ID string `json:"id"`
|
||
|
|
// Name is the artist name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistMBIDResponse is the response for GetArtistMBID.
|
||
|
|
type ArtistMBIDResponse struct {
|
||
|
|
// MBID is the MusicBrainz ID for the artist.
|
||
|
|
MBID string `json:"mbid"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistRef is a reference to an artist with name and optional MBID.
|
||
|
|
type ArtistRef struct {
|
||
|
|
// ID is the internal Navidrome artist ID (if known).
|
||
|
|
ID string `json:"id,omitempty"`
|
||
|
|
// Name is the artist name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the artist.
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistRequest is the common request for artist-related functions.
|
||
|
|
type ArtistRequest struct {
|
||
|
|
// ID is the internal Navidrome artist ID.
|
||
|
|
ID string `json:"id"`
|
||
|
|
// Name is the artist name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the artist (if known).
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistURLResponse is the response for GetArtistURL.
|
||
|
|
type ArtistURLResponse struct {
|
||
|
|
// URL is the external URL for the artist.
|
||
|
|
URL string `json:"url"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ImageInfo represents an image with URL and size.
|
||
|
|
type ImageInfo struct {
|
||
|
|
// URL is the URL of the image.
|
||
|
|
URL string `json:"url"`
|
||
|
|
// Size is the size of the image in pixels (width or height).
|
||
|
|
Size int32 `json:"size"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// SimilarArtistsRequest is the request for GetSimilarArtists.
|
||
|
|
type SimilarArtistsRequest struct {
|
||
|
|
// ID is the internal Navidrome artist ID.
|
||
|
|
ID string `json:"id"`
|
||
|
|
// Name is the artist name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the artist (if known).
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
// Limit is the maximum number of similar artists to return.
|
||
|
|
Limit int32 `json:"limit"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// SimilarArtistsResponse is the response for GetSimilarArtists.
|
||
|
|
type SimilarArtistsResponse struct {
|
||
|
|
// Artists is the list of similar artists.
|
||
|
|
Artists []ArtistRef `json:"artists"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// SongRef is a reference to a song with name and optional MBID.
|
||
|
|
type SongRef struct {
|
||
|
|
// ID is the internal Navidrome mediafile ID (if known).
|
||
|
|
ID string `json:"id,omitempty"`
|
||
|
|
// Name is the song name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the song.
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// TopSongsRequest is the request for GetArtistTopSongs.
|
||
|
|
type TopSongsRequest struct {
|
||
|
|
// ID is the internal Navidrome artist ID.
|
||
|
|
ID string `json:"id"`
|
||
|
|
// Name is the artist name.
|
||
|
|
Name string `json:"name"`
|
||
|
|
// MBID is the MusicBrainz ID for the artist (if known).
|
||
|
|
MBID string `json:"mbid,omitempty"`
|
||
|
|
// Count is the maximum number of top songs to return.
|
||
|
|
Count int32 `json:"count"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// TopSongsResponse is the response for GetArtistTopSongs.
|
||
|
|
type TopSongsResponse struct {
|
||
|
|
// Songs is the list of top songs.
|
||
|
|
Songs []SongRef `json:"songs"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// Metadata is the marker interface for metadata plugins.
|
||
|
|
// Implement one or more of the provider interfaces below.
|
||
|
|
// MetadataAgent provides artist and album metadata retrieval.
|
||
|
|
// This capability allows plugins to provide external metadata for artists and albums,
|
||
|
|
// such as biographies, images, similar artists, and top songs.
|
||
|
|
//
|
||
|
|
// Plugins implementing this capability can choose which methods to implement.
|
||
|
|
// Each method is optional - plugins only need to provide the functionality they support.
|
||
|
|
type Metadata interface{}
|
||
|
|
|
||
|
|
// ArtistMBIDProvider provides the GetArtistMBID function.
|
||
|
|
type ArtistMBIDProvider interface {
|
||
|
|
GetArtistMBID(ArtistMBIDRequest) (*ArtistMBIDResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistURLProvider provides the GetArtistURL function.
|
||
|
|
type ArtistURLProvider interface {
|
||
|
|
GetArtistURL(ArtistRequest) (*ArtistURLResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistBiographyProvider provides the GetArtistBiography function.
|
||
|
|
type ArtistBiographyProvider interface {
|
||
|
|
GetArtistBiography(ArtistRequest) (*ArtistBiographyResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// SimilarArtistsProvider provides the GetSimilarArtists function.
|
||
|
|
type SimilarArtistsProvider interface {
|
||
|
|
GetSimilarArtists(SimilarArtistsRequest) (*SimilarArtistsResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistImagesProvider provides the GetArtistImages function.
|
||
|
|
type ArtistImagesProvider interface {
|
||
|
|
GetArtistImages(ArtistRequest) (*ArtistImagesResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// ArtistTopSongsProvider provides the GetArtistTopSongs function.
|
||
|
|
type ArtistTopSongsProvider interface {
|
||
|
|
GetArtistTopSongs(TopSongsRequest) (*TopSongsResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// AlbumInfoProvider provides the GetAlbumInfo function.
|
||
|
|
type AlbumInfoProvider interface {
|
||
|
|
GetAlbumInfo(AlbumRequest) (*AlbumInfoResponse, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// AlbumImagesProvider provides the GetAlbumImages function.
|
||
|
|
type AlbumImagesProvider interface {
|
||
|
|
GetAlbumImages(AlbumRequest) (*AlbumImagesResponse, error)
|
||
|
|
} // Internal implementation holders
|
||
|
|
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)
|
||
|
|
)
|
||
|
|
|
||
|
|
// Register registers a metadata implementation.
|
||
|
|
// The implementation is checked for optional provider interfaces.
|
||
|
|
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
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// NotImplementedCode is the standard return code for unimplemented functions.
|
||
|
|
// The host recognizes this and skips the plugin gracefully.
|
||
|
|
const NotImplementedCode int32 = -2
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_artist_mbid
|
||
|
|
func _NdGetArtistMbid() int32 {
|
||
|
|
if artistMBIDImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_artist_url
|
||
|
|
func _NdGetArtistUrl() int32 {
|
||
|
|
if artistURLImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_artist_biography
|
||
|
|
func _NdGetArtistBiography() int32 {
|
||
|
|
if artistBiographyImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_similar_artists
|
||
|
|
func _NdGetSimilarArtists() int32 {
|
||
|
|
if similarArtistsImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_artist_images
|
||
|
|
func _NdGetArtistImages() int32 {
|
||
|
|
if artistImagesImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_artist_top_songs
|
||
|
|
func _NdGetArtistTopSongs() int32 {
|
||
|
|
if artistTopSongsImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_album_info
|
||
|
|
func _NdGetAlbumInfo() int32 {
|
||
|
|
if albumInfoImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:wasmexport nd_get_album_images
|
||
|
|
func _NdGetAlbumImages() int32 {
|
||
|
|
if albumImagesImpl == nil {
|
||
|
|
// Return standard code - host will skip this plugin gracefully
|
||
|
|
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
|
||
|
|
}
|