From ced08ca1a00e4b33241fafb3c4fcba030e99d4bf Mon Sep 17 00:00:00 2001 From: Cameron Otsuka Date: Sun, 23 Nov 2025 14:27:59 -0800 Subject: [PATCH] include article content in rss feed, limit to 10 recent items --- src/pages/feed.xml.ts | 72 +++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/src/pages/feed.xml.ts b/src/pages/feed.xml.ts index 1f3cd8e..1536946 100644 --- a/src/pages/feed.xml.ts +++ b/src/pages/feed.xml.ts @@ -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 -- 2.52.0