From 10d017a511c3be04364de3f732e4909edb39e9ea Mon Sep 17 00:00:00 2001 From: Carter McBride <18412686+carterworks@users.noreply.github.com> Date: Fri, 13 Sep 2024 14:59:26 -0600 Subject: [PATCH] Replace rss-parser and manual work with extractus --- bun.lockb | Bin 207740 -> 209636 bytes package.json | 4 +- src/services/feeds.ts | 130 +++++------------------------------------- 3 files changed, 15 insertions(+), 119 deletions(-) diff --git a/bun.lockb b/bun.lockb index 5c739f3d44846fa968be094468071f1513f15e3a..6cd3e946f477a3cd54ca8226072a93b693b97aa0 100755 GIT binary patch delta 41131 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 MgcwafpvAlg05wGlU;qFB delta 40209 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 { if (import.meta.env.FEEDS) { return JSON.parse(import.meta.env.FEEDS); @@ -20,130 +16,30 @@ function readFeedCategoriesFromEnv(): Record { throw new Error("FEEDS environment variable is not set"); } -async function getRawFeedContents(response: Response): Promise { - const contentType = response.headers.get("content-type")?.split(";")[0]; - if (!contentType) return {}; - if ( - [ - "application/atom+xml", - "application/rss+xml", - "application/xml", - "text/xml", - "text/html", - ].includes(contentType) - ) { - return response.text(); - } - if (["application/json", "application/feed+json"].includes(contentType)) { - return response.json(); - } - return {}; -} - -interface RawFeedItem { - creator?: string; - title: string; - link: string; - pubDate: string; - "content:encoded"?: string; - "content:encodedSnippet"?: string; - "dc:creator"?: string; - comments?: string; - content: string; - contentSnippet: string; - guid: string; - categories: unknown[]; - isoDate: string; - [other: string]: unknown; -} - -interface RawFeed { - items: RawFeedItem[]; - feedUrl?: string; - image?: { - link: string; - url: string; - title: string; - width: string; - height: string; - }; - pagenationLinks?: { - self: string; - next: string; - }; - title: string; - description: string; - generator: string; - link: string; - language?: string; - lastBuildDate?: string; - [other: string]: unknown; -} - -function getTitle(item: RawFeed | RawFeedItem): string { - const titleValues: (keyof RawFeed | keyof RawFeedItem)[] = [ - "title", - "url", - "link", - ]; - const keys = Object.keys(item); - const titleProperty = titleValues.find( - (titleValue) => keys.includes(titleValue) && item[titleValue], - ); - return titleProperty ? (item[titleProperty] as string) : ""; -} - -function getLink(item: RawFeed | RawFeedItem): string { - const linkValues: (keyof RawFeed | keyof RawFeedItem)[] = [ - "link", - "url", - "guid", - "home_page_url", - ]; - const keys = Object.keys(item); - const linkProperty = linkValues.find((linkValue) => keys.includes(linkValue)); - return linkProperty ? (item[linkProperty] as string) : ""; -} - -function getTimestamp(item: RawFeedItem): number { - const dateString = - item.pubDate || item.isoDate || item.date || item.date_published; - if (!dateString || typeof dateString !== "string") { - return Date.now(); - } - const timestamp = new Date(dateString).getTime(); - return Number.isNaN(timestamp) ? Date.now() : timestamp; -} - async function parseFeedContents( feedUrl: string, category: string, ): Promise { console.log(`Fetching: ${feedUrl}...`); - const response = await fetch(feedUrl); - const body = await getRawFeedContents(response); - if (!body) { - throw new Error(`Failed to fetch feed: ${feedUrl}`); - } + let items: FeedItem[] = []; try { - const rawFeed = ( - typeof body === "string" ? await parser.parseString(body) : body - ) as RawFeed; - const feedName = getTitle(rawFeed); - const feedLink = getLink(rawFeed); - const items: FeedItem[] = rawFeed.items.flatMap((item) => ({ - feedName, - feedLink, + const result = await extract(feedUrl, { + descriptionMaxLen: 1, + useISODateFormat: false, + }); + items = (result.entries ?? []).map((entry) => ({ + feedName: result.title, + feedLink: result.link, category, - title: item.title, - pubIsoDate: getTimestamp(item), - link: item.link, + title: entry.title, + pubIsoDate: new Date(entry.published).getTime(), + link: entry.link, })); - return items; } catch (err) { console.error(`${feedUrl}\n${err}`); throw err; } + return items; } export default async function getAllFeedItems(): Promise<{