aboutsummaryrefslogtreecommitdiffstats
path: root/packages/api/utils/rss.ts
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-05-31 18:46:04 +0100
committerGitHub <noreply@github.com>2025-05-31 18:46:04 +0100
commit9695bba2e993b48ae333da622fa459dbaacb9349 (patch)
treec6bffbcdd73151671343f27012e82bea5a05ab6b /packages/api/utils/rss.ts
parentb218118b84291de4a9c1cd400dc58afab7054b78 (diff)
downloadkarakeep-9695bba2e993b48ae333da622fa459dbaacb9349.tar.zst
feat: Generate RSS feeds from lists (#1507)
* refactor: Move bookmark utils from shared-react to shared * Expose RSS feeds for lists * Add e2e tests * Slightly improve the look of the share dialog * allow specifying a limit in the rss endpoint
Diffstat (limited to 'packages/api/utils/rss.ts')
-rw-r--r--packages/api/utils/rss.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/api/utils/rss.ts b/packages/api/utils/rss.ts
new file mode 100644
index 00000000..079b3f5a
--- /dev/null
+++ b/packages/api/utils/rss.ts
@@ -0,0 +1,54 @@
+import RSS from "rss";
+
+import serverConfig from "@karakeep/shared/config";
+import {
+ BookmarkTypes,
+ ZPublicBookmark,
+} from "@karakeep/shared/types/bookmarks";
+import { getAssetUrl } from "@karakeep/shared/utils/assetUtils";
+
+export function toRSS(
+ params: {
+ title: string;
+ description?: string;
+ feedUrl: string;
+ siteUrl: string;
+ },
+ bookmarks: ZPublicBookmark[],
+) {
+ const feed = new RSS({
+ title: params.title,
+ feed_url: params.feedUrl,
+ site_url: params.siteUrl,
+ description: params.description,
+ generator: "Karakeep",
+ });
+
+ bookmarks
+ .filter(
+ (b) =>
+ b.content.type === BookmarkTypes.LINK ||
+ b.content.type === BookmarkTypes.ASSET,
+ )
+ .forEach((bookmark) => {
+ feed.item({
+ date: bookmark.createdAt,
+ title: bookmark.title ?? "",
+ url:
+ bookmark.content.type === BookmarkTypes.LINK
+ ? bookmark.content.url
+ : bookmark.content.type === BookmarkTypes.ASSET
+ ? `${serverConfig.publicUrl}${getAssetUrl(bookmark.content.assetId)}`
+ : "",
+ guid: bookmark.id,
+ author:
+ bookmark.content.type === BookmarkTypes.LINK
+ ? (bookmark.content.author ?? undefined)
+ : undefined,
+ categories: bookmark.tags,
+ description: bookmark.description ?? "",
+ });
+ });
+
+ return feed.xml({ indent: true });
+}