-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