rsshub
Version:
Make RSS Great Again!
134 lines (131 loc) • 4.17 kB
JavaScript
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 };