2021-01-05 15:25:09 +00:00
|
|
|
/**
|
|
|
|
* Copyright (C) 2019-2021 Carl Kittelberger <icedream@icedream.pw>
|
|
|
|
*
|
|
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2020-08-22 20:25:57 +00:00
|
|
|
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 () => {};
|