Phase 2: Subsonic REST API framework (auth, response formatting, error handling, routing) plus user permission model
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
package subsonic
|
||||
|
||||
// --- Filesystem-style browsing: getIndexes / getMusicDirectory ---
|
||||
|
||||
type Indexes struct {
|
||||
LastModified int64 `xml:"lastModified,attr" json:"lastModified"`
|
||||
IgnoredArticles string `xml:"ignoredArticles,attr" json:"ignoredArticles"`
|
||||
Shortcut []Artist `xml:"shortcut,omitempty" json:"shortcut,omitempty"`
|
||||
Index []Index `xml:"index" json:"index"`
|
||||
Child []Child `xml:"child,omitempty" json:"child,omitempty"` // top-level files not under any letter index
|
||||
}
|
||||
|
||||
type Index struct {
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
Artist []Artist `xml:"artist" json:"artist"`
|
||||
}
|
||||
|
||||
// Artist is the filesystem-style artist entry (a "directory" one level
|
||||
// below a music folder root), distinct from the ID3 ArtistID3 below.
|
||||
type Artist struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
}
|
||||
|
||||
type Directory struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Parent string `xml:"parent,attr,omitempty" json:"parent,omitempty"`
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
starred // embedded for the optional "starred" attr, see model.go helper types
|
||||
Child []Child `xml:"child" json:"child"`
|
||||
}
|
||||
|
||||
// Child represents both a directory entry and a song/video — the single
|
||||
// polymorphic element type Subsonic uses throughout getMusicDirectory,
|
||||
// search results, playlists, and album contents.
|
||||
type Child struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Parent string `xml:"parent,attr,omitempty" json:"parent,omitempty"`
|
||||
IsDir bool `xml:"isDir,attr" json:"isDir"`
|
||||
Title string `xml:"title,attr" json:"title"`
|
||||
Album string `xml:"album,attr,omitempty" json:"album,omitempty"`
|
||||
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
|
||||
Track int `xml:"track,attr,omitempty" json:"track,omitempty"`
|
||||
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
|
||||
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
|
||||
CoverArt string `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
|
||||
Size int64 `xml:"size,attr,omitempty" json:"size,omitempty"`
|
||||
ContentType string `xml:"contentType,attr,omitempty" json:"contentType,omitempty"`
|
||||
Suffix string `xml:"suffix,attr,omitempty" json:"suffix,omitempty"`
|
||||
TranscodedContentType string `xml:"transcodedContentType,attr,omitempty" json:"transcodedContentType,omitempty"`
|
||||
TranscodedSuffix string `xml:"transcodedSuffix,attr,omitempty" json:"transcodedSuffix,omitempty"`
|
||||
Duration int `xml:"duration,attr,omitempty" json:"duration,omitempty"`
|
||||
BitRate int `xml:"bitRate,attr,omitempty" json:"bitRate,omitempty"`
|
||||
Path string `xml:"path,attr,omitempty" json:"path,omitempty"`
|
||||
IsVideo bool `xml:"isVideo,attr,omitempty" json:"isVideo,omitempty"`
|
||||
UserRating int `xml:"userRating,attr,omitempty" json:"userRating,omitempty"`
|
||||
AverageRating float64 `xml:"averageRating,attr,omitempty" json:"averageRating,omitempty"`
|
||||
PlayCount int64 `xml:"playCount,attr,omitempty" json:"playCount,omitempty"`
|
||||
DiscNumber int `xml:"discNumber,attr,omitempty" json:"discNumber,omitempty"`
|
||||
Created string `xml:"created,attr,omitempty" json:"created,omitempty"`
|
||||
Starred string `xml:"starred,attr,omitempty" json:"starred,omitempty"`
|
||||
AlbumID string `xml:"albumId,attr,omitempty" json:"albumId,omitempty"`
|
||||
ArtistID string `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
|
||||
Type string `xml:"type,attr,omitempty" json:"type,omitempty"`
|
||||
BookmarkPosition int64 `xml:"bookmarkPosition,attr,omitempty" json:"bookmarkPosition,omitempty"`
|
||||
}
|
||||
|
||||
type Songs struct {
|
||||
Song []Child `xml:"song" json:"song"`
|
||||
}
|
||||
|
||||
// starred is embedded into structs that carry an optional "starred"
|
||||
// timestamp attribute (Directory, AlbumID3, ArtistID3, ...).
|
||||
type starred struct {
|
||||
Starred string `xml:"starred,attr,omitempty" json:"starred,omitempty"`
|
||||
}
|
||||
|
||||
// --- ID3/tag-style browsing: getArtists / getArtist / getAlbum / getSong ---
|
||||
|
||||
type ArtistsID3 struct {
|
||||
IgnoredArticles string `xml:"ignoredArticles,attr" json:"ignoredArticles"`
|
||||
Index []IndexID3 `xml:"index" json:"index"`
|
||||
}
|
||||
|
||||
type IndexID3 struct {
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
Artist []ArtistID3 `xml:"artist" json:"artist"`
|
||||
}
|
||||
|
||||
type ArtistID3 struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
CoverArt string `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
|
||||
AlbumCount int `xml:"albumCount,attr" json:"albumCount"`
|
||||
starred
|
||||
}
|
||||
|
||||
type ArtistWithAlbumsID3 struct {
|
||||
ArtistID3
|
||||
Album []AlbumID3 `xml:"album,omitempty" json:"album,omitempty"`
|
||||
}
|
||||
|
||||
type AlbumID3 struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Name string `xml:"name,attr" json:"name"`
|
||||
Artist string `xml:"artist,attr,omitempty" json:"artist,omitempty"`
|
||||
ArtistID string `xml:"artistId,attr,omitempty" json:"artistId,omitempty"`
|
||||
CoverArt string `xml:"coverArt,attr,omitempty" json:"coverArt,omitempty"`
|
||||
SongCount int `xml:"songCount,attr" json:"songCount"`
|
||||
Duration int `xml:"duration,attr" json:"duration"`
|
||||
PlayCount int64 `xml:"playCount,attr,omitempty" json:"playCount,omitempty"`
|
||||
Created string `xml:"created,attr" json:"created"`
|
||||
starred
|
||||
Year int `xml:"year,attr,omitempty" json:"year,omitempty"`
|
||||
Genre string `xml:"genre,attr,omitempty" json:"genre,omitempty"`
|
||||
}
|
||||
|
||||
type AlbumWithSongsID3 struct {
|
||||
AlbumID3
|
||||
Song []Child `xml:"song,omitempty" json:"song,omitempty"`
|
||||
}
|
||||
|
||||
// --- Artist/album info (last.fm-style metadata; VibeSonic has no
|
||||
// external metadata provider in Phase 2, so these return locally-known
|
||||
// data only: biography/images are empty, similar artists are omitted) ---
|
||||
|
||||
type ArtistInfoBase struct {
|
||||
Biography string `xml:"biography,omitempty" json:"biography,omitempty"`
|
||||
MusicBrainzID string `xml:"musicBrainzId,omitempty" json:"musicBrainzId,omitempty"`
|
||||
LastFmURL string `xml:"lastFmUrl,omitempty" json:"lastFmUrl,omitempty"`
|
||||
SmallImageURL string `xml:"smallImageUrl,omitempty" json:"smallImageUrl,omitempty"`
|
||||
MediumImageURL string `xml:"mediumImageUrl,omitempty" json:"mediumImageUrl,omitempty"`
|
||||
LargeImageURL string `xml:"largeImageUrl,omitempty" json:"largeImageUrl,omitempty"`
|
||||
}
|
||||
|
||||
type ArtistInfo struct {
|
||||
ArtistInfoBase
|
||||
SimilarArtist []Artist `xml:"similarArtist,omitempty" json:"similarArtist,omitempty"`
|
||||
}
|
||||
|
||||
type ArtistInfo2 struct {
|
||||
ArtistInfoBase
|
||||
SimilarArtist []ArtistID3 `xml:"similarArtist,omitempty" json:"similarArtist,omitempty"`
|
||||
}
|
||||
|
||||
type AlbumInfo struct {
|
||||
Notes string `xml:"notes,omitempty" json:"notes,omitempty"`
|
||||
MusicBrainzID string `xml:"musicBrainzId,omitempty" json:"musicBrainzId,omitempty"`
|
||||
LastFmURL string `xml:"lastFmUrl,omitempty" json:"lastFmUrl,omitempty"`
|
||||
SmallImageURL string `xml:"smallImageUrl,omitempty" json:"smallImageUrl,omitempty"`
|
||||
MediumImageURL string `xml:"mediumImageUrl,omitempty" json:"mediumImageUrl,omitempty"`
|
||||
LargeImageURL string `xml:"largeImageUrl,omitempty" json:"largeImageUrl,omitempty"`
|
||||
}
|
||||
|
||||
type SimilarSongs struct {
|
||||
Song []Child `xml:"song,omitempty" json:"song,omitempty"`
|
||||
}
|
||||
|
||||
type SimilarSongs2 struct {
|
||||
Song []Child `xml:"song,omitempty" json:"song,omitempty"`
|
||||
}
|
||||
|
||||
type TopSongs struct {
|
||||
Song []Child `xml:"song,omitempty" json:"song,omitempty"`
|
||||
}
|
||||
|
||||
// --- Video ---
|
||||
|
||||
type Videos struct {
|
||||
Video []Child `xml:"video,omitempty" json:"video,omitempty"`
|
||||
}
|
||||
|
||||
type VideoInfo struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
AudioTrack []AudioTrack `xml:"audioTrack,omitempty" json:"audioTrack,omitempty"`
|
||||
Captions []Captions `xml:"captions,omitempty" json:"captions,omitempty"`
|
||||
}
|
||||
|
||||
type AudioTrack struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Name string `xml:"name,attr,omitempty" json:"name,omitempty"`
|
||||
LanguageCode string `xml:"languageCode,attr,omitempty" json:"languageCode,omitempty"`
|
||||
}
|
||||
|
||||
type Captions struct {
|
||||
ID string `xml:"id,attr" json:"id"`
|
||||
Name string `xml:"name,attr,omitempty" json:"name,omitempty"`
|
||||
}
|
||||
Reference in New Issue
Block a user