50 lines
1.6 KiB
Go
50 lines
1.6 KiB
Go
package playlist
|
|
|
|
import "errors"
|
|
|
|
// ErrNeedsAuth is returned by providers that require interactive sign-in
|
|
// before they can be used.
|
|
var ErrNeedsAuth = errors.New("sign-in required")
|
|
|
|
// PlaylistInfo describes a playlist with its name and track count.
|
|
//
|
|
// DurationSecs is optional: providers that can compute it cheaply should
|
|
// populate it so the UI can render a total runtime. A zero value means
|
|
// "unknown" and the UI will hide the duration column.
|
|
//
|
|
// Section is optional: providers may set it to group their playlists in the UI.
|
|
// Adjacent rows that share a Section are rendered under one header; a change of
|
|
// Section emits a "── header ──" divider. The radio provider uses
|
|
// SectionedList.IDPrefix instead and leaves Section empty.
|
|
type PlaylistInfo struct {
|
|
ID string
|
|
Name string
|
|
TrackCount int
|
|
DurationSecs int
|
|
Section string
|
|
}
|
|
|
|
// Provider is the interface for playlist sources (radio, Navidrome, Spotify, etc.).
|
|
type Provider interface {
|
|
// Name returns the display name of this provider.
|
|
Name() string
|
|
|
|
// Playlists returns the available playlists from this provider.
|
|
Playlists() ([]PlaylistInfo, error)
|
|
|
|
// Tracks returns the tracks in the given playlist.
|
|
Tracks(playlistID string) ([]Track, error)
|
|
}
|
|
|
|
// Authenticator is optionally implemented by providers that require sign-in.
|
|
type Authenticator interface {
|
|
Authenticate() error
|
|
}
|
|
|
|
// Refresher is optionally implemented by providers that cache playlist or
|
|
// track data and support invalidating that cache so the next Playlists() /
|
|
// Tracks() call re-fetches from the source.
|
|
type Refresher interface {
|
|
Refresh()
|
|
}
|