UNPKG

rsshub

Version:
104 lines (102 loc) 4.3 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import { t as ViewType } from "./types-D84BRIt4.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import "./helpers-DxBp0Pty.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { load } from "cheerio"; //#region lib/routes/hackernews/index.ts const route = { path: "/:section?/:type?/:user?", categories: ["programming"], view: ViewType.Articles, example: "/hackernews/threads/comments_list/dang", parameters: { section: { description: "Content section, default to `index`" }, type: { description: "Link type, default to `sources`" }, user: { description: "Set user, only valid in `threads` and `submitted` sections" } }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["news.ycombinator.com/:section", "news.ycombinator.com/"] }], name: "User", maintainers: ["nczitzk", "xie-dongping"], handler, description: `Subscribe to the content of a specific user` }; async function handler(ctx) { const section = ctx.req.param("section") ?? "index"; const type = ctx.req.param("type") ?? "sources"; const user = ctx.req.param("user") ?? ""; const rootUrl = "https://news.ycombinator.com"; const sectionUrl = section === "index" ? "" : `/${section}`; let optUrl = user === "" ? "" : "?id=" + user; if (section === "over") optUrl = user === "" ? "?points=100" : "?points=" + user; const currentUrl = `${rootUrl}${sectionUrl}${optUrl}`; const $ = load((await got_default(currentUrl)).data); const list = $(".athing").slice(0, ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 30).toArray().map((thing) => { thing = $(thing); const item = { guid: thing.attr("id"), title: thing.find(".titleline").children("a").text(), category: thing.find(".sitestr").text(), author: thing.next().find(".hnuser").text(), pubDate: parseDate(thing.find(".age").attr("title") ?? thing.next().find(".age").attr("title")), link: "", origin: thing.find(".titleline").children("a").attr("href"), onStory: thing.find(".onstory").text().slice(2), comments: thing.next().find("a").last().text().split("\xA0comment")[0], upvotes: thing.next().find(".score").text().split(" point")[0], currentComment: thing.find(".comment").text(), description: "" }; item.link = `${rootUrl}/item?id=${item.guid}`; item.guid = type === "sources" ? item.guid : `${item.guid}${item.comments === "discuss" ? "" : `-${item.comments}`}`; item.description = `<a href="${item.link}">Comments on Hacker News</a> | <a href="${item.origin}">Source</a>`; return item; }); const items = await Promise.all(list.map((item) => cache_default.tryGet(item.guid, async () => { if (item.comments !== "discuss" && type === "comments") { const content = load((await got_default({ method: "get", url: item.link })).data); content(".reply").remove(); item.description = ""; content(".comtr").each(function() { const author = content(this).find(".hnuser"); const comment = content(this).find(".commtext"); item.description += `<div><div><small><a href="${rootUrl}/${author.attr("href")}">${author.text()}</a></small>&nbsp&nbsp<small><a href="${rootUrl}/item?id=${content(this).attr("id")}">${content(this).find(".age").attr("title")}</a></small></div>`; const commentText = comment.clone(); commentText.find("p").remove(); commentText.html(`<p>${commentText.text()}</p>`); commentText.append(comment.find("p").toArray().map((p) => `<p>${content(p).html()}</p>`)); item.description += `<div>${commentText.html()}</div></div>`; }); } else if (item.comments !== "discuss" && type === "comments_list") { item.title = item.onStory; item.description = item.currentComment; } if (Number.isNaN(item.comments)) item.comments = 0; item.link = type === "sources" ? item.origin : item.link; delete item.origin; return item; }))); return { title: $("title").text(), link: currentUrl, item: items }; } //#endregion export { route };