91 lines
3.0 KiB
Go
91 lines
3.0 KiB
Go
package ctrlsubsonic
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/mmcdole/gofeed"
|
|
|
|
"go.senan.xyz/gonic/server/ctrlsubsonic/params"
|
|
"go.senan.xyz/gonic/server/ctrlsubsonic/spec"
|
|
"go.senan.xyz/gonic/server/ctrlsubsonic/specid"
|
|
"go.senan.xyz/gonic/server/db"
|
|
)
|
|
|
|
func (c *Controller) ServeGetPodcasts(r *http.Request) *spec.Response {
|
|
params := r.Context().Value(CtxParams).(params.Params)
|
|
isIncludeEpisodes := params.GetOrBool("includeEpisodes", true)
|
|
user := r.Context().Value(CtxUser).(*db.User)
|
|
id, _ := params.GetID("id")
|
|
podcasts, err := c.Podcasts.GetPodcastOrAll(user.ID, id.Value, isIncludeEpisodes)
|
|
if err != nil {
|
|
return spec.NewError(10, "failed get podcast(s): %s", err)
|
|
}
|
|
sub := spec.NewResponse()
|
|
sub.Podcasts = &spec.Podcasts{}
|
|
for _, podcast := range podcasts {
|
|
channel := spec.NewPodcastChannel(podcast)
|
|
sub.Podcasts.List = append(sub.Podcasts.List, channel)
|
|
}
|
|
return sub
|
|
}
|
|
|
|
func (c *Controller) ServeDownloadPodcastEpisode(r *http.Request) *spec.Response {
|
|
params := r.Context().Value(CtxParams).(params.Params)
|
|
id, err := params.GetID("id")
|
|
if err != nil || id.Type != specid.PodcastEpisode {
|
|
return spec.NewError(10, "please provide a valid podcast episode id")
|
|
}
|
|
if err := c.Podcasts.DownloadEpisode(id.Value); err != nil {
|
|
return spec.NewError(10, "failed to download episode: %s", err)
|
|
}
|
|
return spec.NewResponse()
|
|
}
|
|
|
|
func (c *Controller) ServeCreatePodcastChannel(r *http.Request) *spec.Response {
|
|
user := r.Context().Value(CtxUser).(*db.User)
|
|
params := r.Context().Value(CtxParams).(params.Params)
|
|
rssURL, _ := params.Get("url")
|
|
fp := gofeed.NewParser()
|
|
feed, err := fp.ParseURL(rssURL)
|
|
if err != nil {
|
|
return spec.NewError(10, "failed to parse feed: %s", err)
|
|
}
|
|
if _, err = c.Podcasts.AddNewPodcast(rssURL, feed, user.ID); err != nil {
|
|
return spec.NewError(10, "failed to add feed: %s", err)
|
|
}
|
|
return spec.NewResponse()
|
|
}
|
|
|
|
func (c *Controller) ServeRefreshPodcasts(r *http.Request) *spec.Response {
|
|
user := r.Context().Value(CtxUser).(*db.User)
|
|
if err := c.Podcasts.RefreshPodcastsForUser(user.ID); err != nil {
|
|
return spec.NewError(10, "failed to refresh feeds: %s", err)
|
|
}
|
|
return spec.NewResponse()
|
|
}
|
|
|
|
func (c *Controller) ServeDeletePodcastChannel(r *http.Request) *spec.Response {
|
|
user := r.Context().Value(CtxUser).(*db.User)
|
|
params := r.Context().Value(CtxParams).(params.Params)
|
|
id, err := params.GetID("id")
|
|
if err != nil || id.Type != specid.Podcast {
|
|
return spec.NewError(10, "please provide a valid podcast id")
|
|
}
|
|
if err := c.Podcasts.DeletePodcast(user.ID, id.Value); err != nil {
|
|
return spec.NewError(10, "failed to delete podcast: %s", err)
|
|
}
|
|
return spec.NewResponse()
|
|
}
|
|
|
|
func (c *Controller) ServeDeletePodcastEpisode(r *http.Request) *spec.Response {
|
|
params := r.Context().Value(CtxParams).(params.Params)
|
|
id, err := params.GetID("id")
|
|
if err != nil || id.Type != specid.PodcastEpisode {
|
|
return spec.NewError(10, "please provide a valid podcast episode id")
|
|
}
|
|
if err := c.Podcasts.DeletePodcastEpisode(id.Value); err != nil {
|
|
return spec.NewError(10, "failed to delete podcast: %s", err)
|
|
}
|
|
return spec.NewResponse()
|
|
}
|