UNPKG

rsshub

Version:
117 lines (115 loc) 4.41 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.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 { load } from "cheerio"; //#region lib/routes/sustainabilitymag/articles.ts const route = { path: "/articles", name: "Articles", url: "sustainabilitymag.com/articles", maintainers: ["mintyfrankie"], categories: ["other"], example: "/sustainabilitymag/articles", radar: [{ source: ["https://sustainabilitymag.com/articles"], target: "/sustainabilitymag/articles" }], features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, handler }; const findLargestImgKey = (images) => Object.keys(images).filter((key) => key.startsWith("inline_free_") || key.startsWith("hero_landscape_")).toSorted((a, b) => Number.parseInt(b.split("_")[2]) - Number.parseInt(a.split("_")[2]))[0]; const renderFigure = (url, caption) => `<figure><img src="${url}" alt="${caption}" /><figcaption>${caption}</figcaption></figure>`; const render = (widgets) => widgets.map((w) => { switch (w.type) { case "text": return w.html; case "blockquote": return `<blockquote>${w.html}</blockquote>`; case "keyFacts": return `<div><ul>${w.keyFacts.map((k) => `<li>${k.text}</li>`).join("")}</ul></div>`; case "inlineVideo": return w.provider === "youtube" ? `<iframe id="ytplayer" type="text/html" width="640" height="360" src="https://www.youtube-nocookie.com/embed/${w.videoId}" frameborder="0" allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe>` : /* @__PURE__ */ new Error(`Unhandled inlineVideo provider: ${w.provider}`); case "inlineImage": return w.inlineImageImages.map((image) => { const i = image.images[findLargestImgKey(image.images)][0]; return renderFigure(i.url, i.caption); }).join(""); default: throw new Error(`Unhandled widget type: ${w.type}`); } }).join(""); async function handler() { const baseURL = `https://sustainabilitymag.com`; const feedURL = `${baseURL}/articles`; const feedLang = "en"; const feedDescription = "Sustainability Magazine Articles"; const requestEndpoint = `${baseURL}/graphql`; const requestBody = JSON.stringify({ query: `query PaginatedQuery($url: String!, $page: Int = 1, $widgetType: String!) { paginatedWidget(url: $url, widgetType: $widgetType) { ... on SimpleArticleGridWidget { articles(page: $page) { results { _id headline fullUrlPath featured category contentType tags { tag } attribution subAttribution sell images { thumbnail_widescreen_553 { url } } } } } } }`, operationName: "PaginatedQuery", variables: { widgetType: "simpleArticleGrid", page: 1, url: "https://sustainabilitymag.com/articles" } }); const list = (await ofetch_default(requestEndpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: requestBody })).data.paginatedWidget.articles.results.map((item) => ({ title: item.headline, link: `${baseURL}${item.fullUrlPath}`, image: item.images?.thumbnail_widescreen_553?.url, category: item.category })); const items = await Promise.all(list.map((item) => cache_default.tryGet(item.link, async () => { const $ = load(await ofetch_default(item.link)); const article = JSON.parse($("script#__NEXT_DATA__").text()).props.pageProps.article; item.pubDate = parseDate(article.displayDate); item.author = article.author.name; const heroImage = article.images[findLargestImgKey(article.images)][0]; item.description = renderFigure(heroImage.url, heroImage.caption) + render(article.body.widgets); return item; }))); return { title: "Sustainability Magazine Articles", language: feedLang, description: feedDescription, link: `https://${feedURL}`, item: items }; } //#endregion export { route };