rsshub 1.0.0-master.fe69819 → 1.0.0-master.fe775f5

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 (502) hide show
  1. package/lib/config.js +144 -121
  2. package/lib/middleware/cache/index.js +3 -3
  3. package/lib/middleware/cache/memory.js +5 -5
  4. package/lib/middleware/cache/redis.js +17 -2
  5. package/lib/middleware/template.js +4 -4
  6. package/lib/radar-rules.js +0 -162
  7. package/lib/router.js +90 -164
  8. package/lib/routes/afdian/dynamic.js +2 -1
  9. package/lib/routes/dsndsht23/index.js +2 -1
  10. package/lib/routes/ehentai/ehapi.js +16 -6
  11. package/lib/routes/ehentai/favorites.js +14 -7
  12. package/lib/routes/ehentai/search.js +14 -5
  13. package/lib/routes/ehentai/tag.js +14 -5
  14. package/lib/routes/fdroid/apprelease.js +1 -1
  15. package/lib/routes/gov/fmprc/utils.js +6 -10
  16. package/lib/routes/hentaimama/videos.js +1 -1
  17. package/lib/routes/lizhi/user.js +1 -1
  18. package/lib/routes/manxiaosi/book.js +1 -1
  19. package/lib/routes/missevan/drama.js +1 -1
  20. package/lib/routes/missevan/latest.js +1 -1
  21. package/lib/routes/mofish/index.js +21 -9
  22. package/lib/routes/mofish/templates/description.art +4 -0
  23. package/lib/routes/ncm/djradio.js +3 -4
  24. package/lib/routes/nhentai/util.js +2 -2
  25. package/lib/routes/novel/biquge.js +24 -23
  26. package/lib/routes/novel/biqugeinfo.js +26 -26
  27. package/lib/routes/or/index.js +1 -1
  28. package/lib/routes/prestige-av/series.js +3 -6
  29. package/lib/routes/radio/radio.js +1 -1
  30. package/lib/routes/sina/rollnews.js +8 -3
  31. package/lib/routes/tencent/wechat/tgchannel.js +91 -30
  32. package/lib/routes/touhougarakuta/index.js +4 -2
  33. package/lib/routes/touhougarakuta/json2html.js +22 -10
  34. package/lib/routes/universities/hitwh/today.js +6 -6
  35. package/lib/routes/weibo/timeline.js +18 -1
  36. package/lib/routes/weibo/user.js +19 -3
  37. package/lib/routes/weibo/utils.js +113 -5
  38. package/lib/routes/ximalaya/album.js +2 -2
  39. package/lib/routes/yyets/todayfilelist.js +0 -1
  40. package/lib/routes/zhihu/activities.js +1 -0
  41. package/lib/routes/zhihu/daily.js +1 -0
  42. package/lib/routes/zhihu/daily_section.js +1 -0
  43. package/lib/routes/zhihu/hot.js +3 -2
  44. package/lib/utils/puppeteer.js +1 -1
  45. package/lib/v2/35photo/actual.js +7 -0
  46. package/lib/v2/35photo/author.js +9 -0
  47. package/lib/v2/35photo/genre.js +9 -0
  48. package/lib/v2/35photo/interesting.js +7 -0
  49. package/lib/v2/35photo/maintainer.js +8 -0
  50. package/lib/v2/35photo/map.js +7 -0
  51. package/lib/v2/35photo/new.js +7 -0
  52. package/lib/v2/35photo/radar.js +43 -0
  53. package/lib/v2/35photo/router.js +8 -0
  54. package/lib/v2/35photo/utils.js +42 -0
  55. package/lib/v2/36kr/maintainer.js +7 -0
  56. package/lib/{routes → v2}/36kr/motif.js +2 -1
  57. package/lib/v2/36kr/news.js +56 -0
  58. package/lib/{routes → v2}/36kr/newsflashes.js +2 -1
  59. package/lib/v2/36kr/radar.js +37 -0
  60. package/lib/v2/36kr/router.js +7 -0
  61. package/lib/{routes → v2}/36kr/search/article.js +3 -2
  62. package/lib/{routes → v2}/36kr/user.js +2 -1
  63. package/lib/v2/52hrtt/index.js +57 -0
  64. package/lib/v2/52hrtt/maintainer.js +4 -0
  65. package/lib/v2/52hrtt/radar.js +19 -0
  66. package/lib/v2/52hrtt/router.js +4 -0
  67. package/lib/v2/52hrtt/symposium.js +57 -0
  68. package/lib/v2/8kcos/article.js +24 -0
  69. package/lib/v2/8kcos/cat.js +22 -0
  70. package/lib/{routes → v2}/8kcos/const.js +0 -0
  71. package/lib/v2/8kcos/latest.js +23 -0
  72. package/lib/v2/8kcos/maintainer.js +5 -0
  73. package/lib/v2/8kcos/radar.js +25 -0
  74. package/lib/v2/8kcos/router.js +5 -0
  75. package/lib/v2/8kcos/tag.js +23 -0
  76. package/lib/{routes → v2}/95mm/category.js +5 -3
  77. package/lib/v2/95mm/maintainer.js +5 -0
  78. package/lib/v2/95mm/radar.js +25 -0
  79. package/lib/v2/95mm/router.js +5 -0
  80. package/lib/v2/95mm/tab.js +9 -0
  81. package/lib/v2/95mm/tag.js +9 -0
  82. package/lib/v2/95mm/templates/description.art +3 -0
  83. package/lib/v2/95mm/utils.js +59 -0
  84. package/lib/v2/abskoop/index.js +52 -0
  85. package/lib/v2/abskoop/maintainer.js +3 -0
  86. package/lib/v2/abskoop/radar.js +13 -0
  87. package/lib/v2/abskoop/router.js +3 -0
  88. package/lib/v2/abskoop/templates/description.art +3 -0
  89. package/lib/v2/ajmide/index.js +1 -1
  90. package/lib/v2/app-center/templates/description.art +1 -1
  91. package/lib/v2/apple/exchange_repair.js +40 -0
  92. package/lib/v2/apple/maintainer.js +3 -0
  93. package/lib/v2/apple/radar.js +13 -0
  94. package/lib/v2/apple/router.js +3 -0
  95. package/lib/{routes/apple → v2}/appstore/gofans.js +3 -3
  96. package/lib/{routes/apple → v2}/appstore/in-app-purchase.js +0 -0
  97. package/lib/v2/appstore/maintainer.js +7 -0
  98. package/lib/{routes/apple → v2}/appstore/price.js +0 -0
  99. package/lib/v2/appstore/radar.js +41 -0
  100. package/lib/v2/appstore/router.js +7 -0
  101. package/lib/{routes/apple → v2}/appstore/update.js +0 -0
  102. package/lib/{routes/apple → v2}/appstore/xianmian.js +3 -2
  103. package/lib/v2/bbcnewslabs/maintainer.js +3 -0
  104. package/lib/v2/bbcnewslabs/news.js +32 -0
  105. package/lib/v2/bbcnewslabs/radar.js +13 -0
  106. package/lib/v2/bbcnewslabs/router.js +3 -0
  107. package/lib/v2/bigquant/collections.js +35 -0
  108. package/lib/v2/bigquant/maintainer.js +3 -0
  109. package/lib/v2/bigquant/radar.js +13 -0
  110. package/lib/v2/bigquant/router.js +3 -0
  111. package/lib/{routes → v2}/bilibili/app.js +0 -0
  112. package/lib/{routes → v2}/bilibili/article.js +1 -0
  113. package/lib/{routes → v2}/bilibili/audio.js +0 -0
  114. package/lib/{routes → v2}/bilibili/bangumi.js +0 -0
  115. package/lib/{routes → v2}/bilibili/blackboard.js +0 -0
  116. package/lib/{routes → v2}/bilibili/cache.js +17 -0
  117. package/lib/{routes → v2}/bilibili/coin.js +0 -0
  118. package/lib/{routes → v2}/bilibili/danmaku.js +0 -0
  119. package/lib/{routes → v2}/bilibili/dynamic.js +1 -0
  120. package/lib/{routes → v2}/bilibili/fav.js +0 -0
  121. package/lib/{routes → v2}/bilibili/followers.js +0 -0
  122. package/lib/{routes → v2}/bilibili/followings.js +0 -0
  123. package/lib/{routes → v2}/bilibili/followings_article.js +0 -0
  124. package/lib/{routes → v2}/bilibili/followings_dynamic.js +0 -0
  125. package/lib/{routes → v2}/bilibili/followings_video.js +0 -0
  126. package/lib/{routes → v2}/bilibili/linkNews.js +0 -0
  127. package/lib/{routes → v2}/bilibili/liveArea.js +0 -0
  128. package/lib/{routes → v2}/bilibili/liveRoom.js +0 -0
  129. package/lib/{routes → v2}/bilibili/liveSearch.js +0 -0
  130. package/lib/{routes → v2}/bilibili/mallIP.js +0 -0
  131. package/lib/{routes → v2}/bilibili/mallNew.js +0 -0
  132. package/lib/{routes → v2}/bilibili/manga_followings.js +0 -0
  133. package/lib/{routes → v2}/bilibili/manga_update.js +0 -0
  134. package/lib/v2/bilibili/online.js +25 -0
  135. package/lib/{routes → v2}/bilibili/page.js +0 -0
  136. package/lib/{routes → v2}/bilibili/partion-ranking.js +0 -0
  137. package/lib/{routes → v2}/bilibili/partion.js +0 -0
  138. package/lib/v2/bilibili/radar.js +6 -0
  139. package/lib/{routes → v2}/bilibili/ranking.js +0 -0
  140. package/lib/{routes → v2}/bilibili/readlist.js +0 -0
  141. package/lib/{routes → v2}/bilibili/reply.js +0 -0
  142. package/lib/v2/bilibili/router.js +39 -0
  143. package/lib/{routes → v2}/bilibili/topic.js +0 -0
  144. package/lib/{routes → v2}/bilibili/userChannel.js +0 -0
  145. package/lib/{routes → v2}/bilibili/userFav.js +0 -0
  146. package/lib/{routes → v2}/bilibili/user_bangumi.js +0 -0
  147. package/lib/{routes → v2}/bilibili/utils.js +0 -0
  148. package/lib/{routes → v2}/bilibili/video.js +3 -1
  149. package/lib/{routes → v2}/bilibili/vsearch.js +0 -0
  150. package/lib/{routes → v2}/bilibili/weekly_recommend.js +0 -0
  151. package/lib/v2/bitbucket/commits.js +40 -0
  152. package/lib/v2/bitbucket/maintainer.js +4 -0
  153. package/lib/v2/bitbucket/radar.js +19 -0
  154. package/lib/v2/bitbucket/router.js +4 -0
  155. package/lib/v2/bitbucket/tags.js +40 -0
  156. package/lib/v2/bitmovin/blog.js +33 -0
  157. package/lib/v2/bitmovin/maintainer.js +3 -0
  158. package/lib/v2/bitmovin/radar.js +13 -0
  159. package/lib/v2/bitmovin/router.js +3 -0
  160. package/lib/{routes/universities → v2}/bjfu/grs.js +0 -0
  161. package/lib/v2/bjfu/it/index.js +49 -0
  162. package/lib/v2/bjfu/it/utils.js +64 -0
  163. package/lib/{routes/universities → v2}/bjfu/jwc/index.js +0 -0
  164. package/lib/{routes/universities → v2}/bjfu/jwc/utils.js +10 -9
  165. package/lib/{routes/universities → v2}/bjfu/kjc.js +0 -0
  166. package/lib/v2/bjfu/maintainer.js +7 -0
  167. package/lib/{routes/universities → v2}/bjfu/news/index.js +0 -0
  168. package/lib/{routes/universities → v2}/bjfu/news/utils.js +10 -9
  169. package/lib/v2/bjfu/radar.js +45 -0
  170. package/lib/v2/bjfu/router.js +7 -0
  171. package/lib/{routes → v2}/chaping/banner.js +2 -1
  172. package/lib/v2/chaping/maintainer.js +5 -0
  173. package/lib/{routes → v2}/chaping/news.js +3 -2
  174. package/lib/v2/chaping/newsflash.js +23 -0
  175. package/lib/v2/chaping/radar.js +31 -0
  176. package/lib/v2/chaping/router.js +5 -0
  177. package/lib/v2/dahecube/index.js +66 -0
  178. package/lib/v2/dahecube/maintainer.js +3 -0
  179. package/lib/v2/dahecube/radar.js +23 -0
  180. package/lib/v2/dahecube/router.js +3 -0
  181. package/lib/v2/dahecube/utils.js +47 -0
  182. package/lib/v2/dayanzai/index.js +58 -0
  183. package/lib/v2/dayanzai/maintainer.js +3 -0
  184. package/lib/v2/dayanzai/radar.js +13 -0
  185. package/lib/v2/dayanzai/router.js +3 -0
  186. package/lib/v2/dhu/jiaowu/news.js +37 -0
  187. package/lib/v2/dhu/maintainer.js +4 -0
  188. package/lib/v2/dhu/radar.js +17 -0
  189. package/lib/v2/dhu/router.js +4 -0
  190. package/lib/v2/dhu/xxgk/news.js +32 -0
  191. package/lib/v2/douban/people/wish.js +2 -1
  192. package/lib/{routes → v2}/dtcj/datahero.js +3 -2
  193. package/lib/v2/dtcj/datainsight.js +53 -0
  194. package/lib/v2/dtcj/maintainer.js +4 -0
  195. package/lib/v2/dtcj/radar.js +25 -0
  196. package/lib/v2/dtcj/router.js +4 -0
  197. package/lib/v2/eastday/24.js +90 -0
  198. package/lib/v2/eastday/maintainer.js +2 -0
  199. package/lib/v2/eastday/radar.js +16 -0
  200. package/lib/v2/eastday/router.js +2 -0
  201. package/lib/{routes → v2}/eastday/sh.js +6 -11
  202. package/lib/v2/eastmoney/radar.js +13 -0
  203. package/lib/v2/eastmoney/router.js +3 -0
  204. package/lib/v2/eastmoney/ttjj/user.js +65 -0
  205. package/lib/v2/ems/apple.js +42 -0
  206. package/lib/v2/ems/maintainer.js +4 -0
  207. package/lib/{routes → v2}/ems/news.js +0 -0
  208. package/lib/v2/ems/radar.js +19 -0
  209. package/lib/v2/ems/router.js +4 -0
  210. package/lib/v2/ems/templates/apple.art +6 -0
  211. package/lib/v2/eprice/rss.js +4 -2
  212. package/lib/v2/ff14/ff14_global.js +1 -1
  213. package/lib/{routes → v2}/flyert/creditcard.js +0 -0
  214. package/lib/v2/flyert/maintainer.js +4 -0
  215. package/lib/v2/flyert/preferential.js +48 -0
  216. package/lib/v2/flyert/radar.js +19 -0
  217. package/lib/v2/flyert/router.js +4 -0
  218. package/lib/{routes → v2}/flyert/utils.js +2 -1
  219. package/lib/v2/foresightnews/index.js +88 -0
  220. package/lib/v2/foresightnews/maintainer.js +6 -0
  221. package/lib/v2/foresightnews/radar.js +31 -0
  222. package/lib/v2/foresightnews/router.js +3 -0
  223. package/lib/v2/gcores/category.js +126 -0
  224. package/lib/v2/gcores/maintainer.js +4 -0
  225. package/lib/v2/gcores/radar.js +19 -0
  226. package/lib/v2/gcores/router.js +4 -0
  227. package/lib/v2/gcores/tag.js +126 -0
  228. package/lib/v2/github/comments.js +95 -37
  229. package/lib/v2/github/follower.js +1 -1
  230. package/lib/v2/github/maintainer.js +1 -1
  231. package/lib/v2/github/pulls.js +7 -3
  232. package/lib/v2/github/radar.js +1 -1
  233. package/lib/v2/github/router.js +3 -2
  234. package/lib/v2/github/star.js +1 -1
  235. package/lib/v2/github/starred_repos.js +1 -1
  236. package/lib/v2/gitpod/blog.js +52 -0
  237. package/lib/v2/gitpod/changelog.js +35 -0
  238. package/lib/v2/gitpod/maintainer.js +4 -0
  239. package/lib/v2/gitpod/radar.js +19 -0
  240. package/lib/v2/gitpod/router.js +4 -0
  241. package/lib/v2/gitpod/templates/description.art +2 -0
  242. package/lib/v2/gitpod/utils.js +3 -0
  243. package/lib/v2/google/maintainer.js +1 -0
  244. package/lib/v2/google/router.js +1 -0
  245. package/lib/v2/google/sitesRecentChanges.js +52 -0
  246. package/lib/v2/gov/maintainer.js +10 -0
  247. package/lib/v2/gov/mee/ywdt.js +80 -0
  248. package/lib/v2/gov/miit/wjfb.js +61 -0
  249. package/lib/{routes → v2}/gov/miit/wjgs.js +0 -0
  250. package/lib/v2/gov/miit/yjzj.js +59 -0
  251. package/lib/{routes → v2}/gov/miit/zcjd.js +0 -0
  252. package/lib/{routes → v2}/gov/miit/zcwj.js +0 -0
  253. package/lib/{routes → v2/gov}/pbc/goutongjiaoliu.js +5 -4
  254. package/lib/v2/gov/pbc/gzlw.js +27 -0
  255. package/lib/{routes → v2/gov}/pbc/tradeAnnouncement.js +5 -4
  256. package/lib/v2/gov/pbc/utils.js +20 -0
  257. package/lib/v2/gov/pbc/zcyj.js +29 -0
  258. package/lib/v2/gov/radar.js +57 -0
  259. package/lib/v2/gov/router.js +10 -0
  260. package/lib/{routes → v2}/guancha/headline.js +11 -8
  261. package/lib/{routes → v2}/guancha/index.js +55 -28
  262. package/lib/v2/guancha/maintainer.js +7 -0
  263. package/lib/{routes → v2}/guancha/member.js +30 -15
  264. package/lib/{routes → v2}/guancha/personalpage.js +0 -0
  265. package/lib/v2/guancha/radar.js +49 -0
  266. package/lib/v2/guancha/router.js +7 -0
  267. package/lib/{routes → v2}/guancha/topic.js +14 -13
  268. package/lib/v2/hdu/cs/index.js +57 -0
  269. package/lib/v2/hdu/maintainer.js +3 -0
  270. package/lib/v2/hdu/radar.js +13 -0
  271. package/lib/v2/hdu/router.js +4 -0
  272. package/lib/v2/hellobtc/information.js +51 -0
  273. package/lib/v2/hellobtc/kepu.js +64 -0
  274. package/lib/v2/hellobtc/maintainer.js +6 -0
  275. package/lib/v2/hellobtc/news.js +29 -0
  276. package/lib/v2/hellobtc/radar.js +85 -0
  277. package/lib/v2/hellobtc/router.js +6 -0
  278. package/lib/v2/hellobtc/topic.js +43 -0
  279. package/lib/v2/hellogithub/article.js +47 -0
  280. package/lib/v2/hellogithub/maintainer.js +5 -0
  281. package/lib/v2/hellogithub/month.js +42 -0
  282. package/lib/v2/hellogithub/radar.js +25 -0
  283. package/lib/v2/hellogithub/ranking.js +39 -0
  284. package/lib/v2/hellogithub/router.js +5 -0
  285. package/lib/v2/ielts/index.js +58 -0
  286. package/lib/v2/ielts/maintainer.js +3 -0
  287. package/lib/v2/ielts/radar.js +13 -0
  288. package/lib/v2/ielts/router.js +3 -0
  289. package/lib/v2/ithome/index.js +1 -0
  290. package/lib/v2/ixigua/maintainer.js +3 -0
  291. package/lib/v2/ixigua/radar.js +13 -0
  292. package/lib/v2/ixigua/router.js +3 -0
  293. package/lib/v2/ixigua/templates/userVideo.art +5 -0
  294. package/lib/v2/ixigua/userVideo.js +40 -0
  295. package/lib/v2/javbus/index.js +153 -0
  296. package/lib/v2/javbus/maintainer.js +18 -0
  297. package/lib/v2/javbus/radar.js +113 -0
  298. package/lib/v2/javbus/router.js +3 -0
  299. package/lib/v2/javbus/templates/description.art +18 -0
  300. package/lib/v2/javlibrary/utils.js +1 -1
  301. package/lib/v2/kbs/maintainer.js +4 -0
  302. package/lib/v2/kbs/news.js +67 -0
  303. package/lib/v2/kbs/radar.js +19 -0
  304. package/lib/v2/kbs/router.js +4 -0
  305. package/lib/{routes → v2}/kbs/today.js +1 -1
  306. package/lib/v2/liulinblog/itnews.js +23 -0
  307. package/lib/v2/liulinblog/kuaixun.js +17 -0
  308. package/lib/v2/liulinblog/maintainer.js +4 -0
  309. package/lib/v2/liulinblog/radar.js +33 -0
  310. package/lib/v2/liulinblog/router.js +4 -0
  311. package/lib/v2/liulinblog/utils.js +39 -0
  312. package/lib/v2/lofter/maintainer.js +4 -0
  313. package/lib/v2/lofter/radar.js +17 -0
  314. package/lib/v2/lofter/router.js +4 -0
  315. package/lib/{routes → v2}/lofter/tag.js +4 -4
  316. package/lib/v2/lofter/user.js +52 -0
  317. package/lib/v2/lvv2/maintainer.js +4 -0
  318. package/lib/v2/lvv2/news.js +75 -0
  319. package/lib/v2/lvv2/radar.js +79 -0
  320. package/lib/v2/lvv2/router.js +4 -0
  321. package/lib/v2/lvv2/templates/outlink.art +1 -0
  322. package/lib/v2/lvv2/top.js +77 -0
  323. package/lib/v2/nbd/article.js +50 -0
  324. package/lib/{routes → v2}/nbd/index.js +8 -5
  325. package/lib/v2/nbd/maintainer.js +4 -0
  326. package/lib/v2/nbd/radar.js +19 -0
  327. package/lib/v2/nbd/router.js +4 -0
  328. package/lib/v2/nikkei-cn/index.js +10 -5
  329. package/lib/v2/njnu/ceai/ceai.js +44 -0
  330. package/lib/v2/njnu/ceai/utils.js +55 -0
  331. package/lib/v2/njnu/jwc/jwc.js +43 -0
  332. package/lib/v2/njnu/jwc/utils.js +59 -0
  333. package/lib/v2/njnu/maintainer.js +4 -0
  334. package/lib/v2/njnu/radar.js +21 -0
  335. package/lib/v2/njnu/router.js +4 -0
  336. package/lib/v2/njupt/jwc.js +90 -0
  337. package/lib/v2/njupt/maintainer.js +3 -0
  338. package/lib/v2/njupt/radar.js +20 -0
  339. package/lib/v2/njupt/router.js +3 -0
  340. package/lib/v2/nltimes/maintainer.js +3 -0
  341. package/lib/v2/nltimes/news.js +89 -0
  342. package/lib/v2/nltimes/radar.js +19 -0
  343. package/lib/v2/nltimes/router.js +3 -0
  344. package/lib/{routes → v2}/nowcoder/discuss.js +17 -22
  345. package/lib/v2/nowcoder/experience.js +48 -0
  346. package/lib/{routes → v2}/nowcoder/jobcenter.js +0 -0
  347. package/lib/v2/nowcoder/maintainer.js +7 -0
  348. package/lib/v2/nowcoder/radar.js +40 -0
  349. package/lib/{routes → v2}/nowcoder/recommend.js +1 -1
  350. package/lib/v2/nowcoder/router.js +7 -0
  351. package/lib/{routes → v2}/nowcoder/schedule.js +4 -3
  352. package/lib/v2/ntdtv/channel.js +44 -0
  353. package/lib/v2/ntdtv/maintainer.js +3 -0
  354. package/lib/v2/ntdtv/radar.js +13 -0
  355. package/lib/v2/ntdtv/router.js +3 -0
  356. package/lib/v2/odaily/post.js +10 -8
  357. package/lib/v2/oilchem/index.js +67 -0
  358. package/lib/v2/oilchem/maintainer.js +3 -0
  359. package/lib/v2/oilchem/radar.js +11 -0
  360. package/lib/v2/oilchem/router.js +3 -0
  361. package/lib/v2/oilchem/routes.js +671 -0
  362. package/lib/v2/picuki/maintainer.js +3 -0
  363. package/lib/v2/picuki/profile.js +167 -0
  364. package/lib/v2/picuki/radar.js +13 -0
  365. package/lib/v2/picuki/router.js +3 -0
  366. package/lib/v2/picuki/templates/post.art +7 -0
  367. package/lib/v2/qq88/index.js +60 -0
  368. package/lib/v2/qq88/maintainer.js +3 -0
  369. package/lib/v2/qq88/radar.js +13 -0
  370. package/lib/v2/qq88/router.js +3 -0
  371. package/lib/v2/readhub/index.js +106 -0
  372. package/lib/v2/readhub/maintainer.js +3 -0
  373. package/lib/v2/readhub/radar.js +13 -0
  374. package/lib/v2/readhub/router.js +6 -0
  375. package/lib/{routes → v2}/rfa/index.js +11 -6
  376. package/lib/v2/rfa/maintainer.js +3 -0
  377. package/lib/v2/rfa/radar.js +13 -0
  378. package/lib/v2/rfa/router.js +3 -0
  379. package/lib/v2/segmentfault/channel.js +46 -0
  380. package/lib/v2/segmentfault/maintainer.js +4 -0
  381. package/lib/v2/segmentfault/radar.js +19 -0
  382. package/lib/v2/segmentfault/router.js +4 -0
  383. package/lib/v2/segmentfault/user.js +43 -0
  384. package/lib/v2/shmeea/maintainer.js +1 -0
  385. package/lib/v2/shmeea/radar.js +6 -0
  386. package/lib/v2/shmeea/router.js +2 -1
  387. package/lib/v2/shmeea/self-study.js +61 -0
  388. package/lib/v2/sohu/maintainer.js +3 -0
  389. package/lib/{routes → v2}/sohu/mp.js +9 -8
  390. package/lib/v2/sohu/radar.js +13 -0
  391. package/lib/v2/sohu/router.js +3 -0
  392. package/lib/v2/soundofhope/channel.js +42 -0
  393. package/lib/v2/soundofhope/maintainer.js +3 -0
  394. package/lib/v2/soundofhope/radar.js +13 -0
  395. package/lib/v2/soundofhope/router.js +3 -0
  396. package/lib/v2/sputniknews/index.js +93 -0
  397. package/lib/v2/sputniknews/maintainer.js +3 -0
  398. package/lib/v2/sputniknews/radar.js +13 -0
  399. package/lib/v2/sputniknews/router.js +3 -0
  400. package/lib/{routes/universities/sysu/sdcs.js → v2/sysu/cse.js} +3 -3
  401. package/lib/v2/sysu/maintainer.js +3 -0
  402. package/lib/v2/sysu/radar.js +13 -0
  403. package/lib/v2/sysu/router.js +3 -0
  404. package/lib/v2/telegram/channel.js +446 -112
  405. package/lib/v2/telegram/maintainer.js +1 -1
  406. package/lib/v2/telegram/router.js +1 -1
  407. package/lib/v2/telegram/templates/video.art +3 -1
  408. package/lib/v2/tencent/maintainer.js +3 -0
  409. package/lib/v2/tencent/qq/sdk/changelog.js +56 -0
  410. package/lib/v2/tencent/radar.js +56 -0
  411. package/lib/v2/tencent/router.js +3 -0
  412. package/lib/v2/test/index.js +1 -0
  413. package/lib/v2/tokeninsight/blog.js +52 -0
  414. package/lib/v2/tokeninsight/bulletin.js +44 -0
  415. package/lib/v2/tokeninsight/maintainer.js +5 -0
  416. package/lib/v2/tokeninsight/radar.js +25 -0
  417. package/lib/v2/tokeninsight/report.js +52 -0
  418. package/lib/v2/tokeninsight/router.js +5 -0
  419. package/lib/v2/txrjy/fornumtopic.js +72 -0
  420. package/lib/v2/txrjy/maintainer.js +3 -0
  421. package/lib/v2/txrjy/radar.js +17 -0
  422. package/lib/v2/txrjy/router.js +3 -0
  423. package/lib/v2/txrjy/templates/fornumtopic.art +6 -0
  424. package/lib/v2/wallstreetcn/live.js +18 -15
  425. package/lib/v2/wallstreetcn/router.js +1 -1
  426. package/lib/v2/wfu/jwc.js +54 -0
  427. package/lib/v2/wfu/maintainer.js +4 -0
  428. package/lib/v2/wfu/news.js +96 -0
  429. package/lib/v2/wfu/radar.js +21 -0
  430. package/lib/v2/wfu/router.js +4 -0
  431. package/lib/v2/whitehouse/maintainer.js +1 -0
  432. package/lib/v2/whitehouse/ostp.js +50 -0
  433. package/lib/v2/whitehouse/radar.js +6 -0
  434. package/lib/v2/whitehouse/router.js +1 -0
  435. package/lib/v2/who/maintainer.js +5 -0
  436. package/lib/v2/who/news-room.js +76 -0
  437. package/lib/{routes → v2}/who/news.js +1 -1
  438. package/lib/v2/who/radar.js +25 -0
  439. package/lib/v2/who/router.js +5 -0
  440. package/lib/{routes → v2}/who/speeches.js +0 -0
  441. package/lib/v2/wikinews/index.js +43 -0
  442. package/lib/v2/wikinews/maintainer.js +3 -0
  443. package/lib/v2/wikinews/radar.js +13 -0
  444. package/lib/v2/wikinews/router.js +4 -0
  445. package/lib/v2/wp-china/maintainer.js +3 -0
  446. package/lib/v2/wp-china/news.js +57 -0
  447. package/lib/v2/wp-china/radar.js +13 -0
  448. package/lib/v2/wp-china/router.js +3 -0
  449. package/lib/{routes → v2}/wsj/index.js +6 -4
  450. package/lib/v2/wsj/maintainer.js +3 -0
  451. package/lib/v2/wsj/radar.js +21 -0
  452. package/lib/v2/wsj/router.js +3 -0
  453. package/lib/v2/xiaoyuzhou/maintainer.js +1 -1
  454. package/lib/v2/xiaoyuzhou/pickup.js +2 -2
  455. package/lib/v2/xiaoyuzhou/podcast.js +2 -2
  456. package/lib/v2/xmanhua/index.js +74 -0
  457. package/lib/v2/xmanhua/radar.js +13 -0
  458. package/lib/v2/xmanhua/router.js +3 -0
  459. package/lib/{routes → v2}/zhibo8/forum.js +8 -16
  460. package/lib/v2/zhibo8/maintainer.js +5 -0
  461. package/lib/v2/zhibo8/more.js +82 -0
  462. package/lib/{routes → v2}/zhibo8/post.js +1 -1
  463. package/lib/v2/zhibo8/radar.js +27 -0
  464. package/lib/v2/zhibo8/router.js +5 -0
  465. package/lib/views/error.art +4 -4
  466. package/lib/views/rss.art +5 -4
  467. package/package.json +17 -16
  468. package/lib/routes/36kr/news.js +0 -94
  469. package/lib/routes/8kcos/article.js +0 -17
  470. package/lib/routes/8kcos/cat.js +0 -28
  471. package/lib/routes/8kcos/latest.js +0 -27
  472. package/lib/routes/95mm/tab.js +0 -9
  473. package/lib/routes/95mm/tag.js +0 -7
  474. package/lib/routes/95mm/utils.js +0 -51
  475. package/lib/routes/apple/exchange_repair.js +0 -47
  476. package/lib/routes/eastmoney/user.js +0 -30
  477. package/lib/routes/flyert/preferential.js +0 -33
  478. package/lib/routes/gcores/category.js +0 -127
  479. package/lib/routes/gov/mee/gs.js +0 -54
  480. package/lib/routes/ixigua/userVideo.js +0 -35
  481. package/lib/routes/javbus/genre.js +0 -7
  482. package/lib/routes/javbus/home.js +0 -3
  483. package/lib/routes/javbus/series.js +0 -7
  484. package/lib/routes/javbus/star.js +0 -7
  485. package/lib/routes/javbus/uncensored/genre.js +0 -6
  486. package/lib/routes/javbus/uncensored/home.js +0 -3
  487. package/lib/routes/javbus/uncensored/series.js +0 -7
  488. package/lib/routes/javbus/uncensored/star.js +0 -7
  489. package/lib/routes/javbus/util.js +0 -211
  490. package/lib/routes/javbus/western/genre.js +0 -7
  491. package/lib/routes/javbus/western/home.js +0 -3
  492. package/lib/routes/javbus/western/series.js +0 -7
  493. package/lib/routes/javbus/western/star.js +0 -7
  494. package/lib/routes/lofter/posts.js +0 -54
  495. package/lib/routes/nbd/article.js +0 -60
  496. package/lib/routes/picuki/profile.js +0 -90
  497. package/lib/routes/readhub/category.js +0 -102
  498. package/lib/routes/segmentfault/channel.js +0 -90
  499. package/lib/routes/segmentfault/user.js +0 -90
  500. package/lib/routes/universities/njupt/jwc.js +0 -84
  501. package/lib/routes/who/news-room.js +0 -56
  502. package/lib/routes/zhibo8/more.js +0 -45
