diff --git a/Readme.md b/Readme.md index cf16aa7..5dd06bd 100644 --- a/Readme.md +++ b/Readme.md @@ -14,7 +14,7 @@ -->

Podgrab

-

Current Version -2021.10.01

+

Current Version -2021.12.03

A self-hosted podcast manager to download episodes as soon as they become live diff --git a/client/player.html b/client/player.html index f0790f2..9f368bd 100644 --- a/client/player.html +++ b/client/player.html @@ -694,7 +694,7 @@ div#large-visualization{

- : + ::
diff --git a/client/settings.html b/client/settings.html index f857945..440bfd6 100644 --- a/client/settings.html +++ b/client/settings.html @@ -36,8 +36,11 @@ -
- Export OPML + +
Rss Feed @@ -132,7 +135,7 @@ - + diff --git a/controllers/pages.go b/controllers/pages.go index 7f2660d..2034e22 100644 --- a/controllers/pages.go +++ b/controllers/pages.go @@ -332,7 +332,10 @@ func Search(c *gin.Context) { } func GetOmpl(c *gin.Context) { - data, err := service.ExportOmpl() + + usePodgrabLink := c.DefaultQuery("usePodgrabLink", "false") == "true" + + data, err := service.ExportOmpl(usePodgrabLink, getBaseUrl(c)) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid request"}) return diff --git a/controllers/podcast.go b/controllers/podcast.go index e0688c3..de692e8 100644 --- a/controllers/podcast.go +++ b/controllers/podcast.go @@ -289,7 +289,7 @@ func GetPodcastItemFileById(c *gin.Context) { c.Header("Content-Description", "File Transfer") c.Header("Content-Transfer-Encoding", "binary") c.Header("Content-Disposition", "attachment; filename="+path.Base(podcast.DownloadPath)) - c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Type", GetFileContentType(podcast.DownloadPath)) c.File(podcast.DownloadPath) } else { c.Redirect(302, podcast.FileURL) @@ -300,6 +300,19 @@ func GetPodcastItemFileById(c *gin.Context) { } } +func GetFileContentType(filePath string) string { + file, err := os.Open(filePath) + if err != nil { + return "application/octet-stream" + } + defer file.Close() + buffer := make([]byte, 512) + if _, err := file.Read(buffer); err != nil { + return "application/octet-stream" + } + return http.DetectContentType(buffer) +} + func MarkPodcastItemAsUnplayed(c *gin.Context) { var searchByIdQuery SearchByIdQuery @@ -439,7 +452,7 @@ func getBaseUrl(c *gin.Context) string { return setting.BaseUrl } -func createRss(items []db.PodcastItem, title, description string, c *gin.Context) model.RssPodcastData { +func createRss(items []db.PodcastItem, title, description, image string, c *gin.Context) model.RssPodcastData { var rssItems []model.RssItem url := getBaseUrl(c) for _, item := range items { @@ -468,6 +481,12 @@ func createRss(items []db.PodcastItem, title, description string, c *gin.Context } rssItems = append(rssItems, rssItem) } + + imagePath := fmt.Sprintf("%s/webassets/blank.png", url) + if image != "" { + imagePath = image + } + return model.RssPodcastData{ Itunes: "http://www.itunes.com/dtds/podcast-1.0.dtd", Media: "http://search.yahoo.com/mrss/", @@ -482,7 +501,7 @@ func createRss(items []db.PodcastItem, title, description string, c *gin.Context Summary: description, Author: "Podgrab Aggregation", Link: fmt.Sprintf("%s/allTags", url), - Image: model.RssItemImage{Text: title, Href: fmt.Sprintf("%s/webassets/blank.png", url)}, + Image: model.RssItemImage{Text: title, URL: imagePath}, }, } } @@ -491,7 +510,7 @@ func GetRssForPodcastById(c *gin.Context) { var searchByIdQuery SearchByIdQuery if c.ShouldBindUri(&searchByIdQuery) == nil { var podcast db.Podcast - err:=db.GetPodcastById(searchByIdQuery.Id,&podcast) + err := db.GetPodcastById(searchByIdQuery.Id, &podcast) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"}) } @@ -503,7 +522,7 @@ func GetRssForPodcastById(c *gin.Context) { title := podcast.Title if err == nil { - c.XML(200, createRss(items, title, description, c)) + c.XML(200, createRss(items, title, description, podcast.Image, c)) } } else { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"}) @@ -523,7 +542,7 @@ func GetRssForTagById(c *gin.Context) { title := fmt.Sprintf(" %s | Podgrab", tag.Label) if err == nil { - c.XML(200, createRss(items, title, description, c)) + c.XML(200, createRss(items, title, description, "", c)) } } else { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"}) @@ -540,7 +559,7 @@ func GetRss(c *gin.Context) { title := "Podgrab" description := "Pograb playlist" - c.XML(200, createRss(items, title, description, c)) + c.XML(200, createRss(items, title, description, "", c)) } func DeleteTagById(c *gin.Context) { diff --git a/model/rssModels.go b/model/rssModels.go index 6afda25..298b1d4 100644 --- a/model/rssModels.go +++ b/model/rssModels.go @@ -56,6 +56,7 @@ type RssItemEnclosure struct { type RssItemImage struct { Text string `xml:",chardata"` Href string `xml:"href,attr"` + URL string `xml:"url"` } type RssItemGuid struct { diff --git a/service/podcastService.go b/service/podcastService.go index 8efa1fa..345d2a2 100644 --- a/service/podcastService.go +++ b/service/podcastService.go @@ -141,14 +141,22 @@ func AddOpml(content string) error { } -func ExportOmpl() ([]byte, error) { +func ExportOmpl(usePodgrabLink bool, baseUrl string) ([]byte, error) { + podcasts := GetAllPodcasts("") + var outlines []model.OpmlOutline for _, podcast := range *podcasts { + + xmlUrl := podcast.URL + if usePodgrabLink { + xmlUrl = fmt.Sprintf("%s/podcasts/%s/rss", baseUrl, podcast.ID) + } + toAdd := model.OpmlOutline{ AttrText: podcast.Summary, Type: "rss", - XmlUrl: podcast.URL, + XmlUrl: xmlUrl, Title: podcast.Title, } outlines = append(outlines, toAdd)
Current Version 2021.10.01 2021.12.03
Website