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.
Files changed (273) hide show
  1. package/README.md +3 -3
  2. package/lib/config.js +21 -8
  3. package/lib/middleware/cache/index.js +4 -3
  4. package/lib/middleware/cache/redis.js +3 -3
  5. package/lib/middleware/onerror.js +8 -0
  6. package/lib/middleware/template.js +79 -85
  7. package/lib/router.js +7 -7
  8. package/lib/routes/index.js +6 -13
  9. package/lib/utils/common-utils.js +2 -6
  10. package/lib/utils/render.js +2 -0
  11. package/lib/v2/1point3acres/maintainer.js +2 -2
  12. package/lib/v2/95mm/utils.js +3 -2
  13. package/lib/v2/aliyun/notice.js +1 -1
  14. package/lib/v2/amazon/maintainer.js +1 -1
  15. package/lib/v2/apnews/topics.js +1 -1
  16. package/lib/v2/arcteryx/maintainer.js +3 -3
  17. package/lib/v2/bangumi/maintainer.js +1 -0
  18. package/lib/v2/bangumi/radar.js +6 -0
  19. package/lib/v2/bangumi/router.js +1 -0
  20. package/lib/v2/bangumi/tv/user/wish.js +38 -0
  21. package/lib/v2/bellroy/maintainer.js +1 -1
  22. package/lib/v2/bilibili/cache.js +10 -7
  23. package/lib/v2/bilibili/maintainer.js +1 -0
  24. package/lib/v2/bilibili/platform.js +43 -0
  25. package/lib/v2/bilibili/radar.js +8 -0
  26. package/lib/v2/bilibili/router.js +1 -0
  27. package/lib/v2/bilibili/video.js +8 -1
  28. package/lib/v2/bossdesign/index.js +41 -0
  29. package/lib/v2/bossdesign/maintainer.js +3 -0
  30. package/lib/v2/bossdesign/radar.js +13 -0
  31. package/lib/v2/bossdesign/router.js +3 -0
  32. package/lib/v2/brave/latest.js +4 -2
  33. package/lib/v2/buaa/maintainer.js +4 -0
  34. package/lib/v2/buaa/news/index.js +46 -0
  35. package/lib/v2/buaa/radar.js +21 -0
  36. package/lib/v2/buaa/router.js +4 -0
  37. package/lib/v2/buaa/sme.js +59 -0
  38. package/lib/v2/cfachina/analygarden.js +60 -0
  39. package/lib/v2/cfachina/maintainer.js +3 -0
  40. package/lib/v2/cfachina/radar.js +13 -0
  41. package/lib/v2/cfachina/router.js +3 -0
  42. package/lib/v2/cna/maintainer.js +1 -0
  43. package/lib/v2/cna/radar.js +6 -0
  44. package/lib/v2/cna/router.js +1 -0
  45. package/lib/v2/cna/web/index.js +62 -0
  46. package/lib/v2/cste/radar.js +1 -1
  47. package/lib/v2/dahecube/radar.js +40 -4
  48. package/lib/v2/dongqiudi/utils.js +1 -1
  49. package/lib/v2/douban/maintainer.js +1 -0
  50. package/lib/v2/douban/other/discussion.js +58 -0
  51. package/lib/v2/douban/radar.js +8 -0
  52. package/lib/v2/douban/router.js +1 -0
  53. package/lib/v2/dut/defaults.js +4 -0
  54. package/lib/v2/dut/index.js +21 -9
  55. package/lib/v2/dut/maintainer.js +8 -7
  56. package/lib/v2/dut/radar.js +37 -29
  57. package/lib/v2/dut/shortcuts.js +5 -0
  58. package/lib/v2/egsea/flash.js +30 -0
  59. package/lib/v2/egsea/maintainer.js +3 -0
  60. package/lib/v2/egsea/radar.js +13 -0
  61. package/lib/v2/egsea/router.js +3 -0
  62. package/lib/v2/fisher-spb/news.js +1 -2
  63. package/lib/v2/fosshub/radar.js +1 -1
  64. package/lib/v2/fxiaoke/crm.js +63 -0
  65. package/lib/v2/fxiaoke/maintainer.js +3 -0
  66. package/lib/v2/fxiaoke/radar.js +37 -0
  67. package/lib/v2/fxiaoke/router.js +3 -0
  68. package/lib/v2/gdsrx/index.js +72 -0
  69. package/lib/v2/gdsrx/maintainer.js +3 -0
  70. package/lib/v2/gdsrx/radar.js +61 -0
  71. package/lib/v2/gdsrx/router.js +3 -0
  72. package/lib/v2/gogoanimehd/radar.js +1 -1
  73. package/lib/v2/gogoanimehd/recent-releases.js +1 -1
  74. package/lib/v2/google/alerts.js +33 -0
  75. package/lib/v2/google/maintainer.js +1 -0
  76. package/lib/v2/google/router.js +1 -0
  77. package/lib/v2/gov/maintainer.js +9 -2
  78. package/lib/v2/gov/moa/zdscxx.js +104 -0
  79. package/lib/v2/gov/mot/index.js +66 -0
  80. package/lib/v2/gov/nea/ghs.js +58 -0
  81. package/lib/v2/gov/nifdc/index.js +40 -33
  82. package/lib/v2/gov/radar.js +232 -4
  83. package/lib/v2/gov/router.js +10 -2
  84. package/lib/v2/gov/safe/business.js +8 -0
  85. package/lib/v2/gov/safe/complaint.js +8 -0
  86. package/lib/v2/gov/safe/templates/message.art +25 -0
  87. package/lib/v2/gov/safe/util.js +87 -0
  88. package/lib/v2/gov/zhengce/index.js +99 -0
  89. package/lib/v2/greasyfork/maintainer.js +1 -0
  90. package/lib/v2/greasyfork/router.js +1 -0
  91. package/lib/v2/greasyfork/scripts.js +25 -20
  92. package/lib/{routes/universities → v2}/harvard/health/blog.js +8 -7
  93. package/lib/v2/harvard/maintainer.js +3 -0
  94. package/lib/v2/harvard/radar.js +13 -0
  95. package/lib/v2/harvard/router.js +3 -0
  96. package/lib/v2/huxiu/briefColumn.js +13 -25
  97. package/lib/v2/huxiu/channel.js +28 -0
  98. package/lib/v2/huxiu/club.js +30 -0
  99. package/lib/v2/huxiu/collection.js +14 -26
  100. package/lib/v2/huxiu/maintainer.js +8 -5
  101. package/lib/v2/huxiu/member.js +27 -0
  102. package/lib/v2/huxiu/moment.js +11 -25
  103. package/lib/v2/huxiu/radar.js +24 -16
  104. package/lib/v2/huxiu/router.js +7 -4
  105. package/lib/v2/huxiu/search.js +16 -21
  106. package/lib/v2/huxiu/tag.js +13 -25
  107. package/lib/v2/huxiu/templates/description.art +46 -0
  108. package/lib/v2/huxiu/util.js +460 -0
  109. package/lib/v2/ifi-audio/maintainer.js +1 -1
  110. package/lib/v2/imiker/jinghua.js +87 -0
  111. package/lib/v2/imiker/maintainer.js +3 -0
  112. package/lib/v2/imiker/radar.js +13 -0
  113. package/lib/v2/imiker/router.js +3 -0
  114. package/lib/v2/imiker/templates/description.art +32 -0
  115. package/lib/v2/inoreader/maintainer.js +1 -1
  116. package/lib/v2/instagram/common-utils.js +7 -4
  117. package/lib/v2/instagram/templates/images.art +9 -2
  118. package/lib/v2/instagram/templates/video.art +4 -1
  119. package/lib/v2/instagram/web-api/index.js +30 -9
  120. package/lib/v2/instagram/web-api/utils.js +149 -25
  121. package/lib/v2/kemono/index.js +26 -2
  122. package/lib/v2/kemono/radar.js +1 -1
  123. package/lib/v2/kepu/live.js +89 -0
  124. package/lib/v2/kepu/maintainer.js +3 -0
  125. package/lib/v2/kepu/radar.js +13 -0
  126. package/lib/v2/kepu/router.js +3 -0
  127. package/lib/v2/kepu/templates/description.art +33 -0
  128. package/lib/v2/leetcode/maintainer.js +1 -1
  129. package/lib/v2/lightnovel/lightNovel.js +62 -0
  130. package/lib/v2/lightnovel/maintainer.js +3 -0
  131. package/lib/v2/lightnovel/radar.js +13 -0
  132. package/lib/v2/lightnovel/router.js +3 -0
  133. package/lib/v2/line/radar.js +1 -1
  134. package/lib/v2/liquipedia/cs_matches.js +52 -0
  135. package/lib/v2/liquipedia/dota2_matches.js +47 -0
  136. package/lib/v2/liquipedia/maintainer.js +4 -0
  137. package/lib/v2/liquipedia/radar.js +19 -0
  138. package/lib/v2/liquipedia/router.js +4 -0
  139. package/lib/v2/magazinelib/maintainer.js +1 -1
  140. package/lib/v2/mihoyo/radar.js +1 -1
  141. package/lib/v2/missav/maintainer.js +3 -0
  142. package/lib/v2/missav/new.js +36 -0
  143. package/lib/v2/missav/radar.js +13 -0
  144. package/lib/v2/missav/router.js +3 -0
  145. package/lib/v2/missav/templates/preview.art +3 -0
  146. package/lib/v2/modb/maintainer.js +3 -0
  147. package/lib/v2/modb/radar.js +13 -0
  148. package/lib/v2/modb/router.js +3 -0
  149. package/lib/v2/modb/topic.js +59 -0
  150. package/lib/v2/nature/cover.js +32 -42
  151. package/lib/v2/nature/highlight.js +2 -2
  152. package/lib/v2/nature/news-and-comment.js +2 -2
  153. package/lib/v2/nature/news.js +2 -2
  154. package/lib/v2/nature/research.js +2 -2
  155. package/lib/v2/nature/siteindex.js +5 -5
  156. package/lib/v2/nature/utils.js +124 -5
  157. package/lib/v2/ncu/jwc.js +33 -0
  158. package/lib/v2/ncu/maintainer.js +3 -0
  159. package/lib/v2/ncu/radar.js +13 -0
  160. package/lib/v2/ncu/router.js +3 -0
  161. package/lib/v2/nmtv/radar.js +1 -1
  162. package/lib/v2/oo-software/radar.js +1 -1
  163. package/lib/v2/patagonia/maintainer.js +1 -1
  164. package/lib/v2/phoronix/index.js +177 -48
  165. package/lib/v2/phoronix/maintainer.js +1 -1
  166. package/lib/v2/phoronix/radar.js +3 -3
  167. package/lib/v2/phoronix/router.js +1 -1
  168. package/lib/v2/picnob/maintainer.js +1 -1
  169. package/lib/v2/picnob/templates/desc.art +3 -3
  170. package/lib/v2/picnob/user.js +74 -37
  171. package/lib/v2/picnob/utils.js +24 -0
  172. package/lib/v2/qbitai/category.js +27 -0
  173. package/lib/v2/qbitai/maintainer.js +4 -0
  174. package/lib/v2/qbitai/radar.js +19 -0
  175. package/lib/v2/qbitai/router.js +4 -0
  176. package/lib/v2/qbitai/tag.js +27 -0
  177. package/lib/v2/questmobile/maintainer.js +3 -0
  178. package/lib/v2/questmobile/radar.js +18 -0
  179. package/lib/v2/questmobile/report.js +127 -0
  180. package/lib/v2/questmobile/router.js +3 -0
  181. package/lib/v2/questmobile/templates/description.art +17 -0
  182. package/lib/v2/readhub/daily.js +43 -0
  183. package/lib/v2/readhub/index.js +19 -72
  184. package/lib/v2/readhub/maintainer.js +1 -0
  185. package/lib/v2/readhub/radar.js +6 -0
  186. package/lib/v2/readhub/router.js +1 -0
  187. package/lib/v2/readhub/util.js +69 -0
  188. package/lib/v2/routledge/book-series.js +78 -0
  189. package/lib/v2/routledge/maintainer.js +3 -0
  190. package/lib/v2/routledge/radar.js +13 -0
  191. package/lib/v2/routledge/router.js +3 -0
  192. package/lib/v2/routledge/templates/description.art +7 -0
  193. package/lib/v2/showstart/artist.js +15 -0
  194. package/lib/v2/showstart/brand.js +15 -0
  195. package/lib/v2/showstart/const.js +4 -0
  196. package/lib/v2/showstart/event.js +18 -0
  197. package/lib/v2/showstart/maintainer.js +6 -0
  198. package/lib/v2/showstart/radar.js +40 -0
  199. package/lib/v2/showstart/router.js +6 -0
  200. package/lib/v2/showstart/search.js +51 -0
  201. package/lib/v2/showstart/service.js +166 -0
  202. package/lib/v2/showstart/utils.js +92 -0
  203. package/lib/v2/snowpeak/maintainer.js +1 -1
  204. package/lib/v2/sony/maintainer.js +1 -1
  205. package/lib/v2/sse/disclosure.js +4 -3
  206. package/lib/v2/sspu/jwc.js +44 -0
  207. package/lib/v2/sspu/maintainer.js +3 -0
  208. package/lib/v2/sspu/radar.js +13 -0
  209. package/lib/v2/sspu/router.js +3 -0
  210. package/lib/v2/techcrunch/maintainer.js +1 -1
  211. package/lib/v2/theatlantic/maintainer.js +1 -1
  212. package/lib/v2/thepaper/radar.js +2 -2
  213. package/lib/v2/threads/index.js +20 -150
  214. package/lib/v2/threads/utils.js +147 -0
  215. package/lib/v2/twitter/keyword.js +1 -3
  216. package/lib/v2/twitter/media.js +1 -5
  217. package/lib/v2/twitter/user.js +1 -3
  218. package/lib/v2/twitter/utils.js +5 -3
  219. package/lib/v2/twitter/web-api/constants.js +80 -68
  220. package/lib/v2/twitter/web-api/twitter-api.js +96 -103
  221. package/lib/v2/uniqlo/maintainer.js +3 -0
  222. package/lib/v2/uniqlo/new.js +62 -0
  223. package/lib/v2/uniqlo/radar.js +12 -0
  224. package/lib/v2/uniqlo/router.js +3 -0
  225. package/lib/v2/wechat/maintainer.js +1 -1
  226. package/lib/v2/weibo/maintainer.js +1 -1
  227. package/lib/v2/weibo/radar.js +1 -1
  228. package/lib/v2/weibo/router.js +1 -1
  229. package/lib/v2/weibo/search/hot.js +118 -7
  230. package/lib/v2/weibo/search/template/digest.art +17 -0
  231. package/lib/v2/xiaohongshu/util.js +17 -7
  232. package/lib/v2/xmnn/docs.js +0 -0
  233. package/lib/v2/xmnn/maintainer.js +1 -0
  234. package/lib/v2/xmnn/news.js +65 -0
  235. package/lib/v2/xmnn/radar.js +67 -1
  236. package/lib/v2/xmnn/router.js +1 -0
  237. package/lib/v2/xsijishe/maintainer.js +1 -0
  238. package/lib/v2/xsijishe/radar.js +12 -0
  239. package/lib/v2/xsijishe/rank.js +60 -0
  240. package/lib/v2/xsijishe/router.js +1 -0
  241. package/lib/v2/yahoo/maintainer.js +2 -0
  242. package/lib/v2/yahoo/news/tw/index.js +24 -0
  243. package/lib/v2/yahoo/news/tw/provider-helper.js +22 -0
  244. package/lib/v2/yahoo/news/tw/provider.js +24 -0
  245. package/lib/v2/yahoo/news/tw/utils.js +129 -0
  246. package/lib/v2/yahoo/radar.js +29 -1
  247. package/lib/v2/yahoo/router.js +4 -1
  248. package/lib/v2/yahoo/templates/youtube.art +1 -0
  249. package/lib/v2/yuque/book.js +6 -1
  250. package/lib/v2/yuque/utils.js +16 -0
  251. package/lib/v2/zagg/maintainer.js +1 -1
  252. package/lib/views/error.art +1 -1
  253. package/lib/views/rss3-ums.js +62 -0
  254. package/lib/views/welcome.art +1 -1
  255. package/package.json +45 -39
  256. package/lib/routes/egsea/flash.js +0 -40
  257. package/lib/routes/gov/moa/sjzxfb.js +0 -20
  258. package/lib/routes/liquipedia/dota2_matches.js +0 -50
  259. package/lib/routes/questmobile/report.js +0 -121
  260. package/lib/routes/uniqlo/stylingbook.js +0 -24
  261. package/lib/routes/universities/buaa/news/index.js +0 -66
  262. package/lib/routes/universities/buaa/utils.js +0 -57
  263. package/lib/v2/gov/zhengce/zuixin.js +0 -39
  264. package/lib/v2/huxiu/article.js +0 -33
  265. package/lib/v2/huxiu/author.js +0 -36
  266. package/lib/v2/huxiu/templates/brief.art +0 -22
  267. package/lib/v2/huxiu/templates/img.art +0 -3
  268. package/lib/v2/huxiu/templates/moment.art +0 -16
  269. package/lib/v2/huxiu/templates/video.art +0 -7
  270. package/lib/v2/huxiu/utils.js +0 -154
  271. package/lib/v2/twitter/web-api/twitter-got.js +0 -113
  272. /package/lib/{routes → v2}/gov/moa/moa.js +0 -0
  273. /package/lib/v2/yahoo/news/{index.js → us/index.js} +0 -0
