diff options
author | 2024-03-19 21:24:30 -0700 | |
---|---|---|
committer | 2024-03-19 21:57:46 -0700 | |
commit | 08640b27d55f6382af6f08d0789b8109279ae825 (patch) | |
tree | e9b133e38bfb3d09b518d4b35a2292a06aaa661b /internal/reader/atom/atom_10_adapter.go | |
parent | 4be993e05537a2ed658f62060b6dd6b89304a346 (diff) | |
download | v2-08640b27d55f6382af6f08d0789b8109279ae825.tar.gz v2-08640b27d55f6382af6f08d0789b8109279ae825.tar.zst v2-08640b27d55f6382af6f08d0789b8109279ae825.zip |
Ensure enclosure URLs are always absolute
Diffstat (limited to 'internal/reader/atom/atom_10_adapter.go')
-rw-r--r-- | internal/reader/atom/atom_10_adapter.go | 109 |
1 files changed, 75 insertions, 34 deletions
diff --git a/internal/reader/atom/atom_10_adapter.go b/internal/reader/atom/atom_10_adapter.go index c9ce5c23..a0a73623 100644 --- a/internal/reader/atom/atom_10_adapter.go +++ b/internal/reader/atom/atom_10_adapter.go @@ -158,51 +158,92 @@ func (a *Atom10Adapter) populateEntries(siteURL string) model.Entries { uniqueEnclosuresMap := make(map[string]bool) for _, mediaThumbnail := range atomEntry.AllMediaThumbnails() { - if _, found := uniqueEnclosuresMap[mediaThumbnail.URL]; !found { - uniqueEnclosuresMap[mediaThumbnail.URL] = true - entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ - URL: mediaThumbnail.URL, - MimeType: mediaThumbnail.MimeType(), - Size: mediaThumbnail.Size(), - }) - } - } - - for _, link := range atomEntry.Links { - if !strings.EqualFold(link.Rel, "enclosure") || link.Href == "" { + mediaURL := strings.TrimSpace(mediaThumbnail.URL) + if mediaURL == "" { continue } + if _, found := uniqueEnclosuresMap[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 { + uniqueEnclosuresMap[mediaAbsoluteURL] = true + entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaThumbnail.MimeType(), + Size: mediaThumbnail.Size(), + }) + } + } + } - if _, found := uniqueEnclosuresMap[link.Href]; !found { - uniqueEnclosuresMap[link.Href] = true - length, _ := strconv.ParseInt(link.Length, 10, 0) - entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ - URL: link.Href, - MimeType: link.Type, - Size: length, - }) + for _, link := range atomEntry.Links.findAllLinksWithRelation("enclosure") { + absoluteEnclosureURL, err := urllib.AbsoluteURL(siteURL, link.Href) + if err != nil { + slog.Debug("Unable to resolve absolute URL for enclosure", + slog.String("enclosure_url", link.Href), + slog.String("entry_url", entry.URL), + slog.Any("error", err), + ) + } else { + if _, found := uniqueEnclosuresMap[absoluteEnclosureURL]; !found { + uniqueEnclosuresMap[absoluteEnclosureURL] = true + length, _ := strconv.ParseInt(link.Length, 10, 0) + entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ + URL: absoluteEnclosureURL, + MimeType: link.Type, + Size: length, + }) + } } } for _, mediaContent := range atomEntry.AllMediaContents() { - if _, found := uniqueEnclosuresMap[mediaContent.URL]; !found { - uniqueEnclosuresMap[mediaContent.URL] = true - entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ - URL: mediaContent.URL, - MimeType: mediaContent.MimeType(), - Size: mediaContent.Size(), - }) + mediaURL := strings.TrimSpace(mediaContent.URL) + if mediaURL == "" { + continue + } + 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 { + if _, found := uniqueEnclosuresMap[mediaAbsoluteURL]; !found { + uniqueEnclosuresMap[mediaAbsoluteURL] = true + entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaContent.MimeType(), + Size: mediaContent.Size(), + }) + } } } for _, mediaPeerLink := range atomEntry.AllMediaPeerLinks() { - if _, found := uniqueEnclosuresMap[mediaPeerLink.URL]; !found { - uniqueEnclosuresMap[mediaPeerLink.URL] = true - entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ - URL: mediaPeerLink.URL, - MimeType: mediaPeerLink.MimeType(), - Size: mediaPeerLink.Size(), - }) + mediaURL := strings.TrimSpace(mediaPeerLink.URL) + if mediaURL == "" { + continue + } + 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 { + if _, found := uniqueEnclosuresMap[mediaAbsoluteURL]; !found { + uniqueEnclosuresMap[mediaAbsoluteURL] = true + entry.Enclosures = append(entry.Enclosures, &model.Enclosure{ + URL: mediaAbsoluteURL, + MimeType: mediaPeerLink.MimeType(), + Size: mediaPeerLink.Size(), + }) + } } } |