feat(route): Add gamer520(全球游戏交流中心) (#14909)
* feat(route): Add gamer520(全球游戏交流中心) * feat(route): gamer520 change to use wordpress api * feat(route): gamer520 load categories via wp api & apply suggestions from code review * fix: typing ---------
This commit is contained in:
parent
24020bb6ba
commit
f1b8eb3cbc
|
|
@ -0,0 +1,85 @@
|
|||
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,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
import type { Namespace } from '@/types';
|
||||
|
||||
export const namespace: Namespace = {
|
||||
name: '全球游戏交流中心',
|
||||
url: 'www.gamer520.com',
|
||||
};
|
||||
Loading…
Reference in New Issue