@@ -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 * 1000) || item.pubDate;
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.split(',');
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
- .html()
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
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ '/jwc': ['ywh555hhh'],
3
+ };
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ 'ncu.edu.cn': {
3
+ _name: '南昌大学',
4
+ jwc: [
5
+ {
6
+ title: '教务通知',
7
+ docs: 'https://docs.rsshub.app/routes/university#nan-chang-da-xue',
8
+ source: ['/', '/jwtz/index.htm'],
9
+ target: '/ncu/jwc',
10
+ },
11
+ ],
12
+ },
13
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = function (router) {
2
+ router.get('/jwc', require('./jwc'));
3
+ };
@@ -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/${new URL(url).toString.split(/\/folder/).pop()}`,
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/${new URL(url).match(/\/en\/(.*?)\/changelog/)[1]}`,
9
+ target: (params, url) => `/oo-software/changelog/${url.match(/\/en\/(.*?)\/changelog/)[1]}`,
10
10
  },
11
11
  ],
12
12
  },
@@ -1,3 +1,3 @@
1
1
  module.exports = {
2
- '/patagonia/new-arrivals/:category': ['NavePnow'],
2
+ '/patagonia/new-arrivals/:category': ['EthanWng97'],
3
3
  };
@@ -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
- module.exports = async (ctx) => {
8
- const { page, queryOrItem } = ctx.params;
9
- const rssUrl = new URL('/rss.php', baseUrl);
10
- rssUrl.searchParams.set('page', page);
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
- rssUrl.searchParams.set('item', queryOrItem);
83
+ legacyUrl.searchParams.set('item', queryOrItem);
14
84
  } else {
15
- rssUrl.searchParams.set('q', queryOrItem);
85
+ legacyUrl.searchParams.set('q', queryOrItem);
16
86
  }
