rsshub
Version:
Make RSS Great Again!
173 lines (172 loc) • 7.71 kB
JavaScript
import { t as rofetch } from "./ofetch-C3ts-Hud.mjs";
import "./types-DNj6Etbg.mjs";
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs";
import { load } from "cheerio";
//#region lib/routes/lemonde/en.ts
const ROOT_URL = "https://www.lemonde.fr/en";
const feedMap = {
"": `${ROOT_URL}/rss/une.xml`,
international: `${ROOT_URL}/international/rss_full.xml`,
americas: `${ROOT_URL}/americas/rss_full.xml`,
"united-kingdom": `${ROOT_URL}/united-kingdom/rss_full.xml`,
"united-states": `${ROOT_URL}/united-states/rss_full.xml`,
africa: `${ROOT_URL}/le-monde-africa/rss_full.xml`,
"asia-pacific": `${ROOT_URL}/asia-and-pacific/rss_full.xml`,
"middle-east": `${ROOT_URL}/middle-east/rss_full.xml`,
europe: `${ROOT_URL}/europe/rss_full.xml`,
politics: `${ROOT_URL}/politics/rss_full.xml`,
"police-and-justice": `${ROOT_URL}/police-and-justice/rss_full.xml`,
education: `${ROOT_URL}/education/rss_full.xml`,
"french-delights": `${ROOT_URL}/french-delights/rss_full.xml`,
environment: `${ROOT_URL}/environment/rss_full.xml`,
economy: `${ROOT_URL}/economy/rss_full.xml`,
"world-economy": `${ROOT_URL}/world-economy/rss_full.xml`,
"french-economy": `${ROOT_URL}/french-economy/rss_full.xml`,
"m-le-mag": `${ROOT_URL}/m-le-mag/rss_full.xml`,
lifestyle: `${ROOT_URL}/lifestyle/rss_full.xml`,
fashion: `${ROOT_URL}/fashion/rss_full.xml`,
food: `${ROOT_URL}/food/rss_full.xml`,
travel: `${ROOT_URL}/travel/rss_full.xml`,
culture: `${ROOT_URL}/culture/rss_full.xml`,
arts: `${ROOT_URL}/arts/rss_full.xml`,
cinema: `${ROOT_URL}/cinema/rss_full.xml`,
music: `${ROOT_URL}/music/rss_full.xml`,
books: `${ROOT_URL}/books/rss_full.xml`,
"global-issues": `${ROOT_URL}/global-issues/rss_full.xml`,
pixels: `${ROOT_URL}/pixels/rss_full.xml`,
"artificial-intelligence": `${ROOT_URL}/artificial-intelligence/rss_full.xml`,
"social-media": `${ROOT_URL}/social-media/rss_full.xml`,
sports: `${ROOT_URL}/sports/rss_full.xml`,
football: `${ROOT_URL}/football/rss_full.xml`,
rugby: `${ROOT_URL}/rugby/rss_full.xml`,
tennis: `${ROOT_URL}/tennis/rss_full.xml`,
cycling: `${ROOT_URL}/cycling/rss_full.xml`,
basketball: `${ROOT_URL}/basketball/rss_full.xml`,
science: `${ROOT_URL}/science/rss_full.xml`,
health: `${ROOT_URL}/health/rss_full.xml`,
intimacy: `${ROOT_URL}/intimacy/rss_full.xml`,
"les-decodeurs": `${ROOT_URL}/les-decodeurs/rss_full.xml`,
"our-times": `${ROOT_URL}/our-times/rss_full.xml`,
obituaries: `${ROOT_URL}/obituaries/rss_full.xml`,
religion: `${ROOT_URL}/religion/rss_full.xml`,
opinion: `${ROOT_URL}/opinion/rss_full.xml`,
editorials: `${ROOT_URL}/editorials/rss_full.xml`,
columns: `${ROOT_URL}/columns/rss_full.xml`,
"op-eds": `${ROOT_URL}/op-eds/rss_full.xml`
};
const route = {
path: "/en/:category?",
categories: ["traditional-media"],
example: "/lemonde/en",
view: 0,
parameters: { category: {
description: "Category slug, see table below. Defaults to homepage.",
default: ""
} },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{
source: ["lemonde.fr/en/:category"],
target: "/en/:category"
}],
name: "News (English)",
maintainers: ["mlkgrnt"],
handler,
description: `| Category | Description |
| ----------------------- | ------------------------- |
| (empty) | Homepage / Top stories |
| international | World – International |
| americas | World – Americas |
| united-kingdom | World – United Kingdom |
| united-states | World – United States |
| africa | World – Africa |
| asia-pacific | World – Asia Pacific |
| middle-east | World – Middle East |
| europe | Europe |
| politics | France – French Politics |
| police-and-justice | France – French Justice |
| education | France – French Education |
| french-delights | France – French Delights |
| environment | Environment |
| economy | Economy |
| world-economy | Economy – World Economy |
| french-economy | Economy – French Economy |
| m-le-mag | M Magazine |
| lifestyle | M Magazine – Lifestyle |
| fashion | M Magazine – Fashion |
| food | M Magazine – Food |
| travel | M Magazine – Travel |
| culture | Culture |
| arts | Culture – Art |
| cinema | Culture – Cinema |
| music | Culture – Music |
| books | Culture – Books |
| global-issues | Global Issues |
| pixels | Pixels |
| artificial-intelligence | Pixels – AI |
| social-media | Pixels – Social Media |
| sports | Sports |
| football | Sports – Football |
| rugby | Sports – Rugby |
| tennis | Sports – Tennis |
| cycling | Sports – Cycling |
| basketball | Sports – Basketball |
| science | Science |
| health | Health |
| intimacy | Intimacy |
| les-decodeurs | Les Décodeurs |
| our-times | Our Times |
| obituaries | Obituaries |
| religion | Religion |
| opinion | Opinion |
| editorials | Opinion – Editorials |
| columns | Opinion – Columns |
| op-eds | Opinion – Op-Eds |`
};
async function handler(ctx) {
const category = ctx.req.param("category") ?? "";
const feedUrl = feedMap[category];
if (!feedUrl) throw new Error(`Invalid category: ${category}`);
const $ = load(await rofetch(feedUrl), { xml: true });
const channel = $("channel");
const feedTitle = channel.children("title").text();
const feedLink = channel.children("link").text() || ROOT_URL;
const limit = ctx.req.query("limit") ? Number(ctx.req.query("limit")) : 20;
const items = $("item").toArray().slice(0, limit).map((el) => {
const item = $(el);
const link = item.children("link").text() || item.children("guid").text();
const title = item.children("title").text();
const pubDateText = item.children("pubDate").text();
const summary = item.children("description").text();
const categoryList = item.children("category").toArray().map((c) => $(c).text()).filter(Boolean);
const imageUrl = item.find(String.raw`media\:content`).attr("url");
const imageCredit = item.find(String.raw`media\:credit`).text();
let description = "";
if (imageUrl) description += `<img src="${imageUrl}" />`;
if (imageCredit) description += `<p><em>${imageCredit}</em></p>`;
if (summary) description += summary;
return {
title,
link,
pubDate: pubDateText ? parseDate(pubDateText) : void 0,
description,
category: categoryList,
guid: link
};
}).filter((item) => item.link);
return {
title: feedTitle || "Le Monde in English",
link: feedLink,
description: feedTitle || "Le Monde in English",
language: "en",
item: items
};
}
//#endregion
export { route };