mirror of
https://github.com/navidrome/navidrome.git
synced 2026-11-07 18:58:38 +01:00
feat: generate PDK code for PlaylistGenerator capability
Generated via ndpgen: Go PDK wrappers, Rust PDK wrappers, and XTP schema for non-Go plugins.
This commit is contained in:
parent
4908dae21f
commit
dedaf8e64a
5 changed files with 535 additions and 0 deletions
157
plugins/pdk/go/playlistgenerator/playlistgenerator.go
Normal file
157
plugins/pdk/go/playlistgenerator/playlistgenerator.go
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
// Code generated by ndpgen. DO NOT EDIT.
|
||||
//
|
||||
// This file contains export wrappers for the PlaylistGenerator capability.
|
||||
// It is intended for use in Navidrome plugins built with TinyGo.
|
||||
//
|
||||
//go:build wasip1
|
||||
|
||||
package playlistgenerator
|
||||
|
||||
import (
|
||||
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
|
||||
)
|
||||
|
||||
// GetPlaylistRequest is the request for GetPlaylist.
|
||||
type GetPlaylistRequest struct {
|
||||
// ID is the plugin-scoped playlist ID.
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
// GetPlaylistResponse is the response for GetPlaylist.
|
||||
type GetPlaylistResponse struct {
|
||||
// Name is the display name of the playlist.
|
||||
Name string `json:"name"`
|
||||
// Description is an optional description for the playlist.
|
||||
Description string `json:"description,omitempty"`
|
||||
// CoverArtURL is an optional external URL for the playlist cover art.
|
||||
CoverArtURL string `json:"coverArtUrl,omitempty"`
|
||||
// Tracks is the list of songs in the playlist, using SongRef for matching.
|
||||
Tracks []SongRef `json:"tracks"`
|
||||
// ValidUntil is a unix timestamp indicating when this playlist data expires.
|
||||
// 0 means static (never refresh).
|
||||
ValidUntil int64 `json:"validUntil"`
|
||||
}
|
||||
|
||||
// GetPlaylistsRequest is the request for GetPlaylists.
|
||||
type GetPlaylistsRequest struct {
|
||||
}
|
||||
|
||||
// GetPlaylistsResponse is the response for GetPlaylists.
|
||||
type GetPlaylistsResponse struct {
|
||||
// Playlists is the list of playlists provided by this plugin.
|
||||
Playlists []PlaylistInfo `json:"playlists"`
|
||||
// RefreshInterval is the number of seconds until the next GetPlaylists call.
|
||||
// 0 means never re-discover.
|
||||
RefreshInterval int64 `json:"refreshInterval"`
|
||||
}
|
||||
|
||||
// PlaylistInfo identifies a plugin playlist and its target user.
|
||||
type PlaylistInfo struct {
|
||||
// ID is the plugin-scoped unique identifier for this playlist.
|
||||
ID string `json:"id"`
|
||||
// OwnerUserID is the Navidrome user ID that owns this playlist.
|
||||
OwnerUserID string `json:"ownerUserId"`
|
||||
}
|
||||
|
||||
// SongRef is a reference to a song with metadata for matching.
|
||||
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"`
|
||||
// ISRC is the International Standard Recording Code for the song.
|
||||
ISRC string `json:"isrc,omitempty"`
|
||||
// Artist is the artist name.
|
||||
Artist string `json:"artist,omitempty"`
|
||||
// ArtistMBID is the MusicBrainz artist ID.
|
||||
ArtistMBID string `json:"artistMbid,omitempty"`
|
||||
// Album is the album name.
|
||||
Album string `json:"album,omitempty"`
|
||||
// AlbumMBID is the MusicBrainz release ID.
|
||||
AlbumMBID string `json:"albumMbid,omitempty"`
|
||||
// Duration is the song duration in seconds.
|
||||
Duration float32 `json:"duration,omitempty"`
|
||||
}
|
||||
|
||||
// PlaylistGenerator requires all methods to be implemented.
|
||||
// PlaylistGenerator provides dynamically-generated playlists (e.g., "Daily Mix",
|
||||
// personalized recommendations). Plugins implementing this capability expose two
|
||||
// functions: GetPlaylists for lightweight discovery and GetPlaylist for fetching
|
||||
// the heavy payload (tracks, metadata).
|
||||
type PlaylistGenerator interface {
|
||||
// GetPlaylists - GetPlaylists returns the list of playlists this plugin provides.
|
||||
GetPlaylists(GetPlaylistsRequest) (GetPlaylistsResponse, error)
|
||||
// GetPlaylist - GetPlaylist returns the full data for a single playlist (tracks, metadata).
|
||||
GetPlaylist(GetPlaylistRequest) (GetPlaylistResponse, error)
|
||||
} // Internal implementation holders
|
||||
var (
|
||||
playlistsImpl func(GetPlaylistsRequest) (GetPlaylistsResponse, error)
|
||||
playlistImpl func(GetPlaylistRequest) (GetPlaylistResponse, error)
|
||||
)
|
||||
|
||||
// Register registers a playlistgenerator implementation.
|
||||
// All methods are required.
|
||||
func Register(impl PlaylistGenerator) {
|
||||
playlistsImpl = impl.GetPlaylists
|
||||
playlistImpl = impl.GetPlaylist
|
||||
}
|
||||
|
||||
// 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_playlist_generator_get_playlists
|
||||
func _NdPlaylistGeneratorGetPlaylists() int32 {
|
||||
if playlistsImpl == nil {
|
||||
// Return standard code - host will skip this plugin gracefully
|
||||
return NotImplementedCode
|
||||
}
|
||||
|
||||
var input GetPlaylistsRequest
|
||||
if err := pdk.InputJSON(&input); err != nil {
|
||||
pdk.SetError(err)
|
||||
return -1
|
||||
}
|
||||
|
||||
output, err := playlistsImpl(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_playlist_generator_get_playlist
|
||||
func _NdPlaylistGeneratorGetPlaylist() int32 {
|
||||
if playlistImpl == nil {
|
||||
// Return standard code - host will skip this plugin gracefully
|
||||
return NotImplementedCode
|
||||
}
|
||||
|
||||
var input GetPlaylistRequest
|
||||
if err := pdk.InputJSON(&input); err != nil {
|
||||
pdk.SetError(err)
|
||||
return -1
|
||||
}
|
||||
|
||||
output, err := playlistImpl(input)
|
||||
if err != nil {
|
||||
pdk.SetError(err)
|
||||
return -1
|
||||
}
|
||||
|
||||
if err := pdk.OutputJSON(output); err != nil {
|
||||
pdk.SetError(err)
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
92
plugins/pdk/go/playlistgenerator/playlistgenerator_stub.go
Normal file
92
plugins/pdk/go/playlistgenerator/playlistgenerator_stub.go
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
// Code generated by ndpgen. DO NOT EDIT.
|
||||
//
|
||||
// This file provides stub implementations for non-WASM platforms.
|
||||
// It allows Go plugins to compile and run tests outside of WASM,
|
||||
// but the actual functionality is only available in WASM builds.
|
||||
//
|
||||
//go:build !wasip1
|
||||
|
||||
package playlistgenerator
|
||||
|
||||
// GetPlaylistRequest is the request for GetPlaylist.
|
||||
type GetPlaylistRequest struct {
|
||||
// ID is the plugin-scoped playlist ID.
|
||||
ID string `json:"id"`
|
||||
}
|
||||
|
||||
// GetPlaylistResponse is the response for GetPlaylist.
|
||||
type GetPlaylistResponse struct {
|
||||
// Name is the display name of the playlist.
|
||||
Name string `json:"name"`
|
||||
// Description is an optional description for the playlist.
|
||||
Description string `json:"description,omitempty"`
|
||||
// CoverArtURL is an optional external URL for the playlist cover art.
|
||||
CoverArtURL string `json:"coverArtUrl,omitempty"`
|
||||
// Tracks is the list of songs in the playlist, using SongRef for matching.
|
||||
Tracks []SongRef `json:"tracks"`
|
||||
// ValidUntil is a unix timestamp indicating when this playlist data expires.
|
||||
// 0 means static (never refresh).
|
||||
ValidUntil int64 `json:"validUntil"`
|
||||
}
|
||||
|
||||
// GetPlaylistsRequest is the request for GetPlaylists.
|
||||
type GetPlaylistsRequest struct {
|
||||
}
|
||||
|
||||
// GetPlaylistsResponse is the response for GetPlaylists.
|
||||
type GetPlaylistsResponse struct {
|
||||
// Playlists is the list of playlists provided by this plugin.
|
||||
Playlists []PlaylistInfo `json:"playlists"`
|
||||
// RefreshInterval is the number of seconds until the next GetPlaylists call.
|
||||
// 0 means never re-discover.
|
||||
RefreshInterval int64 `json:"refreshInterval"`
|
||||
}
|
||||
|
||||
// PlaylistInfo identifies a plugin playlist and its target user.
|
||||
type PlaylistInfo struct {
|
||||
// ID is the plugin-scoped unique identifier for this playlist.
|
||||
ID string `json:"id"`
|
||||
// OwnerUserID is the Navidrome user ID that owns this playlist.
|
||||
OwnerUserID string `json:"ownerUserId"`
|
||||
}
|
||||
|
||||
// SongRef is a reference to a song with metadata for matching.
|
||||
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"`
|
||||
// ISRC is the International Standard Recording Code for the song.
|
||||
ISRC string `json:"isrc,omitempty"`
|
||||
// Artist is the artist name.
|
||||
Artist string `json:"artist,omitempty"`
|
||||
// ArtistMBID is the MusicBrainz artist ID.
|
||||
ArtistMBID string `json:"artistMbid,omitempty"`
|
||||
// Album is the album name.
|
||||
Album string `json:"album,omitempty"`
|
||||
// AlbumMBID is the MusicBrainz release ID.
|
||||
AlbumMBID string `json:"albumMbid,omitempty"`
|
||||
// Duration is the song duration in seconds.
|
||||
Duration float32 `json:"duration,omitempty"`
|
||||
}
|
||||
|
||||
// PlaylistGenerator requires all methods to be implemented.
|
||||
// PlaylistGenerator provides dynamically-generated playlists (e.g., "Daily Mix",
|
||||
// personalized recommendations). Plugins implementing this capability expose two
|
||||
// functions: GetPlaylists for lightweight discovery and GetPlaylist for fetching
|
||||
// the heavy payload (tracks, metadata).
|
||||
type PlaylistGenerator interface {
|
||||
// GetPlaylists - GetPlaylists returns the list of playlists this plugin provides.
|
||||
GetPlaylists(GetPlaylistsRequest) (GetPlaylistsResponse, error)
|
||||
// GetPlaylist - GetPlaylist returns the full data for a single playlist (tracks, metadata).
|
||||
GetPlaylist(GetPlaylistRequest) (GetPlaylistResponse, error)
|
||||
}
|
||||
|
||||
// NotImplementedCode is the standard return code for unimplemented functions.
|
||||
const NotImplementedCode int32 = -2
|
||||
|
||||
// Register is a no-op on non-WASM platforms.
|
||||
// This stub allows code to compile outside of WASM.
|
||||
func Register(_ PlaylistGenerator) {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue