rsshub 1.0.0-master.f7c0247 → 1.0.0-master.f7c4a93

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 (478) hide show
  1. package/lib/config.js +11 -1
  2. package/lib/middleware/anti-hotlink.js +90 -22
  3. package/lib/middleware/cache/redis.js +7 -2
  4. package/lib/middleware/onerror.js +2 -1
  5. package/lib/middleware/parameter.js +76 -35
  6. package/lib/middleware/templates/iframe.art +14 -0
  7. package/lib/radar-rules.js +0 -163
  8. package/lib/router.js +79 -94
  9. package/lib/routes/agefans/update.js +1 -1
  10. package/lib/routes/index.js +1 -1
  11. package/lib/routes/novel/biqugeinfo.js +2 -2
  12. package/lib/routes/universities/uestc/sice.js +12 -33
  13. package/lib/routes/weibo/user.js +20 -28
  14. package/lib/utils/cf-email.js +36 -0
  15. package/lib/utils/parse-date.js +4 -2
  16. package/lib/utils/puppeteer.js +22 -0
  17. package/lib/utils/wechat-mp.js +1 -0
  18. package/lib/v2/19lou/index.js +74 -0
  19. package/lib/v2/19lou/maintainer.js +3 -0
  20. package/lib/v2/19lou/radar.js +29 -0
  21. package/lib/v2/19lou/router.js +3 -0
  22. package/lib/v2/7mmtv/index.js +86 -0
  23. package/lib/v2/7mmtv/maintainer.js +4 -0
  24. package/lib/v2/7mmtv/radar.js +19 -0
  25. package/lib/v2/7mmtv/router.js +3 -0
  26. package/lib/v2/7mmtv/templates/description.art +11 -0
  27. package/lib/v2/91porn/index.js +58 -0
  28. package/lib/v2/91porn/maintainer.js +3 -0
  29. package/lib/v2/91porn/radar.js +13 -0
  30. package/lib/v2/91porn/router.js +3 -0
  31. package/lib/v2/91porn/templates/index.art +1 -0
  32. package/lib/v2/9to5/maintainer.js +3 -0
  33. package/lib/v2/9to5/radar.js +35 -0
  34. package/lib/v2/9to5/router.js +3 -0
  35. package/lib/{routes → v2}/9to5/subsite.js +20 -17
  36. package/lib/{routes → v2}/9to5/utils.js +4 -1
  37. package/lib/{routes → v2}/aliyun/database_month.js +8 -13
  38. package/lib/{routes → v2}/aliyun/developer/group.js +6 -1
  39. package/lib/v2/aliyun/maintainer.js +5 -0
  40. package/lib/{routes → v2}/aliyun/notice.js +13 -21
  41. package/lib/v2/aliyun/radar.js +32 -0
  42. package/lib/v2/aliyun/router.js +5 -0
  43. package/lib/v2/apnews/maintainer.js +3 -0
  44. package/lib/v2/apnews/radar.js +13 -0
  45. package/lib/v2/apnews/router.js +3 -0
  46. package/lib/v2/apnews/templates/description.art +14 -0
  47. package/lib/v2/apnews/topics.js +44 -0
  48. package/lib/{routes → v2}/asiantolick/index.js +20 -17
  49. package/lib/v2/asiantolick/maintainer.js +6 -0
  50. package/lib/v2/asiantolick/radar.js +31 -0
  51. package/lib/v2/asiantolick/router.js +3 -0
  52. package/lib/v2/asiantolick/templates/description.art +3 -0
  53. package/lib/v2/behance/maintainer.js +3 -0
  54. package/lib/v2/behance/radar.js +26 -0
  55. package/lib/v2/behance/router.js +3 -0
  56. package/lib/v2/behance/user.js +67 -0
  57. package/lib/v2/caareviews/book.js +14 -0
  58. package/lib/v2/caareviews/essay.js +14 -0
  59. package/lib/v2/caareviews/exhibition.js +14 -0
  60. package/lib/v2/caareviews/maintainer.js +5 -0
  61. package/lib/v2/caareviews/radar.js +25 -0
  62. package/lib/v2/caareviews/router.js +5 -0
  63. package/lib/v2/caareviews/templates/utils.art +2 -0
  64. package/lib/v2/caareviews/utils.js +49 -0
  65. package/lib/v2/ccac/news.js +12 -3
  66. package/lib/v2/chinanews/index.js +4 -3
  67. package/lib/v2/cn-healthcare/index.js +31 -0
  68. package/lib/v2/cn-healthcare/maintainer.js +3 -0
  69. package/lib/v2/cn-healthcare/radar.js +13 -0
  70. package/lib/v2/cn-healthcare/router.js +3 -0
  71. package/lib/v2/cncf/index.js +43 -0
  72. package/lib/v2/cncf/maintainer.js +3 -0
  73. package/lib/v2/cncf/radar.js +31 -0
  74. package/lib/v2/cncf/reports.js +38 -0
  75. package/lib/v2/cncf/router.js +4 -0
  76. package/lib/v2/cnjxol/index.js +94 -0
  77. package/lib/v2/cnjxol/maintainer.js +4 -0
  78. package/lib/v2/cnjxol/radar.js +19 -0
  79. package/lib/v2/cnjxol/router.js +3 -0
  80. package/lib/v2/cnjxol/templates/description.art +2 -0
  81. package/lib/v2/cntheory/maintainer.js +3 -0
  82. package/lib/v2/cntheory/paper.js +93 -0
  83. package/lib/v2/cntheory/radar.js +13 -0
  84. package/lib/v2/cntheory/router.js +3 -0
  85. package/lib/v2/cntheory/templates/description.art +2 -0
  86. package/lib/v2/cscse/maintainer.js +3 -0
  87. package/lib/v2/cscse/radar.js +13 -0
  88. package/lib/v2/cscse/router.js +3 -0
  89. package/lib/v2/cscse/tzgg.js +54 -0
  90. package/lib/v2/diandong/ddh.js +51 -0
  91. package/lib/v2/diandong/maintainer.js +4 -0
  92. package/lib/v2/diandong/news.js +50 -0
  93. package/lib/v2/diandong/radar.js +19 -0
  94. package/lib/v2/diandong/router.js +4 -0
  95. package/lib/v2/domp4/detail.js +67 -0
  96. package/lib/v2/domp4/latest.js +31 -0
  97. package/lib/v2/domp4/maintainer.js +4 -0
  98. package/lib/v2/domp4/radar.js +25 -0
  99. package/lib/v2/domp4/router.js +4 -0
  100. package/lib/v2/domp4/utils.js +72 -0
  101. package/lib/v2/douyin/hashtag.js +133 -0
  102. package/lib/v2/douyin/radar.js +6 -0
  103. package/lib/v2/douyin/router.js +1 -0
  104. package/lib/v2/douyin/user.js +10 -1
  105. package/lib/{routes → v2}/earthquake/ceic.js +3 -1
  106. package/lib/{routes → v2}/earthquake/index.js +5 -3
  107. package/lib/v2/earthquake/maintainer.js +4 -0
  108. package/lib/v2/earthquake/radar.js +24 -0
  109. package/lib/v2/earthquake/router.js +4 -0
  110. package/lib/{routes/the-economist → v2/economist}/download.js +0 -0
  111. package/lib/v2/economist/espresso.js +50 -0
  112. package/lib/v2/economist/full.js +42 -0
  113. package/lib/v2/economist/gre-vocabulary.js +19 -0
  114. package/lib/v2/economist/maintainer.js +6 -0
  115. package/lib/v2/economist/radar.js +27 -0
  116. package/lib/v2/economist/router.js +6 -0
  117. package/lib/v2/elasticsearch-cn/index.js +57 -0
  118. package/lib/v2/elasticsearch-cn/maintainer.js +3 -0
  119. package/lib/v2/elasticsearch-cn/radar.js +13 -0
  120. package/lib/v2/elasticsearch-cn/router.js +3 -0
  121. package/lib/v2/elsevier/issue.js +62 -0
  122. package/lib/v2/elsevier/journal.js +72 -0
  123. package/lib/v2/elsevier/maintainer.js +2 -2
  124. package/lib/v2/elsevier/radar.js +5 -5
  125. package/lib/v2/elsevier/router.js +4 -2
  126. package/lib/v2/elsevier/templates/description.art +5 -5
  127. package/lib/v2/epicgames/index.js +45 -11
  128. package/lib/v2/feng/forum.js +42 -0
  129. package/lib/v2/feng/radar.js +13 -0
  130. package/lib/v2/feng/router.js +3 -0
  131. package/lib/v2/feng/templates/deleted.art +2 -0
  132. package/lib/v2/feng/templates/img.art +6 -0
  133. package/lib/v2/feng/utils.js +80 -0
  134. package/lib/v2/fx-markets/channel.js +56 -0
  135. package/lib/v2/fx-markets/maintainer.js +3 -0
  136. package/lib/v2/fx-markets/radar.js +31 -0
  137. package/lib/v2/fx-markets/router.js +3 -0
  138. package/lib/v2/gcores/category.js +5 -1
  139. package/lib/v2/gcores/tag.js +5 -1
  140. package/lib/v2/getitfree/index.js +54 -0
  141. package/lib/v2/getitfree/maintainer.js +3 -0
  142. package/lib/v2/getitfree/radar.js +13 -0
  143. package/lib/v2/getitfree/router.js +3 -0
  144. package/lib/v2/gitee/maintainer.js +6 -0
  145. package/lib/v2/gitee/radar.js +31 -0
  146. package/lib/v2/gitee/repos/commits.js +40 -0
  147. package/lib/v2/gitee/repos/events.js +66 -0
  148. package/lib/v2/gitee/repos/releases.js +33 -0
  149. package/lib/v2/gitee/router.js +6 -0
  150. package/lib/v2/gitee/users/events.js +84 -0
  151. package/lib/v2/gov/beijing/jw/tzgg.js +58 -0
  152. package/lib/v2/gov/customs/list.js +80 -0
  153. package/lib/v2/gov/customs/utils.js +21 -0
  154. package/lib/v2/gov/maintainer.js +4 -1
  155. package/lib/v2/gov/miit/wjgs.js +50 -41
  156. package/lib/v2/gov/miit/zcjd.js +50 -41
  157. package/lib/v2/gov/pbc/goutongjiaoliu.js +20 -15
  158. package/lib/v2/gov/pbc/tradeAnnouncement.js +18 -14
  159. package/lib/v2/gov/radar.js +45 -26
  160. package/lib/v2/gov/router.js +2 -0
  161. package/lib/v2/gumroad/index.js +35 -0
  162. package/lib/v2/gumroad/maintainer.js +3 -0
  163. package/lib/v2/gumroad/radar.js +17 -0
  164. package/lib/v2/gumroad/router.js +3 -0
  165. package/lib/v2/gumroad/templates/products.art +7 -0
  166. package/lib/v2/hackertalk/index.js +23 -0
  167. package/lib/v2/hackertalk/maintainer.js +3 -0
  168. package/lib/v2/hackertalk/radar.js +13 -0
  169. package/lib/v2/hackertalk/router.js +3 -0
  170. package/lib/v2/hashnode/blog.js +62 -0
  171. package/lib/v2/hashnode/maintainer.js +3 -0
  172. package/lib/v2/hashnode/radar.js +13 -0
  173. package/lib/v2/hashnode/router.js +3 -0
  174. package/lib/v2/hashnode/templates/description.art +2 -0
  175. package/lib/v2/heu/gx/list.js +2 -2
  176. package/lib/v2/heu/job/list.js +2 -2
  177. package/lib/v2/heu/uae/list.js +2 -2
  178. package/lib/v2/heu/yjsy/list.js +2 -2
  179. package/lib/v2/hk01/channel.js +40 -0
  180. package/lib/{routes → v2}/hk01/hot.js +2 -1
  181. package/lib/v2/hk01/issue.js +41 -0
  182. package/lib/v2/hk01/maintainer.js +7 -0
  183. package/lib/v2/hk01/radar.js +37 -0
  184. package/lib/v2/hk01/router.js +7 -0
  185. package/lib/{routes → v2}/hk01/tag.js +2 -1
  186. package/lib/{routes → v2}/hk01/zone.js +3 -2
  187. package/lib/v2/hotukdeals/index.js +1 -1
  188. package/lib/{routes → v2}/huxiu/article.js +1 -1
  189. package/lib/{routes → v2}/huxiu/author.js +18 -6
  190. package/lib/{routes → v2}/huxiu/collection.js +1 -2
  191. package/lib/v2/huxiu/maintainer.js +7 -0
  192. package/lib/v2/huxiu/radar.js +35 -0
  193. package/lib/v2/huxiu/router.js +7 -0
  194. package/lib/{routes → v2}/huxiu/search.js +0 -0
  195. package/lib/{routes → v2}/huxiu/tag.js +0 -0
  196. package/lib/{routes → v2}/huxiu/utils.js +3 -4
  197. package/lib/v2/ieee/journal.js +78 -0
  198. package/lib/v2/ieee/maintainer.js +2 -2
  199. package/lib/v2/ieee/radar.js +4 -4
  200. package/lib/v2/ieee/{latestdate.js → recent.js} +34 -42
  201. package/lib/v2/ieee/router.js +4 -2
  202. package/lib/v2/ieee/templates/description.art +5 -5
  203. package/lib/v2/ielts/index.js +32 -26
  204. package/lib/v2/itch/devlog.js +62 -0
  205. package/lib/v2/itch/index.js +56 -0
  206. package/lib/v2/itch/maintainer.js +5 -0
  207. package/lib/v2/itch/posts.js +41 -0
  208. package/lib/v2/itch/radar.js +28 -0
  209. package/lib/v2/itch/router.js +5 -0
  210. package/lib/v2/itch/templates/description.art +4 -0
  211. package/lib/v2/jike/utils.js +32 -1
  212. package/lib/{routes → v2}/juejin/books.js +2 -1
  213. package/lib/{routes → v2}/juejin/category.js +1 -1
  214. package/lib/{routes → v2}/juejin/collection.js +0 -0
  215. package/lib/{routes → v2}/juejin/column.js +0 -0
  216. package/lib/{routes → v2}/juejin/favorites.js +0 -0
  217. package/lib/v2/juejin/maintainer.js +13 -0
  218. package/lib/v2/juejin/news.js +25 -0
  219. package/lib/{routes → v2}/juejin/pins.js +3 -2
  220. package/lib/{routes → v2}/juejin/posts.js +0 -0
  221. package/lib/v2/juejin/radar.js +61 -0
  222. package/lib/v2/juejin/router.js +13 -0
  223. package/lib/{routes → v2}/juejin/shares.js +0 -0
  224. package/lib/{routes → v2}/juejin/tag.js +0 -0
  225. package/lib/{routes → v2}/juejin/trending.js +0 -0
  226. package/lib/{routes → v2}/juejin/utils.js +15 -7
  227. package/lib/v2/kcna/maintainer.js +3 -0
  228. package/lib/v2/kcna/news.js +81 -0
  229. package/lib/v2/kcna/radar.js +61 -0
  230. package/lib/v2/kcna/router.js +3 -0
  231. package/lib/v2/kcna/templates/news.art +9 -0
  232. package/lib/v2/kcna/utils.js +64 -0
  233. package/lib/v2/keep/maintainer.js +3 -0
  234. package/lib/v2/keep/radar.js +13 -0
  235. package/lib/v2/keep/router.js +3 -0
  236. package/lib/v2/keep/templates/user.art +16 -0
  237. package/lib/{routes → v2}/keep/user.js +14 -4
  238. package/lib/v2/laohu8/maintainer.js +3 -0
  239. package/lib/v2/laohu8/personal.js +32 -0
  240. package/lib/v2/laohu8/radar.js +13 -0
  241. package/lib/v2/laohu8/router.js +3 -0
  242. package/lib/v2/lever/index.js +28 -0
  243. package/lib/v2/lever/maintainer.js +3 -0
  244. package/lib/v2/lever/radar.js +13 -0
  245. package/lib/v2/lever/router.js +3 -0
  246. package/lib/v2/mdpi/journal.js +65 -0
  247. package/lib/v2/mdpi/maintainer.js +3 -0
  248. package/lib/v2/mdpi/radar.js +13 -0
  249. package/lib/v2/mdpi/router.js +3 -0
  250. package/lib/v2/mdpi/templates/description.art +12 -0
  251. package/lib/v2/mihoyo/bbs.js +1 -0
  252. package/lib/v2/mihoyo/radar.js +2 -2
  253. package/lib/v2/mirror/index.js +34 -0
  254. package/lib/v2/mirror/maintainer.js +3 -0
  255. package/lib/v2/mirror/radar.js +17 -0
  256. package/lib/v2/mirror/router.js +3 -0
  257. package/lib/v2/mobilism/forums.js +75 -0
  258. package/lib/v2/mobilism/maintainer.js +4 -0
  259. package/lib/v2/mobilism/portal.js +54 -0
  260. package/lib/v2/mobilism/radar.js +23 -0
  261. package/lib/v2/mobilism/router.js +4 -0
  262. package/lib/{routes → v2}/mp4er/index.js +1 -1
  263. package/lib/v2/mp4er/maintainer.js +3 -0
  264. package/lib/v2/mp4er/radar.js +13 -0
  265. package/lib/v2/mp4er/router.js +3 -0
  266. package/lib/v2/mysql/maintainer.js +3 -0
  267. package/lib/v2/mysql/radar.js +13 -0
  268. package/lib/v2/mysql/release.js +55 -0
  269. package/lib/v2/mysql/router.js +3 -0
  270. package/lib/v2/nbd/radar.js +2 -2
  271. package/lib/v2/ncwu/maintainer.js +3 -0
  272. package/lib/v2/ncwu/notice.js +27 -0
  273. package/lib/v2/ncwu/radar.js +13 -0
  274. package/lib/v2/ncwu/router.js +3 -0
  275. package/lib/v2/nhk/news.js +41 -0
  276. package/lib/{routes → v2}/nhk/news_web_easy.js +20 -20
  277. package/lib/v2/nhk/radar.js +19 -0
  278. package/lib/v2/nhk/router.js +4 -0
  279. package/lib/v2/nhk/templates/news.art +5 -0
  280. package/lib/v2/nju/rczp.js +34 -24
  281. package/lib/v2/njust/utils.js +4 -0
  282. package/lib/v2/nuaa/utils/pypasswaf.js +4 -5
  283. package/lib/v2/nytimes/daily_briefing_chinese.js +66 -41
  284. package/lib/v2/nytimes/index.js +3 -3
  285. package/lib/v2/nytimes/maintainer.js +1 -1
  286. package/lib/v2/nytimes/templates/image.art +4 -0
  287. package/lib/v2/nytimes/utils.js +7 -1
  288. package/lib/v2/oceanengine/arithmeticIndex.js +145 -0
  289. package/lib/v2/oceanengine/maintainer.js +3 -0
  290. package/lib/v2/oceanengine/radar.js +13 -0
  291. package/lib/v2/oceanengine/router.js +3 -0
  292. package/lib/v2/oceanengine/templates/content.art +14 -0
  293. package/lib/v2/openwrt/maintainer.js +3 -0
  294. package/lib/v2/openwrt/radar.js +13 -0
  295. package/lib/v2/openwrt/releases.js +25 -0
  296. package/lib/v2/openwrt/router.js +3 -0
  297. package/lib/v2/orcid/index.js +1 -1
  298. package/lib/v2/orcid/templates/description.art +2 -2
  299. package/lib/v2/panewslab/{column.js → author.js} +11 -23
  300. package/lib/v2/panewslab/index.js +24 -17
  301. package/lib/v2/panewslab/maintainer.js +3 -1
  302. package/lib/v2/panewslab/news.js +28 -0
  303. package/lib/v2/panewslab/radar.js +2 -2
  304. package/lib/v2/panewslab/router.js +4 -2
  305. package/lib/v2/panewslab/topic.js +7 -14
  306. package/lib/v2/pincong/hot.js +28 -0
  307. package/lib/{routes → v2}/pincong/index.js +6 -12
  308. package/lib/v2/pincong/maintainer.js +5 -0
  309. package/lib/v2/pincong/radar.js +35 -0
  310. package/lib/v2/pincong/router.js +5 -0
  311. package/lib/v2/pincong/topic.js +25 -0
  312. package/lib/v2/pincong/utils.js +22 -0
  313. package/lib/v2/pku/maintainer.js +1 -0
  314. package/lib/v2/pku/nsd.js +69 -0
  315. package/lib/v2/pku/radar.js +8 -0
  316. package/lib/v2/pku/router.js +1 -0
  317. package/lib/v2/playno1/av.js +41 -0
  318. package/lib/v2/playno1/maintainer.js +4 -0
  319. package/lib/v2/playno1/radar.js +21 -0
  320. package/lib/v2/playno1/router.js +4 -0
  321. package/lib/v2/playno1/st.js +36 -0
  322. package/lib/v2/playno1/utils.js +32 -0
  323. package/lib/v2/pmthinking/index.js +61 -0
  324. package/lib/v2/pmthinking/maintainer.js +3 -0
  325. package/lib/v2/pmthinking/radar.js +13 -0
  326. package/lib/v2/pmthinking/router.js +3 -0
  327. package/lib/v2/pmthinking/templates/description.art +4 -0
  328. package/lib/v2/prestige-av/maintainer.js +3 -0
  329. package/lib/v2/prestige-av/radar.js +18 -0
  330. package/lib/v2/prestige-av/router.js +3 -0
  331. package/lib/{routes → v2}/prestige-av/series.js +8 -5
  332. package/lib/v2/qipamaijia/index.js +26 -0
  333. package/lib/v2/qipamaijia/maintainer.js +3 -0
  334. package/lib/v2/qipamaijia/radar.js +13 -0
  335. package/lib/v2/qipamaijia/router.js +3 -0
  336. package/lib/v2/reuters/common.js +54 -0
  337. package/lib/v2/reuters/investigates.js +39 -0
  338. package/lib/v2/reuters/maintainer.js +6 -0
  339. package/lib/v2/reuters/migration_prompt.js +3 -0
  340. package/lib/v2/reuters/radar.js +19 -0
  341. package/lib/v2/reuters/router.js +6 -0
  342. package/lib/v2/sciencedirect/journal.js +8 -1
  343. package/lib/v2/{jasa/latest.js → scitation/journal.js} +24 -27
  344. package/lib/v2/scitation/maintainer.js +4 -0
  345. package/lib/v2/scitation/radar.js +19 -0
  346. package/lib/v2/scitation/router.js +4 -0
  347. package/lib/v2/scitation/section.js +90 -0
  348. package/lib/v2/scitation/templates/description.art +11 -0
  349. package/lib/v2/sis001/forum.js +62 -0
  350. package/lib/v2/sis001/maintainer.js +3 -0
  351. package/lib/v2/sis001/radar.js +13 -0
  352. package/lib/v2/sis001/router.js +3 -0
  353. package/lib/{routes → v2}/sobooks/date.js +1 -1
  354. package/lib/{routes → v2}/sobooks/index.js +1 -1
  355. package/lib/v2/sobooks/maintainer.js +5 -0
  356. package/lib/v2/sobooks/radar.js +25 -0
  357. package/lib/v2/sobooks/router.js +5 -0
  358. package/lib/{routes → v2}/sobooks/tag.js +1 -1
  359. package/lib/{routes → v2}/sobooks/utils.js +3 -2
  360. package/lib/v2/springer/journal.js +72 -0
  361. package/lib/v2/springer/maintainer.js +3 -0
  362. package/lib/v2/springer/radar.js +13 -0
  363. package/lib/v2/springer/router.js +3 -0
  364. package/lib/v2/springer/templates/description.art +12 -0
  365. package/lib/v2/sspai/maintainer.js +1 -0
  366. package/lib/v2/sspai/radar.js +6 -0
  367. package/lib/v2/sspai/router.js +1 -0
  368. package/lib/v2/sspai/seriesUpdate.js +36 -0
  369. package/lib/v2/supchina/index.js +67 -0
  370. package/lib/v2/supchina/maintainer.js +4 -0
  371. package/lib/v2/supchina/podcasts.js +66 -0
  372. package/lib/v2/supchina/radar.js +19 -0
  373. package/lib/v2/supchina/router.js +4 -0
  374. package/lib/v2/techflow520/index.js +34 -0
  375. package/lib/v2/techflow520/maintainer.js +4 -0
  376. package/lib/v2/techflow520/newsflash.js +32 -0
  377. package/lib/v2/techflow520/radar.js +19 -0
  378. package/lib/v2/techflow520/router.js +4 -0
  379. package/lib/v2/tencent/cloud/column.js +51 -0
  380. package/lib/v2/tencent/maintainer.js +1 -0
  381. package/lib/v2/tencent/radar.js +11 -0
  382. package/lib/v2/tencent/router.js +1 -0
  383. package/lib/v2/test/index.js +23 -2
  384. package/lib/v2/tiktok/maintainer.js +3 -0
  385. package/lib/v2/tiktok/radar.js +13 -0
  386. package/lib/v2/tiktok/router.js +3 -0
  387. package/lib/v2/tiktok/templates/user.art +3 -0
  388. package/lib/v2/tiktok/user.js +89 -0
  389. package/lib/v2/tingshuitz/dalian.js +29 -0
  390. package/lib/{routes → v2}/tingshuitz/dongguan.js +2 -1
  391. package/lib/{routes → v2}/tingshuitz/guangzhou.js +0 -0
  392. package/lib/{routes → v2}/tingshuitz/hangzhou.js +0 -0
  393. package/lib/v2/tingshuitz/maintainer.js +11 -0
  394. package/lib/{routes → v2}/tingshuitz/nanjing.js +9 -11
  395. package/lib/v2/tingshuitz/radar.js +68 -0
  396. package/lib/v2/tingshuitz/router.js +11 -0
  397. package/lib/v2/tingshuitz/wuhan.js +32 -0
  398. package/lib/{routes → v2}/tingshuitz/xian.js +1 -1
  399. package/lib/{routes → v2}/tingshuitz/xiaoshan.js +0 -0
  400. package/lib/{routes → v2}/tingshuitz/yangjiang.js +6 -8
  401. package/lib/v2/trending/allTrending.js +169 -0
  402. package/lib/v2/trending/maintainer.js +3 -0
  403. package/lib/v2/trending/radar.js +35 -0
  404. package/lib/v2/trending/router.js +3 -0
  405. package/lib/v2/trending/templates/content.art +24 -0
  406. package/lib/v2/uraaka-joshi/uraaka-joshi-user.js +7 -1
  407. package/lib/v2/uraaka-joshi/uraaka-joshi.js +8 -1
  408. package/lib/v2/usts/jwch.js +56 -0
  409. package/lib/v2/usts/maintainer.js +3 -0
  410. package/lib/v2/usts/radar.js +25 -0
  411. package/lib/v2/usts/router.js +3 -0
  412. package/lib/v2/wallpaperhub/index.js +28 -0
  413. package/lib/v2/wallpaperhub/maintainer.js +3 -0
  414. package/lib/v2/wallpaperhub/radar.js +13 -0
  415. package/lib/v2/wallpaperhub/router.js +3 -0
  416. package/lib/v2/wallpaperhub/templates/description.art +1 -0
  417. package/lib/{routes → v2}/xiaohongshu/board.js +8 -6
  418. package/lib/v2/xiaohongshu/maintainer.js +4 -0
  419. package/lib/v2/xiaohongshu/radar.js +25 -0
  420. package/lib/v2/xiaohongshu/router.js +4 -0
  421. package/lib/{routes → v2}/xiaohongshu/user.js +9 -11
  422. package/lib/v2/xiaohongshu/util.js +32 -0
  423. package/lib/v2/xiaozhuanlan/column.js +52 -0
  424. package/lib/v2/xiaozhuanlan/maintainer.js +3 -0
  425. package/lib/v2/xiaozhuanlan/radar.js +13 -0
  426. package/lib/v2/xiaozhuanlan/router.js +3 -0
  427. package/lib/v2/xidian/jwc.js +54 -0
  428. package/lib/v2/xidian/maintainer.js +3 -0
  429. package/lib/v2/xidian/radar.js +13 -0
  430. package/lib/v2/xidian/router.js +3 -0
  431. package/lib/{routes → v2}/youtube/channel.js +9 -5
  432. package/lib/v2/youtube/maintainer.js +6 -0
  433. package/lib/{routes → v2}/youtube/playlist.js +6 -10
  434. package/lib/v2/youtube/radar.js +31 -0
  435. package/lib/v2/youtube/router.js +6 -0
  436. package/lib/v2/youtube/subscriptions.js +56 -0
  437. package/lib/v2/youtube/templates/description.art +7 -0
  438. package/lib/{routes → v2}/youtube/user.js +4 -5
  439. package/lib/v2/youtube/utils.js +141 -0
  440. package/lib/v2/zhihu/activities.js +36 -0
  441. package/lib/v2/zyshow/index.js +46 -0
  442. package/lib/v2/zyshow/maintainer.js +3 -0
  443. package/lib/v2/zyshow/radar.js +17 -0
  444. package/lib/v2/zyshow/router.js +3 -0
  445. package/lib/v2/zyshow/templates/description.art +16 -0
  446. package/package.json +21 -20
  447. package/lib/routes/apnews/topics.js +0 -43
  448. package/lib/routes/behance/index.js +0 -58
  449. package/lib/routes/gov/customs/list.js +0 -77
  450. package/lib/routes/hk01/channel.js +0 -22
  451. package/lib/routes/hk01/issue.js +0 -22
  452. package/lib/routes/mirror/entries.js +0 -80
  453. package/lib/routes/mobilism/release.js +0 -42
  454. package/lib/routes/pincong/hot.js +0 -33
  455. package/lib/routes/pincong/topic.js +0 -32
  456. package/lib/routes/reuters/channel.js +0 -155
  457. package/lib/routes/reuters/theWire.js +0 -45
  458. package/lib/routes/reuters/utils.js +0 -72
  459. package/lib/routes/the-economist/full.js +0 -48
  460. package/lib/routes/the-economist/gre-vocabulary.js +0 -27
  461. package/lib/routes/tingshuitz/dalian.js +0 -34
  462. package/lib/routes/tingshuitz/wuhan.js +0 -34
  463. package/lib/routes/universities/ncwu/notice.js +0 -42
  464. package/lib/routes/universities/xidian/jwc.js +0 -70
  465. package/lib/routes/waijiedanao/article.js +0 -78
  466. package/lib/routes/wallpaperhub/index.js +0 -22
  467. package/lib/routes/xiaohongshu/util.js +0 -18
  468. package/lib/routes/youtube/utils.js +0 -90
  469. package/lib/routes/zyshow/index.js +0 -42
  470. package/lib/v2/elsevier/latest.js +0 -87
  471. package/lib/v2/elsevier/volume.js +0 -75
  472. package/lib/v2/ieee/latestvol.js +0 -87
  473. package/lib/v2/jasa/maintainer.js +0 -4
  474. package/lib/v2/jasa/radar.js +0 -19
  475. package/lib/v2/jasa/router.js +0 -4
  476. package/lib/v2/jasa/section.js +0 -95
  477. package/lib/v2/jasa/templates/description.art +0 -11
  478. package/lib/v2/panewslab/newsflash.js +0 -35
package/lib/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  require('dotenv').config();
2
- const randUserAgent = require('@/utils/rand-user-agent');
2
+ const randUserAgent = require('./utils/rand-user-agent');
3
3
  let envs = process.env;
4
4
  let value;
5
5
  const calculateValue = () => {
@@ -91,6 +91,10 @@ const calculateValue = () => {
91
91
  includePaths: envs.HOTLINK_INCLUDE_PATHS && envs.HOTLINK_INCLUDE_PATHS.split(','),
92
92
  excludePaths: envs.HOTLINK_EXCLUDE_PATHS && envs.HOTLINK_EXCLUDE_PATHS.split(','),
93
93
  },
94
+ feature: {
95
+ allow_user_hotlink_template: envs.ALLOW_USER_HOTLINK_TEMPLATE === 'true',
96
+ filter_regex_engine: envs.FILTER_REGEX_ENGINE || 're2',
97
+ },
94
98
  suffix: envs.SUFFIX,
95
99
  titleLengthLimit: parseInt(envs.TITLE_LENGTH_LIMIT) || 150,
96
100
 
@@ -150,6 +154,9 @@ const calculateValue = () => {
150
154
  github: {
151
155
  access_token: envs.GITHUB_ACCESS_TOKEN,
152
156
  },
157
+ gitee: {
158
+ access_token: envs.GITEE_ACCESS_TOKEN,
159
+ },
153
160
  google: {
154
161
  fontsApiKey: envs.GOOGLE_FONTS_API_KEY,
155
162
  },
@@ -251,6 +258,9 @@ const calculateValue = () => {
251
258
  },
252
259
  youtube: {
253
260
  key: envs.YOUTUBE_KEY,
261
+ clientId: envs.YOUTUBE_CLIENT_ID,
262
+ clientSecret: envs.YOUTUBE_CLIENT_SECRET,
263
+ refreshToken: envs.YOUTUBE_REFRESH_TOKEN,
254
264
  },
255
265
  yuque: {
256
266
  token: envs.YUQUE_TOKEN,
@@ -1,6 +1,12 @@
1
1
  const config = require('@/config').value;
2
2
  const cheerio = require('cheerio');
3
3
  const logger = require('@/utils/logger');
4
+ const path = require('path');
5
+ const { art } = require('@/utils/render');
6
+
7
+ const templateRegex = /\$\{([^{}]+)}/g;
8
+ const allowedUrlProperties = ['hash', 'host', 'hostname', 'href', 'origin', 'password', 'pathname', 'port', 'protocol', 'search', 'searchParams', 'username'];
9
+ const IframeWrapperTemplate = path.join(__dirname, 'templates/iframe.art');
4
10
 
5
11
  // match path or sub-path
6
12
  const matchPath = (path, paths) => {
@@ -19,9 +25,16 @@ const filterPath = (path) => {
19
25
  return !(include && !matchPath(path, include)) && !(exclude && matchPath(path, exclude));
20
26
  };
21
27
 
22
- const interpolate = (str, obj) => str.replace(/\${([^}]+)}/g, (_, prop) => obj[prop]);
23
- // I don't want to keep another regex and
24
- // URL will be the standard way to parse URL
28
+ const interpolate = (str, obj) =>
29
+ str.replace(templateRegex, (_, prop) => {
30
+ let needEncode = false;
31
+ if (prop.endsWith('_ue')) {
32
+ // url encode
33
+ prop = prop.slice(0, -3);
34
+ needEncode = true;
35
+ }
36
+ return needEncode ? encodeURIComponent(obj[prop]) : obj[prop];
37
+ });
25
38
  const parseUrl = (str) => {
26
39
  let url;
27
40
  try {
@@ -32,48 +45,103 @@ const parseUrl = (str) => {
32
45
 
33
46
  return url;
34
47
  };
35
- const replaceUrls = (body, template) => {
36
- // const $ = cheerio.load(body, { decodeEntities: false, xmlMode: true });
37
- // `<br><img><hr><video><source>abc</video>` => `<br><img><hr><video><source>abc</source></video></hr></img></br>`
38
- // so awful...
39
- // "In HTML, using a closing tag on an empty element is usually invalid."
40
- // https://developer.mozilla.org/en-US/docs/Glossary/Empty_element
41
- // I guess it is just a workaround to drop `<html><head></head><body>`, so this is what we exactly need:
42
- const $ = cheerio.load(body, null, false);
43
- $('img').each(function () {
44
- const old_src = $(this).attr('src');
45
- const url = parseUrl(old_src);
46
- if (url) {
47
- const new_src = interpolate(template, url);
48
- $(this).attr('src', new_src);
48
+ const replaceUrls = ($, selector, template, attribute = 'src') => {
49
+ $(selector).each(function () {
50
+ const old_src = $(this).attr(attribute);
51
+ if (old_src) {
52
+ const url = parseUrl(old_src);
53
+ if (url) {
54
+ // Cheerio will do the right thing to prohibit XSS.
55
+ $(this).attr(attribute, interpolate(template, url));
56
+ }
49
57
  }
50
58
  });
59
+ };
60
+
61
+ const wrapWithIframe = ($, selector) => {
62
+ $(selector).each((_, elem) => {
63
+ elem = $(elem);
64
+ elem.replaceWith(art(IframeWrapperTemplate, { content: elem.toString() }));
65
+ });
66
+ };
51
67
 
52
- return $.root().html();
68
+ const process = (html, image_hotlink_template, multimedia_hotlink_template, wrap_multimedia_in_iframe) => {
69
+ const $ = cheerio.load(html, undefined, false);
70
+ if (image_hotlink_template) {
71
+ replaceUrls($, 'img, picture > source', image_hotlink_template);
72
+ replaceUrls($, 'video[poster]', image_hotlink_template, 'poster');
73
+ }
74
+ if (multimedia_hotlink_template) {
75
+ replaceUrls($, 'video, video > source, audio, audio > source', multimedia_hotlink_template);
76
+ if (!image_hotlink_template) {
77
+ replaceUrls($, 'video[poster]', multimedia_hotlink_template, 'poster');
78
+ }
79
+ }
80
+ if (wrap_multimedia_in_iframe) {
81
+ wrapWithIframe($, 'video, audio');
82
+ }
83
+ return $.html();
84
+ };
85
+
86
+ const validateTemplate = (template) => {
87
+ if (!template) {
88
+ return;
89
+ }
90
+ [...template.matchAll(templateRegex)].forEach((match) => {
91
+ const prop = match[1].endsWith('_ue') ? match[1].slice(0, -3) : match[1];
92
+ if (!allowedUrlProperties.includes(prop)) {
93
+ throw new Error(`Invalid URL property: ${prop}`);
94
+ }
95
+ });
53
96
  };
54
97
 
55
98
  module.exports = async (ctx, next) => {
56
99
  await next();
57
100
 
58
- const template = config.hotlink.template;
101
+ let image_hotlink_template = undefined;
102
+ let multimedia_hotlink_template = undefined;
103
+ const shouldWrapInIframe = ctx.query.wrap_multimedia_in_iframe === '1';
59
104
 
60
- if (!template || !filterPath(ctx.request.path)) {
105
+ // Read params if enabled
106
+ if (config.feature.allow_user_hotlink_template) {
107
+ // By default, the config turns these features off. Set corresponding config to
108
+ // true to turn this feature on.
109
+ // A risk is that the media URLs will be replaced by user-supplied templates,
110
+ // so a user could literally take the control of "where are the media from",
111
+ // but only in their personal-use feed URL.
112
+ multimedia_hotlink_template = ctx.query.multimedia_hotlink_template;
113
+ image_hotlink_template = ctx.query.image_hotlink_template;
114
+ }
115
+
116
+ // Force config hotlink template on conflict
117
+ if (config.hotlink.template) {
118
+ if (!filterPath(ctx.request.path)) {
119
+ image_hotlink_template = undefined;
120
+ } else {
121
+ image_hotlink_template = config.hotlink.template;
122
+ }
123
+ }
124
+
125
+ if (!image_hotlink_template && !multimedia_hotlink_template && !shouldWrapInIframe) {
61
126
  return;
62
127
  }
63
128
 
129
+ validateTemplate(image_hotlink_template);
130
+ validateTemplate(multimedia_hotlink_template);
131
+
64
132
  // Assume that only description include image link
65
133
  // and here we will only check them in description.
66
134
  // Use Cheerio to load the description as html and filter all
67
135
  // image link
68
136
  if (ctx.state.data) {
69
137
  if (ctx.state.data.description) {
70
- ctx.state.data.description = replaceUrls(ctx.state.data.description, template);
138
+ ctx.state.data.description = process(ctx.state.data.description, image_hotlink_template, multimedia_hotlink_template, shouldWrapInIframe);
71
139
  }
72
140
 
73
141
  ctx.state.data.item &&
74
142
  ctx.state.data.item.forEach((item) => {
75
143
  if (item.description) {
76
- item.description = replaceUrls(item.description, template);
144
+ item.description = process(item.description, image_hotlink_template, multimedia_hotlink_template, shouldWrapInIframe);
77
145
  }
78
146
  });
79
147
  }
@@ -32,8 +32,10 @@ module.exports = {
32
32
  let [value, cacheTtl] = await redisClient.mget(key, cacheTtlKey);
33
33
  if (value && refresh) {
34
34
  if (!cacheTtl) {
35
+ // if cacheTtl is not set, that means the cache expire time is contentExpire
35
36
  cacheTtl = config.cache.contentExpire;
36
- redisClient.set(cacheTtlKey, cacheTtl, 'EX', cacheTtl);
37
+ // dont save cacheTtl to Redis, as it is the default value
38
+ // redisClient.set(cacheTtlKey, cacheTtl, 'EX', cacheTtl);
37
39
  } else {
38
40
  redisClient.expire(cacheTtlKey, cacheTtl);
39
41
  }
@@ -54,7 +56,10 @@ module.exports = {
54
56
  value = JSON.stringify(value);
55
57
  }
56
58
  if (key) {
57
- redisClient.set(getCacheTtlKey(key), maxAge, 'EX', maxAge);
59
+ if (maxAge !== config.cache.contentExpire) {
60
+ // Only set cacheTtlKey if maxAge !== contentExpire
61
+ redisClient.set(getCacheTtlKey(key), maxAge, 'EX', maxAge);
62
+ }
58
63
  return redisClient.set(key, value, 'EX', maxAge); // setMode: https://redis.io/commands/set
59
64
  }
60
65
  },
@@ -23,7 +23,7 @@ if (config.sentry.dsn) {
23
23
  try {
24
24
  gitHash = require('git-rev-sync').short();
25
25
  } catch (e) {
26
- gitHash = (process.env.HEROKU_SLUG_COMMIT && process.env.HEROKU_SLUG_COMMIT.slice(0, 7)) || (process.env.VERCEL_GITHUB_COMMIT_SHA && process.env.VERCEL_GITHUB_COMMIT_SHA.slice(0, 7)) || 'unknown';
26
+ gitHash = (process.env.HEROKU_SLUG_COMMIT && process.env.HEROKU_SLUG_COMMIT.slice(0, 7)) || (process.env.VERCEL_GIT_COMMIT_SHA && process.env.VERCEL_GIT_COMMIT_SHA.slice(0, 7)) || 'unknown';
27
27
  }
28
28
 
29
29
  module.exports = async (ctx, next) => {
@@ -62,6 +62,7 @@ module.exports = async (ctx, next) => {
62
62
  if (err instanceof RequestInProgressError) {
63
63
  ctx.status = 503;
64
64
  message = err.message;
65
+ ctx.set('Cache-Control', `public, max-age=${config.cache.requestTimeout}`);
65
66
  } else if (ctx.status === 403) {
66
67
  message = err.message;
67
68
  } else {
@@ -3,16 +3,41 @@ const cheerio = require('cheerio');
3
3
  const { simplecc } = require('simplecc-wasm');
4
4
  const got = require('@/utils/got');
5
5
  const config = require('@/config').value;
6
+ const RE2 = require('re2');
6
7
 
7
8
  let mercury_parser;
8
9
 
10
+ const resolveRelativeLink = ($, elem, attr, baseUrl) => {
11
+ const $elem = $(elem);
12
+
13
+ if (baseUrl) {
14
+ try {
15
+ const oldAttr = $elem.attr(attr);
16
+ if (oldAttr) {
17
+ // e.g. <video><source src="https://example.com"></video> should leave <video> unchanged
18
+ $elem.attr(attr, new URL(oldAttr, baseUrl).href);
19
+ }
20
+ } catch (e) {
21
+ // no-empty
22
+ }
23
+ }
24
+ };
25
+
9
26
  module.exports = async (ctx, next) => {
10
27
  await next();
11
28
 
12
29
  if (!ctx.state.data && !ctx._matchedRoute) {
13
- ctx.set({
14
- 'Cache-Control': `public, max-age=${config.cache.routeExpire * 100}`,
15
- });
30
+ // Given that the official demo has a cache TTL of 2h, a "wrong path" page will be cached by CloudFlare for
31
+ // 200h (8.33d).
32
+ // What makes it worse is that the documentation contains status badges to detect the availability of routes,
33
+ // but the documentation is updated more timely than the official demo, so the every example path of every
34
+ // new route will probably have a "wrong path" page cached for at least 200h soon after accepted. That is to
35
+ // say, the example paths of a new route will probably be unavailable on the public demo in the first 200h
36
+ // after accepted.
37
+ // As a conclusion, the next 3 lines has been commented out. (exactly the same behavior as any internal error)
38
+ // ctx.set({
39
+ // 'Cache-Control': `public, max-age=${config.cache.routeExpire * 100}`,
40
+ // });
16
41
  throw Error('wrong path');
17
42
  }
18
43
 
@@ -68,50 +93,49 @@ module.exports = async (ctx, next) => {
68
93
 
69
94
  $('script').remove();
70
95
 
71
- $('a').each((_, ele) => {
72
- const $ele = $(ele);
73
-
74
- // absolute link
75
- if (baseUrl) {
76
- try {
77
- $ele.attr('href', new URL($ele.attr('href'), baseUrl).href);
78
- } catch (e) {
79
- // no-empty
80
- }
81
- }
82
- });
83
-
84
96
  $('img').each((_, ele) => {
85
97
  const $ele = $(ele);
86
98
 
87
99
  // fix lazyload
88
100
  if (!$ele.attr('src')) {
89
- for (const key in ele.attribs) {
90
- const value = ele.attribs[key].trim();
91
- if (['.gif', '.png', '.jpg', '.webp'].some((suffix) => value.includes(suffix))) {
92
- $ele.attr('src', value);
93
- break;
101
+ const lazySrc = $ele.attr('data-src') || $ele.attr('data-original');
102
+ if (lazySrc) {
103
+ $ele.attr('src', lazySrc);
104
+ } else {
105
+ for (const key in ele.attribs) {
106
+ const value = ele.attribs[key].trim();
107
+ if (['.gif', '.png', '.jpg', '.webp'].some((suffix) => value.includes(suffix))) {
108
+ $ele.attr('src', value);
109
+ break;
110
+ }
94
111
  }
95
112
  }
96
113
  }
97
114
 
98
- // absolute link
99
- if (baseUrl) {
100
- try {
101
- $ele.attr('src', new URL($ele.attr('src'), baseUrl).href);
102
- } catch (e) {
103
- // no-empty
104
- }
105
- }
106
-
107
- // referrerpolicy
108
- $ele.attr('referrerpolicy', 'no-referrer');
109
-
110
115
  // redundant attributes
111
116
  ['onclick', 'onerror', 'onload'].forEach((e) => {
112
117
  $ele.removeAttr(e);
113
118
  });
114
119
  });
120
+
121
+ // resolve relative link & fix referrer policy
122
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
123
+ // https://www.w3schools.com/tags/att_href.asp
124
+ $('a, area').each((_, elem) => {
125
+ resolveRelativeLink($, elem, 'href', baseUrl);
126
+ // $(elem).attr('rel', 'noreferrer'); // currently no such a need
127
+ });
128
+ // https://www.w3schools.com/tags/att_src.asp
129
+ $('img, video, audio, source, iframe, embed, track').each((_, elem) => {
130
+ resolveRelativeLink($, elem, 'src', baseUrl);
131
+ });
132
+ $('video[poster]').each((_, elem) => {
133
+ resolveRelativeLink($, elem, 'poster', baseUrl);
134
+ });
135
+ $('img, iframe').each((_, elem) => {
136
+ $(elem).attr('referrerpolicy', 'no-referrer');
137
+ });
138
+
115
139
  item.description = $('body').html() + '' + (config.suffix || '');
116
140
  }
117
141
  return item;
@@ -128,10 +152,25 @@ module.exports = async (ctx, next) => {
128
152
  // filter
129
153
  const makeRegex = (string) => {
130
154
  // default: case_senstivie = true
155
+ const engine = config.feature.filter_regex_engine;
131
156
  if (ctx.query.filter_case_sensitive === 'false') {
132
- return new RegExp(string, 'i');
157
+ switch (engine) {
158
+ case 'regexp':
159
+ return new RegExp(string, 'i');
160
+ case 're2':
161
+ return new RE2(string, 'i');
162
+ default:
163
+ throw Error(`Invalid Engine Value: ${engine}, please check your config.`);
164
+ }
133
165
  } else {
134
- return new RegExp(string);
166
+ switch (engine) {
167
+ case 'regexp':
168
+ return new RegExp(string);
169
+ case 're2':
170
+ return new RE2(string);
171
+ default:
172
+ throw Error(`Invalid Engine Value: ${engine}, please check your config.`);
173
+ }
135
174
  }
136
175
  };
137
176
 
@@ -264,6 +303,8 @@ module.exports = async (ctx, next) => {
264
303
  throw Error(`Invalid parameter <code>brief=${ctx.query.brief}</code>. Please check the doc https://docs.rsshub.app/parameter.html#shu-chu-jian-xun`);
265
304
  }
266
305
  }
306
+
307
+ // some parameters are processed in `anti-hotlink.js`
267
308
  }
268
309
  }
269
310
  };
@@ -0,0 +1,14 @@
1
+ <iframe referrerpolicy="no-referrer" width=100% height=150vh frameborder=0 marginheight=0 marginwidth=0
2
+ style="border:0; margin:0; padding:0; width:100%; height:150vh;"
3
+ srcdoc="
4
+ <!DOCTYPE html>
5
+ <html>
6
+ <head>
7
+ <meta name=&quot;referrer&quot; content=&quot;no-referrer&quot;>
8
+ </head>
9
+ <body>
10
+ {{ content }}
11
+ </body>
12
+ </html>
13
+ ">
14
+ </iframe>
@@ -131,29 +131,6 @@ module.exports = {
131
131
  },
132
132
  ],
133
133
  },
134
- 'youtube.com': {
135
- _name: 'YouTube',
136
- www: [
137
- {
138
- title: '用户',
139
- docs: 'https://docs.rsshub.app/social-media.html#youtube',
140
- source: '/user/:username',
141
- target: '/youtube/user/:username',
142
- },
143
- {
144
- title: '频道',
145
- docs: 'https://docs.rsshub.app/social-media.html#youtube',
146
- source: '/channel/:id',
147
- target: '/youtube/channel/:id',
148
- },
149
- {
150
- title: '播放列表',
151
- docs: 'https://docs.rsshub.app/social-media.html#youtube',
152
- source: '/playlist',
153
- target: (params, url) => `/youtube/playlist/${new URL(url).searchParams.get('list')}`,
154
- },
155
- ],
156
- },
157
134
  'smzdm.com': {
158
135
  _name: '什么值得买',
159
136
  www: [
@@ -207,47 +184,6 @@ module.exports = {
207
184
  },
208
185
  ],
209
186
  },
210
- 'juejin.cn': {
211
- _name: '掘金',
212
- '.': [
213
- {
214
- title: '标签',
215
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-biao-qian',
216
- source: '/tag/:tag',
217
- target: '/juejin/tag/:tag',
218
- },
219
- {
220
- title: '小册',
221
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-xiao-ce',
222
- source: '/books',
223
- target: '/juejin/books',
224
- },
225
- {
226
- title: '沸点',
227
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-fei-dian',
228
- source: ['/pins/:type', '/pins/topic/:type'],
229
- target: (params) => (params.type !== 'recommended' ? '/juejin/pins/:type' : '/juejin/pins'),
230
- },
231
- {
232
- title: '专栏',
233
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-zhuan-lan',
234
- source: ['/user/:id', '/user/:id/posts'],
235
- target: '/juejin/posts/:id',
236
- },
237
- {
238
- title: '收藏集',
239
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-shou-cang-ji',
240
- source: ['/user/:id', '/user/:id/collections'],
241
- target: '/juejin/collections/:id',
242
- },
243
- {
244
- title: '单个收藏夹',
245
- docs: 'https://docs.rsshub.app/programming.html#jue-jin-dan-ge-shou-cang-jia',
246
- source: '/collection/:collectionId',
247
- target: '/juejin/collection/:collectionId',
248
- },
249
- ],
250
- },
251
187
  'anime1.me': {
252
188
  _name: 'Anime1',
253
189
  '.': [
@@ -1199,17 +1135,6 @@ module.exports = {
1199
1135
  },
1200
1136
  ],
1201
1137
  },
1202
- 'apnews.com': {
1203
- _name: 'AP News',
1204
- '.': [
1205
- {
1206
- title: '话题',
1207
- docs: 'https://docs.rsshub.app/traditional-media.html#ap-news',
1208
- source: '/:topic',
1209
- target: '/apnews/topics/:topic',
1210
- },
1211
- ],
1212
- },
1213
1138
  'csc.edu.cn': {
1214
1139
  _name: '国家留学网',
1215
1140
  www: [
@@ -1653,41 +1578,6 @@ module.exports = {
1653
1578
  },
1654
1579
  ],
1655
1580
  },
1656
- 'hk01.com': {
1657
- _name: '香港01',
1658
- www: [
1659
- {
1660
- title: '最 Hit',
1661
- docs: 'https://docs.rsshub.app/traditional-media.html#xiang-gang-01',
1662
- source: ['/hot', '/'],
1663
- target: '/hk01/hot',
1664
- },
1665
- {
1666
- title: 'zone',
1667
- docs: 'https://docs.rsshub.app/traditional-media.html#xiang-gang-01',
1668
- source: '/zone/:id/:title',
1669
- target: '/hk01/zone/:id',
1670
- },
1671
- {
1672
- title: 'channel',
1673
- docs: 'https://docs.rsshub.app/traditional-media.html#xiang-gang-01',
1674
- source: '/channel/:id/:title',
1675
- target: '/hk01/channel/:id',
1676
- },
1677
- {
1678
- title: 'issue',
1679
- docs: 'https://docs.rsshub.app/traditional-media.html#xiang-gang-01',
1680
- source: '/issue/:id/:title',
1681
- target: '/hk01/issue/:id',
1682
- },
1683
- {
1684
- title: 'tag',
1685
- docs: 'https://docs.rsshub.app/traditional-media.html#xiang-gang-01',
1686
- source: '/tag/:id/:title',
1687
- target: '/hk01/tag/:id',
1688
- },
1689
- ],
1690
- },
1691
1581
  'popiapp.cn': {
1692
1582
  _name: 'Popi 提问箱',
1693
1583
  www: [
@@ -1737,20 +1627,6 @@ module.exports = {
1737
1627
  },
1738
1628
  ],
1739
1629
  },
1740
- 'behance.net': {
1741
- _name: 'Behance',
1742
- www: [
1743
- {
1744
- title: 'User',
1745
- docs: 'https://docs.rsshub.app/design.html#behance-user-works',
1746
- source: ['/:user'],
1747
- target: (params, url, document) => {
1748
- const uid1 = document && document.querySelector('html').innerHTML.match(/([^/]+)\/insights/)[1];
1749
- return `/behance/${uid1}`;
1750
- },
1751
- },
1752
- ],
1753
- },
1754
1630
  'jjmhw.cc': {
1755
1631
  _name: '漫小肆',
1756
1632
  www: [
@@ -2059,35 +1935,6 @@ module.exports = {
2059
1935
  },
2060
1936
  ],
2061
1937
  },
2062
- 'gcores.com': {
2063
- _name: '机核网',
2064
- www: [
2065
- {
2066
- title: '资讯',
2067
- docs: 'https://docs.rsshub.app/program-update.html#eagle',
2068
- source: '/news',
2069
- target: '/gcores/category/news',
2070
- },
2071
- {
2072
- title: '视频',
2073
- docs: 'https://docs.rsshub.app/program-update.html#eagle',
2074
- source: '/videos',
2075
- target: '/gcores/category/videos',
2076
- },
2077
- {
2078
- title: '电台',
2079
- docs: 'https://docs.rsshub.app/program-update.html#eagle',
2080
- source: '/radios',
2081
- target: '/gcores/category/radios',
2082
- },
2083
- {
2084
- title: '文章',
2085
- docs: 'https://docs.rsshub.app/program-update.html#eagle',
2086
- source: '/articles',
2087
- target: '/gcores/category/articles',
2088
- },
2089
- ],
2090
- },
2091
1938
  'bgm.tv': {
2092
1939
  _name: 'Bangumi',
2093
1940
  '.': [
@@ -2211,14 +2058,4 @@ module.exports = {
2211
2058
  },
2212
2059
  ],
2213
2060
  },
2214
- 'zyshow.net': {
2215
- www: [
2216
- {
2217
- title: '',
2218
- docs: 'https://docs.rsshub.app/game.html#lv-fa-shi-ying-di',
2219
- source: '/:name/',
2220
- target: '/zyshow/:name',
2221
- },
2222
- ],
2223
- },
2224
2061
  };