Documentation
¶
Index ¶
- Constants
- Variables
- func DiscArtworkID(albumID string, discNumber int) string
- func FolderID(lib Library, path string) string
- func GetEntityByID(ctx context.Context, ds DataStore, id string) (any, error)
- func IsAudioFile(filePath string) bool
- func IsImageFile(filePath string) bool
- func IsValidPlaylist(filePath string) bool
- func ParseDiscArtworkID(id string) (albumID string, discNumber int, err error)
- func TagMainMappings() map[TagName]TagConf
- func TagMappings() map[TagName]TagConf
- func UploadedImagePath(entityType, filename string) string
- type Album
- type AlbumCursor
- type AlbumRepository
- type Albums
- type AnnotatedRepository
- type Annotations
- type Artist
- type ArtistIndex
- type ArtistIndexes
- type ArtistInfo
- type ArtistRepository
- type ArtistStats
- type Artists
- type ArtworkID
- type Bookmark
- type Bookmarkable
- type BookmarkableRepository
- type Bookmarks
- type DataStore
- type DiscID
- type Discs
- type Folder
- type FolderCursor
- type FolderRepository
- type FolderUpdateInfo
- type Genre
- type GenreRepository
- type Genres
- type Kind
- type Libraries
- type Library
- type LibraryRepository
- type Line
- type LyricList
- type Lyrics
- type MediaFile
- func (mf MediaFile) AbsolutePath() string
- func (mf MediaFile) AlbumCoverArtID() ArtworkID
- func (mf MediaFile) AudioCodec() string
- func (mf MediaFile) ContentType() string
- func (mf MediaFile) CoverArtID() ArtworkID
- func (mf MediaFile) DiscCoverArtID() ArtworkID
- func (mf MediaFile) Equals(other MediaFile) bool
- func (mf MediaFile) FullAlbumName() string
- func (mf MediaFile) FullTitle() string
- func (mf MediaFile) Hash() string
- func (mf MediaFile) IsEquivalent(other MediaFile) bool
- func (mf MediaFile) String() string
- func (mf MediaFile) StructuredLyrics() (LyricList, error)
- type MediaFileCursor
- type MediaFileRepository
- type MediaFiles
- type Participant
- type ParticipantList
- type Participants
- func (p Participants) Add(role Role, artists ...Artist)
- func (p Participants) AddWithSubRole(role Role, subRole string, artists ...Artist)
- func (p Participants) AllArtists() []Artist
- func (p Participants) AllIDs() []string
- func (p Participants) AllNames() []string
- func (p Participants) First(role Role) Artist
- func (p Participants) Hash() []byte
- func (p Participants) Merge(other Participants)
- func (p Participants) Sort()
- type PlayQueue
- type PlayQueueRepository
- type PlayQueues
- type Player
- type PlayerRepository
- type Players
- type Playlist
- func (pls *Playlist) AddMediaFiles(mfs MediaFiles)
- func (pls *Playlist) AddMediaFilesByID(mediaFileIds []string)
- func (pls Playlist) CoverArtID() ArtworkID
- func (pls Playlist) IsSmartPlaylist() bool
- func (pls Playlist) MediaFiles() MediaFiles
- func (pls *Playlist) RemoveTracks(idxToRemove []int)
- func (pls *Playlist) SetTracks(tracks PlaylistTracks)
- func (pls *Playlist) ToM3U8() string
- func (pls Playlist) UploadedImagePath() string
- type PlaylistRepository
- type PlaylistTrack
- type PlaylistTrackRepository
- type PlaylistTracks
- type Playlists
- type Plugin
- type PluginRepository
- type Plugins
- type PropertyRepository
- type QueryOptions
- type Radio
- type RadioRepository
- type Radios
- type RawTags
- type ResourceRepository
- type Role
- type ScanTarget
- type Scanner
- type ScannerStatus
- type Scrobble
- type ScrobbleBufferRepository
- type ScrobbleEntries
- type ScrobbleEntry
- type ScrobbleRepository
- type SearchableRepository
- type Share
- type ShareRepository
- type Shares
- type Tag
- type TagConf
- type TagList
- type TagName
- type TagRepository
- type TagType
- type Tags
- func (t Tags) Add(name TagName, v string)
- func (t Tags) Flatten(name TagName) TagList
- func (t Tags) FlattenAll() TagList
- func (t Tags) Hash() []byte
- func (t Tags) IDs() []string
- func (t Tags) Merge(tags Tags)
- func (t Tags) Sort()
- func (t Tags) ToGenres() (string, Genres)
- func (t Tags) Values(name TagName) []string
- type Transcoding
- type TranscodingRepository
- type Transcodings
- type User
- type UserPropsRepository
- type UserRepository
- type Users
Constants ¶
const ( DefaultLibraryID = 1 DefaultLibraryName = "Music Library" )
Variables ¶
var ( KindMediaFileArtwork = Kind{"mf", "media_file"} KindArtistArtwork = Kind{"ar", "artist"} KindAlbumArtwork = Kind{"al", "album"} KindPlaylistArtwork = Kind{"pl", "playlist"} KindDiscArtwork = Kind{"dc", "disc"} KindRadioArtwork = Kind{"ra", "radio"} )
var ( ErrNotFound = errors.New("data not found") ErrInvalidAuth = errors.New("invalid authentication") ErrNotAuthorized = errors.New("not authorized") ErrExpired = errors.New("access expired") ErrNotAvailable = errors.New("functionality not available") ErrValidation = errors.New("validation error") )
var ( RoleInvalid = Role{"invalid"} RoleArtist = Role{"artist"} RoleAlbumArtist = Role{"albumartist"} RoleComposer = Role{"composer"} RoleConductor = Role{"conductor"} RoleLyricist = Role{"lyricist"} RoleArranger = Role{"arranger"} RoleProducer = Role{"producer"} RoleDirector = Role{"director"} RoleEngineer = Role{"engineer"} RoleMixer = Role{"mixer"} RoleRemixer = Role{"remixer"} RoleDJMixer = Role{"djmixer"} RolePerformer = Role{"performer"} // RoleMainCredit is a credit where the artist is an album artist or artist RoleMainCredit = Role{"maincredit"} )
var AlbumLevelTags = sync.OnceValue(func() map[TagName]struct{} { tags := make(map[TagName]struct{}) m := TagMappings() for t, conf := range m { if conf.Album { tags[t] = struct{}{} } } return tags })
AlbumLevelTags contains all Tags marked as `album: true` in the mappings.yml file. They are not "first-class citizens" in the Album struct, but are still stored in the album table, in the `tags` column.
var AllRoles = map[string]Role{ RoleArtist.role: RoleArtist, RoleAlbumArtist.role: RoleAlbumArtist, RoleComposer.role: RoleComposer, RoleConductor.role: RoleConductor, RoleLyricist.role: RoleLyricist, RoleArranger.role: RoleArranger, RoleProducer.role: RoleProducer, RoleDirector.role: RoleDirector, RoleEngineer.role: RoleEngineer, RoleMixer.role: RoleMixer, RoleRemixer.role: RoleRemixer, RoleDJMixer.role: RoleDJMixer, RolePerformer.role: RolePerformer, RoleMainCredit.role: RoleMainCredit, }
Functions ¶
func DiscArtworkID ¶ added in v0.61.0
func FolderID ¶ added in v0.55.0
FolderID generates a unique ID for a folder in a library. The ID is generated based on the library ID and the folder path relative to the library root. Any leading or trailing slashes are removed from the folder path.
func GetEntityByID ¶ added in v0.49.0
TODO: Should the type be encoded in the ID?
func IsAudioFile ¶ added in v0.49.0
func IsImageFile ¶ added in v0.49.0
func IsValidPlaylist ¶ added in v0.49.0
func ParseDiscArtworkID ¶ added in v0.61.0
func TagMainMappings ¶ added in v0.55.0
func TagMappings ¶ added in v0.55.0
func UploadedImagePath ¶ added in v0.61.0
UploadedImagePath returns the absolute filesystem path for a manually uploaded entity cover image. Returns empty string if filename is empty.
Types ¶
type Album ¶
type Album struct {
Annotations `structs:"-" hash:"ignore"`
ID string `structs:"id" json:"id"`
LibraryID int `structs:"library_id" json:"libraryId"`
LibraryPath string `structs:"-" json:"libraryPath" hash:"ignore"`
LibraryName string `structs:"-" json:"libraryName" hash:"ignore"`
Name string `structs:"name" json:"name"`
EmbedArtPath string `structs:"embed_art_path" json:"-"`
AlbumArtistID string `structs:"album_artist_id" json:"albumArtistId"` // Deprecated, use Participants
// AlbumArtist is the display name used for the album artist.
AlbumArtist string `structs:"album_artist" json:"albumArtist"`
MaxYear int `structs:"max_year" json:"maxYear"`
MinYear int `structs:"min_year" json:"minYear"`
Date string `structs:"date" json:"date,omitempty"`
MaxOriginalYear int `structs:"max_original_year" json:"maxOriginalYear"`
MinOriginalYear int `structs:"min_original_year" json:"minOriginalYear"`
OriginalDate string `structs:"original_date" json:"originalDate,omitempty"`
ReleaseDate string `structs:"release_date" json:"releaseDate,omitempty"`
Compilation bool `structs:"compilation" json:"compilation"`
Comment string `structs:"comment" json:"comment,omitempty"`
SongCount int `structs:"song_count" json:"songCount"`
Duration float32 `structs:"duration" json:"duration"`
Size int64 `structs:"size" json:"size"`
Discs Discs `structs:"discs" json:"discs,omitempty"`
SortAlbumName string `structs:"sort_album_name" json:"sortAlbumName,omitempty"`
SortAlbumArtistName string `structs:"sort_album_artist_name" json:"sortAlbumArtistName,omitempty"`
OrderAlbumName string `structs:"order_album_name" json:"orderAlbumName"`
OrderAlbumArtistName string `structs:"order_album_artist_name" json:"orderAlbumArtistName"`
CatalogNum string `structs:"catalog_num" json:"catalogNum,omitempty"`
MbzAlbumID string `structs:"mbz_album_id" json:"mbzAlbumId,omitempty"`
MbzAlbumArtistID string `structs:"mbz_album_artist_id" json:"mbzAlbumArtistId,omitempty"`
MbzAlbumType string `structs:"mbz_album_type" json:"mbzAlbumType,omitempty"`
MbzAlbumComment string `structs:"mbz_album_comment" json:"mbzAlbumComment,omitempty"`
MbzReleaseGroupID string `structs:"mbz_release_group_id" json:"mbzReleaseGroupId,omitempty"`
FolderIDs []string `structs:"folder_ids" json:"-" hash:"set"` // All folders that contain media_files for this album
ExplicitStatus string `structs:"explicit_status" json:"explicitStatus"`
// External metadata fields
Description string `structs:"description" json:"description,omitempty" hash:"ignore"`
SmallImageUrl string `structs:"small_image_url" json:"smallImageUrl,omitempty" hash:"ignore"`
MediumImageUrl string `structs:"medium_image_url" json:"mediumImageUrl,omitempty" hash:"ignore"`
LargeImageUrl string `structs:"large_image_url" json:"largeImageUrl,omitempty" hash:"ignore"`
ExternalUrl string `structs:"external_url" json:"externalUrl,omitempty" hash:"ignore"`
ExternalInfoUpdatedAt *time.Time `structs:"external_info_updated_at" json:"externalInfoUpdatedAt" hash:"ignore"`
Genre string `structs:"genre" json:"genre" hash:"ignore"` // Easy access to the most common genre
Genres Genres `structs:"-" json:"genres" hash:"ignore"` // Easy access to all genres for this album
Tags Tags `structs:"tags" json:"tags,omitempty" hash:"ignore"` // All imported tags for this album
Participants Participants `structs:"participants" json:"participants" hash:"ignore"` // All artists that participated in this album
Missing bool `structs:"missing" json:"missing"` // If all file of the album ar missing
ImportedAt time.Time `structs:"imported_at" json:"importedAt" hash:"ignore"` // When this album was imported/updated
CreatedAt time.Time `structs:"created_at" json:"createdAt"` // Oldest CreatedAt for all songs in this album
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"` // Newest UpdatedAt for all songs in this album
}
func (Album) CoverArtID ¶ added in v0.49.0
type AlbumRepository ¶
type AlbumRepository interface {
CountAll(...QueryOptions) (int64, error)
Exists(id string) (bool, error)
Put(*Album) error
UpdateExternalInfo(*Album) error
Get(id string) (*Album, error)
GetAll(...QueryOptions) (Albums, error)
// The following methods are used exclusively by the scanner:
Touch(ids ...string) error
TouchByMissingFolder() (int64, error)
GetTouchedAlbums(libID int) (AlbumCursor, error)
RefreshPlayCounts() (int64, error)
CopyAttributes(fromID, toID string, columns ...string) error
AnnotatedRepository
SearchableRepository[Albums]
}
type AnnotatedRepository ¶
type Annotations ¶
type Annotations struct {
PlayCount int64 `structs:"play_count" json:"playCount,omitempty"`
PlayDate *time.Time `structs:"play_date" json:"playDate,omitempty" `
Rating int `structs:"rating" json:"rating,omitempty" `
RatedAt *time.Time `structs:"rated_at" json:"ratedAt,omitempty" `
Starred bool `structs:"starred" json:"starred,omitempty" `
StarredAt *time.Time `structs:"starred_at" json:"starredAt,omitempty"`
AverageRating float64 `structs:"average_rating" json:"averageRating,omitempty"`
}
type Artist ¶
type Artist struct {
Annotations `structs:"-"`
ID string `structs:"id" json:"id"`
// Data based on tags
Name string `structs:"name" json:"name"`
SortArtistName string `structs:"sort_artist_name" json:"sortArtistName,omitempty"`
OrderArtistName string `structs:"order_artist_name" json:"orderArtistName,omitempty"`
MbzArtistID string `structs:"mbz_artist_id" json:"mbzArtistId,omitempty"`
// Data calculated from files
Stats map[Role]ArtistStats `structs:"-" json:"stats,omitempty"`
Size int64 `structs:"-" json:"size,omitempty"`
AlbumCount int `structs:"-" json:"albumCount,omitempty"`
SongCount int `structs:"-" json:"songCount,omitempty"`
// Data imported from external sources
Biography string `structs:"biography" json:"biography,omitempty"`
SmallImageUrl string `structs:"small_image_url" json:"smallImageUrl,omitempty"`
MediumImageUrl string `structs:"medium_image_url" json:"mediumImageUrl,omitempty"`
LargeImageUrl string `structs:"large_image_url" json:"largeImageUrl,omitempty"`
ExternalUrl string `structs:"external_url" json:"externalUrl,omitempty"`
SimilarArtists Artists `structs:"similar_artists" json:"-"`
ExternalInfoUpdatedAt *time.Time `structs:"external_info_updated_at" json:"externalInfoUpdatedAt,omitempty"`
Missing bool `structs:"missing" json:"missing"`
UploadedImage string `structs:"uploaded_image" json:"uploadedImage,omitempty"`
CreatedAt *time.Time `structs:"created_at" json:"createdAt,omitempty"`
UpdatedAt *time.Time `structs:"updated_at" json:"updatedAt,omitempty"`
}
func (Artist) ArtistImageUrl ¶
func (Artist) CoverArtID ¶ added in v0.49.0
func (Artist) Roles ¶ added in v0.55.0
Roles returns the roles this artist has participated in., based on the Stats field
func (Artist) UploadedImagePath ¶ added in v0.61.0
type ArtistIndex ¶
type ArtistIndexes ¶
type ArtistIndexes []ArtistIndex
type ArtistInfo ¶
type ArtistRepository ¶
type ArtistRepository interface {
CountAll(options ...QueryOptions) (int64, error)
Exists(id string) (bool, error)
Put(m *Artist, colsToUpdate ...string) error
UpdateExternalInfo(a *Artist) error
Get(id string) (*Artist, error)
GetAll(options ...QueryOptions) (Artists, error)
GetIndex(includeMissing bool, libraryIds []int, roles ...Role) (ArtistIndexes, error)
// The following methods are used exclusively by the scanner:
RefreshPlayCounts() (int64, error)
RefreshStats(allArtists bool) (int64, error)
AnnotatedRepository
SearchableRepository[Artists]
}
type ArtistStats ¶ added in v0.55.0
type ArtworkID ¶ added in v0.49.0
func MustParseArtworkID ¶ added in v0.49.0
func NewArtworkID ¶ added in v0.49.0
func ParseArtworkID ¶ added in v0.49.0
type Bookmark ¶
type Bookmark struct {
Item MediaFile `structs:"item" json:"item"`
Comment string `structs:"comment" json:"comment"`
Position int64 `structs:"position" json:"position"`
ChangedBy string `structs:"changed_by" json:"changed_by"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
}
type Bookmarkable ¶
type Bookmarkable struct {
BookmarkPosition int64 `structs:"-" json:"bookmarkPosition"`
}
type BookmarkableRepository ¶
type DataStore ¶
type DataStore interface {
Library(ctx context.Context) LibraryRepository
Folder(ctx context.Context) FolderRepository
Album(ctx context.Context) AlbumRepository
Artist(ctx context.Context) ArtistRepository
MediaFile(ctx context.Context) MediaFileRepository
Genre(ctx context.Context) GenreRepository
Tag(ctx context.Context) TagRepository
Playlist(ctx context.Context) PlaylistRepository
PlayQueue(ctx context.Context) PlayQueueRepository
Transcoding(ctx context.Context) TranscodingRepository
Player(ctx context.Context) PlayerRepository
Radio(ctx context.Context) RadioRepository
Property(ctx context.Context) PropertyRepository
User(ctx context.Context) UserRepository
UserProps(ctx context.Context) UserPropsRepository
ScrobbleBuffer(ctx context.Context) ScrobbleBufferRepository
Scrobble(ctx context.Context) ScrobbleRepository
Plugin(ctx context.Context) PluginRepository
Resource(ctx context.Context, model any) ResourceRepository
WithTx(block func(tx DataStore) error, scope ...string) error
WithTxImmediate(block func(tx DataStore) error, scope ...string) error
GC(ctx context.Context, libraryIDs ...int) error
}
type Folder ¶ added in v0.55.0
type Folder struct {
ID string `structs:"id"`
LibraryID int `structs:"library_id"`
LibraryPath string `structs:"-" json:"-" hash:"ignore"`
Path string `structs:"path"`
Name string `structs:"name"`
ParentID string `structs:"parent_id"`
NumAudioFiles int `structs:"num_audio_files"`
NumPlaylists int `structs:"num_playlists"`
ImageFiles []string `structs:"image_files"`
ImagesUpdatedAt time.Time `structs:"images_updated_at"`
Hash string `structs:"hash"`
Missing bool `structs:"missing"`
UpdateAt time.Time `structs:"updated_at"`
CreatedAt time.Time `structs:"created_at"`
}
Folder represents a folder in the library. Its path is relative to the library root. ALWAYS use NewFolder to create a new instance.
func (Folder) AbsolutePath ¶ added in v0.55.0
type FolderRepository ¶ added in v0.55.0
type FolderRepository interface {
Get(id string) (*Folder, error)
GetByPath(lib Library, path string) (*Folder, error)
GetAll(...QueryOptions) ([]Folder, error)
CountAll(...QueryOptions) (int64, error)
GetFolderUpdateInfo(lib Library, targetPaths ...string) (map[string]FolderUpdateInfo, error)
Put(*Folder) error
MarkMissing(missing bool, ids ...string) error
GetTouchedWithPlaylists() (FolderCursor, error)
}
type FolderUpdateInfo ¶ added in v0.57.0
type GenreRepository ¶
type GenreRepository interface {
GetAll(...QueryOptions) (Genres, error)
}
type Library ¶ added in v0.53.0
type Library struct {
ID int `json:"id" db:"id"`
Name string `json:"name" db:"name"`
Path string `json:"path" db:"path"`
RemotePath string `json:"remotePath" db:"remote_path"`
LastScanAt time.Time `json:"lastScanAt" db:"last_scan_at"`
LastScanStartedAt time.Time `json:"lastScanStartedAt" db:"last_scan_started_at"`
FullScanInProgress bool `json:"fullScanInProgress" db:"full_scan_in_progress"`
UpdatedAt time.Time `json:"updatedAt" db:"updated_at"`
CreatedAt time.Time `json:"createdAt" db:"created_at"`
TotalSongs int `json:"totalSongs" db:"total_songs"`
TotalAlbums int `json:"totalAlbums" db:"total_albums"`
TotalArtists int `json:"totalArtists" db:"total_artists"`
TotalFolders int `json:"totalFolders" db:"total_folders"`
TotalFiles int `json:"totalFiles" db:"total_files"`
TotalMissingFiles int `json:"totalMissingFiles" db:"total_missing_files"`
TotalSize int64 `json:"totalSize" db:"total_size"`
TotalDuration float64 `json:"totalDuration" db:"total_duration"`
DefaultNewUsers bool `json:"defaultNewUsers" db:"default_new_users"`
}
type LibraryRepository ¶ added in v0.53.0
type LibraryRepository interface {
Get(id int) (*Library, error)
// GetPath returns the path of the library with the given ID.
// Its implementation must be optimized to avoid unnecessary queries.
GetPath(id int) (string, error)
GetAll(...QueryOptions) (Libraries, error)
CountAll(...QueryOptions) (int64, error)
Put(*Library) error
Delete(id int) error
StoreMusicFolder() error
AddArtist(id int, artistID string) error
// User-library association methods
GetUsersWithLibraryAccess(libraryID int) (Users, error)
// TODO These methods should be moved to a core service
ScanBegin(id int, fullScan bool) error
ScanEnd(id int) error
ScanInProgress() (bool, error)
RefreshStats(id int) error
}
type Lyrics ¶ added in v0.51.0
type Lyrics struct {
DisplayArtist string `structs:"displayArtist,omitempty" json:"displayArtist,omitempty"`
DisplayTitle string `structs:"displayTitle,omitempty" json:"displayTitle,omitempty"`
Lang string `structs:"lang" json:"lang"`
Line []Line `structs:"line" json:"line"`
Offset *int64 `structs:"offset,omitempty" json:"offset,omitempty"`
Synced bool `structs:"synced" json:"synced"`
}
type MediaFile ¶
type MediaFile struct {
Annotations `structs:"-" hash:"ignore"`
Bookmarkable `structs:"-" hash:"ignore"`
ID string `structs:"id" json:"id" hash:"ignore"`
PID string `structs:"pid" json:"-" hash:"ignore"`
LibraryID int `structs:"library_id" json:"libraryId" hash:"ignore"`
LibraryPath string `structs:"-" json:"libraryPath" hash:"ignore"`
LibraryName string `structs:"-" json:"libraryName" hash:"ignore"`
FolderID string `structs:"folder_id" json:"folderId" hash:"ignore"`
Path string `structs:"path" json:"path" hash:"ignore"`
Title string `structs:"title" json:"title"`
Album string `structs:"album" json:"album"`
ArtistID string `structs:"artist_id" json:"artistId"` // Deprecated: Use Participants instead
// Artist is the display name used for the artist.
Artist string `structs:"artist" json:"artist"`
AlbumArtistID string `structs:"album_artist_id" json:"albumArtistId"` // Deprecated: Use Participants instead
// AlbumArtist is the display name used for the album artist.
AlbumArtist string `structs:"album_artist" json:"albumArtist"`
AlbumID string `structs:"album_id" json:"albumId" hash:"ignore"`
HasCoverArt bool `structs:"has_cover_art" json:"hasCoverArt"`
TrackNumber int `structs:"track_number" json:"trackNumber"`
DiscNumber int `structs:"disc_number" json:"discNumber"`
DiscSubtitle string `structs:"disc_subtitle" json:"discSubtitle,omitempty"`
Year int `structs:"year" json:"year"`
Date string `structs:"date" json:"date,omitempty"`
OriginalYear int `structs:"original_year" json:"originalYear"`
OriginalDate string `structs:"original_date" json:"originalDate,omitempty"`
ReleaseYear int `structs:"release_year" json:"releaseYear"`
ReleaseDate string `structs:"release_date" json:"releaseDate,omitempty"`
Size int64 `structs:"size" json:"size"`
Suffix string `structs:"suffix" json:"suffix"`
Duration float32 `structs:"duration" json:"duration"`
BitRate int `structs:"bit_rate" json:"bitRate"`
SampleRate int `structs:"sample_rate" json:"sampleRate"`
BitDepth int `structs:"bit_depth" json:"bitDepth"`
Channels int `structs:"channels" json:"channels"`
Codec string `structs:"codec" json:"codec"`
ProbeData string `structs:"probe_data" json:"-" hash:"ignore"`
Genre string `structs:"genre" json:"genre"`
Genres Genres `structs:"-" json:"genres,omitempty"`
SortTitle string `structs:"sort_title" json:"sortTitle,omitempty"`
SortAlbumName string `structs:"sort_album_name" json:"sortAlbumName,omitempty"`
SortArtistName string `structs:"sort_artist_name" json:"sortArtistName,omitempty"` // Deprecated: Use Participants instead
SortAlbumArtistName string `structs:"sort_album_artist_name" json:"sortAlbumArtistName,omitempty"` // Deprecated: Use Participants instead
OrderTitle string `structs:"order_title" json:"orderTitle,omitempty"`
OrderAlbumName string `structs:"order_album_name" json:"orderAlbumName"`
OrderArtistName string `structs:"order_artist_name" json:"orderArtistName"` // Deprecated: Use Participants instead
OrderAlbumArtistName string `structs:"order_album_artist_name" json:"orderAlbumArtistName"` // Deprecated: Use Participants instead
Compilation bool `structs:"compilation" json:"compilation"`
Comment string `structs:"comment" json:"comment,omitempty"`
Lyrics string `structs:"lyrics" json:"lyrics"`
BPM int `structs:"bpm" json:"bpm,omitempty"`
ExplicitStatus string `structs:"explicit_status" json:"explicitStatus"`
CatalogNum string `structs:"catalog_num" json:"catalogNum,omitempty"`
MbzRecordingID string `structs:"mbz_recording_id" json:"mbzRecordingID,omitempty"`
MbzReleaseTrackID string `structs:"mbz_release_track_id" json:"mbzReleaseTrackId,omitempty"`
MbzAlbumID string `structs:"mbz_album_id" json:"mbzAlbumId,omitempty"`
MbzReleaseGroupID string `structs:"mbz_release_group_id" json:"mbzReleaseGroupId,omitempty"`
MbzArtistID string `structs:"mbz_artist_id" json:"mbzArtistId,omitempty"` // Deprecated: Use Participants instead
MbzAlbumArtistID string `structs:"mbz_album_artist_id" json:"mbzAlbumArtistId,omitempty"` // Deprecated: Use Participants instead
MbzAlbumType string `structs:"mbz_album_type" json:"mbzAlbumType,omitempty"`
MbzAlbumComment string `structs:"mbz_album_comment" json:"mbzAlbumComment,omitempty"`
RGAlbumGain *float64 `structs:"rg_album_gain" json:"rgAlbumGain"`
RGAlbumPeak *float64 `structs:"rg_album_peak" json:"rgAlbumPeak"`
RGTrackGain *float64 `structs:"rg_track_gain" json:"rgTrackGain"`
RGTrackPeak *float64 `structs:"rg_track_peak" json:"rgTrackPeak"`
Tags Tags `structs:"tags" json:"tags,omitempty" hash:"ignore"` // All imported tags from the original file
Participants Participants `structs:"participants" json:"participants" hash:"ignore"` // All artists that participated in this track
Missing bool `structs:"missing" json:"missing" hash:"ignore"` // If the file is not found in the library's FS
BirthTime time.Time `structs:"birth_time" json:"birthTime" hash:"ignore"` // Time of file creation (ctime)
CreatedAt time.Time `structs:"created_at" json:"createdAt" hash:"ignore"` // Time this entry was created in the DB
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt" hash:"ignore"` // Time of file last update (mtime)
}
func (MediaFile) AbsolutePath ¶ added in v0.55.0
func (MediaFile) AlbumCoverArtID ¶ added in v0.49.0
func (MediaFile) AudioCodec ¶ added in v0.61.0
AudioCodec returns the audio codec for this file. Uses the stored Codec field if available, otherwise infers from Suffix and audio properties.
func (MediaFile) ContentType ¶
func (MediaFile) CoverArtID ¶ added in v0.49.0
func (MediaFile) DiscCoverArtID ¶ added in v0.61.0
DiscCoverArtID returns the disc artwork ID when the media file has a disc number, otherwise it returns the album artwork ID.
func (MediaFile) Equals ¶ added in v0.55.0
Equals compares two MediaFiles by their hash. It does not consider the ID, PID, Path and other identifier fields. Check the structure for the fields that are marked with `hash:"ignore"`.
func (MediaFile) FullAlbumName ¶ added in v0.61.0
func (MediaFile) Hash ¶ added in v0.55.0
Hash returns a hash of the MediaFile based on its tags and audio properties
func (MediaFile) IsEquivalent ¶ added in v0.55.0
IsEquivalent compares two MediaFiles by path only. Used for matching missing tracks.
func (MediaFile) StructuredLyrics ¶ added in v0.51.0
type MediaFileRepository ¶
type MediaFileRepository interface {
CountAll(options ...QueryOptions) (int64, error)
CountBySuffix(options ...QueryOptions) (map[string]int64, error)
Exists(id string) (bool, error)
Put(m *MediaFile) error
UpdateProbeData(id string, data string) error
Get(id string) (*MediaFile, error)
GetWithParticipants(id string) (*MediaFile, error)
GetAll(options ...QueryOptions) (MediaFiles, error)
GetAllByTags(tag TagName, values []string, options ...QueryOptions) (MediaFiles, error)
GetCursor(options ...QueryOptions) (MediaFileCursor, error)
Delete(id string) error
DeleteMissing(ids []string) error
DeleteAllMissing() (int64, error)
FindByPaths(paths []string) (MediaFiles, error)
// The following methods are used exclusively by the scanner:
MarkMissing(bool, ...*MediaFile) error
MarkMissingByFolder(missing bool, folderIDs ...string) error
GetMissingAndMatching(libId int) (MediaFileCursor, error)
FindRecentFilesByMBZTrackID(missing MediaFile, since time.Time) (MediaFiles, error)
FindRecentFilesByProperties(missing MediaFile, since time.Time) (MediaFiles, error)
AnnotatedRepository
BookmarkableRepository
SearchableRepository[MediaFiles]
}
type MediaFiles ¶
type MediaFiles []MediaFile
func (MediaFiles) ToAlbum ¶ added in v0.49.0
func (mfs MediaFiles) ToAlbum() Album
ToAlbum creates an Album object based on the attributes of this MediaFiles collection. It assumes all mediafiles have the same Album (same ID), or else results are unpredictable.
func (MediaFiles) ToM3U8 ¶ added in v0.56.0
func (mfs MediaFiles) ToM3U8(title string, absolutePaths bool) string
ToM3U8 exports the playlist to the Extended M3U8 format, as specified in https://docs.fileformat.com/audio/m3u/#extended-m3u
type Participant ¶ added in v0.55.0
type ParticipantList ¶ added in v0.55.0
type ParticipantList []Participant
func (ParticipantList) Join ¶ added in v0.55.0
func (p ParticipantList) Join(sep string) string
type Participants ¶ added in v0.55.0
type Participants map[Role]ParticipantList
func (Participants) Add ¶ added in v0.55.0
func (p Participants) Add(role Role, artists ...Artist)
Add adds the artists to the role, ignoring duplicates.
func (Participants) AddWithSubRole ¶ added in v0.55.0
func (p Participants) AddWithSubRole(role Role, subRole string, artists ...Artist)
AddWithSubRole adds the artists to the role, ignoring duplicates.
func (Participants) AllArtists ¶ added in v0.55.0
func (p Participants) AllArtists() []Artist
AllArtists returns all artists found in the Participants.
func (Participants) AllIDs ¶ added in v0.55.0
func (p Participants) AllIDs() []string
AllIDs returns all artist IDs found in the Participants.
func (Participants) AllNames ¶ added in v0.55.0
func (p Participants) AllNames() []string
AllNames returns all artist names found in the Participants, including SortArtistNames.
func (Participants) First ¶ added in v0.55.0
func (p Participants) First(role Role) Artist
First returns the first artist for the role, or an empty artist if the role is not present.
func (Participants) Hash ¶ added in v0.55.0
func (p Participants) Hash() []byte
func (Participants) Merge ¶ added in v0.55.0
func (p Participants) Merge(other Participants)
Merge merges the other Participants into this one.
func (Participants) Sort ¶ added in v0.55.0
func (p Participants) Sort()
type PlayQueue ¶
type PlayQueue struct {
ID string `structs:"id" json:"id"`
UserID string `structs:"user_id" json:"userId"`
Current int `structs:"current" json:"current"`
Position int64 `structs:"position" json:"position"`
ChangedBy string `structs:"changed_by" json:"changedBy"`
Items MediaFiles `structs:"-" json:"items,omitempty"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
}
type PlayQueueRepository ¶
type PlayQueueRepository interface {
Store(queue *PlayQueue, colNames ...string) error
// Retrieve returns the playqueue without loading the full MediaFiles
// (Items only contain IDs)
Retrieve(userId string) (*PlayQueue, error)
// RetrieveWithMediaFiles returns the playqueue with full MediaFiles loaded
RetrieveWithMediaFiles(userId string) (*PlayQueue, error)
Clear(userId string) error
}
type PlayQueues ¶
type PlayQueues []PlayQueue
type Player ¶
type Player struct {
Username string `structs:"-" json:"userName"`
ID string `structs:"id" json:"id"`
Name string `structs:"name" json:"name"`
UserAgent string `structs:"user_agent" json:"userAgent"`
UserId string `structs:"user_id" json:"userId"`
Client string `structs:"client" json:"client"`
IP string `structs:"ip" json:"ip"`
LastSeen time.Time `structs:"last_seen" json:"lastSeen"`
TranscodingId string `structs:"transcoding_id" json:"transcodingId"`
MaxBitRate int `structs:"max_bit_rate" json:"maxBitRate"`
ReportRealPath bool `structs:"report_real_path" json:"reportRealPath"`
ScrobbleEnabled bool `structs:"scrobble_enabled" json:"scrobbleEnabled"`
}
type PlayerRepository ¶
type Playlist ¶
type Playlist struct {
ID string `structs:"id" json:"id"`
Name string `structs:"name" json:"name"`
Comment string `structs:"comment" json:"comment"`
Duration float32 `structs:"duration" json:"duration"`
Size int64 `structs:"size" json:"size"`
SongCount int `structs:"song_count" json:"songCount"`
OwnerName string `structs:"-" json:"ownerName"`
OwnerID string `structs:"owner_id" json:"ownerId"`
Public bool `structs:"public" json:"public"`
Tracks PlaylistTracks `structs:"-" json:"tracks,omitempty"`
Path string `structs:"path" json:"path"`
Sync bool `structs:"sync" json:"sync"`
UploadedImage string `structs:"uploaded_image" json:"uploadedImage"`
ExternalImageURL string `structs:"external_image_url" json:"externalImageUrl,omitempty"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
// SmartPlaylist attributes
Rules *criteria.Criteria `structs:"rules" json:"rules"`
EvaluatedAt *time.Time `structs:"evaluated_at" json:"evaluatedAt"`
}
func (*Playlist) AddMediaFiles ¶ added in v0.47.0
func (pls *Playlist) AddMediaFiles(mfs MediaFiles)
func (*Playlist) AddMediaFilesByID ¶ added in v0.58.0
func (Playlist) CoverArtID ¶ added in v0.49.0
func (Playlist) IsSmartPlaylist ¶ added in v0.47.0
func (Playlist) MediaFiles ¶ added in v0.47.0
func (pls Playlist) MediaFiles() MediaFiles
func (*Playlist) RemoveTracks ¶ added in v0.47.0
func (*Playlist) SetTracks ¶ added in v0.58.0
func (pls *Playlist) SetTracks(tracks PlaylistTracks)
func (Playlist) UploadedImagePath ¶ added in v0.61.0
UploadedImagePath returns the absolute filesystem path for a manually uploaded playlist cover image. Returns empty string if no image has been uploaded. This does NOT cover sidecar images or external URLs — those are resolved by the artwork reader's fallback chain.
type PlaylistRepository ¶
type PlaylistRepository interface {
ResourceRepository
CountAll(options ...QueryOptions) (int64, error)
Exists(id string) (bool, error)
Put(pls *Playlist) error
Get(id string) (*Playlist, error)
GetWithTracks(id string, refreshSmartPlaylist, includeMissing bool) (*Playlist, error)
GetAll(options ...QueryOptions) (Playlists, error)
FindByPath(path string) (*Playlist, error)
Delete(id string) error
Tracks(playlistId string, refreshSmartPlaylist bool) PlaylistTrackRepository
GetPlaylists(mediaFileId string) (Playlists, error)
}
type PlaylistTrack ¶
type PlaylistTrackRepository ¶
type PlaylistTrackRepository interface {
ResourceRepository
GetAll(options ...QueryOptions) (PlaylistTracks, error)
GetAlbumIDs(options ...QueryOptions) ([]string, error)
Add(mediaFileIds []string) (int, error)
AddAlbums(albumIds []string) (int, error)
AddArtists(artistIds []string) (int, error)
AddDiscs(discs []DiscID) (int, error)
Delete(id ...string) error
DeleteAll() error
Reorder(pos int, newPos int) error
}
type PlaylistTracks ¶
type PlaylistTracks []PlaylistTrack
func (PlaylistTracks) MediaFiles ¶ added in v0.47.0
func (plt PlaylistTracks) MediaFiles() MediaFiles
type Plugin ¶ added in v0.60.0
type Plugin struct {
ID string `structs:"id" json:"id"`
Path string `structs:"path" json:"path"`
Manifest string `structs:"manifest" json:"manifest"`
Config string `structs:"config" json:"config,omitempty"`
Users string `structs:"users" json:"users,omitempty"`
AllUsers bool `structs:"all_users" json:"allUsers,omitempty"`
Libraries string `structs:"libraries" json:"libraries,omitempty"`
AllLibraries bool `structs:"all_libraries" json:"allLibraries,omitempty"`
AllowWriteAccess bool `structs:"allow_write_access" json:"allowWriteAccess,omitempty"`
Enabled bool `structs:"enabled" json:"enabled"`
LastError string `structs:"last_error" json:"lastError,omitempty"`
SHA256 string `structs:"sha256" json:"sha256"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
}
type PluginRepository ¶ added in v0.60.0
type PluginRepository interface {
ResourceRepository
ClearErrors() error
CountAll(options ...QueryOptions) (int64, error)
Delete(id string) error
Get(id string) (*Plugin, error)
GetAll(options ...QueryOptions) (Plugins, error)
Put(p *Plugin) error
}
type PropertyRepository ¶
type QueryOptions ¶
type Radio ¶ added in v0.49.0
type Radio struct {
ID string `structs:"id" json:"id"`
StreamUrl string `structs:"stream_url" json:"streamUrl"`
Name string `structs:"name" json:"name"`
HomePageUrl string `structs:"home_page_url" json:"homePageUrl"`
UploadedImage string `structs:"uploaded_image" json:"uploadedImage,omitempty"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
}
func (Radio) CoverArtID ¶ added in v0.61.0
func (Radio) UploadedImagePath ¶ added in v0.61.0
type RadioRepository ¶ added in v0.49.0
type RadioRepository interface {
ResourceRepository
CountAll(options ...QueryOptions) (int64, error)
Delete(id string) error
Get(id string) (*Radio, error)
GetAll(options ...QueryOptions) (Radios, error)
Put(u *Radio, colsToUpdate ...string) error
}
type ResourceRepository ¶
type ResourceRepository interface {
rest.Repository
}
type Role ¶ added in v0.55.0
type Role struct {
// contains filtered or unexported fields
}
Role represents the role of an artist in a track or album.
func RoleFromString ¶ added in v0.55.0
func (Role) MarshalText ¶ added in v0.55.0
func (*Role) UnmarshalText ¶ added in v0.55.0
type ScanTarget ¶ added in v0.59.0
type ScanTarget struct {
LibraryID int
FolderPath string // Relative path within the library, or "" for entire library
}
ScanTarget represents a specific folder within a library to be scanned. NOTE: This struct is used as a map key, so it should only contain comparable types.
func ParseTargets ¶ added in v0.59.0
func ParseTargets(libFolders []string) ([]ScanTarget, error)
ParseTargets parses scan targets strings into ScanTarget structs. Example: []string{"1:Music/Rock", "2:Classical"}
func (ScanTarget) String ¶ added in v0.59.0
func (st ScanTarget) String() string
type Scanner ¶ added in v0.59.0
type Scanner interface {
// ScanAll starts a scan of all libraries. This is a blocking operation.
ScanAll(ctx context.Context, fullScan bool) (warnings []string, err error)
// ScanFolders scans specific library/folder pairs, recursing into subdirectories.
// If targets is nil, it scans all libraries. This is a blocking operation.
ScanFolders(ctx context.Context, fullScan bool, targets []ScanTarget) (warnings []string, err error)
Status(context.Context) (*ScannerStatus, error)
}
type ScannerStatus ¶ added in v0.59.0
type ScannerStatus struct {
Scanning bool
LastScan time.Time
Count uint32
FolderCount uint32
LastError string
ScanType string
ElapsedTime time.Duration
}
ScannerStatus holds information about the current scan status
type ScrobbleBufferRepository ¶ added in v0.45.0
type ScrobbleEntries ¶ added in v0.45.0
type ScrobbleEntries []ScrobbleEntry
type ScrobbleEntry ¶ added in v0.45.0
type ScrobbleRepository ¶ added in v0.59.0
type SearchableRepository ¶ added in v0.55.0
type SearchableRepository[T any] interface { Search(q string, options ...QueryOptions) (T, error) }
type ShareRepository ¶ added in v0.44.0
type ShareRepository interface {
}
type Tag ¶ added in v0.55.0
type TagConf ¶ added in v0.55.0
type TagConf struct {
Aliases []string `yaml:"aliases"`
Type TagType `yaml:"type"`
MaxLength int `yaml:"maxLength"`
Split []string `yaml:"split"`
Album bool `yaml:"album"`
SplitRx *regexp.Regexp `yaml:"-"`
}
func TagArtistsConf ¶ added in v0.55.0
func TagArtistsConf() TagConf
func TagRolesConf ¶ added in v0.55.0
func TagRolesConf() TagConf
func (TagConf) SplitTagValue ¶ added in v0.55.0
SplitTagValue splits a tag value by the split separators, but only if it has a single value.
type TagList ¶ added in v0.55.0
type TagList []Tag
func (TagList) GroupByFrequency ¶ added in v0.55.0
type TagName ¶ added in v0.55.0
type TagName string
const ( TagAlbum TagName = "album" TagTitle TagName = "title" TagTrackNumber TagName = "track" TagDiscNumber TagName = "disc" TagTotalTracks TagName = "tracktotal" TagTotalDiscs TagName = "disctotal" TagDiscSubtitle TagName = "discsubtitle" TagSubtitle TagName = "subtitle" TagGenre TagName = "genre" TagMood TagName = "mood" TagComment TagName = "comment" TagAlbumSort TagName = "albumsort" TagAlbumVersion TagName = "albumversion" TagTitleSort TagName = "titlesort" TagCompilation TagName = "compilation" TagGrouping TagName = "grouping" TagLyrics TagName = "lyrics" TagRecordLabel TagName = "recordlabel" TagReleaseType TagName = "releasetype" TagReleaseCountry TagName = "releasecountry" TagMedia TagName = "media" TagCatalogNumber TagName = "catalognumber" TagISRC TagName = "isrc" TagBPM TagName = "bpm" TagExplicitStatus TagName = "explicitstatus" TagOriginalDate TagName = "originaldate" TagReleaseDate TagName = "releasedate" TagRecordingDate TagName = "recordingdate" TagAlbumArtist TagName = "albumartist" TagAlbumArtists TagName = "albumartists" TagAlbumArtistSort TagName = "albumartistsort" TagAlbumArtistsSort TagName = "albumartistssort" TagTrackArtist TagName = "artist" TagTrackArtists TagName = "artists" TagTrackArtistSort TagName = "artistsort" TagTrackArtistsSort TagName = "artistssort" TagComposer TagName = "composer" TagComposerSort TagName = "composersort" TagLyricist TagName = "lyricist" TagLyricistSort TagName = "lyricistsort" TagDirector TagName = "director" TagProducer TagName = "producer" TagEngineer TagName = "engineer" TagMixer TagName = "mixer" TagRemixer TagName = "remixer" TagDJMixer TagName = "djmixer" TagConductor TagName = "conductor" TagArranger TagName = "arranger" TagPerformer TagName = "performer" TagReplayGainAlbumGain TagName = "replaygain_album_gain" TagReplayGainAlbumPeak TagName = "replaygain_album_peak" TagReplayGainTrackGain TagName = "replaygain_track_gain" TagReplayGainTrackPeak TagName = "replaygain_track_peak" TagR128AlbumGain TagName = "r128_album_gain" TagR128TrackGain TagName = "r128_track_gain" TagMusicBrainzArtistID TagName = "musicbrainz_artistid" TagMusicBrainzRecordingID TagName = "musicbrainz_recordingid" TagMusicBrainzTrackID TagName = "musicbrainz_trackid" TagMusicBrainzAlbumArtistID TagName = "musicbrainz_albumartistid" TagMusicBrainzAlbumID TagName = "musicbrainz_albumid" TagMusicBrainzReleaseGroupID TagName = "musicbrainz_releasegroupid" TagMusicBrainzComposerID TagName = "musicbrainz_composerid" TagMusicBrainzLyricistID TagName = "musicbrainz_lyricistid" TagMusicBrainzDirectorID TagName = "musicbrainz_directorid" TagMusicBrainzProducerID TagName = "musicbrainz_producerid" TagMusicBrainzEngineerID TagName = "musicbrainz_engineerid" TagMusicBrainzMixerID TagName = "musicbrainz_mixerid" TagMusicBrainzRemixerID TagName = "musicbrainz_remixerid" TagMusicBrainzDJMixerID TagName = "musicbrainz_djmixerid" TagMusicBrainzConductorID TagName = "musicbrainz_conductorid" TagMusicBrainzArrangerID TagName = "musicbrainz_arrangerid" TagMusicBrainzPerformerID TagName = "musicbrainz_performerid" )
Tag names, as defined in the mappings.yaml file
type TagRepository ¶ added in v0.55.0
type Tags ¶ added in v0.55.0
func (Tags) FlattenAll ¶ added in v0.55.0
type Transcoding ¶
type TranscodingRepository ¶
type TranscodingRepository interface {
Get(id string) (*Transcoding, error)
CountAll(...QueryOptions) (int64, error)
Put(*Transcoding) error
FindByFormat(format string) (*Transcoding, error)
}
type Transcodings ¶
type Transcodings []Transcoding
type User ¶
type User struct {
ID string `structs:"id" json:"id"`
UserName string `structs:"user_name" json:"userName"`
Name string `structs:"name" json:"name"`
Email string `structs:"email" json:"email"`
IsAdmin bool `structs:"is_admin" json:"isAdmin"`
LastLoginAt *time.Time `structs:"last_login_at" json:"lastLoginAt"`
LastAccessAt *time.Time `structs:"last_access_at" json:"lastAccessAt"`
CreatedAt time.Time `structs:"created_at" json:"createdAt"`
UpdatedAt time.Time `structs:"updated_at" json:"updatedAt"`
// Library associations (many-to-many relationship)
Libraries Libraries `structs:"-" json:"libraries,omitempty"`
// This is only available on the backend, and it is never sent over the wire
Password string `structs:"-" json:"-"`
// This is used to set or change a password when calling Put. If it is empty, the password is not changed.
// It is received from the UI with the name "password"
NewPassword string `structs:"password,omitempty" json:"password,omitempty"` //nolint:gosec
// If changing the password, this is also required
CurrentPassword string `structs:"current_password,omitempty" json:"currentPassword,omitempty"`
}
func (User) HasLibraryAccess ¶ added in v0.58.0
type UserPropsRepository ¶ added in v0.44.0
type UserRepository ¶
type UserRepository interface {
ResourceRepository
CountAll(...QueryOptions) (int64, error)
Delete(id string) error
Get(id string) (*User, error)
GetAll(options ...QueryOptions) (Users, error)
Put(*User) error
UpdateLastLoginAt(id string) error
UpdateLastAccessAt(id string) error
FindFirstAdmin() (*User, error)
// FindByUsername must be case-insensitive
FindByUsername(username string) (*User, error)
// FindByUsernameWithPassword is the same as above, but also returns the decrypted password
FindByUsernameWithPassword(username string) (*User, error)
// Library association methods
GetUserLibraries(userID string) (Libraries, error)
SetUserLibraries(userID string, libraryIDs []int) error
}
Source Files
¶
- album.go
- annotation.go
- artist.go
- artist_info.go
- artwork_id.go
- bookmark.go
- datastore.go
- errors.go
- file_types.go
- folder.go
- genre.go
- get_entity.go
- image.go
- library.go
- lyrics.go
- mediafile.go
- participants.go
- player.go
- playlist.go
- playqueue.go
- plugin.go
- properties.go
- radio.go
- scanner.go
- scrobble.go
- scrobble_buffer.go
- searchable.go
- share.go
- tag.go
- tag_mappings.go
- transcoding.go
- user.go
- user_props.go