@@ -17,9 +17,18 @@ module.exports = async (ctx) => {
17
17
  if (match !== null) {
18
18
  title = match[1];
19
19
  }
20
- ctx.state.data = {
21
- title: title + ' - E-Hentai Search ',
22
- link: `https://e-hentai.org/?${params}`,
23
- item: items,
24
- };
20
+
21
+ if (EhAPI.from_ex) {
22
+ ctx.state.data = {
23
+ title: title + ' - ExHentai Search ',
24
+ link: `https://exhentai.org/?${params}`,
25
+ item: items,
26
+ };
27
+ } else {
28
+ ctx.state.data = {
29
+ title: title + ' - E-Hentai Search ',
30
+ link: `https://e-hentai.org/?${params}`,
31
+ item: items,
32
+ };
33
+ }
25
34
  };
@@ -5,9 +5,18 @@ module.exports = async (ctx) => {
5
5
  const tag = ctx.params.tag;
6
6
  const bittorrent = ctx.params.bittorrent || false;
7
7
  const items = await EhAPI.getTagItems(ctx.cache, tag, page, bittorrent);
8
- ctx.state.data = {
9
- title: tag + ' - E-Hentai Tag',
10
- link: `https://e-hentai.org/tag/${tag}`,
11
- item: items,
12
- };
8
+
9
+ if (EhAPI.from_ex) {
10
+ ctx.state.data = {
11
+ title: tag + ' - ExHentai Tag',
12
+ link: `https://exhentai.org/tag/${tag}`,
13
+ item: items,
14
+ };
15
+ } else {
16
+ ctx.state.data = {
17
+ title: tag + ' - E-Hentai Tag',
18
+ link: `https://e-hentai.org/tag/${tag}`,
19
+ item: items,
20
+ };
21
+ }
13
22
  };
