diff options
Diffstat (limited to 'reader/rss')
-rw-r--r-- | reader/rss/parser_test.go | 49 | ||||
-rw-r--r-- | reader/rss/rss.go | 96 |
2 files changed, 79 insertions, 66 deletions
diff --git a/reader/rss/parser_test.go b/reader/rss/parser_test.go index af98d7e..56ae159 100644 --- a/reader/rss/parser_test.go +++ b/reader/rss/parser_test.go @@ -771,3 +771,52 @@ func TestParseEntryWithMediaContent(t *testing.T) { } } } + +func TestParseEntryWithMediaPeerLink(t *testing.T) { + data := `<?xml version="1.0" encoding="utf-8"?> + <rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"> + <channel> + <title>My Example Feed</title> + <link>http://example.org</link> + <item> + <title>Example Item</title> + <link>http://www.example.org/entries/1</link> + <media:peerLink type="application/x-bittorrent" href="http://www.example.org/file.torrent" /> + </item> + </channel> + </rss>` + + feed, err := Parse(bytes.NewBufferString(data)) + if err != nil { + t.Fatal(err) + } + + if len(feed.Entries) != 1 { + t.Errorf("Incorrect number of entries, got: %d", len(feed.Entries)) + } + if len(feed.Entries[0].Enclosures) != 1 { + t.Fatalf("Incorrect number of enclosures, got: %d", len(feed.Entries[0].Enclosures)) + } + + expectedResults := []struct { + url string + mimeType string + size int64 + }{ + {"http://www.example.org/file.torrent", "application/x-bittorrent", 0}, + } + + for index, enclosure := range feed.Entries[0].Enclosures { + if expectedResults[index].url != enclosure.URL { + t.Errorf(`Unexpected enclosure URL, got %q instead of %q`, enclosure.URL, expectedResults[index].url) + } + + if expectedResults[index].mimeType != enclosure.MimeType { + t.Errorf(`Unexpected enclosure type, got %q instead of %q`, enclosure.MimeType, expectedResults[index].mimeType) + } + + if expectedResults[index].size != enclosure.Size { + t.Errorf(`Unexpected enclosure size, got %d instead of %d`, enclosure.Size, expectedResults[index].size) + } + } +} 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 } |