135 lines
4.7 KiB
Go
135 lines
4.7 KiB
Go
package subsonic
|
|
|
|
import (
|
|
"encoding/json"
|
|
"encoding/xml"
|
|
"time"
|
|
)
|
|
|
|
type Episode struct {
|
|
XMLName xml.Name `xml:"episode" json:"-"`
|
|
ID int `xml:"id,attr" json:"id"`
|
|
StreamID int `xml:"streamId,attr" json:"streamId"`
|
|
ChannelID int `xml:"channelId,attr" json:"channelId"`
|
|
Title string `xml:"title,attr" json:"title"`
|
|
Description string `xml:"description,attr" json:"description"`
|
|
PublishDate time.Time `xml:"publishDate,attr" json:"publishDate"`
|
|
Status string `xml:"status,attr" json:"status"`
|
|
Parent int `xml:"parent,attr" json:"parent"`
|
|
IsDir bool `xml:"isDir,attr" json:"isDir"`
|
|
Year int `xml:"year,attr" json:"year"`
|
|
Genre string `xml:"genre,attr" json:"genre"`
|
|
CoverArt int `xml:"coverArt,attr" json:"coverArt"`
|
|
Size int `xml:"size,attr" json:"size"`
|
|
ContentType string `xml:"contentType,attr" json:"contentType"`
|
|
Suffix string `xml:"suffix,attr" json:"suffix"`
|
|
Duration int `xml:"duration,attr" json:"duration"`
|
|
Bitrate int `xml:"bitrate,attr" json:"bitrate"`
|
|
Path string `xml:"path,attr" json:"path"`
|
|
}
|
|
|
|
type Podcast struct {
|
|
XMLName xml.Name `xml:"channel" json:"-"`
|
|
ID int `xml:"id,attr" json:"id"`
|
|
URL string `xml:"url,attr" json:"url"`
|
|
Title string `xml:"title,attr" json:"title"`
|
|
Description string `xml:"description,attr" json:"description"`
|
|
CoverArt string `xml:"coverArt,attr" json:"coverArt"`
|
|
OriginalImageURL string `xml:"originalImageUrl,attr" json:"originalImageUrl"`
|
|
Status string `xml:"status,attr" json:"status"`
|
|
Episodes []Episode `xml:"episode" json:"episodes"`
|
|
ErrorMessage string `xml:"errorMessage,attr,omitempty" json:"errorMessage,omitempty"`
|
|
}
|
|
|
|
func (p Podcast) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
|
|
if p.ErrorMessage != "" {
|
|
return e.EncodeElement(struct {
|
|
ID int `xml:"id,attr,omitempty"`
|
|
URL string `xml:"url,attr,omitempty"`
|
|
Status string `xml:"status,attr,omitempty"`
|
|
ErrorMessage string `xml:"errorMessage,attr,omitempty"`
|
|
}{
|
|
ID: p.ID,
|
|
URL: p.URL,
|
|
Status: p.Status,
|
|
ErrorMessage: p.ErrorMessage,
|
|
}, start)
|
|
}
|
|
|
|
type Alias Podcast
|
|
return e.EncodeElement(Alias(p), start)
|
|
}
|
|
|
|
func (p Podcast) MarshalJSON() ([]byte, error) {
|
|
if p.ErrorMessage != "" {
|
|
return json.Marshal(struct {
|
|
ID int `xml:"id,attr,omitempty" json:"id,omitempty"`
|
|
URL string `xml:"url,attr,omitempty" json:"url,omitempty"`
|
|
Status string `xml:"status,attr,omitempty" json:"status,omitempty"`
|
|
ErrorMessage string `xml:"errorMessage,attr,omitempty" json:"errorMessage,omitempty"`
|
|
}{
|
|
ID: p.ID,
|
|
URL: p.URL,
|
|
ErrorMessage: p.ErrorMessage,
|
|
})
|
|
}
|
|
|
|
type Alias Podcast
|
|
return json.Marshal(Alias(p))
|
|
}
|
|
|
|
type PodcastsResponse struct {
|
|
Response
|
|
Podcasts []Podcast `xml:"podcasts>channel" json:"podcasts"`
|
|
}
|
|
|
|
type NewestEpisode struct {
|
|
ID int `xml:"id,attr" json:"id"`
|
|
Parent int `xml:"parent,attr" json:"parent"`
|
|
IsDir bool `xml:"isDir,attr" json:"isDir"`
|
|
Title string `xml:"title,attr" json:"title"`
|
|
Album string `xml:"album,attr" json:"album"`
|
|
Artist string `xml:"artist,attr" json:"artist"`
|
|
Year int `xml:"year,attr" json:"year"`
|
|
CoverArt int `xml:"coverArt,attr" json:"coverArt"`
|
|
Size int `xml:"size,attr" json:"size"`
|
|
ContentType string `xml:"contentType,attr" json:"contentType"`
|
|
Suffix string `xml:"suffix,attr" json:"suffix"`
|
|
Duration int `xml:"duration,attr" json:"duration"`
|
|
Bitrate int `xml:"bitrate,attr" json:"bitrate"`
|
|
IsVideo bool `xml:"isVideo,attr" json:"isVideo"`
|
|
Created time.Time `xml:"created,attr" json:"created"`
|
|
ArtistID int `xml:"artistId,attr" json:"artistId"`
|
|
Type string `xml:"type,attr" json:"type"`
|
|
StreamID int `xml:"streamId,attr" json:"streamId"`
|
|
ChannelID int `xml:"channelId,attr" json:"channelId"`
|
|
Description string `xml:"description,attr" json:"description"`
|
|
Status string `xml:"status,attr" json:"status"`
|
|
PublishDate time.Time `xml:"publishDate,attr" json:"publishDate"`
|
|
}
|
|
|
|
type NewestPodcastsResponse struct {
|
|
Response
|
|
NewestPodcasts []NewestEpisode `xml:"newestPodcasts>episode" json:"newestPodcasts"`
|
|
}
|
|
|
|
type RefreshPodcastsResponse struct {
|
|
Response
|
|
}
|
|
|
|
type CreatePodcastResponse struct {
|
|
Response
|
|
}
|
|
|
|
type DeletePodcastResponse struct {
|
|
Response
|
|
}
|
|
|
|
type DeleteEpisodeResponse struct {
|
|
Response
|
|
}
|
|
|
|
type DownloadEpisodeResponse struct {
|
|
Response
|
|
}
|