소스 검색

fix(jsonfeed): fallback to `external_url` when `url` is missing

Frédéric Guillot 6 달 전
부모
커밋
ff07f02716
2개의 변경된 파일66개의 추가작업 그리고 4개의 파일을 삭제
  1. 9 4
      internal/reader/json/adapter.go
  2. 57 0
      internal/reader/json/parser_test.go

+ 9 - 4
internal/reader/json/adapter.go

@@ -68,11 +68,16 @@ func (j *JSONAdapter) BuildFeed(baseURL string) *model.Feed {
 	for _, item := range j.jsonFeed.Items {
 		entry := model.NewEntry()
 		entry.Title = strings.TrimSpace(item.Title)
-		entry.URL = strings.TrimSpace(item.URL)
 
-		// Make sure the entry URL is absolute.
-		if entryURL, err := urllib.AbsoluteURL(feed.SiteURL, entry.URL); err == nil {
-			entry.URL = entryURL
+		for _, itemURL := range []string{item.URL, item.ExternalURL} {
+			itemURL = strings.TrimSpace(itemURL)
+			if itemURL != "" {
+				// Make sure the entry URL is absolute.
+				if entryURL, err := urllib.AbsoluteURL(feed.SiteURL, itemURL); err == nil {
+					entry.URL = entryURL
+				}
+				break
+			}
 		}
 
 		// The entry title is optional, so we need to find a fallback.

+ 57 - 0
internal/reader/json/parser_test.go

@@ -415,6 +415,63 @@ func TestParseItemWithRelativeURL(t *testing.T) {
 	}
 }
 
+func TestParseItemWithExternalURLAndNoURL(t *testing.T) {
+	data := `{
+		"version": "https://jsonfeed.org/version/1",
+		"title": "Example",
+		"home_page_url": "https://example.org/",
+		"feed_url": "https://example.org/feed.json",
+		"items": [
+			{
+				"id": "1234259",
+				"external_url": "some_page.html"
+			}
+		]
+	}`
+
+	feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if len(feed.Entries) != 1 {
+		t.Fatalf("Incorrect number of entries, got: %d", len(feed.Entries))
+	}
+
+	if feed.Entries[0].URL != "https://example.org/some_page.html" {
+		t.Errorf("Incorrect entry URL, got: %s", feed.Entries[0].URL)
+	}
+}
+
+func TestParseItemWithExternalURLAndURL(t *testing.T) {
+	data := `{
+		"version": "https://jsonfeed.org/version/1",
+		"title": "Example",
+		"home_page_url": "https://example.org/",
+		"feed_url": "https://example.org/feed.json",
+		"items": [
+			{
+				"id": "1234259",
+				"url": "https://example.org/article",
+				"external_url": "https://example.org/another-article"
+			}
+		]
+	}`
+
+	feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if len(feed.Entries) != 1 {
+		t.Fatalf("Incorrect number of entries, got: %d", len(feed.Entries))
+	}
+
+	if feed.Entries[0].URL != "https://example.org/article" {
+		t.Errorf("Incorrect entry URL, got: %s", feed.Entries[0].URL)
+	}
+}
+
 func TestParseItemWithLegacyAuthorField(t *testing.T) {
 	data := `{
 		"version": "https://jsonfeed.org/version/1",