rsshub
Version:
Make RSS Great Again!
86 lines (69 loc) • 2.77 kB
text/typescript
import got from '@/utils/got';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';
import zlib from 'node:zlib';
const constants = {
labelHot: '热门',
labelImportant: '重要消息',
defaultType: 'article',
};
const params = {
article: 'article',
event: 'timeline',
news: 'news',
};
const rootUrl = 'https://foresightnews.pro';
const apiRootUrl = 'https://api.foresightnews.pro';
const imgRootUrl = 'https://img.foresightnews.pro';
const icon = new URL('foresight.ico', rootUrl).href;
const image = new URL('vertical_logo.png', imgRootUrl).href;
const processItems = async (apiUrl, limit, ...parameters) => {
let searchParams = {
size: limit,
};
for (const param of parameters) {
searchParams = {
...searchParams,
...param,
};
}
const info = {
column: '',
};
const { data: response } = await got(apiUrl, {
searchParams,
});
let items = JSON.parse(String(zlib.inflateSync(Buffer.from(response.data?.list ?? response.data, 'base64'))));
items = (items?.list ?? items).slice(0, limit).map((item) => {
const sourceType = item.source_type ?? (item.source_link ? (item.column?.title ? 'article' : 'news') : item.event_type ? 'event' : constants.defaultType);
item = item.source_type ? item[item.source_type] : item;
const column = item.column?.title;
info.column = info.column || column;
const categories = [
column,
item.event_type,
item.is_hot ? constants.labelHot : undefined,
item.is_important ? (item.important_tag?.name ?? constants.labelImportant) : '',
item.label,
...(item.tags?.map((c) => c.name) ?? []),
].filter((v, index, self) => v && self.indexOf(v) === index);
const link = new URL(`${params[sourceType]}/detail/${item.id}`, rootUrl).href;
return {
title: item.title,
link,
description: art(path.join(__dirname, 'templates/description.art'), {
image: item.img.split('?')[0],
description: item.content ?? item.brief,
source: item.source_link,
}),
author: item.column?.title ?? item.author?.username ?? undefined,
category: categories,
guid: `foresightnews-${sourceType}#${item.id}`,
pubDate: item.published_at ? parseDate(item.published_at * 1000) : undefined,
updated: item.last_update_at ? parseDate(item.last_update_at * 1000) : undefined,
};
});
return { items, info };
};
export { icon, image, rootUrl, apiRootUrl, imgRootUrl, processItems };