@@ -6,7 +6,7 @@ module.exports = async (ctx) => {
6
6
  const data = response.data;
7
7
  const $ = cheerio.load(data);
8
8
 
9
- const app_name = $('.package-title').find('h3').text();
9
+ const app_name = $('.package-title').find('h3').text().trim();
10
10
  const app_descr = $('.package-title').find('.package-summary').text();
11
11
 
12
12
  const items = [];
@@ -1,19 +1,16 @@
1
1
  const got = require('@/utils/got');
2
+ const { parseDate } = require('@/utils/parse-date');
3
+ const timezone = require('@/utils/timezone');
2
4
  const cheerio = require('cheerio');
3
- const url = require('url');
4
5
 
5
6
  // 加载文章页
6
7
  async function load(link) {
7
8
  const response = await got.get(link);
8
9
  const $ = cheerio.load(response.data);
9
10
 
10
- const date = new Date(
11
- $('#News_Body_Time')
12
- .text()
13
- .match(/\d{4}-\d{2}-\d{2}/)
14
- );
11
+ const date = parseDate($('.time').text(), 'YYYY-MM-DD HH:mm');
15
12
 
16
- const pubDate = new Date(date.getTime()).toUTCString();
13
+ const pubDate = timezone(date, +8);
17
14
 
18
15
  // 提取内容
19
16
  const description = $('#News_Body_Txt_A').html();
@@ -30,13 +27,12 @@ const ProcessFeed = (list, caches) => {
30
27
 
31
28
  const $title = $('a');
32
29
  // 还原相对链接为绝对链接
33
- const itemUrl = url.resolve(host, $title.attr('href'));
30
+ const itemUrl = new URL($title.attr('href'), host);
34
31
 
35
32
  // 列表上提取到的信息
36
33
  const single = {
37
34
  title: $.text(),
38
35
  link: itemUrl,
39
- guid: itemUrl,
40
36
  };
41
37
 
42
38
  // 使用tryGet方法从缓存获取内容。
@@ -44,7 +40,7 @@ const ProcessFeed = (list, caches) => {
44
40
  const other = await caches.tryGet(itemUrl, () => load(itemUrl));
45
41
 
46
42
  // 合并解析后的结果集作为该篇文章最终的输出结果
47
- return Promise.resolve(Object.assign({}, single, other));
43
+ return { ...single, ...other };
48
44
  })
49
45
  );
50
46
  };
