Skip to content

Commit

Permalink
feat(route): add The.bi (#16356)
Browse files Browse the repository at this point in the history
  • Loading branch information
nczitzk authored Aug 5, 2024
1 parent d82efda commit 1f235e7
Show file tree
Hide file tree
Showing 4 changed files with 552 additions and 0 deletions.
210 changes: 210 additions & 0 deletions lib/routes/the/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
import { Route } from '@/types';
import { getCurrentPath } from '@/utils/helpers';
const __dirname = getCurrentPath(import.meta.url);

import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';

import { apiSlug, bakeFilterSearchParams, bakeFiltersWithPair, bakeUrl, fetchData, getFilterParamsForUrl, parseFilterStr } from './util';

export const handler = async (ctx) => {
const { filter } = ctx.req.param();
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50;

const rootUrl = 'https://the.bi/s';
const filters = parseFilterStr(filter);
const filtersWithPair = await bakeFiltersWithPair(filters, rootUrl);

const searchParams = bakeFilterSearchParams(filters, 'name', false);
const apiSearchParams = bakeFilterSearchParams(filtersWithPair, 'id', true);

apiSearchParams.append('_embed', 'true');
apiSearchParams.append('per_page', String(limit));

const apiUrl = bakeUrl(`${apiSlug}/posts`, rootUrl, apiSearchParams);
const currentUrl = bakeUrl(getFilterParamsForUrl(filtersWithPair) ?? '', rootUrl, searchParams);

const { data: response } = await got(apiUrl);

const items = response.slice(0, limit).map((item) => {
const terminologies = item._embedded['wp:term'];
const guid = item.guid?.rendered ?? item.guid;

const $$ = load(item.content?.rendered ?? item.content);

const image = $$('img#poster').prop('data-srcset');

$$('figure.graf').each((_, el) => {
el = $$(el);

const imgEl = el.find('img');

el.replaceWith(
art(path.join(__dirname, 'templates/description.art'), {
images: imgEl
? [
{
src: imgEl.prop('src'),
width: imgEl.prop('width'),
height: imgEl.prop('height'),
},
]
: undefined,
})
);
});

const title = $$('h1').text();
const intro = $$('h2').text();

$$('h1').parent().remove();

const description = art(path.join(__dirname, 'templates/description.art'), {
images: image
? [
{
src: image,
},
]
: undefined,
intro,
description: $$.html(),
});

return {
title: item.title?.rendered ?? item.title ?? title,
description,
pubDate: parseDate(item.date_gmt),
link: item.link,
category: [...new Set(terminologies.flat().map((c) => c.name))],
author: item._embedded.author.map((a) => a.name).join('/'),
guid,
id: guid,
content: {
html: description,
text: $$.text(),
},
updated: parseDate(item.modified_gmt),
};
});

const data = await fetchData(currentUrl, rootUrl);

return {
...data,
item: items,
};
};

export const route: Route = {
path: '/:filter{.+}?',
name: '分类',
url: 'the.bi',
maintainers: ['nczitzk'],
handler,
example: '/the',
parameters: { filter: '过滤器,见下方描述' },
description: `:::tip
如果你想订阅特定类别或标签,可以在路由中填写 filter 参数。\`/category/rawmw7dsta2jew\` 可以实现订阅 [剩余价值](https://the.bi/s/rawmw7dsta2jew) 类别。此时,路由是 [\`/the/category/rawmw7dsta2jew/\`](https://rsshub.app/the/category/rawmw7dsta2jew).
你还可以订阅多个类别。\`/category/rawmw7dsta2jew,rawbcvxkktdkq8/\` 可以实现同时订阅 [剩余价值](https://the.bi/s/rawmw7dsta2jew) 和 [打江山](https://the.bi/s/rawbcvxkktdkq8) 两个类别。此时,路由是 [\`/the/category/rawmw7dsta2jew,rawbcvxkktdkq8\`](https://rsshub.app/the/category/rawmw7dsta2jew,rawbcvxkktdkq8).
类别和标签也可以合并订阅。\`/category/rawmw7dsta2jew/tag/raweekl3na8trq\` 订阅 [剩余价值](https://the.bi/s/rawmw7dsta2jew) 类别和 [动物](https://the.bi/s/raweekl3na8trq) 标签。此时,路由是 [\`/the/category/rawmw7dsta2jew/tag/raweekl3na8trq\`](https://rsshub.app/the/category/rawmw7dsta2jew/tag/raweekl3na8trq).
你还可以搜索关键字。\`/search/中国\` 搜索关键字 [中国](https://the.bi/s/?s=中国)。在这种情况下,路径是 [\`/the/search/中国\`](https://rsshub.app/the/search/中国).
:::
| 分类 | ID |
| ---------------------------------------------- | ---------------------------------------------------------------- |
| [时局图](https://the.bi/s/rawj7o4ypewv94) | [rawj7o4ypewv94](https://rsshub.app/the/category/rawj7o4ypewv94) |
| [剩余价值](https://the.bi/s/rawmw7dsta2jew) | [rawmw7dsta2jew](https://rsshub.app/the/category/rawmw7dsta2jew) |
| [打江山](https://the.bi/s/rawbcvxkktdkq8) | [rawbcvxkktdkq8](https://rsshub.app/the/category/rawbcvxkktdkq8) |
| [中国经济](https://the.bi/s/raw4krvx85dh27) | [raw4krvx85dh27](https://rsshub.app/the/category/raw4krvx85dh27) |
| [水深火热](https://the.bi/s/rawtn8jpsc6uvv) | [rawtn8jpsc6uvv](https://rsshub.app/the/category/rawtn8jpsc6uvv) |
| [东升西降](https://the.bi/s/rawai5kd4z15il) | [rawai5kd4z15il](https://rsshub.app/the/category/rawai5kd4z15il) |
| [大局 & 大棋](https://the.bi/s/raw2efkzejrsx8) | [raw2efkzejrsx8](https://rsshub.app/the/category/raw2efkzejrsx8) |
| [境外势力](https://the.bi/s/rawmpalhnlphuc) | [rawmpalhnlphuc](https://rsshub.app/the/category/rawmpalhnlphuc) |
| [副刊](https://the.bi/s/rawxght2jr2u5z) | [rawxght2jr2u5z](https://rsshub.app/the/category/rawxght2jr2u5z) |
| [天高地厚](https://the.bi/s/rawrsnh9zakqdx) | [rawrsnh9zakqdx](https://rsshub.app/the/category/rawrsnh9zakqdx) |
| [Oyster](https://the.bi/s/rawdhl9hugdfn9) | [rawdhl9hugdfn9](https://rsshub.app/the/category/rawdhl9hugdfn9) |
`,
categories: ['new-media'],

features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportRadar: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['the.bi/s/:category?'],
target: (params) => {
const category = params.category;

return `/the${category ? `/category/${category}` : ''}`;
},
},
{
title: '时局图',
source: ['the.bi/s/rawj7o4ypewv94'],
target: '/category/rawj7o4ypewv94',
},
{
title: '剩余价值',
source: ['the.bi/s/rawmw7dsta2jew'],
target: '/category/rawmw7dsta2jew',
},
{
title: '打江山',
source: ['the.bi/s/rawbcvxkktdkq8'],
target: '/category/rawbcvxkktdkq8',
},
{
title: '中国经济',
source: ['the.bi/s/raw4krvx85dh27'],
target: '/category/raw4krvx85dh27',
},
{
title: '水深火热',
source: ['the.bi/s/rawtn8jpsc6uvv'],
target: '/category/rawtn8jpsc6uvv',
},
{
title: '东升西降',
source: ['the.bi/s/rawai5kd4z15il'],
target: '/category/rawai5kd4z15il',
},
{
title: '大局 & 大棋',
source: ['the.bi/s/raw2efkzejrsx8'],
target: '/category/raw2efkzejrsx8',
},
{
title: '境外势力',
source: ['the.bi/s/rawmpalhnlphuc'],
target: '/category/rawmpalhnlphuc',
},
{
title: '副刊',
source: ['the.bi/s/rawxght2jr2u5z'],
target: '/category/rawxght2jr2u5z',
},
{
title: '天高地厚',
source: ['the.bi/s/rawrsnh9zakqdx'],
target: '/category/rawrsnh9zakqdx',
},
{
title: 'Oyster',
source: ['the.bi/s/rawdhl9hugdfn9'],
target: '/category/rawdhl9hugdfn9',
},
],
};
8 changes: 8 additions & 0 deletions lib/routes/the/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: 'The.bi',
url: 'the.bi',
categories: ['new-media'],
description: '',
};
27 changes: 27 additions & 0 deletions lib/routes/the/templates/description.art
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{{ if images }}
{{ each images image }}
{{ if image?.src }}
<figure>
<img
{{ if image.alt }}
alt="{{ image.alt }}"
{{ /if }}
{{ if image.width }}
alt="{{ image.width }}"
{{ /if }}
{{ if image.height }}
alt="{{ image.height }}"
{{ /if }}
src="{{ image.src }}">
</figure>
{{ /if }}
{{ /each }}
{{ /if }}

{{ if intro }}
<blockquote>{{ intro }}</blockquote>
{{ /if }}

{{ if description }}
{{@ description }}
{{ /if }}
Loading

0 comments on commit 1f235e7

Please sign in to comment.