From 912a98788e66b836125fe8ef37672a4de20c169c Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Thu, 28 Nov 2019 23:47:53 -0800 Subject: Add support of media elements for Atom feeds --- reader/rss/rss.go | 96 +++++++++++++++++-------------------------------------- 1 file changed, 30 insertions(+), 66 deletions(-) (limited to 'reader/rss/rss.go') diff --git a/reader/rss/rss.go b/reader/rss/rss.go index 3803798..fb0c5bf 100644 --- a/reader/rss/rss.go +++ b/reader/rss/rss.go @@ -15,6 +15,7 @@ import ( "miniflux.app/logger" "miniflux.app/model" "miniflux.app/reader/date" + "miniflux.app/reader/media" "miniflux.app/reader/sanitizer" "miniflux.app/url" ) @@ -65,62 +66,20 @@ func (enclosure *rssEnclosure) Size() int64 { } type rssItem struct { - GUID string `xml:"guid"` - Title string `xml:"title"` - Links []rssLink `xml:"link"` - OriginalLink string `xml:"http://rssnamespace.org/feedburner/ext/1.0 origLink"` - CommentLinks []rssCommentLink `xml:"comments"` - Description string `xml:"description"` - EncodedContent string `xml:"http://purl.org/rss/1.0/modules/content/ encoded"` - PubDate string `xml:"pubDate"` - Date string `xml:"http://purl.org/dc/elements/1.1/ date"` - Authors []rssAuthor `xml:"author"` - Creator string `xml:"http://purl.org/dc/elements/1.1/ creator"` - EnclosureLinks []rssEnclosure `xml:"enclosure"` - OrigEnclosureLink string `xml:"http://rssnamespace.org/feedburner/ext/1.0 origEnclosureLink"` - MediaGroup []rssMediaGroup `xml:"http://search.yahoo.com/mrss/ group"` - MediaContents []rssMediaContent `xml:"http://search.yahoo.com/mrss/ content"` - MediaThumbnails []rssMediaThumbnails `xml:"http://search.yahoo.com/mrss/ thumbnail"` -} - -type rssMediaGroup struct { - MediaList []rssMediaContent `xml:"content"` -} - -type rssMediaContent struct { - URL string `xml:"url,attr"` - Type string `xml:"type,attr"` - FileSize string `xml:"fileSize,attr"` - Medium string `xml:"medium,attr"` -} - -func (mediaContent *rssMediaContent) MimeType() string { - switch { - case mediaContent.Type == "" && mediaContent.Medium == "image": - return "image/*" - case mediaContent.Type == "" && mediaContent.Medium == "video": - return "video/*" - case mediaContent.Type == "" && mediaContent.Medium == "audio": - return "audio/*" - case mediaContent.Type == "" && mediaContent.Medium == "video": - return "video/*" - case mediaContent.Type != "": - return mediaContent.Type - default: - return "application/octet-stream" - } -} - -func (mediaContent *rssMediaContent) Size() int64 { - if mediaContent.FileSize == "" { - return 0 - } - size, _ := strconv.ParseInt(mediaContent.FileSize, 10, 0) - return size -} - -type rssMediaThumbnails struct { - URL string `xml:"url,attr"` + GUID string `xml:"guid"` + Title string `xml:"title"` + Links []rssLink `xml:"link"` + OriginalLink string `xml:"http://rssnamespace.org/feedburner/ext/1.0 origLink"` + CommentLinks []rssCommentLink `xml:"comments"` + Description string `xml:"description"` + EncodedContent string `xml:"http://purl.org/rss/1.0/modules/content/ encoded"` + PubDate string `xml:"pubDate"` + Date string `xml:"http://purl.org/dc/elements/1.1/ date"` + Authors []rssAuthor `xml:"author"` + Creator string `xml:"http://purl.org/dc/elements/1.1/ creator"` + EnclosureLinks []rssEnclosure `xml:"enclosure"` + OrigEnclosureLink string `xml:"http://rssnamespace.org/feedburner/ext/1.0 origEnclosureLink"` + media.Element } func (r *rssFeed) SiteURL() string { @@ -253,13 +212,13 @@ func (r *rssItem) Enclosures() model.EnclosureList { enclosures := make(model.EnclosureList, 0) duplicates := make(map[string]bool, 0) - for _, mediaThumbnail := range r.MediaThumbnails { + for _, mediaThumbnail := range r.AllMediaThumbnails() { if _, found := duplicates[mediaThumbnail.URL]; !found { duplicates[mediaThumbnail.URL] = true enclosures = append(enclosures, &model.Enclosure{ URL: mediaThumbnail.URL, - MimeType: "image/*", - Size: 0, + MimeType: mediaThumbnail.MimeType(), + Size: mediaThumbnail.Size(), }) } } @@ -285,13 +244,7 @@ func (r *rssItem) Enclosures() model.EnclosureList { } } - for _, mediaContentItem := range r.MediaGroup { - for _, mediaContent := range mediaContentItem.MediaList { - r.MediaContents = append(r.MediaContents, mediaContent) - } - } - - for _, mediaContent := range r.MediaContents { + for _, mediaContent := range r.AllMediaContents() { if _, found := duplicates[mediaContent.URL]; !found { duplicates[mediaContent.URL] = true enclosures = append(enclosures, &model.Enclosure{ @@ -302,6 +255,17 @@ func (r *rssItem) Enclosures() model.EnclosureList { } } + for _, mediaPeerLink := range r.AllMediaPeerLinks() { + if _, found := duplicates[mediaPeerLink.URL]; !found { + duplicates[mediaPeerLink.URL] = true + enclosures = append(enclosures, &model.Enclosure{ + URL: mediaPeerLink.URL, + MimeType: mediaPeerLink.MimeType(), + Size: mediaPeerLink.Size(), + }) + } + } + return enclosures } -- cgit v1.2.3