@@ -21,7 +21,7 @@ module.exports = async (ctx) => {
21
21
  item = $(item);
22
22
  return {
23
23
  title: item.find('img').attr('alt'),
24
- description: '<img src="' + item.find('img').attr('src') + '">',
24
+ description: '<img src="' + item.find('img').attr('data-src') + '">',
25
25
  pubDate: item.find('.data span').text(),
26
26
  guid: new Date(item.find('.data span').text()),
27
27
  link: item.find('a').attr('href'),
@@ -18,7 +18,7 @@ module.exports = async (ctx) => {
18
18
  const list = response.data.audios.map((item) => ({
19
19
  title: item.name,
20
20
  enclosure_url: item.url,
21
- enclosure_length: item.duration,
21
+ itunes_duration: item.duration,
22
22
  enclosure_type: 'audio/mpeg',
23
23
  link: `https://www.lizhi.fm/${$('div.user_info div.desc span').eq(0).text().replace('FM ', '')}/${item.id}`,
24
24
  pubDate: new Date(item.create_time).toUTCString(),
@@ -8,7 +8,7 @@ module.exports = async (ctx) => {
8
8
  const url = host + `/book/${id}`;
9
9
  const response = await got.get(url);
10
10
  const $ = cheerio.load(response.data);
11
- const list = $('#detail-list-select > li > a').reverse().slice(0, 10).get();
11
+ const list = $('#detail-list-select > li > a').get().reverse().slice(0, 10);
12
12
 
13
13
  const items = await Promise.all(
14
14
  list.map(async (item) => {
@@ -17,7 +17,7 @@ module.exports = async (ctx) => {
17
17
  return {
18
18
  title: item.name,
19
19
  enclosure_url: soundData.soundurl,
20
- enclosure_length: soundData.duration,
20
+ itunes_duration: ~~(soundData.duration / 1000),
21
21
  enclosure_type: 'audio/mpeg',
22
22
  image: dramaResp.data.info.drama.cover,
23
23
  itunes_author: soundData.username,
@@ -24,7 +24,7 @@ module.exports = async (ctx) => {
24
24
  return {
25
25
  title: item.name + (item.integrity === 3 ? '(已完结)' : '(更新至 ' + item.newest + ')'),
26
26
  enclosure_url: soundData.soundurl,
27
- enclosure_length: soundData.duration,
27
+ itunes_duration: ~~(soundData.duration / 1000),
28
28
  enclosure_type: 'audio/mpeg',
29
29
  image: item.cover,
30
30
  itunes_author: soundData.username,
@@ -1,4 +1,7 @@
1
1
  const got = require('@/utils/got');
2
+ const { parseDate } = require('@/utils/parse-date');
3
+ const { art } = require('@/utils/render');
4
+ const path = require('path');
2
5
 
3
6
  module.exports = async (ctx) => {
4
7
  const id = ctx.params.id;
@@ -13,17 +16,26 @@ module.exports = async (ctx) => {
13
16
 
14
17
  const data = response.data.Data.data;
15
18
 
16
- const title = `鱼塘热榜`;
19
+ const title = '鱼塘热榜';
17
20
 
18
21
  ctx.state.data = {
19
22
  title,
20
- link: `https://mo.fish/`,
21
- description: title,
22
- item: data.map((item) => ({
23
- title: item.Title,
24
- pubDate: new Date(item.releaseTime).toUTCString(),
25
- link: item.Url,
26
- guid: item.id,
27
- })),
23
+ link: 'https://mo.fish/',
24
+ item: data.map((item) => {
25
+ const isImage = Number(id) === 136 && item.Url.endsWith('.gif');
26
+ const description = isImage
27
+ ? art(path.join(__dirname, 'templates/description.art'), {
28
+ imageUrl: item.Url,
29
+ })
30
+ : title;
31
+
32
+ return {
33
+ title: item.Title,
34
+ description,
35
+ pubDate: parseDate(item.CreateTime * 1000),
36
+ link: item.Url,
37
+ guid: item.id,
38
+ };
39
+ }),
28
40
  };
29
41
  };
@@ -0,0 +1,4 @@
1
+ <p>
2
+ <img src="{{ imageUrl }}" referrerpolicy="no-referrer">
3
+ <br>
4
+ </p>
@@ -38,12 +38,12 @@ module.exports = async (ctx) => {
38
38
  const list = programs.map((pg) => {
39
39
  const description = (pg.description || '').split('\n').map((p) => p);
40
40
  const duration = ~~(pg.duration / 1000);
41
- const itunes_duration = `${(duration / 60).toFixed(0).padStart(2, '0')}:${(duration % 60).toFixed(0).padStart(2, '0')}`;
41
+ const mm_ss_duration = `${(duration / 60).toFixed(0).padStart(2, '0')}:${(duration % 60).toFixed(0).padStart(2, '0')}`;
42
42
 
43
43
  const html = art(path.join(__dirname, 'templates/djradio-content.art'), {
44
44
  pg,
45
45
  description,
46
- itunes_duration,
46
+ itunes_duration: mm_ss_duration,
47
47
  });
48
48
 
49
49
  return {
@@ -56,9 +56,8 @@ module.exports = async (ctx) => {
56
56
  content: { html },
57
57
  itunes_item_image: pg.coverUrl,
58
58
  enclosure_url: `https://music.163.com/song/media/outer/url?id=${pg.mainTrackId}.mp3`,
59
- enclosure_length: duration,
60
59
  enclosure_type: 'audio/mpeg',
61
- itunes_duration,
60
+ itunes_duration: duration,
62
61
  };
63
62
  });
64
63
  return list;
@@ -91,7 +91,7 @@ const parseSimpleDetail = ($ele) => {
91
91
  const link = resolve('https://nhentai.net', $ele.attr('href'));
92
92
  const thumb = $ele.children('img');
93
93
  const thumbSrc = thumb.attr('data-src') || thumb.attr('src');
94
- const highResoThumbSrc = thumbSrc.replace('thumb', '1').replace('t.nhentai.net', 'i.nhentai.net');
94
+ const highResoThumbSrc = thumbSrc.replace('thumb', '1').replace(/t\d+\.nhentai\.net/, 'i.nhentai.net');
95
95
  return {
96
96
  title: $ele.children('.caption').text(),
97
97
  link,
@@ -121,7 +121,7 @@ const getDetail = async (simple) => {
121
121
  .map((_, ele) => resolve('https://nhentai.net', $(ele).attr('data-src')))
122
122
  .get()
123
123
  .map((src) => src.replace(/(.+)(\d+)t\.(.+)/, (_, p1, p2, p3) => `${p1}${p2}.${p3}`)) // thumb to high-quality
124
- .map((src) => src.replace('t.nhentai.net', 'i.nhentai.net'));
124
+ .map((src) => src.replace(/t\d+\.nhentai\.net/, 'i.nhentai.net'));
125
125
 
126
126
  const renderImg = (src) => `<img src="${src}" /><br />`;
127
127
  return {
@@ -2,6 +2,7 @@ const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
3
  const iconv = require('iconv-lite');
4
4
  const asyncPool = require('tiny-async-pool');
5
+ const { parseDate } = require('@/utils/parse-date');
5
6
 
6
7
  const baseUrl = 'http://www.biquge5200.com/';
7
8
  // 获取小说的最新章节列表
@@ -25,36 +26,36 @@ module.exports = async (ctx) => {
25
26
  .map((_, e) => ({
26
27
  title: e.children[0].data,
27
28
  link: e.attribs.href,
28
- pubDate: new Date((parseInt(e.attribs.href.split('/').pop().replace('.html', '')) - 15015015) * 10000).toUTCString(),
29
+ pubDate: parseDate((parseInt(e.attribs.href.split('/').pop().replace('.html', '')) - 15015015) * 10000),
29
30
  }))
30
31
  .get();
31
32
 
32
- const items = await asyncPool(3, chapter_item, async (item) => {
33
- const cache = await ctx.cache.get(item.link);
34
- if (cache) {
35
- return Promise.resolve(JSON.parse(cache));
36
- }
33
+ const items = [];
34
+ for await (const item of asyncPool(3, chapter_item, (item) =>
35
+ ctx.cache.tryGet(item, async () => {
36
+ const response = await got({
37
+ method: 'get',
38
+ url: item.link,
39
+ responseType: 'buffer',
40
+ });
37
41
 
38
- const response = await got({
39
- method: 'get',
40
- url: item.link,
41
- responseType: 'buffer',
42
- });
42
+ const responseHtml = iconv.decode(response.data, 'GBK');
43
+ const $ = cheerio.load(responseHtml);
43
44
 
44
- const responseHtml = iconv.decode(response.data, 'GBK');
45
- const $ = cheerio.load(responseHtml);
45
+ const description = $('#content').html();
46
46
 
47
- const description = $('#content').html();
47
+ const single = {
48
+ title: item.title,
49
+ description,
50
+ link: item.link,
51
+ pubDate: item.pubDate,
52
+ };
53
+ return single;
54
+ })
55
+ )) {
56
+ items.push(item);
57
+ }
48
58
 
49
- const single = {
50
- title: item.title,
51
- description,
52
- link: item.link,
53
- pubDate: item.pubDate,
54
- };
55
- ctx.cache.set(item.link, JSON.stringify(single));
56
- return Promise.resolve(single);
57
- });
58
59
  ctx.state.data = {
59
60
  title: `笔趣阁 ${title}`,
60
61
  link: `${baseUrl}${id}/`,
@@ -1,15 +1,15 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
3
  const iconv = require('iconv-lite');
4
- const url = require('url');
5
4
  const asyncPool = require('tiny-async-pool');
5
+ const { parseDate } = require('@/utils/parse-date');
6
6
 
7
7
  const firstDay = new Date('2020-01-01');
8
8
  const baseUrl = 'http://www.biquge.info';
9
9
  // 获取小说的最新章节列表
10
10
  module.exports = async (ctx) => {
11
11
  const { id, limit = 10 } = ctx.params; // 小说id
12
- const pageUrl = url.resolve(baseUrl, `/${id}/`);
12
+ const pageUrl = new URL(`/${id}/`, baseUrl);
13
13
 
14
14
  const response = await got({
15
15
  method: 'get',
@@ -28,37 +28,37 @@ module.exports = async (ctx) => {
28
28
  .find('a')
29
29
  .map((i, e) => ({
30
30
  title: e.children[0].data,
31
- link: url.resolve(pageUrl, e.attribs.href),
32
- pubDate: new Date(firstDay.getTime() + (nItems - parseInt(limit) + i) * 1000 * 60 * 60 * 24),
31
+ link: new URL(e.attribs.href, pageUrl),
32
+ pubDate: parseDate(firstDay.getTime() + (nItems - parseInt(limit) + i) * 1000 * 60 * 60 * 24),
33
33
  }))
34
34
  .get();
35
35
 
36
- const items = await asyncPool(3, chapter_item, async (item) => {
37
- const cache = await ctx.cache.get(item.link);
38
- if (cache) {
39
- return Promise.resolve(JSON.parse(cache));
40
- }
36
+ const items = [];
37
+ for await (const item of asyncPool(3, chapter_item, (item) =>
38
+ ctx.cache.tryGet(item, async () => {
39
+ const response = await got({
40
+ method: 'get',
41
+ url: item.link,
42
+ responseType: 'buffer',
43
+ });
41
44
 
42
- const response = await got({
43
- method: 'get',
44
- url: item.link,
45
- responseType: 'buffer',
46
- });
45
+ const responseHtml = iconv.decode(response.data, 'utf-8');
46
+ const $ = cheerio.load(responseHtml);
47
47
 
48
- const responseHtml = iconv.decode(response.data, 'utf-8');
49
- const $ = cheerio.load(responseHtml);
48
+ const description = $('#content').html();
50
49
 
51
- const description = $('#content').html();
50
+ const single = {
51
+ title: item.title,
52
+ description,
53
+ link: item.link,
54
+ pubDate: item.pubDate,
55
+ };
56
+ return single;
57
+ })
58
+ )) {
59
+ items.push(item);
60
+ }
52
61
 
53
- const single = {
54
- title: item.title,
55
- description,
56
- link: item.link,
57
- pubDate: item.pubDate,
58
- };
59
- ctx.cache.set(item.link, JSON.stringify(single));
60
- return Promise.resolve(single);
61
- });
62
62
  ctx.state.data = {
63
63
  title: `笔趣阁 ${title}`,
64
64
  link: pageUrl,
@@ -1,7 +1,7 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
3
  const timezone = require('@/utils/timezone');
4
- const parseDate = require('@/utils/parse-date');
4
+ const { parseDate } = require('@/utils/parse-date');
5
5
 
6
6
  module.exports = async (ctx) => {
7
7
  const id = ctx.params.id || '';
@@ -1,18 +1,15 @@
1
1
  const cheerio = require('cheerio');
2
- const puppeteer = require('puppeteer');
3
2
 
4
3
  module.exports = async (ctx) => {
5
- const browser = await puppeteer.launch({
6
- args: ['--disable-dev-shm-usage'],
7
- });
4
+ const browser = await require('@/utils/puppeteer')();
8
5
 
9
6
  const id = ctx.params.mid;
10
- const sort = ctx.params.sort || 'near';
7
+ const sort = ctx.params.sort ?? 'near';
11
8
 
12
9
  const page = await browser.newPage();
13
10
  const link = `https://www.prestige-av.com/goods/goods_list.php?mode=series&mid=${id}&sort=${sort}`;
14
11
  await page.goto(link);
15
- await page.waitForSelector('.button_r18_prestige');
12
+ await page.waitForSelector('.buttons');
16
13
  await page.click('#AC');
17
14
  await page.waitForSelector('#body_goods');
18
15
  const bodyHandle = await page.$('body');
@@ -31,7 +31,7 @@ module.exports = async (ctx) => {
31
31
  guid: item.id,
32
32
  itunes_item_image: 'http://www.radio.cn/pc-portal/image/icon_32.jpg',
33
33
  enclosure_url: 'http://' + item.stream_domain1 + item.stream_url1,
34
- enclosure_length: item.resource_length,
34
+ itunes_duration: item.resource_length,
35
35
  enclosure_type: 'audio/x-m4a',
36
36
  };
37
37
  return single;
@@ -1,8 +1,13 @@
1
1
  const got = require('@/utils/got');
2
2
  const cheerio = require('cheerio');
3
+ const { parseDate } = require('@/utils/parse-date');
3
4
 
4
5
  module.exports = async (ctx) => {
5
- const response = await got.get(`https://feed.mix.sina.com.cn/api/roll/get?pageid=372&lid=2431&k=&num=50&page=1&r=${Math.random()}&callback=&_=${new Date().getTime()}`);
6
+ const response = await got(`https://feed.mix.sina.com.cn/api/roll/get?pageid=372&lid=2431&k=&num=50&page=1&r=${Math.random()}&callback=&_=${new Date().getTime()}`, {
7
+ headers: {
8
+ Referer: 'https://tech.sina.com.cn/',
9
+ },
10
+ });
6
11
  const list = response.data.result.data;
7
12
 
8
13
  const out = await Promise.all(
@@ -22,9 +27,9 @@ module.exports = async (ctx) => {
22
27
  title,
23
28
  link,
24
29
  description,
25
- pubDate: new Date(date).toUTCString(),
30
+ pubDate: parseDate(date),
26
31
  };
27
- return Promise.resolve(single);
32
+ return single;
28
33
  })
29
34
  );
30
35
 
@@ -4,8 +4,15 @@ const cheerio = require('cheerio');
4
4
  module.exports = async (ctx) => {
5
5
  const id = ctx.params.id;
6
6
  const mpName = ctx.params.mpName ?? '';
7
+ let searchQueryType = ctx.params.searchQueryType ?? '0';
8
+ if (searchQueryType !== '0' && searchQueryType !== '1' && searchQueryType !== '2') {
9
+ searchQueryType = '0';
10
+ }
11
+ searchQueryType = +searchQueryType; // 将字符串转换为数字
7
12
 
8
- const { data } = await got.get(`https://t.me/s/${id}`);
13
+ const channelUrl = `https://t.me/s/${id}`;
14
+ const searchQuery = mpName && searchQueryType ? (searchQueryType === 2 ? `?q=%23${mpName}` : `?q=${mpName}`) : '';
15
+ const { data } = await got.get(`${channelUrl}${searchQuery}`);
9
16
  const $ = cheerio.load(data);
10
17
  const list = $('.tgme_widget_message_wrap').slice(-20);
11
18
 
@@ -14,49 +21,97 @@ module.exports = async (ctx) => {
14
21
  .map(async (index, item) => {
15
22
  item = $(item);
16
23
 
24
+ if (searchQuery) {
25
+ // 删除关键字高亮 <mark class="highlight">
26
+ const highlightMarks = item.find('mark.highlight').get();
27
+ highlightMarks.forEach((mark) => {
28
+ mark = $(mark);
29
+ const markInnerHtml = mark.html();
30
+ mark.replaceWith(markInnerHtml);
31
+ });
32
+ if (highlightMarks) {
33
+ item = $(item.html()); // 删除关键字高亮后,相邻的裸文本节点不会被自动合并,重新生成 cheerio 对象以确保后续流程正常运行
34
+ }
35
+ }
36
+
17
37
  // [ div.tgme_widget_message_text 格式简略说明 ]
18
38
  // 若频道只订阅一个公众号:
19
- // 第 1 个元素: <a href="${用于 link priview 的预览图 url}"><i><b>${emoji(链接)}</b></i></a>
39
+ // 第 1 个元素: <a href="${用于 link priview 的预览图 url}"><i><b>🔗</b></i></a>
20
40
  // 第 2 个元素: <a href="${文章 url}">${文章标题}</a>
21
41
  // (余下是文章简介,一般是裸文本,这里用不到)
22
42
  //
23
43
  // 若频道订阅多于一个公众号:
24
- // 第 1 个元素: <i><b>${emoji(标注消息来源于什么 slave,这里是表示微信的对话气泡)}</b></i>
25
- // 第 2 个元素: <i><b>${emoji(标注对话类型,这里是表示私聊的半身人像)</b></i>
44
+ // 第 1 个元素: <i><b>${emoji(标注消息来源于什么 slave,这里是表示微信的💬)}</b></i>
45
+ // 第 2 个元素: <i><b>${emoji(标注对话类型,这里是表示私聊的👤)</b></i>
26
46
  // 裸文本: (半角空格)${公众号名}(半角冒号)
27
47
  // 第 3 个元素: <br />
28
- // 第 4 个元素: <a href="${用于 link priview 的预览图 url}"><i><b>${emoji(链接)}</b></i></a>
48
+ // 第 4 个元素: <a href="${用于 link priview 的预览图 url}"><i><b>🔗</b></i></a>
29
49
  // 第 5 个元素: <a href="${文章 url}">${文章标题}</a>
30
50
  // (余下是文章简介,一般是裸文本,这里用不到)
51
+ //
52
+ // 若启用 efb-patch-middleware 且频道订阅多于一个公众号:
53
+ // 第 1 个元素: <i><b>${emoji(标注消息来源于什么 slave,这里是表示微信的💬)}</b></i>
54
+ // 第 2 个元素: <i><b>${emoji(标注对话类型,这里是表示私聊的👤)</b></i>
55
+ // 第 3 个元素: <a href="${?q=%23url-encoded公众号名}">#${公众号名}</a>
56
+ // 裸文本: ${公众号名余下部分 (若 hashtag 不合法 (遇到空格、标点) 导致被截断才会有)}(半角冒号)
57
+ // 第 4 个元素: <br />
58
+ // 第 5 个元素: <a href="${用于 link priview 的预览图 url}"><i><b>🔗</b></i></a>
59
+ // 第 6 个元素: <a href="${文章 url}">${文章标题}</a>
60
+ // (余下是文章简介,一般是裸文本,这里用不到)
61
+
62
+ let author = '';
63
+ let titleElemIs3thA = false;
64
+
65
+ const brNode = item.find('.tgme_widget_message_text > br:nth-of-type(1)').get(0); // 获取第一个换行
66
+ const authorNode = brNode && brNode.prev; // brNode 不为 undefined 时获取它的前一个节点
67
+ const authorNodePrev = authorNode && authorNode.prev; // authorNode 不为 undefined 时获取它的前一个节点
68
+ if (authorNode && authorNode.type === 'text') {
69
+ // 只有这个节点是一个裸文本时它才可能是公众号名,开始找寻公众号名
70
+ if (authorNodePrev && authorNodePrev.type === 'tag' && authorNodePrev.name === 'a' && authorNodePrev.attribs.href && authorNodePrev.attribs.href.startsWith('?q=%23')) {
71
+ // authorNode 前一个节点是链接, 且是个 hashtag,表示启用了 efb-patch-middleware,这个节点是公众号名
72
+ // 有两种可能:
73
+ // 带 # 的完整公众号名 (efb-patch-middleware 启用,且 hashtag 完全合法)
74
+ // 被截断的公众号名前半部分 (efb-patch-middleware 启用,但 hashtag 被空格或标点截断)
75
+ // (若 efb-patch-middleware 未启用,或 hashtag 完全不合法,不会进入此流程)
76
+ titleElemIs3thA = true;
77
+ author += $(authorNodePrev).text();
78
+ }
31
79
 
32
- const title_elem = item.find('.tgme_widget_message_text > a:nth-of-type(2)'); // 第二个 a 元素会是文章链接
80
+ const spaceIndex = authorNode.data.indexOf(' ');
81
+ const colonIndex = authorNode.data.indexOf(':');
82
+ if (authorNode.data.length > 1 && colonIndex !== -1 && (spaceIndex !== -1 || titleElemIs3thA)) {
83
+ // 有三种可能:
84
+ // 不带 # 的完整公众号名 (efb-patch-middleware 未启用)
85
+ // 带 # 的完整公众号名 (efb-patch-middleware 启用,但 hashtag 完全不合法)
86
+ // 被截断的公众号名后半部分 (efb-patch-middleware 启用,但 hashtag 被空格或标点截断,此时空格有意义)
87
+ // (若 efb-patch-middleware 启用,且 hashtag 完全合法,不会进入此流程)
88
+ const sliceStart = titleElemIs3thA ? 0 : spaceIndex + 1;
89
+ author += authorNode.data.slice(sliceStart, colonIndex); // 提取作者
90
+ }
91
+
92
+ if (author.startsWith('#')) {
93
+ author = author.slice(1); // 去掉开头的 #
94
+ }
95
+ }
33
96
 
34
- if (title_elem.length === 0) {
35
- // 获取不到第二个 a 元素,这可能是公众号发的服务消息,丢弃它
97
+ // 如果启用了 efb-patch-middleware 且 hashtag (部分)合法,第三个 a 元素会是文章链接,否则是第二个
98
+ const titleElemNth = titleElemIs3thA ? 3 : 2;
99
+ const titleElem = item.find(`.tgme_widget_message_text > a:nth-of-type(${titleElemNth})`);
100
+
101
+ if (titleElem.length === 0) {
102
+ // 获取不到标题 a 元素,这可能是公众号发的服务消息,丢弃它
36
103
  return;
37
104
  }
38
105
 
39
- let author;
40
- let title = title_elem.text();
41
- const link = title_elem.attr('href');
42
-
43
- const br_node = item.find('.tgme_widget_message_text > br:nth-of-type(1)').get(0); // 获取第一个换行
44
- const author_node = br_node && br_node.prev; // br_node 不为 undefined 时获取它的前一个节点
45
- if (author_node && author_node.type === 'text') {
46
- // 只有这个节点是一个裸文本时它才可能是公众号名
47
- const spaceIndex = author_node.data.indexOf(' ');
48
- const colonIndex = author_node.data.indexOf(':');
49
- if (spaceIndex !== -1 && colonIndex !== -1) {
50
- // 找到了公众号名,说明这个频道订阅了多个公众号
51
- author = author_node.data.slice(spaceIndex + 1, colonIndex); // 提取作者
52
- if (mpName && author !== mpName) {
53
- // 指定了要筛选的公众号名,且该文章不是该公众号发的
54
- return; // 丢弃
55
- } else if (!mpName) {
56
- // 没有指定要筛选的公众号名
57
- title = author + ': ' + title; // 给标题里加上获取到的作者
58
- }
59
- }
106
+ let title = titleElem.text();
107
+ const link = titleElem.attr('href');
108
+
109
+ if (mpName && author !== mpName) {
110
+ // 指定了要筛选的公众号名,且该文章不是该公众号发的
111
+ return; // 丢弃
112
+ } else if (!mpName && author) {
113
+ // 没有指定要筛选的公众号名,且匹配到了作者
114
+ title = author + ': ' + title; // 给标题里加上获取到的作者
60
115
  }
61
116
 
62
117
  const pubDate = new Date(item.find('.tgme_widget_message_date time').attr('datetime')).toUTCString();
@@ -88,7 +143,13 @@ module.exports = async (ctx) => {
88
143
  }
89
144
 
90
145
  // 修复文字格式错误
91
- single.description = single.description.replace(/<section(.*?)>/g, '<p $1/>');
146
+ single.description = single.description
147
+ .replace(/(<strong.*?>)(.*?)(<\/strong>)/g, '$1<span style="font-size: 16px; line-height: 16px;">$2</span>$3')
148
+ .replace(/<section(.*?)>(.*?)<\/section>/g, '<p $1>$2</p>')
149
+ .replace(/(<p.*?>)(.*?)(<\/p>)/g, '$1<span style="font-size: 16px; line-height: 16px;">$2</span>$3')
150
+ .replace(/<p.*?data-encc.*?>.*?<\/p>/g, '')
151
+ .replace(/<h\d(.*?)>(.*?)<\/h\d>/g, '<p $1>$2</p>')
152
+ .replace(/<br.*?>/g, '');
92
153
 
93
154
  return single;
94
155
  })