rsshub
Version:
Make RSS Great Again!
86 lines (74 loc) • 2.84 kB
text/typescript
import { Data, DataItem, Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
import { Context } from 'hono';
export const route: Route = {
path: '/:category?/:order?',
categories: ['game'],
example: '/gamer520/switchyouxi',
parameters: {
category: '分类,见下表',
order: '排序,发布日期: date; 修改日期: modified',
},
features: {
antiCrawler: true,
},
name: '文章',
maintainers: ['xzzpig'],
handler,
url: 'www.gamer520.com/',
description: `分类
| 所有 | Switch 游戏下载 | 金手指 | 3A 巨作 | switch 主题 | PC 游戏 |
| ---- | --------------- | ---------- | ------- | ----------- | ------- |
| all | switchyouxi | jinshouzhi | 3ajuzuo | zhuti | pcgame |`,
};
interface Post {
id: number;
guid: { rendered: string };
title: { rendered: string };
date_gmt: string;
modified_gmt: string;
categories?: number[];
content: { rendered: string };
}
interface Category {
id: number;
name: string;
link: string;
slug: string;
}
async function getCategories(baseUrl: string): Promise<Category[]> {
return (await cache.tryGet('gamer520:categories', async () => {
const { data } = await got(`${baseUrl}/wp-json/wp/v2/categories`);
return data.map((category) => ({ slug: category.slug, id: category.id, name: category.name, link: category.link }));
})) as Category[];
}
async function handler(ctx: Context): Promise<Data> {
const baseUrl = 'https://www.gamer520.com';
const categories = await getCategories(baseUrl);
const category = ctx.req.param('category') ?? 'all';
const order = ctx.req.param('order');
const categoryId = categories.find((c) => c.slug === category)?.id;
const { data } = (await got(`${baseUrl}/wp-json/wp/v2/posts`, {
searchParams: {
categories: categoryId,
orderby: order,
per_page: ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit') as string) : undefined,
},
})) as unknown as { data: Post[] };
const items: DataItem[] = data.map((item) => ({
guid: `gamer520:${item.id}`,
title: item.title.rendered,
link: item.guid.rendered,
pubDate: parseDate(item.date_gmt),
updated: parseDate(item.modified_gmt),
category: item.categories?.map((c) => categories.find((ca) => ca.id === c)?.name ?? '').filter((c) => c !== '') ?? [],
description: item.content.rendered,
}));
return {
title: '全球游戏交流中心-' + (categories.find((c) => c.slug === category)?.name ?? '所有'),
link: categories.find((c) => c.slug === category)?.link ?? baseUrl,
item: items,
};
}