rss 2 alternatives, TODO: CHOOSE
This commit is contained in:
parent
e4dc0e56cc
commit
6def6e8d8f
|
@ -0,0 +1,53 @@
|
||||||
|
import { listBlogPosts } from '$lib/contents/blog';
|
||||||
|
import RSS from 'rss';
|
||||||
|
|
||||||
|
export const GET = async () => {
|
||||||
|
const posts = listBlogPosts();
|
||||||
|
|
||||||
|
/*
|
||||||
|
The RSS feed is a JavaScript object that contains information about the blog feed.
|
||||||
|
It has a title, description, copyright, and other properties.
|
||||||
|
It also has an array of categories that can be used to filter the blog feed.
|
||||||
|
The pubDate property indicates when the feed was last updated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const feed = new RSS({
|
||||||
|
title: "Matt's C4vern",
|
||||||
|
description: "Matt's personal blog about ventures in tech.",
|
||||||
|
copyright: `Copyright © ${new Date().getFullYear()} Matt Morin. All rights reserved`,
|
||||||
|
ttl: 1800,
|
||||||
|
feed_url: 'https://www.mattmor.in/blog',
|
||||||
|
site_url: 'https://www.mattmor.in',
|
||||||
|
image_url: 'https://www.mattmor.in/favicon192.png',
|
||||||
|
language: 'en',
|
||||||
|
categories: ["Matt's C4vern updates", 'Tech', 'Disruption', 'DevOps', 'Ventures'],
|
||||||
|
pubDate: new Date().toUTCString(),
|
||||||
|
generator: 'Matt Morin'
|
||||||
|
});
|
||||||
|
|
||||||
|
// This code creates an RSS feed. It does so by iterating over all posts and
|
||||||
|
// adding each post to the feed.
|
||||||
|
|
||||||
|
posts.forEach((post: any) => {
|
||||||
|
feed.item({
|
||||||
|
title: post.title,
|
||||||
|
description: post.excerpt,
|
||||||
|
url: `https://www.mattmor.in/blog/${post.slug}`,
|
||||||
|
guid: `https://www.mattmor.in/blog/${post.slug}`,
|
||||||
|
categories: post.tags,
|
||||||
|
date: post.date,
|
||||||
|
enclosure: {
|
||||||
|
url: `https://www.mattmor.in/images/blog/${post.slug}/${post.image}`,
|
||||||
|
type: 'image/webp'
|
||||||
|
},
|
||||||
|
author: post.author
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return new Response(feed.xml(), {
|
||||||
|
headers: {
|
||||||
|
'Cache-Control': 'max-age=0, s-max-age=3600',
|
||||||
|
'Content-Type': 'application/xml'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
|
@ -0,0 +1,37 @@
|
||||||
|
import * as config from '$lib/config';
|
||||||
|
import type { BlogPost } from '$lib/types';
|
||||||
|
|
||||||
|
export const prerender = true;
|
||||||
|
|
||||||
|
export async function GET({ fetch }) {
|
||||||
|
const response = await fetch('api/posts');
|
||||||
|
const posts: BlogPost[] = await response.json();
|
||||||
|
|
||||||
|
const headers = { 'Content-Type': 'application/xml' };
|
||||||
|
|
||||||
|
const xml = `
|
||||||
|
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
|
||||||
|
<channel>
|
||||||
|
<title>${config.title}</title>
|
||||||
|
<description>${config.description}</description>
|
||||||
|
<link>${config.url}</link>
|
||||||
|
<atom:link href="${config.url}/rss.xml" rel="self" type="application/rss+xml"/>
|
||||||
|
${posts
|
||||||
|
.map(
|
||||||
|
(post) => `
|
||||||
|
<item>
|
||||||
|
<title>${post.title}</title>
|
||||||
|
<description>${post.description}</description>
|
||||||
|
<link>${config.url}/${post.slug}</link>
|
||||||
|
<guid isPermaLink="true">${config.url}/${post.slug}</guid>
|
||||||
|
<pubDate>${new Date(post.date).toUTCString()}</pubDate>
|
||||||
|
</item>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.join('')}
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
|
`.trim();
|
||||||
|
|
||||||
|
return new Response(xml, { headers });
|
||||||
|
}
|
Loading…
Reference in New Issue