17
87
  }
18
88
 
19
- const feed = await parser.parseURL(rssUrl.toString());
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
- const items = await Promise.all(
22
- feed.items.map((item) =>
23
- ctx.cache.tryGet(item.link, async () => {
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
- // thel last 2 are the category and comments
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
- // Summary
59
- const summary = $('.content > p:nth-child(1)');
60
-
61
- // High res images
62
- content.find('img').each((_, img) => {
63
- if (img.attribs.src.endsWith('_med')) {
64
- img.attribs.src = img.attribs.src.replace('_med', '_show');
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
- id: item.guid,
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: summary.html(),
226
+ summary: $('meta[name="twitter:description"]').attr('content'),
75
227
  description: content.html(),
76
- icon: 'https://www.phoronix.com/android-chrome-192x192.png',
77
- logo: 'https://www.phoronix.com/phxcms7-css/phoronix.png',
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
  };
@@ -1,3 +1,3 @@
1
1
  module.exports = {
2
- '/:page/:queryOrItem?': ['oppliate'],
2
+ '/:category?/:topic?': ['oppliate', 'Rongronggg9'],
3
3
  };
@@ -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/news',
8
+ source: ['/:category?/:topic?'],
9
+ target: '/phoronix/:category?/:topic?',
10
10
  },
11
11
  ],
12
12
  },
@@ -1,3 +1,3 @@
1
1
  module.exports = (router) => {
2
- router.get('/:page/:queryOrItem?', require('./index'));
2
+ router.get('/:category?/:topic?', require('./index'));
3
3
  };
@@ -1,3 +1,3 @@
1
1
  module.exports = {
2
- '/user/:id': ['TonyRL'],
2
+ '/user/:id': ['TonyRL', 'micheal-death'],
3
3
  };