rsshub 1.0.0-master.f7cdf8b → 1.0.0-master.f7f8b7a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/lib/config.js +21 -8
- package/lib/middleware/cache/index.js +4 -3
- package/lib/middleware/cache/redis.js +3 -3
- package/lib/middleware/onerror.js +8 -0
- package/lib/middleware/template.js +79 -85
- package/lib/router.js +7 -7
- package/lib/routes/index.js +6 -13
- package/lib/utils/common-utils.js +2 -6
- package/lib/utils/render.js +2 -0
- package/lib/v2/1point3acres/maintainer.js +2 -2
- package/lib/v2/95mm/utils.js +3 -2
- package/lib/v2/aliyun/notice.js +1 -1
- package/lib/v2/amazon/maintainer.js +1 -1
- package/lib/v2/apnews/topics.js +1 -1
- package/lib/v2/arcteryx/maintainer.js +3 -3
- package/lib/v2/bangumi/maintainer.js +1 -0
- package/lib/v2/bangumi/radar.js +6 -0
- package/lib/v2/bangumi/router.js +1 -0
- package/lib/v2/bangumi/tv/user/wish.js +38 -0
- package/lib/v2/bellroy/maintainer.js +1 -1
- package/lib/v2/bilibili/cache.js +10 -7
- package/lib/v2/bilibili/maintainer.js +1 -0
- package/lib/v2/bilibili/platform.js +43 -0
- package/lib/v2/bilibili/radar.js +8 -0
- package/lib/v2/bilibili/router.js +1 -0
- package/lib/v2/bilibili/video.js +8 -1
- package/lib/v2/bossdesign/index.js +41 -0
- package/lib/v2/bossdesign/maintainer.js +3 -0
- package/lib/v2/bossdesign/radar.js +13 -0
- package/lib/v2/bossdesign/router.js +3 -0
- package/lib/v2/brave/latest.js +4 -2
- package/lib/v2/buaa/maintainer.js +4 -0
- package/lib/v2/buaa/news/index.js +46 -0
- package/lib/v2/buaa/radar.js +21 -0
- package/lib/v2/buaa/router.js +4 -0
- package/lib/v2/buaa/sme.js +59 -0
- package/lib/v2/cfachina/analygarden.js +60 -0
- package/lib/v2/cfachina/maintainer.js +3 -0
- package/lib/v2/cfachina/radar.js +13 -0
- package/lib/v2/cfachina/router.js +3 -0
- package/lib/v2/cna/maintainer.js +1 -0
- package/lib/v2/cna/radar.js +6 -0
- package/lib/v2/cna/router.js +1 -0
- package/lib/v2/cna/web/index.js +62 -0
- package/lib/v2/cste/radar.js +1 -1
- package/lib/v2/dahecube/radar.js +40 -4
- package/lib/v2/dongqiudi/utils.js +1 -1
- package/lib/v2/douban/maintainer.js +1 -0
- package/lib/v2/douban/other/discussion.js +58 -0
- package/lib/v2/douban/radar.js +8 -0
- package/lib/v2/douban/router.js +1 -0
- package/lib/v2/dut/defaults.js +4 -0
- package/lib/v2/dut/index.js +21 -9
- package/lib/v2/dut/maintainer.js +8 -7
- package/lib/v2/dut/radar.js +37 -29
- package/lib/v2/dut/shortcuts.js +5 -0
- package/lib/v2/egsea/flash.js +30 -0
- package/lib/v2/egsea/maintainer.js +3 -0
- package/lib/v2/egsea/radar.js +13 -0
- package/lib/v2/egsea/router.js +3 -0
- package/lib/v2/fisher-spb/news.js +1 -2
- package/lib/v2/fosshub/radar.js +1 -1
- package/lib/v2/fxiaoke/crm.js +63 -0
- package/lib/v2/fxiaoke/maintainer.js +3 -0
- package/lib/v2/fxiaoke/radar.js +37 -0
- package/lib/v2/fxiaoke/router.js +3 -0
- package/lib/v2/gdsrx/index.js +72 -0
- package/lib/v2/gdsrx/maintainer.js +3 -0
- package/lib/v2/gdsrx/radar.js +61 -0
- package/lib/v2/gdsrx/router.js +3 -0
- package/lib/v2/gogoanimehd/radar.js +1 -1
- package/lib/v2/gogoanimehd/recent-releases.js +1 -1
- package/lib/v2/google/alerts.js +33 -0
- package/lib/v2/google/maintainer.js +1 -0
- package/lib/v2/google/router.js +1 -0
- package/lib/v2/gov/maintainer.js +9 -2
- package/lib/v2/gov/moa/zdscxx.js +104 -0
- package/lib/v2/gov/mot/index.js +66 -0
- package/lib/v2/gov/nea/ghs.js +58 -0
- package/lib/v2/gov/nifdc/index.js +40 -33
- package/lib/v2/gov/radar.js +232 -4
- package/lib/v2/gov/router.js +10 -2
- package/lib/v2/gov/safe/business.js +8 -0
- package/lib/v2/gov/safe/complaint.js +8 -0
- package/lib/v2/gov/safe/templates/message.art +25 -0
- package/lib/v2/gov/safe/util.js +87 -0
- package/lib/v2/gov/zhengce/index.js +99 -0
- package/lib/v2/greasyfork/maintainer.js +1 -0
- package/lib/v2/greasyfork/router.js +1 -0
- package/lib/v2/greasyfork/scripts.js +25 -20
- package/lib/{routes/universities → v2}/harvard/health/blog.js +8 -7
- package/lib/v2/harvard/maintainer.js +3 -0
- package/lib/v2/harvard/radar.js +13 -0
- package/lib/v2/harvard/router.js +3 -0
- package/lib/v2/huxiu/briefColumn.js +13 -25
- package/lib/v2/huxiu/channel.js +28 -0
- package/lib/v2/huxiu/club.js +30 -0
- package/lib/v2/huxiu/collection.js +14 -26
- package/lib/v2/huxiu/maintainer.js +8 -5
- package/lib/v2/huxiu/member.js +27 -0
- package/lib/v2/huxiu/moment.js +11 -25
- package/lib/v2/huxiu/radar.js +24 -16
- package/lib/v2/huxiu/router.js +7 -4
- package/lib/v2/huxiu/search.js +16 -21
- package/lib/v2/huxiu/tag.js +13 -25
- package/lib/v2/huxiu/templates/description.art +46 -0
- package/lib/v2/huxiu/util.js +460 -0
- package/lib/v2/ifi-audio/maintainer.js +1 -1
- package/lib/v2/imiker/jinghua.js +87 -0
- package/lib/v2/imiker/maintainer.js +3 -0
- package/lib/v2/imiker/radar.js +13 -0
- package/lib/v2/imiker/router.js +3 -0
- package/lib/v2/imiker/templates/description.art +32 -0
- package/lib/v2/inoreader/maintainer.js +1 -1
- package/lib/v2/instagram/common-utils.js +7 -4
- package/lib/v2/instagram/templates/images.art +9 -2
- package/lib/v2/instagram/templates/video.art +4 -1
- package/lib/v2/instagram/web-api/index.js +30 -9
- package/lib/v2/instagram/web-api/utils.js +149 -25
- package/lib/v2/kemono/index.js +26 -2
- package/lib/v2/kemono/radar.js +1 -1
- package/lib/v2/kepu/live.js +89 -0
- package/lib/v2/kepu/maintainer.js +3 -0
- package/lib/v2/kepu/radar.js +13 -0
- package/lib/v2/kepu/router.js +3 -0
- package/lib/v2/kepu/templates/description.art +33 -0
- package/lib/v2/leetcode/maintainer.js +1 -1
- package/lib/v2/lightnovel/lightNovel.js +62 -0
- package/lib/v2/lightnovel/maintainer.js +3 -0
- package/lib/v2/lightnovel/radar.js +13 -0
- package/lib/v2/lightnovel/router.js +3 -0
- package/lib/v2/line/radar.js +1 -1
- package/lib/v2/liquipedia/cs_matches.js +52 -0
- package/lib/v2/liquipedia/dota2_matches.js +47 -0
- package/lib/v2/liquipedia/maintainer.js +4 -0
- package/lib/v2/liquipedia/radar.js +19 -0
- package/lib/v2/liquipedia/router.js +4 -0
- package/lib/v2/magazinelib/maintainer.js +1 -1
- package/lib/v2/mihoyo/radar.js +1 -1
- package/lib/v2/missav/maintainer.js +3 -0
- package/lib/v2/missav/new.js +36 -0
- package/lib/v2/missav/radar.js +13 -0
- package/lib/v2/missav/router.js +3 -0
- package/lib/v2/missav/templates/preview.art +3 -0
- package/lib/v2/modb/maintainer.js +3 -0
- package/lib/v2/modb/radar.js +13 -0
- package/lib/v2/modb/router.js +3 -0
- package/lib/v2/modb/topic.js +59 -0
- package/lib/v2/nature/cover.js +32 -42
- package/lib/v2/nature/highlight.js +2 -2
- package/lib/v2/nature/news-and-comment.js +2 -2
- package/lib/v2/nature/news.js +2 -2
- package/lib/v2/nature/research.js +2 -2
- package/lib/v2/nature/siteindex.js +5 -5
- package/lib/v2/nature/utils.js +124 -5
- package/lib/v2/ncu/jwc.js +33 -0
- package/lib/v2/ncu/maintainer.js +3 -0
- package/lib/v2/ncu/radar.js +13 -0
- package/lib/v2/ncu/router.js +3 -0
- package/lib/v2/nmtv/radar.js +1 -1
- package/lib/v2/oo-software/radar.js +1 -1
- package/lib/v2/patagonia/maintainer.js +1 -1
- package/lib/v2/phoronix/index.js +177 -48
- package/lib/v2/phoronix/maintainer.js +1 -1
- package/lib/v2/phoronix/radar.js +3 -3
- package/lib/v2/phoronix/router.js +1 -1
- package/lib/v2/picnob/maintainer.js +1 -1
- package/lib/v2/picnob/templates/desc.art +3 -3
- package/lib/v2/picnob/user.js +74 -37
- package/lib/v2/picnob/utils.js +24 -0
- package/lib/v2/qbitai/category.js +27 -0
- package/lib/v2/qbitai/maintainer.js +4 -0
- package/lib/v2/qbitai/radar.js +19 -0
- package/lib/v2/qbitai/router.js +4 -0
- package/lib/v2/qbitai/tag.js +27 -0
- package/lib/v2/questmobile/maintainer.js +3 -0
- package/lib/v2/questmobile/radar.js +18 -0
- package/lib/v2/questmobile/report.js +127 -0
- package/lib/v2/questmobile/router.js +3 -0
- package/lib/v2/questmobile/templates/description.art +17 -0
- package/lib/v2/readhub/daily.js +43 -0
- package/lib/v2/readhub/index.js +19 -72
- package/lib/v2/readhub/maintainer.js +1 -0
- package/lib/v2/readhub/radar.js +6 -0
- package/lib/v2/readhub/router.js +1 -0
- package/lib/v2/readhub/util.js +69 -0
- package/lib/v2/routledge/book-series.js +78 -0
- package/lib/v2/routledge/maintainer.js +3 -0
- package/lib/v2/routledge/radar.js +13 -0
- package/lib/v2/routledge/router.js +3 -0
- package/lib/v2/routledge/templates/description.art +7 -0
- package/lib/v2/showstart/artist.js +15 -0
- package/lib/v2/showstart/brand.js +15 -0
- package/lib/v2/showstart/const.js +4 -0
- package/lib/v2/showstart/event.js +18 -0
- package/lib/v2/showstart/maintainer.js +6 -0
- package/lib/v2/showstart/radar.js +40 -0
- package/lib/v2/showstart/router.js +6 -0
- package/lib/v2/showstart/search.js +51 -0
- package/lib/v2/showstart/service.js +166 -0
- package/lib/v2/showstart/utils.js +92 -0
- package/lib/v2/snowpeak/maintainer.js +1 -1
- package/lib/v2/sony/maintainer.js +1 -1
- package/lib/v2/sse/disclosure.js +4 -3
- package/lib/v2/sspu/jwc.js +44 -0
- package/lib/v2/sspu/maintainer.js +3 -0
- package/lib/v2/sspu/radar.js +13 -0
- package/lib/v2/sspu/router.js +3 -0
- package/lib/v2/techcrunch/maintainer.js +1 -1
- package/lib/v2/theatlantic/maintainer.js +1 -1
- package/lib/v2/thepaper/radar.js +2 -2
- package/lib/v2/threads/index.js +20 -150
- package/lib/v2/threads/utils.js +147 -0
- package/lib/v2/twitter/keyword.js +1 -3
- package/lib/v2/twitter/media.js +1 -5
- package/lib/v2/twitter/user.js +1 -3
- package/lib/v2/twitter/utils.js +5 -3
- package/lib/v2/twitter/web-api/constants.js +80 -68
- package/lib/v2/twitter/web-api/twitter-api.js +96 -103
- package/lib/v2/uniqlo/maintainer.js +3 -0
- package/lib/v2/uniqlo/new.js +62 -0
- package/lib/v2/uniqlo/radar.js +12 -0
- package/lib/v2/uniqlo/router.js +3 -0
- package/lib/v2/wechat/maintainer.js +1 -1
- package/lib/v2/weibo/maintainer.js +1 -1
- package/lib/v2/weibo/radar.js +1 -1
- package/lib/v2/weibo/router.js +1 -1
- package/lib/v2/weibo/search/hot.js +118 -7
- package/lib/v2/weibo/search/template/digest.art +17 -0
- package/lib/v2/xiaohongshu/util.js +17 -7
- package/lib/v2/xmnn/docs.js +0 -0
- package/lib/v2/xmnn/maintainer.js +1 -0
- package/lib/v2/xmnn/news.js +65 -0
- package/lib/v2/xmnn/radar.js +67 -1
- package/lib/v2/xmnn/router.js +1 -0
- package/lib/v2/xsijishe/maintainer.js +1 -0
- package/lib/v2/xsijishe/radar.js +12 -0
- package/lib/v2/xsijishe/rank.js +60 -0
- package/lib/v2/xsijishe/router.js +1 -0
- package/lib/v2/yahoo/maintainer.js +2 -0
- package/lib/v2/yahoo/news/tw/index.js +24 -0
- package/lib/v2/yahoo/news/tw/provider-helper.js +22 -0
- package/lib/v2/yahoo/news/tw/provider.js +24 -0
- package/lib/v2/yahoo/news/tw/utils.js +129 -0
- package/lib/v2/yahoo/radar.js +29 -1
- package/lib/v2/yahoo/router.js +4 -1
- package/lib/v2/yahoo/templates/youtube.art +1 -0
- package/lib/v2/yuque/book.js +6 -1
- package/lib/v2/yuque/utils.js +16 -0
- package/lib/v2/zagg/maintainer.js +1 -1
- package/lib/views/error.art +1 -1
- package/lib/views/rss3-ums.js +62 -0
- package/lib/views/welcome.art +1 -1
- package/package.json +45 -39
- package/lib/routes/egsea/flash.js +0 -40
- package/lib/routes/gov/moa/sjzxfb.js +0 -20
- package/lib/routes/liquipedia/dota2_matches.js +0 -50
- package/lib/routes/questmobile/report.js +0 -121
- package/lib/routes/uniqlo/stylingbook.js +0 -24
- package/lib/routes/universities/buaa/news/index.js +0 -66
- package/lib/routes/universities/buaa/utils.js +0 -57
- package/lib/v2/gov/zhengce/zuixin.js +0 -39
- package/lib/v2/huxiu/article.js +0 -33
- package/lib/v2/huxiu/author.js +0 -36
- package/lib/v2/huxiu/templates/brief.art +0 -22
- package/lib/v2/huxiu/templates/img.art +0 -3
- package/lib/v2/huxiu/templates/moment.art +0 -16
- package/lib/v2/huxiu/templates/video.art +0 -7
- package/lib/v2/huxiu/utils.js +0 -154
- package/lib/v2/twitter/web-api/twitter-got.js +0 -113
- /package/lib/{routes → v2}/gov/moa/moa.js +0 -0
- /package/lib/v2/yahoo/news/{index.js → us/index.js} +0 -0
package/lib/v2/nature/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const got = require('@/utils/got');
|
|
2
2
|
const cheerio = require('cheerio');
|
|
3
3
|
const { parseDate } = require('@/utils/parse-date');
|
|
4
|
-
|
|
4
|
+
const { CookieJar } = require('tough-cookie');
|
|
5
5
|
const baseUrl = 'https://www.nature.com';
|
|
6
6
|
|
|
7
7
|
const fixFigure = (html) => {
|
|
@@ -51,7 +51,9 @@ const getArticleList = (html) =>
|
|
|
51
51
|
|
|
52
52
|
const getArticle = (item, ctx) =>
|
|
53
53
|
ctx.cache.tryGet(item.link, async () => {
|
|
54
|
-
const response = await got(item.link
|
|
54
|
+
const response = await got(item.link, {
|
|
55
|
+
cookieJar,
|
|
56
|
+
});
|
|
55
57
|
const $ = cheerio.load(response.data);
|
|
56
58
|
const responseUrl = new URL(response.url);
|
|
57
59
|
|
|
@@ -59,7 +61,7 @@ const getArticle = (item, ctx) =>
|
|
|
59
61
|
const meta = getDataLayer($);
|
|
60
62
|
item.doi = meta.content.article?.doi;
|
|
61
63
|
item.author = meta.content.contentInfo.authors.join(', ');
|
|
62
|
-
item.pubDate = parseDate(meta.content.contentInfo.publishedAt
|
|
64
|
+
item.pubDate = parseDate(meta.content.contentInfo.publishedAt, 'X') || item.pubDate;
|
|
63
65
|
} else {
|
|
64
66
|
const meta = JSON.parse($('script[type="application/ld+json"]').html());
|
|
65
67
|
const freeAccess = meta.mainEntity.isAccessibleForFree;
|
|
@@ -69,7 +71,7 @@ const getArticle = (item, ctx) =>
|
|
|
69
71
|
item.doi = meta.mainEntity.sameAs.replace('https://doi.org/', '');
|
|
70
72
|
}
|
|
71
73
|
item.author = meta.mainEntity.author.map((author) => author.name.replace(', ', ' ')).join(', ');
|
|
72
|
-
item.category = meta.mainEntity.keywords
|
|
74
|
+
item.category = meta.mainEntity.keywords;
|
|
73
75
|
item.pubDate = parseDate(meta.mainEntity.datePublished) || item.pubDate;
|
|
74
76
|
|
|
75
77
|
fixFigure($);
|
|
@@ -101,10 +103,12 @@ const getArticle = (item, ctx) =>
|
|
|
101
103
|
const getDataLayer = (html) =>
|
|
102
104
|
JSON.parse(
|
|
103
105
|
html('script[data-test=dataLayer]')
|
|
104
|
-
.
|
|
106
|
+
.text()
|
|
105
107
|
.match(/window\.dataLayer = \[(.*)\];/s)[1]
|
|
106
108
|
);
|
|
107
109
|
|
|
110
|
+
const cookieJar = new CookieJar();
|
|
111
|
+
|
|
108
112
|
/**
|
|
109
113
|
* This is generated by /nature/siteindex.debug.json
|
|
110
114
|
*/
|
|
@@ -144,6 +148,10 @@ const journalMap = {
|
|
|
144
148
|
id: '43747',
|
|
145
149
|
description: '43747',
|
|
146
150
|
},
|
|
151
|
+
{
|
|
152
|
+
title: 'bjcreports',
|
|
153
|
+
name: 'BJC Reports',
|
|
154
|
+
},
|
|
147
155
|
{
|
|
148
156
|
title: 'bcj',
|
|
149
157
|
name: 'Blood Cancer Journal',
|
|
@@ -234,6 +242,10 @@ const journalMap = {
|
|
|
234
242
|
title: 'commsphys',
|
|
235
243
|
name: 'Communications Physics',
|
|
236
244
|
},
|
|
245
|
+
{
|
|
246
|
+
title: 'commspsychol',
|
|
247
|
+
name: 'Communications Psychology',
|
|
248
|
+
},
|
|
237
249
|
{
|
|
238
250
|
title: 'ejcn',
|
|
239
251
|
name: 'European Journal of Clinical Nutrition',
|
|
@@ -470,12 +482,20 @@ const journalMap = {
|
|
|
470
482
|
id: '41589',
|
|
471
483
|
description: '41589',
|
|
472
484
|
},
|
|
485
|
+
{
|
|
486
|
+
title: 'natchemeng',
|
|
487
|
+
name: 'Nature Chemical Engineering',
|
|
488
|
+
},
|
|
473
489
|
{
|
|
474
490
|
title: 'nchem',
|
|
475
491
|
name: 'Nature Chemistry',
|
|
476
492
|
id: '41557',
|
|
477
493
|
description: '41557',
|
|
478
494
|
},
|
|
495
|
+
{
|
|
496
|
+
title: 'natcities',
|
|
497
|
+
name: 'Nature Cities',
|
|
498
|
+
},
|
|
479
499
|
{
|
|
480
500
|
title: 'nclimate',
|
|
481
501
|
name: 'Nature Climate Change',
|
|
@@ -573,6 +593,8 @@ const journalMap = {
|
|
|
573
593
|
{
|
|
574
594
|
title: 'natmentalhealth',
|
|
575
595
|
name: 'Nature Mental Health',
|
|
596
|
+
id: '44220',
|
|
597
|
+
description: '44220',
|
|
576
598
|
},
|
|
577
599
|
{
|
|
578
600
|
title: 'natmetab',
|
|
@@ -631,6 +653,8 @@ const journalMap = {
|
|
|
631
653
|
{
|
|
632
654
|
title: 'natrevbioeng',
|
|
633
655
|
name: 'Nature Reviews Bioengineering',
|
|
656
|
+
id: '44222',
|
|
657
|
+
description: '44222',
|
|
634
658
|
},
|
|
635
659
|
{
|
|
636
660
|
title: 'nrc',
|
|
@@ -672,6 +696,10 @@ const journalMap = {
|
|
|
672
696
|
id: '43017',
|
|
673
697
|
description: '43017',
|
|
674
698
|
},
|
|
699
|
+
{
|
|
700
|
+
title: 'natrevelectreng',
|
|
701
|
+
name: 'Nature Reviews Electrical Engineering',
|
|
702
|
+
},
|
|
675
703
|
{
|
|
676
704
|
title: 'nrendo',
|
|
677
705
|
name: 'Nature Reviews Endocrinology',
|
|
@@ -781,6 +809,8 @@ const journalMap = {
|
|
|
781
809
|
{
|
|
782
810
|
title: 'natwater',
|
|
783
811
|
name: 'Nature Water',
|
|
812
|
+
id: '44221',
|
|
813
|
+
description: '44221',
|
|
784
814
|
},
|
|
785
815
|
{
|
|
786
816
|
title: 'npp',
|
|
@@ -796,10 +826,18 @@ const journalMap = {
|
|
|
796
826
|
title: 'npj2dmaterials',
|
|
797
827
|
name: 'npj 2D Materials and Applications',
|
|
798
828
|
},
|
|
829
|
+
{
|
|
830
|
+
title: 'npjadvmanuf',
|
|
831
|
+
name: 'npj Advanced Manufacturing',
|
|
832
|
+
},
|
|
799
833
|
{
|
|
800
834
|
title: 'npjamd',
|
|
801
835
|
name: 'npj Aging',
|
|
802
836
|
},
|
|
837
|
+
{
|
|
838
|
+
title: 'npjamar',
|
|
839
|
+
name: 'npj Antimicrobials and Resistance',
|
|
840
|
+
},
|
|
803
841
|
{
|
|
804
842
|
title: 'npjbiodivers',
|
|
805
843
|
name: 'npj Biodiversity',
|
|
@@ -808,18 +846,42 @@ const journalMap = {
|
|
|
808
846
|
title: 'npjbiofilms',
|
|
809
847
|
name: 'npj Biofilms and Microbiomes',
|
|
810
848
|
},
|
|
849
|
+
{
|
|
850
|
+
title: 'npjbiolphysmech',
|
|
851
|
+
name: 'npj Biological Physics and Mechanics',
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
title: 'npjbts',
|
|
855
|
+
name: 'npj Biological Timing and Sleep',
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
title: 'npjbiosensing',
|
|
859
|
+
name: 'npj Biosensing',
|
|
860
|
+
},
|
|
811
861
|
{
|
|
812
862
|
title: 'npjbcancer',
|
|
813
863
|
name: 'npj Breast Cancer',
|
|
814
864
|
},
|
|
865
|
+
{
|
|
866
|
+
title: 'npjcardiohealth',
|
|
867
|
+
name: 'npj Cardiovascular Health',
|
|
868
|
+
},
|
|
815
869
|
{
|
|
816
870
|
title: 'npjcleanwater',
|
|
817
871
|
name: 'npj Clean Water',
|
|
818
872
|
},
|
|
873
|
+
{
|
|
874
|
+
title: 'npjclimataction',
|
|
875
|
+
name: 'npj Climate Action',
|
|
876
|
+
},
|
|
819
877
|
{
|
|
820
878
|
title: 'npjclimatsci',
|
|
821
879
|
name: 'npj Climate and Atmospheric Science',
|
|
822
880
|
},
|
|
881
|
+
{
|
|
882
|
+
title: 'npjcomplex',
|
|
883
|
+
name: 'npj Complexity',
|
|
884
|
+
},
|
|
823
885
|
{
|
|
824
886
|
title: 'npjcompumats',
|
|
825
887
|
name: 'npj Computational Materials',
|
|
@@ -836,18 +898,42 @@ const journalMap = {
|
|
|
836
898
|
title: 'npjgenmed',
|
|
837
899
|
name: 'npj Genomic Medicine',
|
|
838
900
|
},
|
|
901
|
+
{
|
|
902
|
+
title: 'npjimaging',
|
|
903
|
+
name: 'npj Imaging',
|
|
904
|
+
},
|
|
839
905
|
{
|
|
840
906
|
title: 'npjmatdeg',
|
|
841
907
|
name: 'npj Materials Degradation',
|
|
842
908
|
},
|
|
909
|
+
{
|
|
910
|
+
title: 'npjmatsustain',
|
|
911
|
+
name: 'npj Materials Sustainability',
|
|
912
|
+
},
|
|
843
913
|
{
|
|
844
914
|
title: 'npjmentalhealth',
|
|
845
915
|
name: 'npj Mental Health Research',
|
|
846
916
|
},
|
|
917
|
+
{
|
|
918
|
+
title: 'npjmetabhealth',
|
|
919
|
+
name: 'npj Metabolic Health and Disease',
|
|
920
|
+
},
|
|
847
921
|
{
|
|
848
922
|
title: 'npjmgrav',
|
|
849
923
|
name: 'npj Microgravity',
|
|
850
924
|
},
|
|
925
|
+
{
|
|
926
|
+
title: 'npjnanophoton',
|
|
927
|
+
name: 'npj Nanophotonics',
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
title: 'npjnathazards',
|
|
931
|
+
name: 'npj Natural Hazards',
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
title: 'npjoceansustain',
|
|
935
|
+
name: 'npj Ocean Sustainability',
|
|
936
|
+
},
|
|
851
937
|
{
|
|
852
938
|
title: 'npjparkd',
|
|
853
939
|
name: "npj Parkinson's Disease",
|
|
@@ -872,6 +958,10 @@ const journalMap = {
|
|
|
872
958
|
title: 'npjregenmed',
|
|
873
959
|
name: 'npj Regenerative Medicine',
|
|
874
960
|
},
|
|
961
|
+
{
|
|
962
|
+
title: 'npjrobot',
|
|
963
|
+
name: 'npj Robotics',
|
|
964
|
+
},
|
|
875
965
|
{
|
|
876
966
|
title: 'npjscifood',
|
|
877
967
|
name: 'npj Science of Food',
|
|
@@ -880,10 +970,26 @@ const journalMap = {
|
|
|
880
970
|
title: 'npjscilearn',
|
|
881
971
|
name: 'npj Science of Learning',
|
|
882
972
|
},
|
|
973
|
+
{
|
|
974
|
+
title: 'npjspintronics',
|
|
975
|
+
name: 'npj Spintronics',
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
title: 'npjsustainagric',
|
|
979
|
+
name: 'npj Sustainable Agriculture',
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
title: 'npjsustainmobil',
|
|
983
|
+
name: 'npj Sustainable Mobility and Transport',
|
|
984
|
+
},
|
|
883
985
|
{
|
|
884
986
|
title: 'npjsba',
|
|
885
987
|
name: 'npj Systems Biology and Applications',
|
|
886
988
|
},
|
|
989
|
+
{
|
|
990
|
+
title: 'npjunconvcomput',
|
|
991
|
+
name: 'npj Unconventional Computing',
|
|
992
|
+
},
|
|
887
993
|
{
|
|
888
994
|
title: 'npjurbansustain',
|
|
889
995
|
name: 'npj Urban Sustainability',
|
|
@@ -892,6 +998,18 @@ const journalMap = {
|
|
|
892
998
|
title: 'npjvaccines',
|
|
893
999
|
name: 'npj Vaccines',
|
|
894
1000
|
},
|
|
1001
|
+
{
|
|
1002
|
+
title: 'npjviruses',
|
|
1003
|
+
name: 'npj Viruses',
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
title: 'npjwomenshealth',
|
|
1007
|
+
name: "npj Women's Health",
|
|
1008
|
+
},
|
|
1009
|
+
{
|
|
1010
|
+
title: 'dpn',
|
|
1011
|
+
name: 'NPP—Digital Psychiatry and Neuroscience',
|
|
1012
|
+
},
|
|
895
1013
|
{
|
|
896
1014
|
title: 'nutd',
|
|
897
1015
|
name: 'Nutrition & Diabetes',
|
|
@@ -973,6 +1091,7 @@ const journalMap = {
|
|
|
973
1091
|
|
|
974
1092
|
module.exports = {
|
|
975
1093
|
baseUrl,
|
|
1094
|
+
cookieJar,
|
|
976
1095
|
getArticle,
|
|
977
1096
|
getArticleList,
|
|
978
1097
|
getDataLayer,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const got = require('@/utils/got'); // 自订的 got
|
|
2
|
+
const cheerio = require('cheerio'); // 可以使用类似 jQuery 的 API HTML 解析器
|
|
3
|
+
const { parseDate } = require('@/utils/parse-date');
|
|
4
|
+
|
|
5
|
+
module.exports = async (ctx) => {
|
|
6
|
+
const baseUrl = 'https://jwc.ncu.edu.cn';
|
|
7
|
+
const response = await got(baseUrl);
|
|
8
|
+
const $ = cheerio.load(response.body);
|
|
9
|
+
|
|
10
|
+
const list = $('.box3 .inner ul.img-list li');
|
|
11
|
+
|
|
12
|
+
ctx.state.data = {
|
|
13
|
+
title: '南昌大学教务处',
|
|
14
|
+
link: baseUrl,
|
|
15
|
+
description: '南昌大学教务处',
|
|
16
|
+
item:
|
|
17
|
+
list &&
|
|
18
|
+
list.toArray().map((item) => {
|
|
19
|
+
const el = $(item);
|
|
20
|
+
const linkEl = el.find('a');
|
|
21
|
+
const date = el.text().split('】')[0].replace('【', '').trim();
|
|
22
|
+
const title = linkEl.attr('title');
|
|
23
|
+
const link = `${baseUrl}/${linkEl.attr('href')}`;
|
|
24
|
+
const month = date.slice(0, 2);
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
title,
|
|
28
|
+
link,
|
|
29
|
+
pubDate: parseDate(date, 'MM-DD').setFullYear(month < 6 ? new Date().getFullYear() - 1 : new Date().getFullYear()),
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
};
|
package/lib/v2/nmtv/radar.js
CHANGED
|
@@ -6,7 +6,7 @@ module.exports = {
|
|
|
6
6
|
title: '点播',
|
|
7
7
|
docs: 'https://docs.rsshub.app/routes/traditional-media#nei-meng-gu-guang-bo-dian-shi-tai-dian-bo',
|
|
8
8
|
source: ['/'],
|
|
9
|
-
target: (params, url) => `/nmtv/column/${
|
|
9
|
+
target: (params, url) => `/nmtv/column/${url.split(/\/folder/).pop()}`,
|
|
10
10
|
},
|
|
11
11
|
],
|
|
12
12
|
},
|
|
@@ -6,7 +6,7 @@ module.exports = {
|
|
|
6
6
|
title: 'Changelog',
|
|
7
7
|
docs: 'https://docs.rsshub.app/routes/program-update#oo-software-changelog',
|
|
8
8
|
source: ['/en/changelog'],
|
|
9
|
-
target: (params, url) => `/oo-software/changelog/${
|
|
9
|
+
target: (params, url) => `/oo-software/changelog/${url.match(/\/en\/(.*?)\/changelog/)[1]}`,
|
|
10
10
|
},
|
|
11
11
|
],
|
|
12
12
|
},
|
package/lib/v2/phoronix/index.js
CHANGED
|
@@ -1,26 +1,132 @@
|
|
|
1
1
|
const parser = require('@/utils/rss-parser');
|
|
2
2
|
const cheerio = require('cheerio');
|
|
3
3
|
const got = require('@/utils/got');
|
|
4
|
+
const dayjs = require('dayjs');
|
|
5
|
+
dayjs.extend(require('dayjs/plugin/utc'));
|
|
6
|
+
dayjs.extend(require('dayjs/plugin/timezone'));
|
|
7
|
+
|
|
8
|
+
const redirectCacheKey = 'phoronix:redirect';
|
|
9
|
+
const webArticlesCacheKey = 'phoronix:web-articles';
|
|
10
|
+
const articleCacheKey = 'phoronix:articles';
|
|
4
11
|
|
|
5
12
|
const baseUrl = 'https://www.phoronix.com';
|
|
13
|
+
const rssUrl = `${baseUrl}/rss.php`;
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
const feedFetch = async () => {
|
|
16
|
+
const feed = await parser.parseURL(rssUrl);
|
|
17
|
+
return {
|
|
18
|
+
title: feed.title,
|
|
19
|
+
link: feed.link,
|
|
20
|
+
description: feed.description,
|
|
21
|
+
item: feed.items,
|
|
22
|
+
language: feed.language,
|
|
23
|
+
icon: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
24
|
+
image: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
25
|
+
logo: 'https://www.phoronix.com/phxcms7-css/phoronix.png',
|
|
26
|
+
// Copied from the web page metadata
|
|
27
|
+
category: [
|
|
28
|
+
'Linux Hardware Reviews',
|
|
29
|
+
'Linux hardware benchmarks',
|
|
30
|
+
'Linux Hardware',
|
|
31
|
+
'Linux benchmarking',
|
|
32
|
+
'Desktop Linux',
|
|
33
|
+
'GNU/Linux benchmarks',
|
|
34
|
+
'Open Source AMD',
|
|
35
|
+
'Linux How To',
|
|
36
|
+
'X.Org drivers',
|
|
37
|
+
'Ubuntu hardware',
|
|
38
|
+
'Phoronix Test Suite',
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const webFetchCb = (response) => {
|
|
44
|
+
const $ = cheerio.load(response.body);
|
|
45
|
+
return {
|
|
46
|
+
title: $('title').text(),
|
|
47
|
+
link: response.url,
|
|
48
|
+
description: $('meta[name="Description"]').attr('content'),
|
|
49
|
+
item: [
|
|
50
|
+
...new Set(
|
|
51
|
+
$('#main a')
|
|
52
|
+
.toArray()
|
|
53
|
+
.map((e) => e.attribs.href)
|
|
54
|
+
),
|
|
55
|
+
]
|
|
56
|
+
.filter((link) => link && (link.startsWith('/review/') || link.startsWith('/news/')))
|
|
57
|
+
.map((link) => ({ link: `${baseUrl}${link}` })),
|
|
58
|
+
language: 'en-us',
|
|
59
|
+
icon: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
60
|
+
image: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
61
|
+
logo: 'https://www.phoronix.com/phxcms7-css/phoronix.png',
|
|
62
|
+
category: $('meta[name="keywords"]').attr('content').split(', '),
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const webFetch = (ctx, url) =>
|
|
67
|
+
ctx.cache.tryGet(`${webArticlesCacheKey}:${url}`, async () => {
|
|
68
|
+
try {
|
|
69
|
+
return webFetchCb(await got(url));
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (error.name === 'HTTPError' && error.response.statusCode === 404) {
|
|
72
|
+
return '404';
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const legacyFetch = async (ctx, page, queryOrItem) => {
|
|
79
|
+
const legacyUrl = new URL('/scan.php', baseUrl);
|
|
80
|
+
legacyUrl.searchParams.set('page', page);
|
|
11
81
|
if (queryOrItem) {
|
|
12
82
|
if (page === 'category') {
|
|
13
|
-
|
|
83
|
+
legacyUrl.searchParams.set('item', queryOrItem);
|
|
14
84
|
} else {
|
|
15
|
-
|
|
85
|
+
legacyUrl.searchParams.set('q', queryOrItem);
|
|
16
86
|
}
|
|
17
87
|
}
|
|
18
88
|
|
|
19
|
-
|
|
89
|
+
let response;
|
|
90
|
+
const webUrl = await ctx.cache.tryGet(`${redirectCacheKey}:${legacyUrl.toString()}`, async () => {
|
|
91
|
+
response = await got(legacyUrl.toString());
|
|
92
|
+
return response.url;
|
|
93
|
+
});
|
|
94
|
+
if (response) {
|
|
95
|
+
const feed = webFetchCb(response);
|
|
96
|
+
ctx.cache.set(`${webArticlesCacheKey}:${webUrl}`, feed);
|
|
97
|
+
return feed;
|
|
98
|
+
}
|
|
99
|
+
return await webFetch(ctx, webUrl);
|
|
100
|
+
};
|
|
20
101
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
102
|
+
const tryFetch = async (ctx, category, topic) => {
|
|
103
|
+
const webUrl = topic ? `${baseUrl}/${category}/${topic}` : `${baseUrl}/${category}`;
|
|
104
|
+
let feed = await webFetch(ctx, webUrl);
|
|
105
|
+
if (feed === '404') {
|
|
106
|
+
feed = await legacyFetch(ctx, category, topic);
|
|
107
|
+
}
|
|
108
|
+
return feed;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
module.exports = async (ctx) => {
|
|
112
|
+
const { category, topic } = ctx.params;
|
|
113
|
+
let feed;
|
|
114
|
+
switch (category) {
|
|
115
|
+
case 'category':
|
|
116
|
+
case 'news_topic':
|
|
117
|
+
feed = await legacyFetch(ctx, category, topic);
|
|
118
|
+
break;
|
|
119
|
+
case 'rss':
|
|
120
|
+
feed = await feedFetch();
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
feed = category ? await tryFetch(ctx, category, topic) : await feedFetch();
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
feed.item = await Promise.all(
|
|
128
|
+
feed.item.map((item) =>
|
|
129
|
+
ctx.cache.tryGet(`${articleCacheKey}:${item.link}`, async () => {
|
|
24
130
|
const response = await got(item.link);
|
|
25
131
|
const html = response.body;
|
|
26
132
|
const $ = cheerio.load(html);
|
|
@@ -28,11 +134,52 @@ module.exports = async (ctx) => {
|
|
|
28
134
|
|
|
29
135
|
// Author
|
|
30
136
|
const authorSelector = $('.author > a');
|
|
31
|
-
//
|
|
137
|
+
// the last 2 are the category and comments
|
|
32
138
|
const author = authorSelector
|
|
33
139
|
.slice(0, authorSelector.length - 2)
|
|
34
140
|
.toArray()
|
|
35
141
|
.map((e) => $(e).text());
|
|
142
|
+
const category = [];
|
|
143
|
+
if (item.link.includes('/news/')) {
|
|
144
|
+
category.push('News');
|
|
145
|
+
} else if (item.link.includes('/review/')) {
|
|
146
|
+
category.push('Review');
|
|
147
|
+
}
|
|
148
|
+
const categorySelector = authorSelector.eq(-2);
|
|
149
|
+
if (categorySelector.length) {
|
|
150
|
+
category.push(categorySelector.text());
|
|
151
|
+
}
|
|
152
|
+
let pubDate;
|
|
153
|
+
if (!item.pubDate) {
|
|
154
|
+
// the text next to the category is the date
|
|
155
|
+
let pubDateReadable = categorySelector.length && categorySelector[0].nextSibling?.nodeValue;
|
|
156
|
+
if (pubDateReadable) {
|
|
157
|
+
pubDateReadable = pubDateReadable.replace(/on|at|\./g, '').trim();
|
|
158
|
+
if (/\d{4}$/.test(pubDateReadable)) {
|
|
159
|
+
// Only date, no time
|
|
160
|
+
// Michael Larabel lives in Indiana, USA, so we assume TZ=America/Indiana/Indianapolis
|
|
161
|
+
// https://www.phoronix.com/review/phoronix_office_2014
|
|
162
|
+
// Here we use the trick to take daylight saving into account.
|
|
163
|
+
pubDate = dayjs
|
|
164
|
+
// If we don't append "UTC" at the end,
|
|
165
|
+
// dayjs.utc() may still parse the date in the platform (local) timezone.
|
|
166
|
+
// E.g., if the platform timezone is UTC+8, then:
|
|
167
|
+
// > dayjs.utc('2 Dec 2023').toString()
|
|
168
|
+
// 'Fri, 01 Dec 2023 16:00:00 GMT'
|
|
169
|
+
// > dayjs.utc('2 Dec 2023 UTC').toString()
|
|
170
|
+
// 'Sat, 02 Dec 2023 00:00:00 GMT'
|
|
171
|
+
// Append "UTC" at the end to explicitly prohibit the weird behavior.
|
|
172
|
+
.utc(`${pubDateReadable} 08:00 UTC`)
|
|
173
|
+
.tz('America/Indiana/Indianapolis', true);
|
|
174
|
+
} else {
|
|
175
|
+
// date, time, and timezone (including daylight saving)
|
|
176
|
+
pubDate = dayjs(pubDateReadable);
|
|
177
|
+
}
|
|
178
|
+
if (!pubDate.isValid()) {
|
|
179
|
+
pubDate = pubDateReadable;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
36
183
|
|
|
37
184
|
// Maybe it's paginated
|
|
38
185
|
const links = $('.pagination > a')
|
|
@@ -55,53 +202,35 @@ module.exports = async (ctx) => {
|
|
|
55
202
|
content.append(pages);
|
|
56
203
|
}
|
|
57
204
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
|
|
205
|
+
const images = content.find('img');
|
|
206
|
+
// Remove topic image
|
|
207
|
+
const topicImage = images.first();
|
|
208
|
+
if (topicImage.attr('src')?.startsWith('/assets/categories/')) {
|
|
209
|
+
const topicImageContainer = topicImage.parent();
|
|
210
|
+
if (!topicImageContainer.text().trim()) {
|
|
211
|
+
topicImageContainer.remove();
|
|
212
|
+
} else {
|
|
213
|
+
topicImage.remove();
|
|
65
214
|
}
|
|
215
|
+
}
|
|
216
|
+
// High-res images
|
|
217
|
+
images.each((_, img) => {
|
|
218
|
+
img.attribs.src = img.attribs.src.replace(/_med$/, '');
|
|
66
219
|
});
|
|
67
220
|
|
|
68
221
|
return {
|
|
69
|
-
title: item.title,
|
|
70
|
-
|
|
71
|
-
pubDate: item.pubDate,
|
|
222
|
+
title: item.title || $('article h1').text(),
|
|
223
|
+
pubDate: item.pubDate || pubDate,
|
|
72
224
|
author: author.join(', '),
|
|
73
225
|
link: item.link,
|
|
74
|
-
summary:
|
|
226
|
+
summary: $('meta[name="twitter:description"]').attr('content'),
|
|
75
227
|
description: content.html(),
|
|
76
|
-
|
|
77
|
-
|
|
228
|
+
image: $('meta[name="twitter:image"]').attr('content'),
|
|
229
|
+
category: item.category || category,
|
|
78
230
|
};
|
|
79
231
|
})
|
|
80
232
|
)
|
|
81
233
|
);
|
|
82
234
|
|
|
83
|
-
ctx.state.data =
|
|
84
|
-
title: feed.title,
|
|
85
|
-
link: feed.link,
|
|
86
|
-
description: feed.description,
|
|
87
|
-
item: items,
|
|
88
|
-
language: feed.language,
|
|
89
|
-
icon: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
90
|
-
image: 'https://www.phoronix.com/android-chrome-192x192.png',
|
|
91
|
-
logo: 'https://www.phoronix.com/phxcms7-css/phoronix.png',
|
|
92
|
-
// Copied from thier web page metadata
|
|
93
|
-
category: [
|
|
94
|
-
'Linux Hardware Reviews',
|
|
95
|
-
'Linux hardware benchmarks',
|
|
96
|
-
'Linux Hardware',
|
|
97
|
-
'Linux benchmarking',
|
|
98
|
-
'Desktop Linux',
|
|
99
|
-
'GNU/Linux benchmarks',
|
|
100
|
-
'Open Source AMD',
|
|
101
|
-
'Linux How To',
|
|
102
|
-
'X.Org drivers',
|
|
103
|
-
'Ubuntu hardware',
|
|
104
|
-
'Phoronix Test Suite',
|
|
105
|
-
],
|
|
106
|
-
};
|
|
235
|
+
ctx.state.data = feed;
|
|
107
236
|
};
|
package/lib/v2/phoronix/radar.js
CHANGED
|
@@ -3,10 +3,10 @@ module.exports = {
|
|
|
3
3
|
_name: 'Phoronix',
|
|
4
4
|
'.': [
|
|
5
5
|
{
|
|
6
|
-
title: '
|
|
6
|
+
title: 'News & Reviews',
|
|
7
7
|
docs: 'https://docs.rsshub.app/routes/new-media#phoronix',
|
|
8
|
-
source: ['
|
|
9
|
-
target: '/phoronix
|
|
8
|
+
source: ['/:category?/:topic?'],
|
|
9
|
+
target: '/phoronix/:category?/:topic?',
|
|
10
10
|
},
|
|
11
11
|
],
|
|
12
12
|
},
|