diff --git a/internal/reader/rss/adapter.go b/internal/reader/rss/adapter.go index 3819271475d..df6b6cb98a7 100644 --- a/internal/reader/rss/adapter.go +++ b/internal/reader/rss/adapter.go @@ -101,10 +101,13 @@ func (r *RSSAdapter) BuildFeed(baseURL string) *model.Feed { } // Generate the entry hash. - if item.GUID.Data != "" { + switch { + case item.GUID.Data != "": entry.Hash = crypto.Hash(item.GUID.Data) - } else if entryURL != "" { + case entryURL != "": entry.Hash = crypto.Hash(entryURL) + default: + entry.Hash = crypto.Hash(entry.Title + entry.Content) } // Find CommentsURL if defined. diff --git a/internal/reader/rss/parser_test.go b/internal/reader/rss/parser_test.go index 83e844cb2cd..2434335a0a3 100644 --- a/internal/reader/rss/parser_test.go +++ b/internal/reader/rss/parser_test.go @@ -336,6 +336,39 @@ func TestParseEntryWithoutLink(t *testing.T) { } } +func TestParseEntryWithoutLinkAndWithoutGUID(t *testing.T) { + data := ` + + + https://example.org/ + + Item 1 + + + Item 2 + Wed, 02 Oct 2002 08:00:00 GMT + + + ` + + feed, err := Parse("https://example.org/", bytes.NewReader([]byte(data))) + if err != nil { + t.Fatal(err) + } + + if len(feed.Entries) != 2 { + t.Errorf("Incorrect number of entries, got: %d", len(feed.Entries)) + } + + if feed.Entries[0].Hash != "c5ddfeffb275254140796b8c080f372d65ebb1b0590e238b191f595d5fcd32ca" { + t.Errorf("Incorrect entry hash, got: %s", feed.Entries[0].Hash) + } + + if feed.Entries[1].Hash != "0a937478f9bdbfca2de5cdeeb5ee7b09678a3330fc7cc5b05169a50d4516c9a3" { + t.Errorf("Incorrect entry hash, got: %s", feed.Entries[1].Hash) + } +} + func TestParseEntryWithOnlyGuidPermalink(t *testing.T) { data := `