From ad2ff17a0d7e18165395dc594007130030313e21 Mon Sep 17 00:00:00 2001 From: Ou Date: Mon, 7 Oct 2024 22:35:50 +0800 Subject: [PATCH] feat: new sources --- server/sources/index.ts | 11 ++++++++--- server/sources/ithome.ts | 32 ++++++++++++++++++++++++++++++++ server/sources/v2ex.ts | 30 ++++++++++++++++++++++++++++++ server/sources/zaobao.ts | 10 ++-------- 4 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 server/sources/ithome.ts create mode 100644 server/sources/v2ex.ts diff --git a/server/sources/index.ts b/server/sources/index.ts index 89ca97f..c372d12 100644 --- a/server/sources/index.ts +++ b/server/sources/index.ts @@ -1,16 +1,21 @@ import type { NewsItem, SourceID } from "@shared/types" import weibo from "./weibo" import zaobao from "./zaobao" +import v2ex from "./v2ex" +import ithome from "./ithome" export const sourcesFn = { + weibo, + zaobao, + v2ex, + ithome, "peopledaily": defineRSSSource("https://feedx.net/rss/people.xml", { hiddenDate: true, }), - weibo, + "sputniknewscn": defineRSSHubSource("/sputniknews/news/chinese"), "douyin": defineFallbackSource("douyin"), - zaobao, + "aljazeeracn": defineRSSSource("https://feedx.net/rss/aljazeera.xml"), "toutiao": defineFallbackSource("toutiao"), "wallstreetcn": defineRSSHubSource("/wallstreetcn/live"), "36kr-quick": defineRSSHubSource("/36kr/newsflashes"), - // "36kr": kr, } as Record Promise> diff --git a/server/sources/ithome.ts b/server/sources/ithome.ts new file mode 100644 index 0000000..ea96fc6 --- /dev/null +++ b/server/sources/ithome.ts @@ -0,0 +1,32 @@ +import * as cheerio from "cheerio" +import type { NewsItem } from "@shared/types" +import { $fetch } from "ofetch" + +export default defineSource(async () => { + const response = await $fetch("https://www.ithome.com/list/") + const $ = cheerio.load(response) + const $main = $("#list > div.fl > ul > li") + const news: NewsItem[] = [] + $main.each((_, el) => { + const $el = $(el) + const $a = $el.find("a.t") + const url = $a.attr("href") + const title = $a.text() + const date = $(el).find("i").text() + if (url && title && date) { + const isAd = url?.includes("lapin") || ["神券", "优惠", "补贴", "京东"].find(k => title.includes(k)) + if (!isAd) { + news.push({ + url, + title, + id: url, + extra: { + date: tranformToUTC(date), + }, + }) + } + } + }) + return news.sort((m, n) => n.extra!.date > m.extra!.data ? 1 : -1) + .slice(0, 20) +}) diff --git a/server/sources/v2ex.ts b/server/sources/v2ex.ts new file mode 100644 index 0000000..9ba0c38 --- /dev/null +++ b/server/sources/v2ex.ts @@ -0,0 +1,30 @@ +interface Res { + version: string + title: string + description: string + home_page_url: string + feed_url: string + icon: string + favicon: string + items: { + url: string + date_modified?: string + content_html: string + date_published: string + title: string + id: string + }[] +} + +export default defineSource(async () => { + const res = await Promise.all(["create", "ideas", "programmer", "share"].map(k => $fetch(`https://www.v2ex.com/feed/${k}.json`) as Promise< Res>)) + if (!res?.[0]?.items?.length) throw new Error("Cannot fetch data") + return res.map(k => k.items).flat().map(k => ({ + id: k.id, + title: k.title, + extra: { + date: k.date_modified ?? k.date_published, + }, + url: k.url, + })).sort((m, n) => m.extra.date < n.extra.date ? 1 : -1).slice(0, 20) +}) diff --git a/server/sources/zaobao.ts b/server/sources/zaobao.ts index 720a6e4..e542c93 100644 --- a/server/sources/zaobao.ts +++ b/server/sources/zaobao.ts @@ -25,17 +25,11 @@ export default defineSource(async () => { title, id: url, extra: { - origin: date, + date: tranformToUTC(date), }, }) } }) - return news.sort((m, n) => n.extra!.origin > m.extra!.origin ? 1 : -1) + return news.sort((m, n) => n.extra!.date > m.extra!.date ? 1 : -1) .slice(0, 20) - .map(item => ({ - ...item, - extra: { - date: tranformToUTC(item.extra!.origin), - }, - })) })