From e9cbea500b08f6401b6d83747bd94210a83db68e Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Mon, 25 Nov 2024 21:35:04 +0000 Subject: [PATCH] autogenerate feed item guids --- src/parser/feed.go | 11 +++++++++++ src/parser/feed_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/parser/feed.go b/src/parser/feed.go index fe07161..e47a873 100644 --- a/src/parser/feed.go +++ b/src/parser/feed.go @@ -2,6 +2,7 @@ package parser import ( "bytes" + "crypto/sha256" "encoding/xml" "errors" "fmt" @@ -119,6 +120,7 @@ func ParseAndFix(r io.Reader, baseURL, fallbackEncoding string) (*Feed, error) { } feed.TranslateURLs(baseURL) feed.SetMissingDatesTo(time.Now()) + feed.SetMissingGUIDs() return feed, nil } @@ -168,3 +170,12 @@ func (feed *Feed) TranslateURLs(base string) error { } return nil } + +func (feed *Feed) SetMissingGUIDs() { + for i, item := range feed.Items { + if item.GUID == "" { + id := strings.Join([]string{item.Title, item.Date.Format(time.RFC3339), item.URL}, ";;") + feed.Items[i].GUID = fmt.Sprintf("%x", sha256.Sum256([]byte(id))) + } + } +} diff --git a/src/parser/feed_test.go b/src/parser/feed_test.go index 0278c69..d24f3b5 100644 --- a/src/parser/feed_test.go +++ b/src/parser/feed_test.go @@ -150,3 +150,32 @@ func TestParseCleanIllegalCharsInNonUTF8(t *testing.T) { t.Fatalf("invalid feed, got: %v", feed) } } + +func TestParseMissingGUID(t *testing.T) { + data := ` + + + + + foo + + + bar + + + + ` + feed, err := ParseAndFix(strings.NewReader(data), "", "") + if err != nil { + t.Fatal(err) + } + if len(feed.Items) != 2 { + t.Fatalf("expected 2 items, got %d", len(feed.Items)) + } + if feed.Items[0].GUID == "" || feed.Items[1].GUID == "" { + t.Fatalf("item GUIDs are missing, got %#v", feed.Items) + } + if feed.Items[0].GUID == feed.Items[1].GUID { + t.Fatalf("item GUIDs are not unique, got %#v", feed.Items) + } +}