feat(subsonic): add getNewestPodcasts
This commit is contained in:
@@ -371,6 +371,10 @@ func (pe *PodcastEpisode) SID() *specid.ID {
|
|||||||
return &specid.ID{Type: specid.PodcastEpisode, Value: pe.ID}
|
return &specid.ID{Type: specid.PodcastEpisode, Value: pe.ID}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pe *PodcastEpisode) PodcastSID() *specid.ID {
|
||||||
|
return &specid.ID{Type: specid.Podcast, Value: pe.PodcastID}
|
||||||
|
}
|
||||||
|
|
||||||
func (pe *PodcastEpisode) AudioFilename() string {
|
func (pe *PodcastEpisode) AudioFilename() string {
|
||||||
return pe.Filename
|
return pe.Filename
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,19 @@ func (p *Podcasts) GetPodcastEpisodes(podcastID int) ([]*db.PodcastEpisode, erro
|
|||||||
return episodes, nil
|
return episodes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Podcasts) GetNewestPodcastEpisodes(count int) ([]*db.PodcastEpisode, error) {
|
||||||
|
episodes := []*db.PodcastEpisode{}
|
||||||
|
err := p.db.
|
||||||
|
Order("publish_date DESC").
|
||||||
|
Limit(count).
|
||||||
|
Find(&episodes).
|
||||||
|
Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("find newest podcast episodes: %w", err)
|
||||||
|
}
|
||||||
|
return episodes, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Podcasts) AddNewPodcast(rssURL string, feed *gofeed.Feed,
|
func (p *Podcasts) AddNewPodcast(rssURL string, feed *gofeed.Feed,
|
||||||
userID int) (*db.Podcast, error) {
|
userID int) (*db.Podcast, error) {
|
||||||
podcast := db.Podcast{
|
podcast := db.Podcast{
|
||||||
|
|||||||
@@ -29,6 +29,21 @@ func (c *Controller) ServeGetPodcasts(r *http.Request) *spec.Response {
|
|||||||
return sub
|
return sub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Controller) ServeGetNewestPodcasts(r *http.Request) *spec.Response {
|
||||||
|
params := r.Context().Value(CtxParams).(params.Params)
|
||||||
|
count := params.GetOrInt("count", 10)
|
||||||
|
episodes, err := c.Podcasts.GetNewestPodcastEpisodes(count)
|
||||||
|
if err != nil {
|
||||||
|
return spec.NewError(10, "failed get podcast(s): %s", err)
|
||||||
|
}
|
||||||
|
sub := spec.NewResponse()
|
||||||
|
sub.NewestPodcasts = &spec.NewestPodcasts{}
|
||||||
|
for _, episode := range episodes {
|
||||||
|
sub.NewestPodcasts.List = append(sub.NewestPodcasts.List, spec.NewPodcastEpisode(episode))
|
||||||
|
}
|
||||||
|
return sub
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Controller) ServeDownloadPodcastEpisode(r *http.Request) *spec.Response {
|
func (c *Controller) ServeDownloadPodcastEpisode(r *http.Request) *spec.Response {
|
||||||
params := r.Context().Value(CtxParams).(params.Params)
|
params := r.Context().Value(CtxParams).(params.Params)
|
||||||
id, err := params.GetID("id")
|
id, err := params.GetID("id")
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ func NewPodcastChannel(p *db.Podcast) *PodcastChannel {
|
|||||||
Status: "skipped",
|
Status: "skipped",
|
||||||
}
|
}
|
||||||
for _, episode := range p.Episodes {
|
for _, episode := range p.Episodes {
|
||||||
specEpisode := NewPodcastEpisode(p, episode)
|
specEpisode := NewPodcastEpisode(episode)
|
||||||
ret.Episode = append(ret.Episode, specEpisode)
|
ret.Episode = append(ret.Episode, specEpisode)
|
||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPodcastEpisode(p *db.Podcast, e *db.PodcastEpisode) *PodcastEpisode {
|
func NewPodcastEpisode(e *db.PodcastEpisode) *PodcastEpisode {
|
||||||
if e == nil {
|
if e == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -27,11 +27,11 @@ func NewPodcastEpisode(p *db.Podcast, e *db.PodcastEpisode) *PodcastEpisode {
|
|||||||
ID: e.SID(),
|
ID: e.SID(),
|
||||||
StreamID: e.SID(),
|
StreamID: e.SID(),
|
||||||
ContentType: e.MIME(),
|
ContentType: e.MIME(),
|
||||||
ChannelID: p.SID(),
|
ChannelID: e.PodcastSID(),
|
||||||
Title: e.Title,
|
Title: e.Title,
|
||||||
Description: e.Description,
|
Description: e.Description,
|
||||||
Status: string(e.Status),
|
Status: string(e.Status),
|
||||||
CoverArt: p.SID(),
|
CoverArt: e.PodcastSID(),
|
||||||
PublishDate: *e.PublishDate,
|
PublishDate: *e.PublishDate,
|
||||||
Genre: "Podcast",
|
Genre: "Podcast",
|
||||||
Duration: e.Length,
|
Duration: e.Length,
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ type Response struct {
|
|||||||
JukeboxStatus *JukeboxStatus `xml:"jukeboxStatus" json:"jukeboxStatus,omitempty"`
|
JukeboxStatus *JukeboxStatus `xml:"jukeboxStatus" json:"jukeboxStatus,omitempty"`
|
||||||
JukeboxPlaylist *JukeboxPlaylist `xml:"jukeboxPlaylist" json:"jukeboxPlaylist,omitempty"`
|
JukeboxPlaylist *JukeboxPlaylist `xml:"jukeboxPlaylist" json:"jukeboxPlaylist,omitempty"`
|
||||||
Podcasts *Podcasts `xml:"podcasts" json:"podcasts,omitempty"`
|
Podcasts *Podcasts `xml:"podcasts" json:"podcasts,omitempty"`
|
||||||
|
NewestPodcasts *NewestPodcasts `xml:"newestPodcasts" json:"newestPodcasts,omitempty"`
|
||||||
Bookmarks *Bookmarks `xml:"bookmarks" json:"bookmarks,omitempty"`
|
Bookmarks *Bookmarks `xml:"bookmarks" json:"bookmarks,omitempty"`
|
||||||
Starred *Starred `xml:"starred" json:"starred,omitempty"`
|
Starred *Starred `xml:"starred" json:"starred,omitempty"`
|
||||||
StarredTwo *StarredTwo `xml:"starred2" json:"starred2,omitempty"`
|
StarredTwo *StarredTwo `xml:"starred2" json:"starred2,omitempty"`
|
||||||
@@ -294,6 +295,10 @@ type Podcasts struct {
|
|||||||
List []*PodcastChannel `xml:"channel" json:"channel"`
|
List []*PodcastChannel `xml:"channel" json:"channel"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NewestPodcasts struct {
|
||||||
|
List []*PodcastEpisode `xml:"episode" json:"episode"`
|
||||||
|
}
|
||||||
|
|
||||||
type PodcastChannel struct {
|
type PodcastChannel struct {
|
||||||
ID *specid.ID `xml:"id,attr" json:"id"`
|
ID *specid.ID `xml:"id,attr" json:"id"`
|
||||||
URL string `xml:"url,attr" json:"url"`
|
URL string `xml:"url,attr" json:"url"`
|
||||||
|
|||||||
@@ -253,6 +253,7 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) {
|
|||||||
|
|
||||||
// podcasts
|
// podcasts
|
||||||
r.Handle("/getPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPodcasts))
|
r.Handle("/getPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPodcasts))
|
||||||
|
r.Handle("/getNewestPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetNewestPodcasts))
|
||||||
r.Handle("/downloadPodcastEpisode{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDownloadPodcastEpisode))
|
r.Handle("/downloadPodcastEpisode{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDownloadPodcastEpisode))
|
||||||
r.Handle("/createPodcastChannel{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreatePodcastChannel))
|
r.Handle("/createPodcastChannel{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreatePodcastChannel))
|
||||||
r.Handle("/refreshPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeRefreshPodcasts))
|
r.Handle("/refreshPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeRefreshPodcasts))
|
||||||
|
|||||||
Reference in New Issue
Block a user