63 lines
1.4 KiB
TypeScript
63 lines
1.4 KiB
TypeScript
import { GetServerSideProps } from 'next';
|
|
import { create } from 'xmlbuilder2';
|
|
import { getIndex, getVideos } from '../util/api';
|
|
import sanitizeTitle from '../util/sanitizeTitle';
|
|
|
|
const urlsetNamespace = 'http://www.sitemaps.org/schemas/sitemap/0.9';
|
|
|
|
export const getServerSideProps: GetServerSideProps = async (ctx) => {
|
|
const { req, res } = ctx;
|
|
|
|
const { ids } = await getIndex();
|
|
|
|
const basePath = `https://${req.headers.host}`;
|
|
|
|
const url = [
|
|
{
|
|
loc: basePath,
|
|
},
|
|
];
|
|
|
|
const results = await Promise.all(
|
|
ids.map(async ({ id }) => {
|
|
const vodInfo = await getVideos(id);
|
|
const { lastUpdatedAt, videos } = vodInfo;
|
|
return [
|
|
{
|
|
loc: `${basePath}/${id}`,
|
|
lastmod: lastUpdatedAt,
|
|
},
|
|
...videos.map(({
|
|
title,
|
|
}) => ({
|
|
loc: `${basePath}/${id}/${sanitizeTitle(title)}`,
|
|
lastmod: lastUpdatedAt,
|
|
})),
|
|
];
|
|
}, url),
|
|
);
|
|
|
|
url.push(
|
|
...(results
|
|
.reduce((old, current) => [...old, ...current], [])),
|
|
);
|
|
|
|
const root = create({ version: '1.0' })
|
|
.ele(urlsetNamespace, 'urlset')
|
|
.ele({
|
|
url,
|
|
})
|
|
.doc();
|
|
|
|
// convert the XML tree to string
|
|
const xml = root.end({ prettyPrint: true });
|
|
res.setHeader('Content-Type', 'text/xml');
|
|
res.write(xml);
|
|
res.end();
|
|
return {
|
|
props: {},
|
|
};
|
|
};
|
|
|
|
export default () => {};
|