Files
moshing-mammut/src/lib/server/rss.ts

66 lines
1.7 KiB
TypeScript

import { BASE_URL, WEBSUB_HUB } from '$env/static/private';
import { PUBLIC_MASTODON_INSTANCE_DISPLAY_NAME } from '$env/static/public';
import type { Post } from '$lib//mastodon/response';
import { log } from '$lib/log';
import { Feed } from 'feed';
import fs from 'fs/promises';
export function createFeed(posts: Post[]): Feed {
const baseUrl = BASE_URL.endsWith('/') ? BASE_URL : BASE_URL + '/';
const hub = WEBSUB_HUB ? WEBSUB_HUB : undefined;
const feed = new Feed({
title: `${PUBLIC_MASTODON_INSTANCE_DISPLAY_NAME} music feed`,
description: `Posts about music on ${PUBLIC_MASTODON_INSTANCE_DISPLAY_NAME}`,
id: baseUrl,
link: baseUrl,
language: 'en',
//image: "http://example.com/image.png",
//favicon: "http://example.com/favicon.ico",
copyright: '',
generator: 'moshing-mamut',
feedLinks: {
atom: `${BASE_URL}/feed.xml`
},
hub: hub,
author: {
name: '@aymm',
link: 'https://metalhead.club/@aymm'
}
});
posts.forEach((p) => {
feed.addItem({
title: p.content,
id: p.url,
link: p.url,
content: p.content,
author: [
{
name: p.account.acct,
link: p.account.url
}
],
date: new Date(p.created_at)
});
});
feed.addCategory('Music');
return feed;
}
export async function saveAtomFeed(feed: Feed) {
await fs.writeFile('feed.xml', feed.atom1(), { encoding: 'utf8' });
if (!WEBSUB_HUB) {
return;
}
try {
const params = new URLSearchParams();
params.append('hub.mode', 'publish');
params.append('hub.url', `${BASE_URL}/feed.xml`);
await fetch(WEBSUB_HUB, {
method: 'POST',
body: params
});
} catch (e) {
log.error('Failed to update WebSub hub', e);
}
}