From ad135816fb71e5c149b4877b01f26dd95019cf3d Mon Sep 17 00:00:00 2001 From: mocusez Date: Tue, 16 Jul 2024 23:24:55 +0800 Subject: [PATCH] feat(route): add route for DuckDB news (#16183) * feat(route): add route for DuckDB news * fix(route): fix the missing of full content and author of DuckDB news --- lib/routes/duckdb/namespace.ts | 6 ++++ lib/routes/duckdb/news.ts | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lib/routes/duckdb/namespace.ts create mode 100644 lib/routes/duckdb/news.ts diff --git a/lib/routes/duckdb/namespace.ts b/lib/routes/duckdb/namespace.ts new file mode 100644 index 0000000000..f3341352e4 --- /dev/null +++ b/lib/routes/duckdb/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'DuckDB Foundation', + url: 'duckdb.org', +}; diff --git a/lib/routes/duckdb/news.ts b/lib/routes/duckdb/news.ts new file mode 100644 index 0000000000..d4cde64a9f --- /dev/null +++ b/lib/routes/duckdb/news.ts @@ -0,0 +1,65 @@ +import { Route } from '@/types'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import { parseDate } from '@/utils/parse-date'; +import timezone from '@/utils/timezone'; +import cache from '@/utils/cache'; + +export const route: Route = { + path: '/news', + categories: ['programming'], + example: '/duckdb/news', + parameters: {}, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '新闻', + maintainers: ['mocusez'], + handler, +}; + +async function handler() { + const baseUrl = 'https://duckdb.org/news/'; + const { data: response } = await got(baseUrl); + const $ = load(response); + + const list = $('.postpreview') + // 使用“toArray()”方法将选择的所有 DOM 元素以数组的形式返回。 + .toArray() + // 使用“map()”方法遍历数组,并从每个元素中解析需要的数据。 + .map((item) => { + item = $(item); + return { + title: item.find('h3').text().trim(), + link: `https://duckdb.org${item.find('a').eq(2).attr('href')}`, + pubDate: timezone(parseDate(item.find('.date').text(), 'YYYY-MM-DD'), 0), + }; + }); + + const items = await Promise.all( + list.map((item) => + cache.tryGet(item.link, async () => { + const response = await got(item.link); + const $ = load(response.body); + item.author = $('.author').text(); + item.description = $('.singleentry').html(); + + // 上面每个列表项的每个属性都在此重用, + // 并增加了一个新属性“description” + return item; + }) + ) + ); + + return { + // 在此处输出您的 RSS + title: 'DuckDB News', + link: baseUrl, + item: items, + }; +}