]> git.otsuka.systems Git - cotsuka.github.io/commitdiff
include article content in rss feed, limit to 10 recent items
authorCameron Otsuka <cameron@otsuka.haus>
Sun, 23 Nov 2025 22:27:59 +0000 (14:27 -0800)
committerCameron Otsuka <cameron@otsuka.haus>
Sun, 23 Nov 2025 22:27:59 +0000 (14:27 -0800)
src/pages/feed.xml.ts

index 1f3cd8eacb1f1675a97ba9d64f161dec53e1df10..15369465b1d9789f8f13281359bfda3d7bebb2c2 100644 (file)
@@ -1,43 +1,61 @@
-import rss from '@astrojs/rss';
-import { getCollection } from 'astro:content';
+import { getContainerRenderer as getMDXRenderer } from '@astrojs/mdx';
+import rss, { type RSSFeedItem } from '@astrojs/rss';
 import formatDate from '@utils/formatDate.ts';
 import { siteDescription, siteTitle } from '@utils/globals.ts';
 import createSlug from '@utils/createSlug.ts';
+import { getCollection, render } from 'astro:content';
+import { loadRenderers } from 'astro:container';
+import { experimental_AstroContainer as AstroContainer } from 'astro/container';
 
 export async function GET(context: any) {
   const articles = await getCollection('articles');
-  const articleItems = articles.map((article) => ({
-    title: article.data.title,
-    link: `/articles/${formatDate(article.data.date)}-${article.id}/`,
-    pubDate: article.data.date,
-    description: article.data.description,
-    categories: (article.data.tags ?? []).concat('articles')
-  }));
-
   const podcasts = await getCollection('podcasts');
-  const podcastItems = podcasts.map((podcast) => ({
-    title: podcast.data.title,
-    link: `/podcasts/${createSlug(podcast.data.show)}-${podcast.id}/`,
-    pubDate: podcast.data.date,
-    description: `${podcast.data.show} - ${podcast.data.description}`,
-    categories: (podcast.data.tags ?? []).concat(podcast.data.type).concat(podcast.data.show).concat('podcasts')
-  }));
-
   const reviews = await getCollection('reviews');
-  const reviewItems = reviews.map((review) => ({
-    title: review.data.title,
-    link: `/reviews/${review.data.type}/${review.id}/`,
-    pubDate: review.data.date,
-    description: review.data.description,
-    categories: (review.data.tags ?? []).concat(review.data.type).concat('reviews')
-  }));
+  const collections = [...articles, ...podcasts, ...reviews]
+
+  const renderers = await loadRenderers([getMDXRenderer()]);
+  const container = await AstroContainer.create({ renderers });
 
-  const feedItems = [ ...articleItems, ...podcastItems, ...reviewItems ];
+  const feedItems: RSSFeedItem[] = []
+  for (const item of collections) {
+    let link: string
+    switch  (item.collection) {
+      case 'articles':
+        link = `/articles/${formatDate(item.data.date)}-${item.id}/`
+        break;
+      case 'podcasts':
+        link = `/podcasts/${createSlug(item.data.show)}-${item.id}/`
+        break;
+      case 'reviews':
+        link = `/reviews/${item.data.type}/${item.id}/`
+        break;
+    }
+
+    const { Content } = await render(item);
+    const content = await container.renderToString(Content);
+    const categories = (item.data.tags ?? []).concat(item.collection)
+    if ('type' in item.data) {
+      categories.concat(item.data.type)
+    }
+    if ('show' in item.data) {
+      categories.concat(item.data.show)
+    }
+
+    feedItems.push({
+      title: item.data.title,
+      link: link,
+      pubDate: item.data.date,
+      description: item.data.description,
+      content: content,
+      categories: categories
+    })
+  }
   const sortedFeedItems = feedItems.sort((a, b) => b.pubDate.getTime() - a.pubDate.getTime());
+
   return rss({
     title: siteTitle,
     description: siteDescription,
     site: context.site,
-    items: sortedFeedItems
+    items: sortedFeedItems.slice(0, 10)
   });
 }
\ No newline at end of file