Files
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

141 lines
4.8 KiB
Go

package provider
import (
"context"
"time"
"github.com/gopxl/beep/v2"
"github.com/bjarneo/cliamp/playlist"
)
// Searcher is implemented by providers that support searching for tracks.
type Searcher interface {
SearchTracks(ctx context.Context, query string, limit int) ([]playlist.Track, error)
}
// ArtistBrowser is implemented by providers that support listing artists
// and their albums.
type ArtistBrowser interface {
Artists() ([]ArtistInfo, error)
ArtistAlbums(artistID string) ([]AlbumInfo, error)
}
// AlbumBrowser is implemented by providers that support paginated album
// listing with configurable sort order.
type AlbumBrowser interface {
AlbumList(sortType string, offset, size int) ([]AlbumInfo, error)
AlbumSortTypes() []SortType
DefaultAlbumSort() string
}
// AlbumSortSaver is implemented by providers that persist album sort changes.
type AlbumSortSaver interface {
SaveAlbumSort(sortType string) error
}
// AlbumTrackLoader is implemented by providers that can return the tracks
// of a specific album (as opposed to a playlist).
type AlbumTrackLoader interface {
AlbumTracks(albumID string) ([]playlist.Track, error)
}
// PlaybackReporter is implemented by providers that accept now-playing and
// playback-completion reports for tracks they originated.
type PlaybackReporter interface {
CanReportPlayback(track playlist.Track) bool
ReportNowPlaying(track playlist.Track, position time.Duration, canSeek bool)
ReportScrobble(track playlist.Track, elapsed, duration time.Duration, canSeek bool)
}
// PlaylistWriter is implemented by providers that support adding tracks
// to existing playlists.
type PlaylistWriter interface {
AddTrackToPlaylist(ctx context.Context, playlistID string, track playlist.Track) error
}
// PlaylistBatchWriter is implemented by providers that support adding multiple
// tracks to existing playlists in one operation.
type PlaylistBatchWriter interface {
AddTracksToPlaylist(ctx context.Context, playlistID string, tracks []playlist.Track) (added, skipped int, err error)
}
// PlaylistSaver is implemented by providers that can overwrite a playlist's
// complete ordered track list.
type PlaylistSaver interface {
SavePlaylist(name string, tracks []playlist.Track) error
}
// PlaylistCreator is implemented by providers that support creating new
// playlists.
type PlaylistCreator interface {
CreatePlaylist(ctx context.Context, name string) (string, error)
}
// PlaylistDeleter is implemented by providers that support removing
// playlists and individual tracks.
type PlaylistDeleter interface {
DeletePlaylist(name string) error
RemoveTrack(name string, index int) error
}
// PlaylistRenamer is implemented by providers that support renaming playlists.
type PlaylistRenamer interface {
RenamePlaylist(oldName, newName string) error
}
// BookmarkSetter is implemented by providers that support toggling
// track bookmarks and persisting them.
type BookmarkSetter interface {
SetBookmark(playlistName string, idx int) error
SetBookmarkByPath(playlistName string, path string) error
}
// CustomStreamer is implemented by providers that need a custom audio
// decode path for non-standard URI schemes (e.g. spotify:track:xxx).
type CustomStreamer interface {
// URISchemes returns the URI prefixes this provider handles.
URISchemes() []string
// NewStreamer creates a decoder for the given URI.
NewStreamer(uri string) (beep.StreamSeekCloser, beep.Format, time.Duration, error)
}
// FavoriteToggler is implemented by providers that support marking items
// as favorites (e.g. radio station favorites).
type FavoriteToggler interface {
ToggleFavorite(id string) (added bool, name string, err error)
}
// CatalogLoader is implemented by providers that support lazy-loading
// catalog pages from an external source (e.g. Radio Browser API).
type CatalogLoader interface {
// LoadCatalogPage fetches the next page of catalog entries starting at
// offset. Returns the number of items added and any error.
LoadCatalogPage(offset, limit int) (added int, err error)
}
// CatalogSearcher is implemented by providers that support server-side
// catalog search (e.g. radio station search via an API).
type CatalogSearcher interface {
// SearchCatalog performs a server-side search. Results are reflected
// in the next Playlists() call.
SearchCatalog(query string) (int, error)
ClearSearch()
IsSearching() bool
}
// SectionedList is implemented by providers whose playlist list has
// logical sections (e.g. local stations, favorites, catalog).
type SectionedList interface {
// IDPrefix returns the section prefix for a playlist ID (e.g. "f", "c", "s").
IDPrefix(id string) string
// IsFavoritableID reports whether the given ID can be favorited.
IsFavoritableID(id string) bool
}
// Closer is implemented by providers that hold resources (sessions,
// connections) that should be released on shutdown.
type Closer interface {
Close()
}