UNPKG

rsshub

Version:
108 lines (107 loc) 3.74 kB
import "./types-DNj6Etbg.mjs"; import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs"; import { t as cache_default } from "./cache-BkqOokyU.mjs"; import { t as getPlaywrightPage } from "./playwright-o20DiLNh.mjs"; import { load } from "cheerio"; //#region lib/routes/perplexity/blog.ts const route = { path: "/blog", example: "/perplexity/blog", url: "www.perplexity.ai", categories: ["blog"], parameters: {}, features: { requireConfig: false, requirePuppeteer: true, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["www.perplexity.ai/hub/blog"], target: "/blog" }], name: "Blog", maintainers: ["seeyangzhi"], handler, description: "Perplexity Blog - Explore Perplexity's blog for articles, announcements, product updates, and tips to optimize your experience. Stay informed and make the most of Perplexity.", view: 5 }; async function handler(ctx) { const limit = Number(ctx.req.query("limit") ?? "20"); const rootUrl = "https://www.perplexity.ai/hub/blog"; const { page, destroy, context } = await getPlaywrightPage(rootUrl, { onBeforeLoad: async (page) => { await page.route("**/*", (route) => { route.request().resourceType() === "document" ? route.continue() : route.abort(); }); } }); const $ = load(await page.evaluate(() => document.documentElement.getHTML())); const items = []; const seenLinks = /* @__PURE__ */ new Set(); const featuredCard = $("[data-framer-name=\"Featured Card\"]").first(); const featuredHref = featuredCard.find("a[href^=\"./blog/\"]").attr("href"); const featuredTitle = featuredCard.find("h4").first().text().trim(); if (featuredHref && featuredTitle) { const link = new URL(featuredHref, rootUrl).href; seenLinks.add(link); items.push({ link, title: featuredTitle }); } for (const element of $("[data-framer-name=\"Article Card\"]").toArray()) { const $card = $(element); const href = $card.attr("href"); const title = $card.find("h6").first().text().trim(); if (!href || !title) continue; const link = new URL(href, rootUrl).href; if (seenLinks.has(link)) continue; seenLinks.add(link); const paragraphs = $card.find("p").toArray(); const dateText = paragraphs.length > 0 ? $(paragraphs[0]).text().trim() : ""; const pubDate = dateText ? parseDate(dateText) : void 0; const category = paragraphs.slice(1).map((p) => $(p).text().trim()).filter(Boolean); items.push({ link, title, pubDate, category: category.length > 0 ? category : void 0 }); } const resultItems = await Promise.all(items.slice(0, limit).map(async (item) => { if (!item.link) return item; return await cache_default.tryGet(item.link, async () => { const contentPage = await context.newPage(); await contentPage.route("**/*", (route) => { route.request().resourceType() === "document" ? route.continue() : route.abort(); }); await contentPage.goto(item.link, { waitUntil: "domcontentloaded" }); const contentHtml = await contentPage.evaluate(() => document.documentElement.getHTML()); await contentPage.close(); const $content = load(contentHtml); let pubDate = item.pubDate ?? void 0; if (!pubDate) { const timeEl = $content("time[datetime]").first(); if (timeEl.length) pubDate = parseDate(timeEl.attr("datetime")); } $content("style, noscript").remove(); const contentArea = $content("[data-framer-name=\"Content\"]").first(); const description = contentArea.length ? contentArea.html() : void 0; return { ...item, pubDate, description }; }); })); await destroy(); return { title: "Perplexity Blog", link: rootUrl, item: resultItems, language: "en" }; } //#endregion export { route };