Fork of Chiri for Astro for my blog
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at d53cf66a7c485bc65a203dfd645442c65b48b58e 81 lines 2.9 kB view raw
1import { getCollection, type CollectionEntry } from 'astro:content' 2import { themeConfig } from '@/config' 3import type { APIContext } from 'astro' 4 5export async function generateRSS(context: APIContext) { 6 const posts = await getCollection('posts') 7 const filteredPosts = posts.filter((post: CollectionEntry<'posts'>) => !post.id.startsWith('_')) 8 const sortedPosts = filteredPosts.sort( 9 (a: CollectionEntry<'posts'>, b: CollectionEntry<'posts'>) => 10 b.data.pubDate.valueOf() - a.data.pubDate.valueOf() 11 ) 12 13 const rss = `<?xml version="1.0" encoding="UTF-8" ?> 14<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"> 15 <channel> 16 <title>${themeConfig.site.title}</title> 17 <link>${context.site}</link> 18 <description>${themeConfig.site.description}</description> 19 <language>zh-CN</language> 20 <lastBuildDate>${new Date().toUTCString()}</lastBuildDate> 21 <atom:link href="${context.site}/rss.xml" rel="self" type="application/rss+xml" /> 22 ${sortedPosts 23 .map( 24 (post: CollectionEntry<'posts'>) => ` 25 <item> 26 <title><![CDATA[${post.data.title}]]></title> 27 <link>${context.site}/${post.id}/</link> 28 <guid>${context.site}/${post.id}/</guid> 29 <pubDate>${post.data.pubDate.toUTCString()}</pubDate> 30 <content:encoded><![CDATA[${post.body}]]></content:encoded> 31 </item> 32 ` 33 ) 34 .join('')} 35 </channel> 36</rss>` 37 38 return new Response(rss, { 39 headers: { 40 'Content-Type': 'application/xml; charset=utf-8' 41 } 42 }) 43} 44 45export async function generateAtom(context: APIContext) { 46 const posts = await getCollection('posts') 47 const filteredPosts = posts.filter((post: CollectionEntry<'posts'>) => !post.id.startsWith('_')) 48 const sortedPosts = filteredPosts.sort( 49 (a: CollectionEntry<'posts'>, b: CollectionEntry<'posts'>) => 50 b.data.pubDate.valueOf() - a.data.pubDate.valueOf() 51 ) 52 53 const atom = `<?xml version="1.0" encoding="utf-8"?> 54<feed xmlns="http://www.w3.org/2005/Atom"> 55 <title>${themeConfig.site.title}</title> 56 <subtitle>${themeConfig.site.description}</subtitle> 57 <link href="${context.site}/atom.xml" rel="self" type="application/atom+xml" /> 58 <link href="${context.site}" /> 59 <id>${context.site}</id> 60 <updated>${new Date().toISOString()}</updated> 61 ${sortedPosts 62 .map( 63 (post: CollectionEntry<'posts'>) => ` 64 <entry> 65 <title>${post.data.title}</title> 66 <link href="${context.site}/${post.id}/" /> 67 <id>${context.site}/${post.id}/</id> 68 <published>${post.data.pubDate.toISOString()}</published> 69 <content type="html"><![CDATA[${post.body}]]></content> 70 </entry> 71 ` 72 ) 73 .join('')} 74</feed>` 75 76 return new Response(atom, { 77 headers: { 78 'Content-Type': 'application/xml; charset=utf-8' 79 } 80 }) 81}