rsshub
Version:
Make RSS Great Again!
69 lines (62 loc) • 2.09 kB
text/typescript
import { Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { getBuildId, getData } from './utils';
import { parseDate } from '@/utils/parse-date';
export const route: Route = {
path: '/category/:category',
categories: ['new-media'],
example: '/aeon/category/philosophy',
parameters: {
category: {
description: 'Category',
options: [
{ value: 'philosophy', label: 'Philosophy' },
{ value: 'science', label: 'Science' },
{ value: 'psychology', label: 'Psychology' },
{ value: 'society', label: 'Society' },
{ value: 'culture', label: 'Culture' },
],
},
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['aeon.co/:category'],
},
],
name: 'Categories',
maintainers: ['emdoe'],
handler,
};
async function handler(ctx) {
const category = ctx.req.param('category').toLowerCase();
const url = `https://aeon.co/category/${category}`;
const buildId = await getBuildId();
const response = await ofetch(`https://aeon.co/_next/data/${buildId}/${category}.json`);
const section = response.pageProps.section;
const list = section.articles.edges.map(({ node }) => ({
title: node.title,
description: node.standfirstLong,
author: node.authors.map((author) => author.displayName).join(', '),
link: `https://aeon.co/${node.type}s/${node.slug}`,
pubDate: parseDate(node.createdAt),
category: [node.section.title, ...node.topics.map((topic) => topic.title)],
image: node.image.url,
type: node.type,
slug: node.slug,
}));
const items = await getData(list);
return {
title: `AEON | ${section.title}`,
link: url,
description: section.metaDescription,
item: items,
};
}