feat(subsonic): add getNewestPodcasts

This commit is contained in:
brian-doherty
2022-04-21 14:13:47 -05:00
committed by GitHub
parent dc4d9e4e96
commit f6687df3f3
6 changed files with 42 additions and 4 deletions

View File

@@ -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
} }

View File

@@ -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{

View File

@@ -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")

View File

@@ -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,

View File

@@ -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"`

View File

@@ -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))