rsshub
Version:
Make RSS Great Again!
247 lines (235 loc) • 9.84 kB
JavaScript
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import { t as ViewType } from "./types-D84BRIt4.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import { t as art } from "./render-BQo6B4tL.mjs";
import path from "node:path";
import { load } from "cheerio";
//#region lib/routes/reuters/common.ts
init_esm_shims();
const route = {
path: "/:category/:topic?",
categories: ["traditional-media"],
view: ViewType.Articles,
example: "/reuters/world/us",
parameters: {
category: {
description: "find it in the URL, or tables below",
options: [
{
value: "world",
label: "World"
},
{
value: "business",
label: "Business"
},
{
value: "legal",
label: "Legal"
},
{
value: "markets",
label: "Markets"
},
{
value: "breakingviews",
label: "Breakingviews"
},
{
value: "technology",
label: "Technology"
},
{
value: "graphics",
label: "Graphics"
},
{
value: "authors",
label: "Authors"
}
],
default: "world"
},
topic: "find it in the URL, or tables below, leave empty for `All`"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{ source: ["reuters.com/:category/:topic?", "reuters.com/"] }],
name: "Category/Topic/Author",
maintainers: [
"LyleLee",
"HenryQW",
"proletarius101",
"black-desk",
"nczitzk",
"pseudoyu"
],
handler,
description: `- \`:category\`:
| World | Business | Legal | Markets | Breakingviews | Technology | Graphics |
| ----- | -------- | ----- | ------- | ------------- | ---------- | -------- |
| world | business | legal | markets | breakingviews | technology | graphics |
- \`world/:topic\`:
| All | Africa | Americas | Asia Pacific | China | Europe | India | Middle East | United Kingdom | United States | The Great Reboot | Reuters Next |
| --- | ------ | -------- | ------------ | ----- | ------ | ----- | ----------- | -------------- | ------------- | ---------------- | ------------ |
| | africa | americas | asia-pacific | china | europe | india | middle-east | uk | us | the-great-reboot | reuters-next |
- \`business/:topic\`:
| All | Aerospace & Defense | Autos & Transportation | Energy | Environment | Finance | Healthcare & Pharmaceuticals | Media & Telecom | Retail & Consumer | Sustainable Business | Charged | Future of Health | Future of Money | Take Five | Reuters Impact |
| --- | ------------------- | ---------------------- | ------ | ----------- | ------- | ---------------------------- | --------------- | ----------------- | -------------------- | ------- | ---------------- | --------------- | --------- | -------------- |
| | aerospace-defense | autos-transportation | energy | environment | finance | healthcare-pharmaceuticals | media-telecom | retail-consumer | sustainable-business | charged | future-of-health | future-of-money | take-five | reuters-impact |
- \`legal/:topic\`:
| All | Government | Legal Industry | Litigation | Transactional |
| --- | ---------- | -------------- | ---------- | ------------- |
| | government | legalindustry | litigation | transactional |
- \`authors/:topic\`:
| Default | Jonathan Landay | any other authors |
| ------- | --------------- | ----------------- |
| reuters | jonathan-landay | their name in URL |
More could be found in the URL of the category/topic page.`
};
async function handler(ctx) {
const MUST_FETCH_BY_TOPICS = new Set(["authors", "tags"]);
const CAN_USE_SOPHI = ["world"];
const category = ctx.req.param("category");
const topic = ctx.req.param("topic") ?? (category === "authors" ? "reuters" : "");
const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 20;
const useSophi = ctx.req.query("sophi") === "true" && topic !== "" && CAN_USE_SOPHI.includes(category);
const section_id = `/${category}/${topic ? `${topic}/` : ""}`;
const browserHeaders = {
Accept: "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
Referer: "https://www.reuters.com/"
};
try {
const { title, description, rootUrl, response } = await (async () => {
if (MUST_FETCH_BY_TOPICS.has(category)) {
const rootUrl$1 = "https://www.reuters.com/pf/api/v3/content/fetch/articles-by-topic-v1";
const response$1 = await ofetch_default(rootUrl$1, {
query: { query: JSON.stringify({
offset: 0,
size: limit,
topic_url: section_id,
website: "reuters"
}) },
headers: browserHeaders
});
return {
title: `${response$1.result.topics[0].name} | Reuters`,
description: response$1.result.topics[0].entity_id,
rootUrl: rootUrl$1,
response: response$1
};
} else {
const rootUrl$1 = "https://www.reuters.com/pf/api/v3/content/fetch/articles-by-section-alias-or-id-v1";
const response$1 = await ofetch_default(rootUrl$1, {
query: { query: JSON.stringify({
offset: 0,
size: limit,
section_id,
website: "reuters",
...useSophi ? {
fetch_type: "sophi",
sophi_page: "*",
sophi_widget: "topic"
} : {}
}) },
headers: browserHeaders
});
return {
title: response$1.result.section.title,
description: response$1.result.section.section_about,
rootUrl: rootUrl$1,
response: response$1
};
}
})();
let items = response.result.articles.map((e) => ({
title: e.title,
link: new URL(e.canonical_url, rootUrl).href,
guid: e.id,
pubDate: parseDate(e.published_time),
updated: parseDate(e.updated_time),
author: e.authors.map((e$1) => e$1.name).join(", "),
category: e.kicker.names,
description: e.description
}));
items = items.filter((e, i) => items.findIndex((f) => e.guid === f.guid) === i);
items = (await Promise.allSettled(items.map((item) => ctx.req.query("fulltext") === "true" ? cache_default.tryGet(item.link, async () => {
const detailResponse = await ofetch_default(item.link, { headers: browserHeaders });
const content = load(detailResponse.data);
if (detailResponse.url.startsWith("https://www.reuters.com/investigates/")) {
const ldJson = JSON.parse(content("script[type=\"application/ld+json\"]").text());
content(".special-report-article-container .container, #slide-dek, #slide-end, .share-in-article-container").remove();
item.title = ldJson.headline;
item.pubDate = parseDate(ldJson.dateCreated);
item.author = ldJson.creator;
item.category = ldJson.keywords;
item.description = content(".special-report-article-container").html();
return item;
}
const matches = content("script#fusion-metadata").text().match(/Fusion.globalContent=({[\S\s]*?});/);
if (matches) {
const data = JSON.parse(matches[1]);
item.title = data.result.title || item.title;
item.description = art(path.join(__dirname, "templates/description-073fbea1.art"), { result: data.result });
item.pubDate = parseDate(data.result.display_time);
item.author = data.result.authors.map((author) => author.name).join(", ");
item.category = data.result.taxonomy.keywords;
return item;
}
content(".title").remove();
content(".article-metadata").remove();
item.title = content("meta[property=\"og:title\"]").attr("content");
item.pubDate = parseDate(detailResponse.data.match(/"datePublished":"(.*?)","dateModified/)[1]);
item.author = detailResponse.data.match(/{"@type":"Person","name":"(.*?)"}/g).map((p) => p.match(/"name":"(.*?)"/)[1]).join(", ");
item.description = content("article").html();
return item;
}) : item))).filter((r) => r.status === "fulfilled").map((r) => r.value);
return {
title,
description,
image: "https://www.reuters.com/pf/resources/images/reuters/logo-vertical-default-512x512.png?d=116",
link: `https://www.reuters.com${section_id}`,
item: items
};
} catch {
const arcResponse = await ofetch_default(topic ? `https://www.reuters.com/arc/outboundfeeds/v4/mobile/section${section_id}?outputType=json` : `https://www.reuters.com/arc/outboundfeeds/v4/mobile/section/${category}/?outputType=json`, { headers: browserHeaders });
if (arcResponse.wireitems?.length) {
const items = arcResponse.wireitems.map((item) => {
const story = item.templates.find((t) => t.template === "story_with_image")?.story;
if (!story) return null;
return {
title: story.hed,
link: item.templates.find((t) => t.template === "story_with_image")?.template_action?.url,
guid: story.usn,
pubDate: parseDate(story.updated_at),
updated: parseDate(story.updated_at),
description: story.lede,
author: story.authors?.map((author) => author.name).join(", "),
category: [arcResponse.analytics?.topic_channel, arcResponse.analytics?.topic_sub_channel].filter(Boolean)
};
}).filter(Boolean);
return {
title: arcResponse.analytics?.title || `${arcResponse.wire_name} | Reuters`,
description: arcResponse.analytics?.content_title,
image: "https://www.reuters.com/pf/resources/images/reuters/logo-vertical-default-512x512.png?d=116",
link: arcResponse.canonical_action?.url || `https://www.reuters.com${section_id}`,
category: [arcResponse.analytics?.topic_channel, arcResponse.analytics?.topic_sub_channel].filter(Boolean),
item: items.slice(0, limit)
};
}
}
}
//#endregion
export { route };