UNPKG

rsshub

Version:
91 lines (89 loc) 3.08 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import { t as logger_default } from "./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 rss_parser_default } from "./rss-parser-Dtop7M8f.mjs"; import { load } from "cheerio"; //#region lib/routes/decrypt/index.ts const route = { path: "/", categories: ["finance"], example: "/decrypt", parameters: {}, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, name: "News", maintainers: ["pseudoyu"], handler, radar: [{ source: ["decrypt.co/"], target: "/" }], description: "Get latest news from Decrypt." }; async function handler(ctx) { const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 20; const feed = await rss_parser_default.parseURL("https://decrypt.co/feed"); const items = await Promise.all(feed.items.filter((item) => item && item.link && !item.link.includes("/videos")).slice(0, limit).map((item) => cache_default.tryGet(`decrypt:article:${item.link}`, async () => { if (!item.link) return {}; try { const result = await extractFullText(item.link); return { title: item.title || "Untitled", link: item.link.split("?")[0], pubDate: item.pubDate ? parseDate(item.pubDate) : void 0, description: result?.fullText ?? (item.content || ""), author: item.creator || "Decrypt", category: result?.tags ? [...new Set([...item.categories ?? [], ...result.tags])] : item.categories || [], guid: item.guid || item.link, image: result?.featuredImage ?? item.enclosure?.url }; } catch (error) { logger_default.warn(`Couldn't fetch full content for ${item.link}: ${error.message}`); return { title: item.title || "Untitled", link: item.link.split("?")[0], pubDate: item.pubDate ? parseDate(item.pubDate) : void 0, description: item.content || "", author: item.creator || "Decrypt", category: item.categories || [], guid: item.guid || item.link, image: item.enclosure?.url }; } }))); return { title: feed.title || "Decrypt", link: feed.link || "https://decrypt.co", description: feed.description || "Latest news from Decrypt", item: items, language: feed.language || "en", image: feed.image?.url }; } async function extractFullText(url) { try { const $ = load(await ofetch_default(url)); const post = JSON.parse($("script#__NEXT_DATA__").text()).props.pageProps.post; if (post.content.length) return { fullText: `<img src="${post.featuredImage.src}" alt="${post.featuredImage.alt}">` + post.content, featuredImage: post.featuredImage.src, tags: post.tags.data.map((tag) => tag.name) }; return null; } catch (error) { logger_default.error(`Error extracting full text from ${url}: ${error}`); return null; } } //#endregion export { route };