add support for subsonic podcast api

This commit is contained in:
Alex McGrath
2021-02-03 20:38:01 +00:00
committed by Senan Kelly
parent ce96b9f6fa
commit 9c4286b0e2
21 changed files with 2011 additions and 1000 deletions

View File

@@ -22,6 +22,7 @@ import (
"go.senan.xyz/gonic/server/assets"
"go.senan.xyz/gonic/server/ctrlbase"
"go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/podcasts"
"go.senan.xyz/gonic/version"
)
@@ -82,9 +83,10 @@ type Controller struct {
buffPool *bpool.BufferPool
templates map[string]*template.Template
sessDB *gormstore.Store
Podcasts *podcasts.Podcasts
}
func New(b *ctrlbase.Controller, sessDB *gormstore.Store) *Controller {
func New(b *ctrlbase.Controller, sessDB *gormstore.Store, podcasts *podcasts.Podcasts) *Controller {
tmplBase := template.
New("layout").
Funcs(sprig.FuncMap()).
@@ -99,6 +101,7 @@ func New(b *ctrlbase.Controller, sessDB *gormstore.Store) *Controller {
buffPool: bpool.NewBufferPool(64),
templates: pagesFromPaths(tmplBase, prefixPages),
sessDB: sessDB,
Podcasts: podcasts,
}
}
@@ -124,6 +127,9 @@ type templateData struct {
CurrentLastFMAPISecret string
DefaultListenBrainzURL string
SelectedUser *db.User
//
PodcastsEnabled bool
Podcasts []*db.Podcast
}
type Response struct {

View File

@@ -7,6 +7,7 @@ import (
"strconv"
"time"
"github.com/mmcdole/gofeed"
"go.senan.xyz/gonic/server/db"
"go.senan.xyz/gonic/server/encode"
"go.senan.xyz/gonic/server/scanner"
@@ -45,6 +46,10 @@ func (c *Controller) ServeHome(r *http.Request) *Response {
c.DB.Table("artists").Count(&data.ArtistCount)
c.DB.Table("albums").Count(&data.AlbumCount)
c.DB.Table("tracks").Count(&data.TrackCount)
data.PodcastsEnabled = c.Podcasts.PodcastBasePath != ""
if data.PodcastsEnabled {
c.DB.Find(&data.Podcasts)
}
// ** begin lastfm box
scheme := firstExisting(
"http", // fallback
@@ -415,3 +420,47 @@ func (c *Controller) ServeDeleteTranscodePrefDo(r *http.Request) *Response {
redirect: "/admin/home",
}
}
func (c *Controller) ServePodcastAddDo(r *http.Request) *Response {
user := r.Context().Value(CtxUser).(*db.User)
rssURL := r.FormValue("feed")
fp := gofeed.NewParser()
feed, err := fp.ParseURL(rssURL)
if err != nil {
return &Response{
redirect: "/admin/home",
flashW: []string{fmt.Sprintf("could not create feed: %v", err)},
}
}
_, err = c.Podcasts.AddNewPodcast(feed, user.ID)
if err != nil {
return &Response{
redirect: "/admin/home",
flashW: []string{fmt.Sprintf("could not create feed: %v", err)},
}
}
return &Response{
redirect: "/admin/home",
}
}
func (c *Controller) ServePodcastDeleteDo(r *http.Request) *Response {
user := r.Context().Value(CtxUser).(*db.User)
id, err := strconv.Atoi(r.URL.Query().Get("id"))
if err != nil {
return &Response{
err: "please provide a valid podcast id",
code: 400,
}
}
err = c.Podcasts.DeletePodcast(user.ID, id)
if err != nil {
return &Response{
err: "please provide a valid podcast id",
code: 400,
}
}
return &Response{
redirect: "/admin/home",
}
}