/** * Copyright (C) 2019-2021 Carl Kittelberger * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ 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 () => {};