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 () => {};