rsshub
Version:
Make RSS Great Again!
107 lines (106 loc) • 3.79 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/index.ts
const ROOT_URL = "https://www.lemonde.fr";
const feedMap = {
"": `${ROOT_URL}/rss/une.xml`,
international: `${ROOT_URL}/international/rss_full.xml`,
politique: `${ROOT_URL}/politique/rss_full.xml`,
economie: `${ROOT_URL}/economie/rss_full.xml`,
societe: `${ROOT_URL}/societe/rss_full.xml`,
culture: `${ROOT_URL}/culture/rss_full.xml`,
sport: `${ROOT_URL}/sport/rss_full.xml`,
planete: `${ROOT_URL}/planete/rss_full.xml`,
pixels: `${ROOT_URL}/pixels/rss_full.xml`,
sciences: `${ROOT_URL}/sciences/rss_full.xml`,
idees: `${ROOT_URL}/idees/rss_full.xml`,
sante: `${ROOT_URL}/sante/rss_full.xml`,
em: `${ROOT_URL}/em/rss_full.xml`,
"en-continu": `${ROOT_URL}/en-continu/rss_full.xml`,
decodeurs: `${ROOT_URL}/decodeurs/rss_full.xml`
};
const route = {
path: "/:category?",
categories: ["traditional-media"],
example: "/lemonde",
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/:category"],
target: "/:category"
}],
name: "News",
maintainers: ["mlkgrnt"],
handler,
description: `| Category | Description |
| ------------- | ---------------------- |
| (empty) | Homepage / Top stories |
| international | International |
| politique | Politics |
| economie | Economy |
| societe | Society |
| culture | Culture |
| sport | Sports |
| planete | Environment |
| pixels | Tech / Digital |
| sciences | Sciences |
| idees | Opinions |
| sante | Health |
| em | M le mag |
| en-continu | Live / Breaking |
| decodeurs | Fact-checking |`
};
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",
link: feedLink,
description: feedTitle || "Le Monde",
language: "fr",
item: items
};
}
//#endregion
export { route };