From e2b9738f7dfc7bd04ec9a847b543e10523cb9fdb Mon Sep 17 00:00:00 2001 From: Mikael Porttila Date: Thu, 13 Feb 2025 20:36:29 +0100 Subject: [PATCH] FeedEntry.id fallback (#64) --- README.md | 2 +- jsr.json | 2 +- src/mappers/mapper.ts | 10 +++++++-- src/mappers/mapper_test.ts | 34 ++++++++++++++++++++++++++++- src/mappers/media_mapper_test.ts | 2 +- src/types/feed.ts | 4 ++-- src/types/internal/internal_rss2.ts | 2 +- 7 files changed, 47 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b199d0d..5fb0fb8 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ const mediaContent = entries[0][MediaRss.Content]; | Feed | Atom | RSS2 | RSS | | --------------------- | --------------------------------------------- | -------------------------------------- | ----------------------------- | -| Id | Id | Guid | DC:URI or Link | +| Id | Id | Guid or Link or DC:URI | DC:URI or Link | | Author | Author | Author or DC:Creator | DC:Creator | | Title | Title | Title or DC:Title | Title or DC:Title | | Description | Summary | Description or DC:Description | Description or DC:Description | diff --git a/jsr.json b/jsr.json index 9c599f6..4e0b2eb 100644 --- a/jsr.json +++ b/jsr.json @@ -1,5 +1,5 @@ { "name": "@mikaelporttila/rss", - "version": "1.1.1", + "version": "1.1.2", "exports": "./mod.ts" } diff --git a/src/mappers/mapper.ts b/src/mappers/mapper.ts index a44cbef..6b7d1db 100644 --- a/src/mappers/mapper.ts +++ b/src/mappers/mapper.ts @@ -261,8 +261,6 @@ function mapRss2ToFeed(rss: InternalRSS2): Feed { copyValueFields(DublinCoreFieldArray, entry, entry); copyMedia(entry as InternalMediaRss, entry); - entry.id = guid?.value as string || entry[DublinCoreFields.URI] as string; - const titleValue = entry[DublinCoreFields.Title] || title?.value; if (titleValue) { entry.title = { @@ -310,6 +308,14 @@ function mapRss2ToFeed(rss: InternalRSS2): Feed { entry.links.push({ href: link?.value }); } + entry.id = guid?.value as string || entry[DublinCoreFields.URI] as string; + if (!entry.id && entry.links.length > 0) { + const linkWithHref = entry.links.find(x => x.href); + if (linkWithHref) { + entry.id = linkWithHref.href; + } + } + if (enclosure) { entry.attachments = enclosure.map((x) => ({ url: x.url, diff --git a/src/mappers/mapper_test.ts b/src/mappers/mapper_test.ts index fd94823..accc729 100644 --- a/src/mappers/mapper_test.ts +++ b/src/mappers/mapper_test.ts @@ -359,6 +359,30 @@ function composeRss2 ( value: "RSS2:Channel:Item:2:content:encoded:Value", }, }, + { + title: { + value: "RSS2:Channel:Item:3:Title:Value", + }, + description: { + value: "RSS2:Channel:Item:3:Description:Value", + }, + author: { + value: "RSS2:Channel:Item:3:Author:Value", + }, + link: { + value: "RSS2:Channel:Item:3:Link:Value", + }, + guid: { + value: undefined, + }, + comments: { + value: "RSS2:Channel:Item:3:Comments:Value", + }, + categories: [ + { value: "RSS2:Channel:Item:3:Categories:0:Value" }, + { value: "RSS2:Channel:Item:3:Categories:1:Value" }, + ] + }, ], }, } as InternalRSS2; @@ -990,7 +1014,7 @@ function testArrayLength ( getValue: (src: Feed) => src.image?.width, assert: [{ fn: assertEquals, expect: 34 }], }, - ...testArrayLength("Items", (src: Feed) => src.entries, 3), + ...testArrayLength("Items", (src: Feed) => src.entries, 4), ...testTextField( "Items:0:Title", (src: Feed) => src.entries[0].title, @@ -1111,6 +1135,14 @@ function testArrayLength ( expect: "RSS2:Channel:Item:2:FeedburnerLink:Value", }], }, + { + name: "Items:3:Id:Fallback", + getValue: (src: Feed) => src.entries[3].id, + assert: [{ + fn: assertEquals, + expect: "RSS2:Channel:Item:3:Link:Value", + }], + }, { name: "Items:2:ContentEncoded", getValue: (src: Feed) => src.entries[2].content?.value, diff --git a/src/mappers/media_mapper_test.ts b/src/mappers/media_mapper_test.ts index 99a7c77..e76f9bd 100644 --- a/src/mappers/media_mapper_test.ts +++ b/src/mappers/media_mapper_test.ts @@ -1,4 +1,4 @@ /* import { assertEquals, assertNotEquals } from "./../../test_deps.ts"; import { copyMedia } from "./media-mapper.ts"; */ -// TODO(MikaelPorttila): Add tests... +// TODO: Add tests... diff --git a/src/types/feed.ts b/src/types/feed.ts index 86c7b51..03fbd75 100644 --- a/src/types/feed.ts +++ b/src/types/feed.ts @@ -34,8 +34,8 @@ export interface FeedEntry extends DublinCore, Slash, MediaRss { title?: TextField; description?: TextField; links: Link[]; - id: string; - // TODO(MikaelPorttila): Replace with Authors to match JSONFeed. + id?: string; + // TODO: Replace with Authors to match JSONFeed. author?: Author; published?: Date; publishedRaw?: string; diff --git a/src/types/internal/internal_rss2.ts b/src/types/internal/internal_rss2.ts index a4be406..832a1a1 100644 --- a/src/types/internal/internal_rss2.ts +++ b/src/types/internal/internal_rss2.ts @@ -28,7 +28,7 @@ interface Channel extends InternalDublinCore { cloud?: Cloud; ttl?: ValueField; image?: Image; - textInput?: any; // TODO(MikaelPorttila): Type textInput + textInput?: any; // TODO: Type textInput skipHours?: { hour?: ValueField[]; };