summaryrefslogtreecommitdiff
path: root/internal/reader/atom/atom_10_adapter.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2024-03-19 21:24:30 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2024-03-19 21:57:46 -0700
commit08640b27d55f6382af6f08d0789b8109279ae825 (patch)
treee9b133e38bfb3d09b518d4b35a2292a06aaa661b /internal/reader/atom/atom_10_adapter.go
parent4be993e05537a2ed658f62060b6dd6b89304a346 (diff)
downloadv2-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.go109
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(),
+ })
+ }
}
}