From 2b018c4f93adb69795cb660c2db9bb4226b5af11 Mon Sep 17 00:00:00 2001
From: Ethan Shen <42264778+nczitzk@users.noreply.github.com>
Date: Wed, 27 Jul 2022 15:48:26 +0800
Subject: [PATCH] feat(route): add TradingView Blog (#10324)
* feat(route): add TradingView Blog
* fix: limit the concurrency with tiny-async-pool
---
docs/en/program-update.md | 33 +++++++++++
docs/program-update.md | 33 +++++++++++
lib/v2/tradingview/blog.js | 60 ++++++++++++++++++++
lib/v2/tradingview/maintainer.js | 3 +
lib/v2/tradingview/radar.js | 13 +++++
lib/v2/tradingview/router.js | 3 +
lib/v2/tradingview/templates/description.art | 4 ++
7 files changed, 149 insertions(+)
create mode 100644 lib/v2/tradingview/blog.js
create mode 100644 lib/v2/tradingview/maintainer.js
create mode 100644 lib/v2/tradingview/radar.js
create mode 100644 lib/v2/tradingview/router.js
create mode 100644 lib/v2/tradingview/templates/description.art
diff --git a/docs/en/program-update.md b/docs/en/program-update.md
index 88ebcc1bb1..63ba542067 100644
--- a/docs/en/program-update.md
+++ b/docs/en/program-update.md
@@ -460,6 +460,39 @@ Refer to [#minecraft](/en/game.html#minecraft)
+## TradingView
+
+### Blog
+
+
+
+Language
+
+| Id | Language |
+| -- | ------------------- |
+| en | English |
+| ru | Русский |
+| ja | 日本語 |
+| es | Español |
+| tr | Türkçe |
+| ko | 한국어 |
+| it | Italiano |
+| pt | Português do Brasil |
+| de | Deutsch |
+| fr | Français |
+| pl | Polski |
+| id | Bahasa Indonesia |
+| my | Bahasa Malaysia |
+| tw | 繁體 |
+| cn | 简体 |
+| vi | Tiếng Việt |
+| th | ภาษาไทย |
+| sv | Svenska |
+| ar | العربية |
+| il | Hebrew |
+
+
+
## Typora
### Changelog
diff --git a/docs/program-update.md b/docs/program-update.md
index f32f1ed34b..62d66c7eae 100644
--- a/docs/program-update.md
+++ b/docs/program-update.md
@@ -543,6 +543,39 @@ pageClass: routes
+## TradingView
+
+### Blog
+
+
+
+语言
+
+| 编号 | 语言 |
+| -- | ------------------- |
+| en | English |
+| ru | Русский |
+| ja | 日本語 |
+| es | Español |
+| tr | Türkçe |
+| ko | 한국어 |
+| it | Italiano |
+| pt | Português do Brasil |
+| de | Deutsch |
+| fr | Français |
+| pl | Polski |
+| id | Bahasa Indonesia |
+| my | Bahasa Malaysia |
+| tw | 繁體 |
+| cn | 简体 |
+| vi | Tiếng Việt |
+| th | ภาษาไทย |
+| sv | Svenska |
+| ar | العربية |
+| il | Hebrew |
+
+
+
## Typora
### Changelog
diff --git a/lib/v2/tradingview/blog.js b/lib/v2/tradingview/blog.js
new file mode 100644
index 0000000000..bbac1845fb
--- /dev/null
+++ b/lib/v2/tradingview/blog.js
@@ -0,0 +1,60 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+const { parseDate } = require('@/utils/parse-date');
+const asyncPool = require('tiny-async-pool');
+const { art } = require('@/utils/render');
+const path = require('path');
+
+module.exports = async (ctx) => {
+ const language = ctx.params.language ?? 'en';
+
+ const rootUrl = 'https://www.tradingview.com';
+ const currentUrl = `${rootUrl}/blog/${language}`;
+
+ const response = await got({
+ method: 'get',
+ url: currentUrl,
+ });
+
+ const $ = cheerio.load(response.data);
+
+ const list = $('.articles-grid-item a[rel="bookmark"]')
+ .slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 20)
+ .toArray()
+ .map((item) => {
+ item = $(item);
+
+ return {
+ title: item.find('.title').text(),
+ link: item.attr('href'),
+ pubDate: parseDate(item.find('.date').text(), 'MMMM D, YYYY'),
+ };
+ });
+
+ const items = [];
+ for await (const item of asyncPool(3, list, (item) =>
+ ctx.cache.tryGet(item.link, async () => {
+ const detailResponse = await got({
+ method: 'get',
+ url: item.link,
+ });
+
+ const content = cheerio.load(detailResponse.data);
+
+ item.description = art(path.join(__dirname, 'templates/description.art'), {
+ image: content('.single-img img').attr('src'),
+ description: content('.entry-content').html(),
+ });
+
+ return item;
+ })
+ )) {
+ items.push(item);
+ }
+
+ ctx.state.data = {
+ title: $('title').text(),
+ link: currentUrl,
+ item: items,
+ };
+};
diff --git a/lib/v2/tradingview/maintainer.js b/lib/v2/tradingview/maintainer.js
new file mode 100644
index 0000000000..8135e010a5
--- /dev/null
+++ b/lib/v2/tradingview/maintainer.js
@@ -0,0 +1,3 @@
+module.exports = {
+ '/blog/:language?': ['nczitzk'],
+};
diff --git a/lib/v2/tradingview/radar.js b/lib/v2/tradingview/radar.js
new file mode 100644
index 0000000000..c9fd5d2b63
--- /dev/null
+++ b/lib/v2/tradingview/radar.js
@@ -0,0 +1,13 @@
+module.exports = {
+ 'tradingview.com': {
+ _name: 'TradingView',
+ '.': [
+ {
+ title: 'Blog',
+ docs: 'https://docs.rsshub.app/program-update.html#tradingview-blog',
+ source: ['/blog/:language', '/'],
+ target: '/tradingview/blog',
+ },
+ ],
+ },
+};
diff --git a/lib/v2/tradingview/router.js b/lib/v2/tradingview/router.js
new file mode 100644
index 0000000000..fadb0f6b37
--- /dev/null
+++ b/lib/v2/tradingview/router.js
@@ -0,0 +1,3 @@
+module.exports = function (router) {
+ router.get('/blog/:language?', require('./blog'));
+};
diff --git a/lib/v2/tradingview/templates/description.art b/lib/v2/tradingview/templates/description.art
new file mode 100644
index 0000000000..c823516c9a
--- /dev/null
+++ b/lib/v2/tradingview/templates/description.art
@@ -0,0 +1,4 @@
+{{ if image }}
+
+{{ /if }}
+{{@ description }}
\ No newline at end of file