diff options
Diffstat (limited to '')
-rw-r--r-- | internal/reader/rss/adapter.go | 91 |
1 files changed, 67 insertions, 24 deletions
diff --git a/internal/reader/rss/adapter.go b/internal/reader/rss/adapter.go index 48def825..07d56059 100644 --- a/internal/reader/rss/adapter.go +++ b/internal/reader/rss/adapter.go @@ -72,7 +72,7 @@ func (r *RSSAdapter) BuildFeed(baseURL string) *model.Feed { entry := model.NewEntry() entry.Date = findEntryDate(&item) entry.Content = findEntryContent(&item) - entry.Enclosures = findEntryEnclosures(&item) + entry.Enclosures = findEntryEnclosures(&item, feed.SiteURL) // Populate the entry URL. entryURL := findEntryURL(&item) @@ -245,18 +245,30 @@ func findEntryAuthor(rssItem *RSSItem) string { return strings.TrimSpace(sanitizer.StripTags(author)) } -func findEntryEnclosures(rssItem *RSSItem) model.EnclosureList { +func findEntryEnclosures(rssItem *RSSItem, siteURL string) model.EnclosureList { enclosures := make(model.EnclosureList, 0) duplicates := make(map[string]bool) for _, mediaThumbnail := range rssItem.AllMediaThumbnails() { - if _, found := duplicates[mediaThumbnail.URL]; !found { - duplicates[mediaThumbnail.URL] = true - enclosures = append(enclosures, &model.Enclosure{ - URL: mediaThumbnail.URL, - MimeType: mediaThumbnail.MimeType(), - Size: mediaThumbnail.Size(), - }) + mediaURL := strings.TrimSpace(mediaThumbnail.URL) + if mediaURL == "" { + continue + } + if _, found := duplicates[mediaURL]; !found { + if mediaAbsoluteURL, err := urllib.AbsoluteURL(siteURL, mediaURL); err != nil { + slog.Debug("Unable to build absolute URL for media thumbnail", + slog.String("url", mediaThumbnail.URL), + slog.String("site_url", siteURL), + slog.Any("error", err), + ) + } else { + duplicates[mediaAbsoluteURL] = true + enclosures = append(enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaThumbnail.MimeType(), + Size: mediaThumbnail.Size(), + }) + } } } @@ -265,15 +277,20 @@ func findEntryEnclosures(rssItem *RSSItem) model.EnclosureList { if rssItem.FeedBurnerEnclosureLink != "" { filename := path.Base(rssItem.FeedBurnerEnclosureLink) - if strings.Contains(enclosureURL, filename) { + if strings.HasSuffix(enclosureURL, filename) { enclosureURL = rssItem.FeedBurnerEnclosureLink } } + enclosureURL = strings.TrimSpace(enclosureURL) if enclosureURL == "" { continue } + if absoluteEnclosureURL, err := urllib.AbsoluteURL(siteURL, enclosureURL); err == nil { + enclosureURL = absoluteEnclosureURL + } + if _, found := duplicates[enclosureURL]; !found { duplicates[enclosureURL] = true @@ -286,24 +303,50 @@ func findEntryEnclosures(rssItem *RSSItem) model.EnclosureList { } for _, mediaContent := range rssItem.AllMediaContents() { - if _, found := duplicates[mediaContent.URL]; !found { - duplicates[mediaContent.URL] = true - enclosures = append(enclosures, &model.Enclosure{ - URL: mediaContent.URL, - MimeType: mediaContent.MimeType(), - Size: mediaContent.Size(), - }) + mediaURL := strings.TrimSpace(mediaContent.URL) + if mediaURL == "" { + continue + } + if _, found := duplicates[mediaURL]; !found { + mediaURL := strings.TrimSpace(mediaContent.URL) + if mediaAbsoluteURL, err := urllib.AbsoluteURL(siteURL, mediaURL); err != nil { + slog.Debug("Unable to build absolute URL for media content", + slog.String("url", mediaContent.URL), + slog.String("site_url", siteURL), + slog.Any("error", err), + ) + } else { + duplicates[mediaAbsoluteURL] = true + enclosures = append(enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaContent.MimeType(), + Size: mediaContent.Size(), + }) + } } } for _, mediaPeerLink := range rssItem.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(), - }) + mediaURL := strings.TrimSpace(mediaPeerLink.URL) + if mediaURL == "" { + continue + } + if _, found := duplicates[mediaURL]; !found { + mediaURL := strings.TrimSpace(mediaPeerLink.URL) + if mediaAbsoluteURL, err := urllib.AbsoluteURL(siteURL, mediaURL); err != nil { + slog.Debug("Unable to build absolute URL for media peer link", + slog.String("url", mediaPeerLink.URL), + slog.String("site_url", siteURL), + slog.Any("error", err), + ) + } else { + duplicates[mediaAbsoluteURL] = true + enclosures = append(enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaPeerLink.MimeType(), + Size: mediaPeerLink.Size(), + }) + } } } |