diff --git a/lib/v2/github/maintainer.js b/lib/v2/github/maintainer.js
index a286a5e2bc..5a7e0d6132 100644
--- a/lib/v2/github/maintainer.js
+++ b/lib/v2/github/maintainer.js
@@ -10,6 +10,6 @@ module.exports = {
'/starred_repos/:user': ['LanceZhu'],
'/stars/:user/:repo': ['HenryQW'],
'/topics/:name/:qs?': ['queensferryme'],
- '/trending/:since/:language?/:spoken_language?': ['DIYgod'],
+ '/trending/:since/:language?/:spoken_language?': ['DIYgod', 'jameschensmith'],
'/user/followers/:user': ['HenryQW'],
};
diff --git a/lib/v2/github/templates/trending-description.art b/lib/v2/github/templates/trending-description.art
new file mode 100644
index 0000000000..4f80467814
--- /dev/null
+++ b/lib/v2/github/templates/trending-description.art
@@ -0,0 +1,5 @@
+
+
{{@ desc }}
+
Language: {{@ lang }}
+
Stars: {{@ stars }}
+
Forks: {{@ forks }}
diff --git a/lib/v2/github/trending.js b/lib/v2/github/trending.js
index 9c0a6caed5..ca2ba42c08 100644
--- a/lib/v2/github/trending.js
+++ b/lib/v2/github/trending.js
@@ -1,5 +1,7 @@
const got = require('@/utils/got');
+const { art } = require('@/utils/render');
const cheerio = require('cheerio');
+const path = require('path');
module.exports = async (ctx) => {
const since = ctx.params.since;
@@ -20,24 +22,38 @@ module.exports = async (ctx) => {
const $ = cheerio.load(data);
const list = $('article');
+ const items = await Promise.all(
+ list.map((_, item) => {
+ item = $(item);
+ const endpoint = item.find('h1 a').attr('href');
+ const link = `https://github.com${endpoint}`;
+ return ctx.cache.tryGet(`github:trending:${endpoint}`, async () => {
+ const response = await got(link);
+
+ const $ = cheerio.load(response.data);
+ const cover = $('meta[property="og:image"]');
+
+ const single = {
+ title: item.find('h1').text(),
+ author: item.find('h1').text().split('/')[0].trim(),
+ description: art(path.join(__dirname, 'templates/trending-description.art'), {
+ cover: cover.attr('content'),
+ desc: item.find('p').text(),
+ lang: item.find('span[itemprop="programmingLanguage"]').text() || 'Unknown',
+ stars: item.find('.Link--muted').eq(0).text().trim(),
+ forks: item.find('.Link--muted').eq(1).text().trim(),
+ }),
+ link,
+ };
+
+ return single;
+ });
+ })
+ );
+
ctx.state.data = {
title: $('title').text(),
link: url,
- item:
- list &&
- list
- .map((_, item) => {
- item = $(item);
- return {
- title: item.find('h1').text(),
- author: item.find('h1').text().split('/')[0].trim(),
- description: `${item.find('.pr-4').text()}
-
Language: ${item.find('span[itemprop="programmingLanguage"]').text() ?? 'unknown'}
-
Star: ${item.find('.Link--muted').eq(0).text().trim()}
-
Fork: ${item.find('.Link--muted').eq(1).text().trim()}`,
- link: `https://github.com${item.find('h1 a').attr('href')}`,
- };
- })
- .get(),
+ item: items,
};
};