diff --git a/doc/changelog.txt b/doc/changelog.txt index a8af358..b5c259d 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -14,6 +14,7 @@ - (fix) keyboard shortcuts in Firefox (thanks to @kaloyan13) - (fix) keyboard shortcuts in non-English layouts (thanks to @kaloyan13) - (fix) sorting articles with timezone information (thanks to @x2cf) +- (fix) handling links set in guid only for certain feeds (thanks to @adaszko for the report) # v2.3 (2022-05-03) diff --git a/src/parser/rss.go b/src/parser/rss.go index bd8ca37..9cf0773 100644 --- a/src/parser/rss.go +++ b/src/parser/rss.go @@ -20,7 +20,7 @@ type rssFeed struct { } type rssItem struct { - GUID string `xml:"guid"` + GUID rssGuid `xml:"guid"` Title string `xml:"title"` Link string `xml:"rss link"` Description string `xml:"rss description"` @@ -36,6 +36,11 @@ type rssItem struct { media } +type rssGuid struct { + GUID string `xml:",chardata"` + IsPermaLink string `xml:"isPermaLink,attr"` +} + type rssLink struct { XMLName xml.Name Data string `xml:",chardata"` @@ -81,10 +86,15 @@ func ParseRSS(r io.Reader) (*Feed, error) { } } + permalink := "" + if srcitem.GUID.IsPermaLink == "true" { + permalink = srcitem.GUID.GUID + } + dstfeed.Items = append(dstfeed.Items, Item{ - GUID: firstNonEmpty(srcitem.GUID, srcitem.Link), + GUID: firstNonEmpty(srcitem.GUID.GUID, srcitem.Link), Date: dateParse(firstNonEmpty(srcitem.DublinCoreDate, srcitem.PubDate)), - URL: firstNonEmpty(srcitem.OrigLink, srcitem.Link), + URL: firstNonEmpty(srcitem.OrigLink, srcitem.Link, permalink), Title: srcitem.Title, Content: firstNonEmpty(srcitem.ContentEncoded, srcitem.Description), AudioURL: podcastURL, diff --git a/src/parser/rss_test.go b/src/parser/rss_test.go index e6eb8a1..1680805 100644 --- a/src/parser/rss_test.go +++ b/src/parser/rss_test.go @@ -203,3 +203,28 @@ func TestRSSTitleHTMLTags(t *testing.T) { } } } + +func TestRSSIsPermalink(t *testing.T) { + feed, _ := Parse(strings.NewReader(` + + + + + http://example.com/posts/1 + + + + `)) + have := feed.Items + want := []Item{ + { + GUID: "http://example.com/posts/1", + URL: "http://example.com/posts/1", + }, + } + for i := 0; i < len(want); i++ { + if want[i] != have[i] { + t.Errorf("Failed to handle isPermalink\nwant: %#v\nhave: %#v\n", want[i], have[i]) + } + } +}