UNPKG

rsshub

Version:
120 lines (116 loc) 4.57 kB
import "./esm-shims-CzJ_djXG.mjs"; import { t as config } from "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import "./helpers-DxBp0Pty.mjs"; import { r as getSubPath } from "./common-utils-vrWQFAEk.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { t as timezone } from "./timezone-D8cuwzTY.mjs"; import { load } from "cheerio"; import Parser from "rss-parser"; //#region lib/routes/nikkei/cn/index.ts const parser = new Parser({ customFields: { item: ["magnet"] }, headers: { "User-Agent": config.ua }, defaultRSS: .9 }); const route = { path: "/cn/*", name: "中文版新闻", example: "/nikkei/cn", maintainers: ["nczitzk"], handler, description: `::: tip 如 [中国 经济 日经中文网](https://cn.nikkei.com/china/ceconomy.html) 的 URL 为 \`https://cn.nikkei.com/china/ceconomy.html\` 对应路由为 [\`/nikkei/cn/cn/china/ceconomy\`](https://rsshub.app/nikkei/cn/cn/china/ceconomy) 如 [中國 經濟 日經中文網](https://zh.cn.nikkei.com/china/ceconomy.html) 的 URL 为 \`https://zh.cn.nikkei.com/china/ceconomy.html\` 对应路由为 [\`/nikkei/cn/zh/china/ceconomy\`](https://rsshub.app/nikkei/cn/zh/china/ceconomy) 特别地,当 \`path\` 填入 \`rss\` 后(如路由为 [\`/nikkei/cn/cn/rss\`](https://rsshub.app/nikkei/cn/cn/rss)),此时返回的是 [官方 RSS 的内容](https://cn.nikkei.com/rss.html) :::`, radar: [{ title: "中文版新闻", source: [ "cn.nikkei.com/:category/:type", "cn.nikkei.com/:category", "cn.nikkei.com/" ], target: (params) => { if (params.category && params.type) return `/nikkei/cn/cn/${params.category}/${params.type.replace(".html", "")}`; else if (params.category && !params.type) return `/nikkei/cn/cn/${params.category.replace(".html", "")}`; else return `/nikkei/cn/cn`; } }, { title: "中文版新聞", source: [ "zh.cn.nikkei.com/:category/:type", "zh.cn.nikkei.com/:category", "zh.cn.nikkei.com/" ], target: (params) => { if (params.category && params.type) return `/nikkei/cn/zh/${params.category}/${params.type.replace(".html", "")}`; else if (params.category && !params.type) return `/nikkei/cn/zh/${params.category.replace(".html", "")}`; else return `/nikkei/cn/zh`; } }] }; async function handler(ctx) { let language = ""; let path = getSubPath(ctx); if (/^\/cn\/(cn|zh)/.test(path)) { language = path.match(/^\/cn\/(cn|zh)/)[1]; path = path.match(/* @__PURE__ */ new RegExp(String.raw`\/cn\/` + language + "(.*)"))[1]; } else language = "cn"; const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 25; const rootUrl = `https://${language === "zh" ? "zh." : ""}cn.nikkei.com`; const isOfficialRSS = path === "/rss"; const currentUrl = `${rootUrl}${path}${isOfficialRSS ? ".html" : ""}`; let officialFeed; let items = [], $; if (isOfficialRSS) { officialFeed = await parser.parseURL(currentUrl); items = officialFeed.items.slice(0, limit).map((item) => ({ title: item.title, link: new URL(item.link, rootUrl).href })); } else { $ = load((await got_default({ method: "get", url: currentUrl })).data); const seenLinks = /* @__PURE__ */ new Set(); items = $("dt a").toArray().map((item) => { item = $(item); return { title: item.text(), link: new URL(item.attr("href"), currentUrl).href }; }).filter((item) => { if (seenLinks.has(item.link)) return false; seenLinks.add(item.link); return true; }).slice(0, limit); } items = await Promise.all(items.map((item) => cache_default.tryGet(item.link, async () => { const content = load((await got_default({ method: "get", url: `${item.link}?print=1` })).data); const divs = content("#contentDiv div"); divs.first().remove(); divs.last().remove(); item.pubDate = timezone(parseDate(item.link.match(/\/\d+-(.*?)\.html/)[1], "YYYY-MM-DD-HH-mm-ss"), 9); item.author = content("meta[name=\"author\"]").attr("content"); item.title = item.title ?? content("meta[name=\"twitter:title\"]").attr("content"); item.description = content("#contentDiv").html()?.replaceAll("&nbsp;", "").replaceAll("<p></p>", ""); return item; }))); return { title: isOfficialRSS ? officialFeed.title : $("title").first().text(), description: isOfficialRSS ? officialFeed.description : "", link: currentUrl, item: items }; } //#endregion export { route };