UNPKG

rsshub

Version:
134 lines (131 loc) 4.17 kB
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs"; import { t as config } from "./config-C37vj7VH.mjs"; import { t as ViewType } from "./types-D84BRIt4.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import "./helpers-DxBp0Pty.mjs"; import { t as art } from "./render-BQo6B4tL.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs"; import path from "node:path"; import { load } from "cheerio"; //#region lib/routes/github/trending.ts init_esm_shims(); const route = { path: "/trending/:since/:language/:spoken_language?", categories: ["programming"], example: "/github/trending/daily/javascript/en", view: ViewType.Notifications, parameters: { since: { description: "time range", options: [ { value: "daily", label: "Today" }, { value: "weekly", label: "This week" }, { value: "monthly", label: "This month" } ] }, language: { description: "the feed language, available in [Trending page](https://github.com/trending/javascript?since=monthly) 's URL, don't filter option is `any`", default: "any" }, spoken_language: { description: "natural language, available in [Trending page](https://github.com/trending/javascript?since=monthly) 's URL" } }, features: { requireConfig: [{ name: "GITHUB_ACCESS_TOKEN", description: "" }], requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["github.com/trending"], target: "/trending/:since" }], name: "Trending", maintainers: ["DIYgod", "jameschensmith"], handler, url: "github.com/trending" }; async function handler(ctx) { if (!config.github || !config.github.access_token) throw new config_not_found_default("GitHub trending RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/config#route-specific-configurations\">relevant config</a>"); const since = ctx.req.param("since"); const language = ctx.req.param("language") === "any" ? "" : ctx.req.param("language"); const spoken_language = ctx.req.param("spoken_language") ?? ""; const trendingUrl = `https://github.com/trending/${encodeURIComponent(language)}?since=${since}&spoken_language_code=${spoken_language}`; const { data: trendingPage } = await got_default({ method: "get", url: trendingUrl, headers: { Referer: trendingUrl } }); const $ = load(trendingPage); const trendingRepos = $("article").toArray().map((item) => { const [owner, name] = $(item).find("h2").text().split("/"); return { name: name.trim(), owner: owner.trim() }; }); const { data: repoData } = await got_default({ method: "post", url: "https://api.github.com/graphql", headers: { Authorization: `bearer ${config.github.access_token}` }, json: { query: ` query { ${trendingRepos.map((repo, index) => ` _${index}: repository(owner: "${repo.owner}", name: "${repo.name}") { ...RepositoryFragment } `).join("\n")} } fragment RepositoryFragment on Repository { description forkCount nameWithOwner openGraphImageUrl primaryLanguage { name } stargazerCount } ` } }); const repos = Object.values(repoData.data).map((repo) => { return { ...trendingRepos.find((r) => `${r.owner}/${r.name}` === repo.nameWithOwner), ...repo }; }); return { title: $("title").text(), link: trendingUrl, item: repos.map((r) => ({ title: r.nameWithOwner, author: r.owner, description: art(path.join(__dirname, "templates/trending-description-ae7ed569.art"), { cover: r.openGraphImageUrl, desc: r.description, forks: r.forkCount, lang: r.primaryLanguage?.name || "Unknown", stars: r.stargazerCount }), link: `https://github.com/${r.nameWithOwner}` })) }; } //#endregion export { route };