rsshub 1.0.0-master.f9003f9 → 1.0.0-master.f917bdc

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 (532) hide show
  1. package/README.md +1 -0
  2. package/lib/api/category/one.ts +54 -0
  3. package/lib/api/index.ts +10 -4
  4. package/lib/app.tsx +2 -0
  5. package/lib/config.ts +43 -17
  6. package/lib/errors/index.test.ts +9 -5
  7. package/lib/errors/index.tsx +11 -4
  8. package/lib/index.ts +5 -2
  9. package/lib/middleware/anti-hotlink.test.ts +6 -6
  10. package/lib/middleware/cache.ts +21 -6
  11. package/lib/middleware/logger.ts +5 -1
  12. package/lib/middleware/template.tsx +15 -11
  13. package/lib/middleware/trace.ts +25 -0
  14. package/lib/registry.test.ts +8 -0
  15. package/lib/registry.ts +10 -2
  16. package/lib/router.js +0 -9
  17. package/lib/routes/141jav/index.ts +25 -21
  18. package/lib/routes/141ppv/index.ts +24 -20
  19. package/lib/routes/2048/index.ts +13 -10
  20. package/lib/routes/3dmgame/news-center.ts +1 -1
  21. package/lib/routes/51read/article.ts +82 -0
  22. package/lib/routes/51read/namespace.ts +6 -0
  23. package/lib/routes/69shu/article.ts +8 -8
  24. package/lib/routes/69shu/namespace.ts +1 -1
  25. package/lib/routes/academia/namespace.ts +6 -0
  26. package/lib/routes/academia/topics.ts +49 -0
  27. package/lib/routes/alistapart/utils.ts +2 -2
  28. package/lib/routes/aljazeera/index.ts +2 -2
  29. package/lib/routes/alpinelinux/namespace.ts +11 -0
  30. package/lib/routes/alpinelinux/pkgs.ts +104 -0
  31. package/lib/routes/apnews/rss.ts +10 -4
  32. package/lib/routes/apnews/topics.ts +11 -5
  33. package/lib/routes/apnews/utils.ts +36 -12
  34. package/lib/routes/apple/apps.ts +30 -8
  35. package/lib/routes/asmr-200/index.ts +66 -0
  36. package/lib/routes/asmr-200/namespace.ts +6 -0
  37. package/lib/routes/asmr-200/templates/work.art +7 -0
  38. package/lib/routes/asmr-200/type.ts +96 -0
  39. package/lib/routes/autocentre/index.ts +29 -0
  40. package/lib/routes/autocentre/namespace.ts +7 -0
  41. package/lib/routes/bbc/index.ts +3 -1
  42. package/lib/routes/bc3ts/list.ts +72 -0
  43. package/lib/routes/bc3ts/namespace.ts +7 -0
  44. package/lib/routes/bc3ts/templates/media.art +10 -0
  45. package/lib/routes/bc3ts/types.ts +118 -0
  46. package/lib/routes/beijingprice/index.ts +193 -0
  47. package/lib/routes/beijingprice/namespace.ts +8 -0
  48. package/lib/routes/bilibili/api-interface.d.ts +1 -0
  49. package/lib/routes/bilibili/dynamic.ts +35 -18
  50. package/lib/routes/bilibili/namespace.ts +1 -1
  51. package/lib/routes/bilibili/ranking.ts +99 -8
  52. package/lib/routes/bilibili/video.ts +3 -5
  53. package/lib/routes/bing/daily-wallpaper.ts +57 -18
  54. package/lib/routes/bjnews/cat.ts +43 -0
  55. package/lib/routes/bjnews/column.ts +43 -0
  56. package/lib/routes/bjnews/namespace.ts +6 -0
  57. package/lib/routes/bjnews/utils.ts +19 -0
  58. package/lib/routes/bjx/fd.ts +63 -0
  59. package/lib/routes/bjx/namespace.ts +1 -1
  60. package/lib/routes/bluearchive/namespace.ts +7 -0
  61. package/lib/routes/bluearchive/news.ts +88 -0
  62. package/lib/routes/bt0/mv.ts +65 -0
  63. package/lib/routes/bt0/namespace.ts +9 -0
  64. package/lib/routes/bt0/tlist.ts +67 -0
  65. package/lib/routes/bt0/util.ts +51 -0
  66. package/lib/routes/buaa/jiaowu.ts +124 -0
  67. package/lib/routes/buaa/lib/space/newbook.ts +171 -0
  68. package/lib/routes/buaa/lib/space/templates/newbook.art +44 -0
  69. package/lib/routes/buaa/news/index.ts +15 -13
  70. package/lib/routes/buaa/sme.ts +5 -3
  71. package/lib/routes/bugzilla/bug.ts +59 -0
  72. package/lib/routes/bugzilla/namespace.ts +11 -0
  73. package/lib/routes/cara/constant.ts +5 -0
  74. package/lib/routes/cara/likes.ts +56 -0
  75. package/lib/routes/cara/namespace.ts +6 -0
  76. package/lib/routes/cara/portfolio.ts +40 -0
  77. package/lib/routes/cara/templates/post.art +6 -0
  78. package/lib/routes/cara/timeline.ts +56 -0
  79. package/lib/routes/cara/types.ts +45 -0
  80. package/lib/routes/cara/utils.ts +62 -0
  81. package/lib/routes/cbaigui/utils.ts +1 -1
  82. package/lib/routes/cccfna/index.ts +82 -0
  83. package/lib/routes/cccfna/namespace.ts +6 -0
  84. package/lib/routes/cffex/announcement.ts +73 -0
  85. package/lib/routes/cffex/namespace.ts +6 -0
  86. package/lib/routes/cfr/index.ts +58 -0
  87. package/lib/routes/cfr/namespace.ts +6 -0
  88. package/lib/routes/cfr/types.ts +30 -0
  89. package/lib/routes/cfr/utils.ts +284 -0
  90. package/lib/routes/chaping/newsflash.ts +2 -2
  91. package/lib/routes/chlinlearn/daily-blog.ts +48 -0
  92. package/lib/routes/chlinlearn/namespcae.ts +6 -0
  93. package/lib/routes/cnbc/rss.ts +1 -1
  94. package/lib/routes/codeforces/contests.ts +2 -2
  95. package/lib/routes/codeforces/recent-actions.ts +2 -2
  96. package/lib/routes/copymanga/comic.ts +3 -1
  97. package/lib/routes/dangdang/namespace.ts +6 -0
  98. package/lib/routes/dangdang/notice.ts +69 -0
  99. package/lib/routes/dataguidance/index.ts +66 -0
  100. package/lib/routes/dataguidance/namespace.ts +7 -0
  101. package/lib/routes/dblp/publication.ts +4 -6
  102. package/lib/routes/deadbydaylight/index.ts +69 -0
  103. package/lib/routes/deadbydaylight/namespace.ts +12 -0
  104. package/lib/routes/devolverdigital/blog.ts +59 -42
  105. package/lib/routes/dewu/declaration.ts +86 -0
  106. package/lib/routes/dewu/namespace.ts +6 -0
  107. package/lib/routes/dhu/jiaowu/news.ts +53 -24
  108. package/lib/routes/dhu/namespace.ts +1 -1
  109. package/lib/routes/dhu/xxgk/news.ts +48 -20
  110. package/lib/routes/digitalcameraworld/news.ts +1 -1
  111. package/lib/routes/discord/channel.ts +10 -10
  112. package/lib/routes/discord/discord-api.ts +27 -32
  113. package/lib/routes/discord/templates/message.art +15 -0
  114. package/lib/routes/discourse/notifications.ts +4 -2
  115. package/lib/routes/dlnews/utils.ts +2 -2
  116. package/lib/routes/dockerhub/build.ts +11 -6
  117. package/lib/routes/domp4/detail.ts +1 -1
  118. package/lib/routes/domp4/latest-movie-bt.ts +71 -0
  119. package/lib/routes/dongqiudi/result.ts +1 -1
  120. package/lib/routes/douban/other/group.ts +24 -3
  121. package/lib/routes/duckdb/namespace.ts +6 -0
  122. package/lib/routes/duckdb/news.ts +65 -0
  123. package/lib/routes/dushu/fuzhou/index.ts +10 -11
  124. package/lib/routes/epicgames/index.ts +14 -4
  125. package/lib/routes/famitsu/category.ts +110 -43
  126. package/lib/routes/famitsu/templates/description.art +7 -0
  127. package/lib/routes/famitsu/types.ts +117 -0
  128. package/lib/routes/fanbox/namespace.ts +1 -1
  129. package/lib/routes/fanqienovel/namespace.ts +7 -0
  130. package/lib/routes/fanqienovel/page.ts +100 -0
  131. package/lib/routes/fansly/post.ts +1 -2
  132. package/lib/routes/fansly/tag.ts +1 -2
  133. package/lib/routes/fansly/utils.ts +5 -4
  134. package/lib/routes/fashionnetwork/index.ts +192 -0
  135. package/lib/routes/fashionnetwork/namespace.ts +8 -0
  136. package/lib/routes/fashionnetwork/templates/description.art +17 -0
  137. package/lib/routes/fediverse/namespace.ts +6 -0
  138. package/lib/routes/fediverse/timeline.ts +98 -0
  139. package/lib/routes/finviz/news.ts +4 -4
  140. package/lib/routes/foresightnews/util.ts +1 -1
  141. package/lib/routes/fortunechina/index.ts +24 -14
  142. package/lib/routes/freebuf/index.ts +3 -3
  143. package/lib/routes/ftchinese/channel.ts +3 -3
  144. package/lib/routes/gdut/oa-news.ts +12 -17
  145. package/lib/routes/getitfree/util.ts +1 -1
  146. package/lib/routes/github/activity.ts +55 -0
  147. package/lib/routes/github/issue.ts +26 -3
  148. package/lib/routes/github/search.ts +20 -18
  149. package/lib/routes/github/star.ts +4 -3
  150. package/lib/routes/github/trending.ts +27 -5
  151. package/lib/routes/google/citations.ts +2 -2
  152. package/lib/routes/google/research.ts +45 -0
  153. package/lib/routes/google/scholar.ts +2 -2
  154. package/lib/routes/gov/beijing/bphc/index.ts +3 -3
  155. package/lib/routes/gov/immiau/news.ts +2 -2
  156. package/lib/routes/gov/sh/fgw/index.ts +155 -0
  157. package/lib/routes/gov/sh/fgw/templates/description.art +17 -0
  158. package/lib/routes/gov/sh/namespace.ts +8 -0
  159. package/lib/routes/gov/{shanghai → sh}/rsj/ksxm.ts +2 -2
  160. package/lib/routes/gov/{shanghai → sh}/wgj/wgj.ts +3 -3
  161. package/lib/routes/gov/{shanghai → sh}/wsjkw/yqtb/index.ts +2 -2
  162. package/lib/routes/gov/{shanghai → sh}/yjj/index.ts +3 -3
  163. package/lib/routes/gov/stats/index.ts +8 -8
  164. package/lib/routes/gov/zhengce/index.ts +3 -6
  165. package/lib/routes/gov/zj/ningbogzw-notice.ts +50 -0
  166. package/lib/routes/gov/zj/ningborsjnotice.ts +50 -0
  167. package/lib/routes/gq/news.ts +1 -1
  168. package/lib/routes/grist/utils.ts +2 -2
  169. package/lib/routes/guokr/utils.ts +1 -1
  170. package/lib/routes/healthz.ts +8 -0
  171. package/lib/routes/hitcon/zeroday.ts +1 -1
  172. package/lib/routes/hket/index.ts +80 -76
  173. package/lib/routes/hrbeu/job/calendar.ts +8 -6
  174. package/lib/routes/huxiu/util.ts +2 -2
  175. package/lib/routes/hypergryph/arknights/arktca.ts +124 -0
  176. package/lib/routes/ieee/journal.ts +50 -67
  177. package/lib/routes/ieee/templates/description.art +1 -1
  178. package/lib/routes/imdb/chart.ts +61 -0
  179. package/lib/routes/imdb/namespace.ts +6 -0
  180. package/lib/routes/imdb/templates/chart.art +15 -0
  181. package/lib/routes/imdb/types.ts +103 -0
  182. package/lib/routes/imop/namespace.ts +10 -0
  183. package/lib/routes/imop/tianshu.ts +53 -0
  184. package/lib/routes/informedainews/docs.ts +78 -0
  185. package/lib/routes/informedainews/namespace.ts +18 -0
  186. package/lib/routes/inspirehep/author.ts +46 -0
  187. package/lib/routes/inspirehep/literature.ts +42 -0
  188. package/lib/routes/inspirehep/namespace.ts +7 -0
  189. package/lib/routes/inspirehep/types.ts +210 -0
  190. package/lib/routes/inspirehep/utils.ts +15 -0
  191. package/lib/routes/instagram/private-api/index.ts +28 -6
  192. package/lib/routes/investor/index.ts +213 -0
  193. package/lib/routes/investor/namespace.ts +8 -0
  194. package/lib/routes/iplaysoft/index.ts +68 -0
  195. package/lib/routes/iplaysoft/namespace.ts +6 -0
  196. package/lib/routes/j-test/namespace.ts +6 -0
  197. package/lib/routes/j-test/news.ts +64 -0
  198. package/lib/routes/japanpost/namespace.ts +7 -1
  199. package/lib/routes/japanpost/router.ts +40 -0
  200. package/lib/routes/japanpost/track.ts +1 -23
  201. package/lib/routes/javbus/index.ts +8 -1
  202. package/lib/routes/javdb/actors.ts +6 -2
  203. package/lib/routes/javdb/index.ts +4 -3
  204. package/lib/routes/javdb/series.ts +1 -1
  205. package/lib/routes/javdb/utils.ts +6 -0
  206. package/lib/routes/javdb/videocodes.ts +56 -0
  207. package/lib/routes/jike/topic.ts +1 -1
  208. package/lib/routes/jike/user.ts +1 -1
  209. package/lib/routes/jingzhengu/namespace.ts +6 -0
  210. package/lib/routes/jingzhengu/news.ts +77 -0
  211. package/lib/routes/jingzhengu/types.ts +39 -0
  212. package/lib/routes/jingzhengu/utils.ts +35 -0
  213. package/lib/routes/jinritemai/docs.ts +74 -0
  214. package/lib/routes/jinritemai/namespace.ts +6 -0
  215. package/lib/routes/jiuyangongshe/community.ts +147 -0
  216. package/lib/routes/jiuyangongshe/namespace.ts +7 -0
  217. package/lib/routes/jiuyangongshe/templates/community-description.art +4 -0
  218. package/lib/routes/jjwxc/book.ts +4 -3
  219. package/lib/routes/jlu/ccst/xwzx/index.ts +63 -0
  220. package/lib/routes/jlu/jwc.ts +55 -0
  221. package/lib/routes/jlu/namespace.ts +6 -0
  222. package/lib/routes/juejin/dynamic.ts +114 -0
  223. package/lib/routes/kadokawa/blog.ts +134 -0
  224. package/lib/routes/kadokawa/namespace.ts +8 -0
  225. package/lib/routes/kadokawa/templates/description.art +21 -0
  226. package/lib/routes/kaopu/news.ts +3 -3
  227. package/lib/routes/kelownacapnews/namespace.ts +6 -0
  228. package/lib/routes/kelownacapnews/news.ts +93 -0
  229. package/lib/routes/kemono/index.ts +21 -0
  230. package/lib/routes/keylol/index.ts +56 -11
  231. package/lib/routes/kurogames/namespace.ts +7 -0
  232. package/lib/routes/kurogames/wutheringwaves/news.ts +59 -0
  233. package/lib/routes/kyodonews/index.ts +1 -1
  234. package/lib/routes/leetcode/articles.ts +19 -21
  235. package/lib/routes/line/today.ts +1 -1
  236. package/lib/routes/linkedin/cn/renderer.ts +1 -1
  237. package/lib/routes/lmu/jobs.ts +96 -0
  238. package/lib/routes/lmu/namespace.ts +17 -0
  239. package/lib/routes/lmu/templates/jobPosting.art +11 -0
  240. package/lib/routes/lofter/user.ts +2 -1
  241. package/lib/routes/logclub/index.ts +1 -2
  242. package/lib/routes/luogu/user-blog.ts +6 -6
  243. package/lib/routes/luolei/index.ts +1 -2
  244. package/lib/routes/maccms/index.ts +72 -0
  245. package/lib/routes/maccms/namespace.ts +9 -0
  246. package/lib/routes/maccms/templates/vod.art +12 -0
  247. package/lib/routes/maccms/type.ts +102 -0
  248. package/lib/routes/mangadex/namespace.ts +1 -1
  249. package/lib/routes/manyvids/namespace.ts +7 -0
  250. package/lib/routes/manyvids/templates/video.art +3 -0
  251. package/lib/routes/manyvids/types.ts +89 -0
  252. package/lib/routes/manyvids/video.ts +51 -0
  253. package/lib/routes/matters/author.ts +63 -0
  254. package/lib/routes/matters/latest.ts +74 -0
  255. package/lib/routes/matters/namespace.ts +7 -0
  256. package/lib/routes/matters/tags.ts +85 -0
  257. package/lib/routes/matters/utils.ts +30 -0
  258. package/lib/routes/mcmod/index.ts +105 -0
  259. package/lib/routes/mcmod/namespace.ts +6 -0
  260. package/lib/routes/mcmod/templates/mod.art +13 -0
  261. package/lib/routes/meituan/namespace.ts +6 -0
  262. package/lib/routes/meituan/tech.ts +67 -0
  263. package/lib/routes/metacritic/index.ts +10 -0
  264. package/lib/routes/metrics.ts +12 -0
  265. package/lib/routes/microsoft/mcr.ts +63 -0
  266. package/lib/routes/microsoft/namespace.ts +2 -2
  267. package/lib/routes/mihoyo/bbs/img-ranking.ts +4 -4
  268. package/lib/routes/mihoyo/bbs/static-data.ts +7 -0
  269. package/lib/routes/minecraft/version.ts +1 -1
  270. package/lib/routes/mirrormedia/category.ts +101 -0
  271. package/lib/routes/mirrormedia/index.ts +43 -0
  272. package/lib/routes/mirrormedia/namespace.ts +6 -0
  273. package/lib/routes/mirrormedia/utils.ts +19 -0
  274. package/lib/routes/misskey/user-timeline.ts +42 -0
  275. package/lib/routes/misskey/utils.ts +41 -1
  276. package/lib/routes/modb/topic.ts +5 -6
  277. package/lib/routes/my-formosa/index.ts +78 -0
  278. package/lib/routes/my-formosa/namespace.ts +6 -0
  279. package/lib/routes/myfans/namespace.ts +6 -0
  280. package/lib/routes/myfans/post.ts +64 -0
  281. package/lib/routes/myfans/templates/post.art +8 -0
  282. package/lib/routes/myfans/types.ts +104 -0
  283. package/lib/routes/myfans/utils.ts +39 -0
  284. package/lib/routes/nasa/apod.ts +4 -3
  285. package/lib/routes/nasa/namespace.ts +1 -1
  286. package/lib/routes/nationalgeographic/latest-stories.ts +1 -1
  287. package/lib/routes/nationalgeographic/templates/stories.art +1 -1
  288. package/lib/routes/neea/index.ts +47 -19
  289. package/lib/routes/neea/jlpt.ts +12 -15
  290. package/lib/routes/neea/namespace.ts +2 -2
  291. package/lib/routes/newrank/utils.ts +1 -1
  292. package/lib/routes/newzmz/util.ts +1 -1
  293. package/lib/routes/nextjs/blog.ts +63 -0
  294. package/lib/routes/nextjs/namespace.ts +6 -0
  295. package/lib/routes/nga/forum.ts +3 -2
  296. package/lib/routes/nikkei/asia/index.ts +1 -10
  297. package/lib/routes/nikkei/cn/index.ts +39 -3
  298. package/lib/routes/nikkei/index.ts +5 -4
  299. package/lib/routes/nikkei/namespace.ts +1 -1
  300. package/lib/routes/nikkei/news.ts +2 -2
  301. package/lib/routes/nmc/weatheralarm.ts +1 -0
  302. package/lib/routes/notion/release.ts +81 -0
  303. package/lib/routes/npm/package.ts +15 -8
  304. package/lib/routes/nyaa/main.ts +2 -3
  305. package/lib/routes/nyaa/namespace.ts +10 -0
  306. package/lib/routes/ollama/blog.ts +39 -0
  307. package/lib/routes/ollama/models.ts +7 -4
  308. package/lib/routes/oschina/news.ts +6 -2
  309. package/lib/routes/people/index.ts +4 -2
  310. package/lib/routes/picnob/namespace.ts +1 -4
  311. package/lib/routes/picnob/user.ts +3 -2
  312. package/lib/routes/picuki/namespace.ts +1 -4
  313. package/lib/routes/picuki/profile.ts +11 -7
  314. package/lib/routes/pixiv/ranking.ts +73 -10
  315. package/lib/routes/pixiv/search.ts +58 -7
  316. package/lib/routes/pixiv/user.ts +3 -1
  317. package/lib/routes/pixiv/utils.ts +3 -3
  318. package/lib/routes/podwise/collections.ts +46 -0
  319. package/lib/routes/podwise/episodes.ts +119 -0
  320. package/lib/routes/podwise/namespace.ts +9 -0
  321. package/lib/routes/ps/monthly-games.ts +3 -2
  322. package/lib/routes/psyche/namespace.ts +6 -0
  323. package/lib/routes/psyche/templates/essay.art +3 -0
  324. package/lib/routes/psyche/templates/video.art +10 -0
  325. package/lib/routes/psyche/topic.ts +46 -0
  326. package/lib/routes/psyche/type.ts +53 -0
  327. package/lib/routes/psyche/utils.ts +107 -0
  328. package/lib/routes/pubscholar/explore.ts +62 -0
  329. package/lib/routes/pubscholar/namespace.ts +7 -0
  330. package/lib/routes/pubscholar/types.ts +41 -0
  331. package/lib/routes/pubscholar/utils.ts +44 -0
  332. package/lib/routes/pwc/sustainability.ts +53 -49
  333. package/lib/routes/qidian/chapter.ts +4 -3
  334. package/lib/routes/raycast/changelog.ts +54 -0
  335. package/lib/routes/raycast/namespace.ts +7 -0
  336. package/lib/routes/react/blog.ts +57 -0
  337. package/lib/routes/react/namespace.ts +6 -0
  338. package/lib/routes/readwise/list.ts +152 -0
  339. package/lib/routes/readwise/namespace.ts +6 -0
  340. package/lib/routes/reuters/common.ts +3 -2
  341. package/lib/routes/reuters/namespace.ts +1 -1
  342. package/lib/routes/rss3/index.ts +148 -0
  343. package/lib/routes/rss3/namespace.ts +7 -0
  344. package/lib/routes/rsshub/routes.ts +36 -14
  345. package/lib/routes/ruc/ai.ts +87 -0
  346. package/lib/routes/ruc/namespace.ts +5 -2
  347. package/lib/routes/samd/namespace.ts +6 -0
  348. package/lib/routes/samd/news.ts +74 -0
  349. package/lib/routes/sara/index.ts +1 -1
  350. package/lib/routes/sciencedirect/cf-email.ts +0 -1
  351. package/lib/routes/sehuatang/index.ts +33 -14
  352. package/lib/routes/sehuatang/user.ts +1 -1
  353. package/lib/routes/shiep/config.ts +4 -10
  354. package/lib/routes/shiep/index.ts +9 -9
  355. package/lib/routes/showstart/artist.ts +5 -4
  356. package/lib/routes/showstart/brand.ts +5 -4
  357. package/lib/routes/showstart/event.ts +8 -7
  358. package/lib/routes/showstart/search.ts +10 -8
  359. package/lib/routes/showstart/service.ts +81 -53
  360. package/lib/routes/showstart/site.ts +41 -0
  361. package/lib/routes/showstart/utils.ts +9 -8
  362. package/lib/routes/sicau/jiaowu.ts +77 -0
  363. package/lib/routes/sicau/jk.ts +210 -0
  364. package/lib/routes/sicau/namespace.ts +1 -1
  365. package/lib/routes/sjtu/jwc.ts +4 -1
  366. package/lib/routes/sjtu/yzb/zkxx.ts +36 -16
  367. package/lib/routes/smzdm/keyword.ts +3 -2
  368. package/lib/routes/smzdm/ranking.ts +180 -46
  369. package/lib/routes/spotify/artist.ts +16 -18
  370. package/lib/routes/spotify/artists-top.ts +7 -8
  371. package/lib/routes/spotify/playlist.ts +10 -10
  372. package/lib/routes/spotify/saved.ts +7 -8
  373. package/lib/routes/spotify/show.ts +8 -9
  374. package/lib/routes/spotify/tracks-top.ts +7 -8
  375. package/lib/routes/spotify/utils.ts +22 -22
  376. package/lib/routes/springer/journal.ts +10 -12
  377. package/lib/routes/sspai/author.ts +8 -2
  378. package/lib/routes/sspai/column.ts +1 -1
  379. package/lib/routes/sspai/index.ts +10 -4
  380. package/lib/routes/sspai/matrix.ts +8 -2
  381. package/lib/routes/sspai/prime-community.ts +83 -0
  382. package/lib/routes/sspai/series-update.ts +1 -1
  383. package/lib/routes/sspai/tag.ts +8 -2
  384. package/lib/routes/sspai/topic.ts +8 -2
  385. package/lib/routes/sspai/topics.ts +1 -1
  386. package/lib/routes/steam/sharefile-changelog.ts +65 -0
  387. package/lib/routes/steam/templates/workshop-search-description.art +5 -0
  388. package/lib/routes/steam/workshop-search.ts +109 -0
  389. package/lib/routes/stockedge/utils.ts +9 -11
  390. package/lib/routes/stream-capital/namespace.ts +6 -0
  391. package/lib/routes/stream-capital/search.ts +79 -0
  392. package/lib/routes/stream-capital/types.ts +44 -0
  393. package/lib/routes/stream-capital/utils.ts +18 -0
  394. package/lib/routes/sustainabilitymag/articles.ts +144 -0
  395. package/lib/routes/sustainabilitymag/namespace.ts +6 -0
  396. package/lib/routes/t66y/index.ts +29 -7
  397. package/lib/routes/techcrunch/news.ts +20 -29
  398. package/lib/routes/techcrunch/templates/description.art +7 -0
  399. package/lib/routes/telecompaper/news.ts +1 -1
  400. package/lib/routes/telegram/channel.ts +37 -31
  401. package/lib/routes/tencent/cloud/developer/column.ts +81 -0
  402. package/lib/routes/tencent/namespace.ts +2 -2
  403. package/lib/routes/tesla/cx.ts +1 -1
  404. package/lib/routes/test/index.ts +5 -1
  405. package/lib/routes/test/namespace.ts +1 -1
  406. package/lib/routes/the/index.ts +210 -0
  407. package/lib/routes/the/namespace.ts +8 -0
  408. package/lib/routes/the/templates/description.art +27 -0
  409. package/lib/routes/the/util.ts +307 -0
  410. package/lib/routes/theinitium/channel.ts +1 -1
  411. package/lib/routes/theinitium/follow.ts +1 -6
  412. package/lib/routes/theinitium/utils.ts +2 -18
  413. package/lib/routes/thoughtworks/index.ts +71 -0
  414. package/lib/routes/thoughtworks/namespace.ts +6 -0
  415. package/lib/routes/trending/all-trending.ts +2 -2
  416. package/lib/routes/tsdm39/bd.ts +101 -0
  417. package/lib/routes/tsdm39/namespace.ts +7 -0
  418. package/lib/routes/tvb/news.ts +1 -0
  419. package/lib/routes/twitter/api/index.ts +1 -1
  420. package/lib/routes/twitter/api/mobile-api/api.ts +9 -6
  421. package/lib/routes/twitter/api/mobile-api/login.ts +161 -138
  422. package/lib/routes/twitter/api/mobile-api/token.ts +16 -22
  423. package/lib/routes/twitter/api/web-api/api.ts +1 -0
  424. package/lib/routes/twitter/api/web-api/utils.ts +89 -17
  425. package/lib/routes/twitter/home.ts +2 -2
  426. package/lib/routes/twitter/keyword.ts +3 -2
  427. package/lib/routes/twitter/likes.ts +1 -1
  428. package/lib/routes/twitter/list.ts +1 -1
  429. package/lib/routes/twitter/media.ts +4 -3
  430. package/lib/routes/twitter/namespace.ts +2 -2
  431. package/lib/routes/twitter/user.ts +5 -4
  432. package/lib/routes/twitter/utils.ts +14 -5
  433. package/lib/routes/twreporter/category.ts +67 -22
  434. package/lib/routes/twreporter/fetch-article.ts +11 -5
  435. package/lib/routes/twreporter/newest.ts +2 -2
  436. package/lib/routes/typst/universe.ts +34 -8
  437. package/lib/routes/udn/breaking-news.ts +9 -0
  438. package/lib/routes/utgd/category.ts +18 -59
  439. package/lib/routes/utgd/timeline.ts +9 -45
  440. package/lib/routes/utgd/topic.ts +9 -51
  441. package/lib/routes/utgd/utils.ts +41 -0
  442. package/lib/routes/v2ex/tab.ts +3 -2
  443. package/lib/routes/v2ex/topics.ts +19 -3
  444. package/lib/routes/v2ex/xna.ts +55 -0
  445. package/lib/routes/vice/namespace.ts +6 -0
  446. package/lib/routes/vice/templates/article.art +19 -0
  447. package/lib/routes/vice/topic.ts +103 -0
  448. package/lib/routes/watasuke/blog.ts +1 -1
  449. package/lib/routes/weibo/friends.ts +1 -0
  450. package/lib/routes/weibo/group.ts +1 -0
  451. package/lib/routes/weibo/keyword.ts +3 -2
  452. package/lib/routes/weibo/namespace.ts +1 -1
  453. package/lib/routes/weibo/search/hot.ts +12 -7
  454. package/lib/routes/weibo/user-bookmarks.ts +191 -0
  455. package/lib/routes/weibo/user.ts +11 -8
  456. package/lib/routes/weibo/utils.ts +32 -2
  457. package/lib/routes/wfu/news.ts +1 -1
  458. package/lib/routes/wired/namespace.ts +7 -0
  459. package/lib/routes/wired/tag.ts +97 -0
  460. package/lib/routes/wired/types.ts +81 -0
  461. package/lib/routes/wordpress/util.ts +1 -1
  462. package/lib/routes/xiaoyuzhou/podcast.ts +2 -1
  463. package/lib/routes/ximalaya/album.ts +27 -19
  464. package/lib/routes/ximalaya/types.ts +68 -0
  465. package/lib/routes/ximalaya/utils.ts +38 -1
  466. package/lib/routes/xinhuanet/app.ts +109 -0
  467. package/lib/routes/xinhuanet/namespace.ts +8 -0
  468. package/lib/routes/xsijishe/forum.ts +23 -3
  469. package/lib/routes/xsijishe/rank.ts +23 -3
  470. package/lib/routes/yahoo/news/index.ts +149 -0
  471. package/lib/routes/yahoo/news/listid.ts +67 -0
  472. package/lib/routes/yahoo/news/{tw/provider-helper.ts → provider-helper.ts} +9 -4
  473. package/lib/routes/yahoo/news/{tw/provider.ts → provider.ts} +21 -6
  474. package/lib/routes/yahoo/news/{tw/utils.ts → utils.ts} +24 -15
  475. package/lib/routes/yicai/carousel.ts +48 -0
  476. package/lib/routes/yicai/utils.ts +23 -17
  477. package/lib/routes/ymgal/article.ts +1 -1
  478. package/lib/routes/youtube/channel.ts +1 -0
  479. package/lib/routes/youtube/custom.ts +2 -0
  480. package/lib/routes/youtube/live.ts +1 -0
  481. package/lib/routes/youtube/playlist.ts +1 -0
  482. package/lib/routes/youtube/subscriptions.ts +2 -0
  483. package/lib/routes/youtube/user.ts +16 -4
  484. package/lib/routes/zaobao/interactive.ts +2 -11
  485. package/lib/routes/zaobao/{index.ts → other.ts} +2 -10
  486. package/lib/routes/zaobao/realtime.ts +0 -8
  487. package/lib/routes/zaobao/util.ts +14 -10
  488. package/lib/routes/zcool/discover.ts +2 -1
  489. package/lib/routes/zhihu/activities.ts +2 -1
  490. package/lib/routes/zhihu/execlib/x-zse-96-v3.ts +2 -0
  491. package/lib/routes/zhihu/hot.ts +56 -7
  492. package/lib/routes/zhihu/namespace.ts +3 -0
  493. package/lib/routes/zhihu/posts.ts +20 -15
  494. package/lib/routes/zhihu/types.ts +104 -0
  495. package/lib/routes/zhihu/utils.ts +25 -4
  496. package/lib/routes/zhihu/zhuanlan.ts +8 -2
  497. package/lib/routes/zhubai/top20.ts +2 -2
  498. package/lib/routes/zhuwang/index.ts +1 -1
  499. package/lib/routes/zjgtjy/index.ts +3 -9
  500. package/lib/routes.test.ts +11 -5
  501. package/lib/types.ts +34 -2
  502. package/lib/utils/cache/index.ts +8 -0
  503. package/lib/utils/ofetch.ts +15 -1
  504. package/lib/utils/otel/index.ts +2 -0
  505. package/lib/utils/otel/metric.ts +66 -0
  506. package/lib/utils/otel/trace.ts +28 -0
  507. package/lib/utils/request-rewriter/fetch.ts +21 -2
  508. package/lib/utils/request-rewriter.test.ts +14 -0
  509. package/lib/views/atom.tsx +2 -2
  510. package/lib/views/error.tsx +4 -4
  511. package/lib/views/index.tsx +5 -4
  512. package/lib/views/json.ts +1 -1
  513. package/lib/views/layout.tsx +1 -1
  514. package/lib/views/rss.tsx +3 -2
  515. package/lib/views/rss3.test.ts +99 -0
  516. package/package.json +69 -56
  517. package/lib/routes/ieee/earlyaccess.ts +0 -100
  518. package/lib/routes/ieee/recent.ts +0 -107
  519. package/lib/routes/yahoo/news/tw/index.ts +0 -80
  520. package/lib/routes/yahoo/news/us/index.ts +0 -55
  521. package/lib/routes/zhihu/hotlist.ts +0 -72
  522. package/lib/routes-deprecated/bjnews/news.js +0 -44
  523. package/lib/routes-deprecated/iplay/home.js +0 -26
  524. package/lib/routes-deprecated/iplay/utils.js +0 -57
  525. package/lib/routes-deprecated/matters/author.js +0 -49
  526. package/lib/routes-deprecated/matters/latest.js +0 -69
  527. package/lib/routes-deprecated/matters/tags.js +0 -56
  528. /package/lib/routes/gov/{shanghai → sh}/rsj/templates/ksxm.art +0 -0
  529. /package/lib/routes/gov/{shanghai → sh}/wgj/templates/wgj.art +0 -0
  530. /package/lib/routes/hypergryph/{announce.ts → arknights/announce.ts} +0 -0
  531. /package/lib/routes/hypergryph/{japan.ts → arknights/japan.ts} +0 -0
  532. /package/lib/routes/hypergryph/{news.ts → arknights/news.ts} +0 -0
@@ -1,9 +1,10 @@
1
1
  import { Route } from '@/types';
2
2
  import cache from '@/utils/cache';
3
- import got from '@/utils/got';
4
3
  import { load } from 'cheerio';
5
4
  import { parseDate } from '@/utils/parse-date';
6
5
  import timezone from '@/utils/timezone';
6
+ import logger from '@/utils/logger';
7
+ import puppeteer from '@/utils/puppeteer';
7
8
 
8
9
  const host = 'https://www.sehuatang.net/';
9
10
 
@@ -41,6 +42,9 @@ export const route: Route = {
41
42
  path: ['/bt/:subforumid?', '/picture/:subforumid', '/:subforumid?/:type?', '/:subforumid?', ''],
42
43
  name: 'Unknown',
43
44
  maintainers: ['qiwihui', 'junfengP', 'nczitzk'],
45
+ features: {
46
+ requirePuppeteer: true,
47
+ },
44
48
  handler,
45
49
  description: `**原创 BT 电影**
46
50
 
@@ -61,16 +65,24 @@ async function handler(ctx) {
61
65
  const type = ctx.req.param('type');
62
66
  const typefilter = type ? `&filter=typeid&typeid=${type}` : '';
63
67
  const link = `${host}forum.php?mod=forumdisplay&orderby=dateline&fid=${subformId}${typefilter}`;
64
- const headers = {
65
- 'Accept-Encoding': 'gzip, deflate, br',
66
- 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
67
- Cookie: '_safe=vqd37pjm4p5uodq339yzk6b7jdt6oich',
68
- };
69
68
 
70
- const response = await got(link, {
71
- headers,
69
+ const browser = await puppeteer();
70
+ const page = await browser.newPage();
71
+ await page.setRequestInterception(true);
72
+ page.on('request', (request) => {
73
+ request.resourceType() === 'document' || request.resourceType() === 'script' ? request.continue() : request.abort();
74
+ });
75
+ logger.http(`Requesting ${link}`);
76
+ await page.goto(link, {
77
+ waitUntil: 'domcontentloaded',
72
78
  });
73
- const $ = load(response.data);
79
+ await page.waitForSelector('a.enter-btn', { visible: true });
80
+
81
+ await Promise.all([page.click('a.enter-btn'), page.waitForNavigation({ waitUntil: 'domcontentloaded' })]);
82
+ const response = await page.content();
83
+ page.close();
84
+
85
+ const $ = load(response);
74
86
 
75
87
  const list = $('#threadlisttableid tbody[id^=normalthread]')
76
88
  .slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 25)
@@ -89,11 +101,19 @@ async function handler(ctx) {
89
101
  const out = await Promise.all(
90
102
  list.map((info) =>
91
103
  cache.tryGet(info.link, async () => {
92
- const response = await got(info.link, {
93
- headers,
104
+ const page = await browser.newPage();
105
+ await page.setRequestInterception(true);
106
+ page.on('request', (request) => {
107
+ request.resourceType() === 'document' || request.resourceType() === 'script' ? request.continue() : request.abort();
94
108
  });
95
109
 
96
- const $ = load(response.data);
110
+ await page.goto(info.link, {
111
+ // 指定页面等待载入的时间
112
+ waitUntil: 'domcontentloaded',
113
+ });
114
+ const response = await page.content();
115
+ await page.close();
116
+ const $ = load(response);
97
117
  const postMessage = $("td[id^='postmessage']").slice(0, 1);
98
118
  const images = $(postMessage).find('img');
99
119
  for (const image of images) {
@@ -131,12 +151,11 @@ async function handler(ctx) {
131
151
  info.enclosure_url = enclosureUrl;
132
152
  info.enclosure_type = isMag ? 'application/x-bittorrent' : 'application/octet-stream';
133
153
  }
134
-
135
154
  return info;
136
155
  })
137
156
  )
138
157
  );
139
-
158
+ await browser.close();
140
159
  return {
141
160
  title: `色花堂 - ${$('#pt > div:nth-child(1) > a:last-child').text()}`,
142
161
  link,
@@ -11,7 +11,7 @@ const baseUrl = 'https://sehuatang.org/';
11
11
 
12
12
  export const route: Route = {
13
13
  path: '/user/:uid',
14
- categories: ['multimedia', 'popular'],
14
+ categories: ['multimedia'],
15
15
  example: '/sehuatang/user/411096',
16
16
  parameters: { uid: '用户 uid, 可在用户主页 URL 中找到' },
17
17
  features: {
@@ -2,44 +2,37 @@ const config = {
2
2
  bwc: { title: '武装部保卫处', id: 'tzgg' },
3
3
  career: { title: '本科就业信息网', id: 'tzgg', listSelector: 'ul.newsList', pubDateSelector: 'li.span2.y', descriptionSelector: '.aContent' },
4
4
  cyb: { title: '资产经营公司/产业办', id: '367' },
5
- dangban: { title: '党委办公室', id: '4014' },
5
+ dangban: { title: '党委办公室', id: '4013' },
6
6
  djfwzxdcs: { title: '党建服务中心/党建督查室', id: 'tzgg', listSelector: 'li.news', pubDateSelector: 'span.news_meta' },
7
7
  dqxy: { title: '电气工程学院', id: '2462' },
8
8
  dwllc: { title: '对外联络处', id: '2649' },
9
9
  dxxy: { title: '电子与信息工程学院', id: 'tzgg', pubDateSelector: 'div.article-publishdate' },
10
10
  energy: { title: '能源与机械工程学院', id: '892' },
11
- 'energy-saving': { title: '上海热交换系统节能工程技术研究中心', id: 'tzgg' },
12
- english: { title: 'Shanghai University of Electric Power', id: 'events' },
13
11
  fao: { title: '国际交流与合作处(港澳台办公室)', id: 'tzgg' },
14
- fgw: { title: '妇工委', id: '1411' },
15
12
  fzghc: { title: '发展规划处', id: '291' },
16
13
  gec: { title: '上海新能源人才技术教育交流中心', id: '1959' },
17
- gonghui: { title: '工会', id: '1806', listSelector: 'table.wp_article_list_table tr', pubDateSelector: 'td[align="right"]' },
14
+ gonghui: { title: '工会(妇工委)', id: '1806', listSelector: 'table.wp_article_list_table tr', pubDateSelector: 'td[align="right"]' },
18
15
  'green-energy': { title: '上海绿色能源并网技术研究中心', id: '118' },
19
- hhsyzx: { title: '能源化学实验教学中心', id: '3709' },
20
16
  hhxy: { title: '环境与化学工程学院', id: '5559', listSelector: 'li.list-item', pubDateSelector: 'div.item-publishdate' },
21
17
  hqglc: { title: '后勤管理处(后勤服务中心)', id: '1616' },
18
+ hsfdyjy: { title: '海上风电研究院', id: '5748' },
22
19
  ieetc: { title: '创新创业工程训练中心', id: 'cxcy', pubDateSelector: 'div.article-publishdate' },
23
20
  jgdw: { title: '机关党委', id: '3205' },
24
21
  jgxy: { title: '经济与管理学院', id: '3633' },
25
22
  jijian: { title: '纪委(监察专员办公室)', id: '59' },
26
23
  jjc: { title: '基建处', id: '327' },
27
24
  jjxy: { title: '继续教育学院(国际教育学院)', id: '2582' },
28
- jsjxfzzx: { title: '教师教学发展中心', id: '3909' },
29
25
  jsjxy: { title: '计算机科学与技术学院', id: 'xygg', listSelector: 'div.xylist', pubDateSelector: 'span:nth-child(2)' },
30
26
  jszyzx: { title: '技术转移中心', id: '4247' },
31
27
  jwc: { title: '教务处', id: '227', listSelector: 'div.text-list li', pubDateSelector: 'span.time' },
32
- jxfz: { title: '电力装备设计与制造虚拟仿真中心', id: '3330' },
33
28
  kczx: { title: '能源电力科创中心', id: '3946' },
34
29
  kyc: { title: '科研处/融合办', id: '834' },
35
30
  lgxq: { title: '临港新校区建设综合办公室', id: '377' },
36
31
  library: { title: '图书馆', id: '4866' },
37
32
  metc: { title: '现代教育技术中心/信息办', id: 'tzgg', pubDateSelector: 'div.article-publishdate' },
38
- mpep: { title: '上海市电力材料防护与新材料重点实验室', id: '1134' },
39
33
  news: { title: '新闻网', id: 'notice' },
40
34
  nydlzk: { title: '能源电力智库', id: 'tzgg' },
41
35
  office: { title: '校长办公室(档案馆)', id: '389' },
42
- rpstec: { title: '国家新能源电力系统实验教学示范中心', id: '1366' },
43
36
  rsc: { title: '党委教师工作部/人事处', id: '1695' },
44
37
  rwysxy: { title: '人文艺术学院', id: '3089', listSelector: 'li.list-item', pubDateSelector: 'div.item-publishdate' },
45
38
  sjc: { title: '审计处', id: '199' },
@@ -57,6 +50,7 @@ const config = {
57
50
  xsc: { title: '学生处', id: '3482' },
58
51
  xunchaban: { title: '巡查办', id: '5044' },
59
52
  xxgk: { title: '信息公开网', id: 'zxgkxx' },
53
+ xxjy: { title: '“学条例 守党纪”专题网', id: '5973', listSelector: 'li.list-item', pubDateSelector: 'div.item-publishdate' },
60
54
  yjsc: { title: '研究生院/研工部', id: '1161' },
61
55
  zdhxy: { title: '自动化工程学院', id: '2002' },
62
56
  zs: { title: '本科招生网', id: 'zxxx' },
@@ -26,17 +26,17 @@ export const route: Route = {
26
26
 
27
27
  学院一览:
28
28
 
29
- | 能源与机械工程学院 | 环境与化学工程学院 | 电气工程学院 | 自动化工程学院 | 计算机科学与技术学院 | 电子与信息工程学院 | 经济与管理学院 | 数理学院 | 外国语学院 | 体育学院 | 马克思主义学院 | 人文艺术学院 | 继续教育学院(国际教育学院) |
30
- | ------------------ | ------------------ | ------------ | -------------- | -------------------- | ------------------ | -------------- | -------- | ---------- | -------- | -------------- | ------------ | ---------------------------- |
31
- | energy | hhxy | dqxy | zdhxy | jsjxy | dxxy | jgxy | slxy | wgyxy | tyb | skb | rwysxy | jjxy |
32
- | 892 | 5559 | 2462 | 2002 | xygg | tzgg | 3633 | 2063 | tzgg | 2891 | 1736 | 3089 | 2582 |
29
+ | 能源与机械工程学院 | 环境与化学工程学院 | 电气工程学院 | 自动化工程学院 | 计算机科学与技术学院 | 电子与信息工程学院 | 经济与管理学院 | 数理学院 | 外国语学院 | 体育学院 | 马克思主义学院 | 人文艺术学院 | 继续教育学院(国际教育学院) | 海上风电研究院 |
30
+ | ------------------ | ------------------ | ------------ | -------------- | -------------------- | ------------------ | -------------- | -------- | ---------- | -------- | -------------- | ------------ | ---------------------------- | -------------- |
31
+ | energy | hhxy | dqxy | zdhxy | jsjxy | dxxy | jgxy | slxy | wgyxy | tyb | skb | rwysxy | jjxy | hsfdyjy |
32
+ | 892 | 5559 | 2462 | 2002 | xygg | tzgg | 3633 | 2063 | tzgg | 2891 | 1736 | 3089 | 2582 | 5748 |
33
33
 
34
34
  党群部门:
35
35
 
36
36
  | 党委办公室 | 组织部(老干部处、党校) | 党建服务中心 / 党建督查室 | 宣传部(文明办、融媒体中心) | 统战部 | 机关党委 | 纪委(监察专员办公室) | 巡查办 | 武装部 | 学生工作部 | 团委 | 工会(妇工委) | 教师工作部 | 离退休党委 | 研究生工作部 |
37
37
  | ---------- | ------------------------ | ------------------------- | ---------------------------- | ------ | -------- | ---------------------- | --------- | ------ | ---------- | ---- | -------------- | ---------- | ---------- | ------------ |
38
38
  | dangban | zzb | djfwzxdcs | xcb | tzb | jgdw | jijian | xunchaban | bwc | xsc | tw | gonghui | rsc | tgb | yjsc |
39
- | 4014 | 1534 | tzgg | 2925 | 3858 | 3205 | 59 | 5044 | tzgg | 3482 | 2092 | 1806 | 1695 | notice | 1161 |
39
+ | 4013 | 1534 | tzgg | 2925 | 3858 | 3205 | 59 | 5044 | tzgg | 3482 | 2092 | 1806 | 1695 | notice | 1161 |
40
40
 
41
41
  行政部门:
42
42
 
@@ -47,10 +47,10 @@ export const route: Route = {
47
47
 
48
48
  其它:
49
49
 
50
- | 新闻网 | Shanghai University of Electric Power | 信息公开网 | 本科招生网 | 本科就业信息网 | 妇工委 | 文明办 | 学习路上 | 上海热交换系统节能工程技术研究中心 | 上海新能源人才技术教育交流中心 | 上海绿色能源并网技术研究中心 | 能源化学实验教学中心 | 教师教学发展中心 | 电力装备设计与制造虚拟仿真中心 | 上海市电力材料防护与新材料重点实验室 | 能源电力智库 | 国家新能源电力系统实验教学示范中心 | 智能发电实验教学中心 |
51
- | ------ | ------------------------------------- | ---------- | ---------- | -------------- | ------ | ------- | -------- | ---------------------------------- | ------------------------------ | ---------------------------- | -------------------- | ---------------- | ------------------------------ | ------------------------------------ | ------------ | ---------------------------------- | -------------------- |
52
- | news | english | xxgk | zs | career | fgw | wenming | ztjy | energy-saving | gec | green-energy | hhsyzx | jsjxfzzx | jxfz | mpep | nydlzk | rpstec | spgc |
53
- | notice | events | zxgkxx | zxxx | tzgg | 1411 | 2202 | 5575 | tzgg | 1959 | 118 | 3709 | 3909 | 3330 | 1134 | tzgg | 1366 | 4449 |
50
+ | 新闻网 | 信息公开网 | 本科招生网 | 本科就业信息网 | 文明办 | 学习路上 | “学条例 守党纪”专题网 | 上海新能源人才技术教育交流中心 | 上海绿色能源并网技术研究中心 | 能源电力智库 | 智能发电实验教学中心 |
51
+ | ------ | ---------- | ---------- | -------------- | ------- | -------- | --------------------- | ------------------------------ | ---------------------------- | ------------ | -------------------- |
52
+ | news | xxgk | zs | career | wenming | ztjy | xxjy | gec | green-energy | nydlzk | spgc |
53
+ | notice | zxgkxx | zxxx | tzgg | 2202 | 5575 | 5973 | 1959 | 118 | tzgg | 4449 |
54
54
 
55
55
  参数与来源页面对应规则为:\`https://\${type}.shiep.edu.cn/\${id}/list.htm\``,
56
56
  };
@@ -1,6 +1,7 @@
1
- import { Route } from '@/types';
1
+ import { Data, Route } from '@/types';
2
2
  import { TITLE, HOST } from './const';
3
3
  import { fetchPerformerInfo } from './service';
4
+ import type { Context } from 'hono';
4
5
 
5
6
  export const route: Route = {
6
7
  path: '/artist/:id',
@@ -20,15 +21,15 @@ export const route: Route = {
20
21
  source: ['www.showstart.com/artist/:id'],
21
22
  },
22
23
  ],
23
- name: '音乐人 - 演出更新',
24
+ name: '按音乐人 - 演出更新',
24
25
  maintainers: ['lchtao26'],
25
26
  handler,
26
27
  description: `:::tip
27
- 音乐人 ID 查询: \`/showstart/search/artist/:keyword\`,如: [https://rsshub.app/showstart/search/artist/ 周杰伦](https://rsshub.app/showstart/search/artist/周杰伦)
28
+ 音乐人 ID 查询: \`/showstart/search/artist/:keyword\`,如: [https://rsshub.app/showstart/search/artist/周杰伦](https://rsshub.app/showstart/search/artist/周杰伦)
28
29
  :::`,
29
30
  };
30
31
 
31
- async function handler(ctx) {
32
+ async function handler(ctx: Context): Promise<Data> {
32
33
  const id = ctx.req.param('id');
33
34
  const artist = await fetchPerformerInfo({
34
35
  performerId: id,
@@ -1,6 +1,7 @@
1
- import { Route } from '@/types';
1
+ import { Data, Route } from '@/types';
2
2
  import { TITLE, HOST } from './const';
3
3
  import { fetchBrandInfo } from './service';
4
+ import type { Context } from 'hono';
4
5
 
5
6
  export const route: Route = {
6
7
  path: '/brand/:id',
@@ -20,15 +21,15 @@ export const route: Route = {
20
21
  source: ['www.showstart.com/host/:id'],
21
22
  },
22
23
  ],
23
- name: '厂牌 - 演出更新',
24
+ name: '按厂牌 - 演出更新',
24
25
  maintainers: ['lchtao26'],
25
26
  handler,
26
27
  description: `:::tip
27
- 厂牌 ID 查询: \`/showstart/search/brand/:keyword\`,如: [https://rsshub.app/showstart/search/brand/ 声场](https://rsshub.app/showstart/search/brand/声场)
28
+ 厂牌 ID 查询: \`/showstart/search/brand/:keyword\`,如: [https://rsshub.app/showstart/search/brand/声场](https://rsshub.app/showstart/search/brand/声场)
28
29
  :::`,
29
30
  };
30
31
 
31
- async function handler(ctx) {
32
+ async function handler(ctx: Context): Promise<Data> {
32
33
  const id = ctx.req.param('id');
33
34
  const brand = await fetchBrandInfo({
34
35
  brandId: id,
@@ -1,6 +1,7 @@
1
- import { Route } from '@/types';
1
+ import { Data, Route } from '@/types';
2
2
  import { TITLE, HOST } from './const';
3
3
  import { fetchActivityList, fetchDictionary } from './service';
4
+ import type { Context } from 'hono';
4
5
 
5
6
  export const route: Route = {
6
7
  path: '/event/:cityCode/:showStyle?',
@@ -15,19 +16,19 @@ export const route: Route = {
15
16
  supportPodcast: false,
16
17
  supportScihub: false,
17
18
  },
18
- name: '演出更新',
19
+ name: '按城市 - 演出更新',
19
20
  maintainers: ['lchtao26'],
20
21
  handler,
21
22
  description: `:::tip
22
- - 演出城市 \`cityCode\` 查询: \`/showstart/search/city/:keyword\`, 如: [https://rsshub.app/showstart/search/city/ 杭州](https://rsshub.app/showstart/search/city/杭州)
23
+ - 演出城市 \`cityCode\` 查询: \`/showstart/search/city/:keyword\`, 如: [https://rsshub.app/showstart/search/city/杭州](https://rsshub.app/showstart/search/city/杭州)
23
24
 
24
- - 演出风格 \`showStyle\` 查询: \`/showstart/search/style/:keyword\`,如: [https://rsshub.app/showstart/search/style/ 摇滚](https://rsshub.app/showstart/search/style/摇滚)
25
+ - 演出风格 \`showStyle\` 查询: \`/showstart/search/style/:keyword\`,如: [https://rsshub.app/showstart/search/style/摇滚](https://rsshub.app/showstart/search/style/摇滚)
25
26
  :::`,
26
27
  };
27
28
 
28
- async function handler(ctx) {
29
- const cityCode = Number.parseInt(ctx.req.param('cityCode'));
30
- const showStyle = Number.parseInt(ctx.req.param('showStyle'));
29
+ async function handler(ctx: Context): Promise<Data> {
30
+ const cityCode = Number.parseInt(ctx.req.param('cityCode')).toString();
31
+ const showStyle = Number.parseInt(ctx.req.param('showStyle')).toString();
31
32
  const items = await fetchActivityList({
32
33
  cityCode,
33
34
  showStyle,
@@ -1,6 +1,7 @@
1
- import { Route } from '@/types';
1
+ import { Data, Route } from '@/types';
2
2
  import { TITLE, HOST } from './const';
3
- import { fetchActivityList, fetchPerformerList, fetchBrandList, fetchCityList, fetchStyleList } from './service';
3
+ import { fetchActivityList, fetchPerformerList, fetchSiteList, fetchBrandList, fetchCityList, fetchStyleList } from './service';
4
+ import type { Context } from 'hono';
4
5
 
5
6
  export const route: Route = {
6
7
  path: '/search/:type/:keyword?',
@@ -20,7 +21,7 @@ export const route: Route = {
20
21
  handler,
21
22
  };
22
23
 
23
- async function handler(ctx) {
24
+ async function handler(ctx: Context): Promise<Data> {
24
25
  const type = ctx.req.param('type') || '';
25
26
  const keyword = ctx.req.param('keyword') || '';
26
27
 
@@ -31,35 +32,36 @@ async function handler(ctx) {
31
32
  link: HOST,
32
33
  item: await fetchActivityList({ keyword }),
33
34
  };
34
- break;
35
35
  case 'artist':
36
36
  return {
37
37
  title: `${TITLE} - 搜艺人 - ${keyword || '全部'}`,
38
38
  link: HOST,
39
39
  item: await fetchPerformerList({ searchKeyword: keyword }),
40
40
  };
41
- break;
41
+ case 'site':
42
+ return {
43
+ title: `${TITLE} - 搜场地 - ${keyword || '全部'}`,
44
+ link: HOST,
45
+ item: await fetchSiteList({ searchKeyword: keyword }),
46
+ };
42
47
  case 'brand':
43
48
  return {
44
49
  title: `${TITLE} - 搜厂牌 - ${keyword || '全部'}`,
45
50
  link: HOST,
46
51
  item: await fetchBrandList({ searchKeyword: keyword }),
47
52
  };
48
- break;
49
53
  case 'city':
50
54
  return {
51
55
  title: `${TITLE} - 搜城市 - ${keyword || '全部'}`,
52
56
  link: HOST,
53
57
  item: await fetchCityList(keyword),
54
58
  };
55
- break;
56
59
  case 'style':
57
60
  return {
58
61
  title: `${TITLE} - 搜风格 - ${keyword || '全部'}`,
59
62
  link: HOST,
60
63
  item: await fetchStyleList(keyword),
61
64
  };
62
- break;
63
65
  default:
64
66
  return {
65
67
  title: `${TITLE} - 搜演出 - ${type || '全部'}`,
@@ -2,37 +2,39 @@ import { HOST } from './const';
2
2
  import { getAccessToken, post, sortBy, uniqBy } from './utils';
3
3
 
4
4
  async function fetchActivityList(
5
- params = {
6
- pageNo: '1',
7
- pageSize: '30',
8
- cityCode: '',
9
- activityIds: '',
10
- coupon: '',
11
- keyword: '',
12
- organizerId: '',
13
- performerId: '',
14
- showStyle: '',
15
- showTime: '',
16
- showType: '',
17
- siteId: '',
18
- sortType: '',
19
- themeId: '',
20
- timeRange: '',
21
- tourId: '',
22
- type: '',
23
- tag: '',
24
- }
5
+ params: Partial<{
6
+ pageNo: string;
7
+ pageSize: string;
8
+ cityCode: string;
9
+ activityIds: string;
10
+ coupon: string;
11
+ keyword: string;
12
+ organizerId: string;
13
+ performerId: string;
14
+ showStyle: string;
15
+ showTime: string;
16
+ showType: string;
17
+ siteId: string;
18
+ sortType: string;
19
+ themeId: string;
20
+ timeRange: string;
21
+ tourId: string;
22
+ type: string;
23
+ tag: string;
24
+ }>
25
25
  ) {
26
+ params.pageNo = params.pageNo || '1';
27
+ params.pageSize = params.pageSize || '30';
26
28
  const accessToken = await getAccessToken();
27
29
  const resp = await post('/web/activity/list', accessToken, params);
28
30
  return resp.result.result.map((item) => formatActivity(item));
29
31
  }
30
32
 
31
- const image = (src) => (src ? `<img src="${src}" />` : '');
32
- const time = (time) => (time ? `<p>演出时间:${time}</p>` : '');
33
- const address = (cityName, siteName) => (cityName || siteName ? `<p>地址:${[cityName, siteName].join(' - ')}</p>` : '');
34
- const performers = (name) => (name ? `<p>艺人:${name}</p>` : '');
35
- const price = (price) => (price ? `<p>票价:${price}</p>` : '');
33
+ const image = (src: string) => (src ? `<img src="${src}" />` : '');
34
+ const time = (time: string) => (time ? `<p>演出时间:${time}</p>` : '');
35
+ const address = (cityName: string, siteName: string) => (cityName || siteName ? `<p>地址:${[cityName, siteName].join(' - ')}</p>` : '');
36
+ const performers = (name: string) => (name ? `<p>艺人:${name}</p>` : '');
37
+ const price = (price: string) => (price ? `<p>票价:${price}</p>` : '');
36
38
 
37
39
  function formatActivity(item) {
38
40
  return {
@@ -43,13 +45,15 @@ function formatActivity(item) {
43
45
  }
44
46
 
45
47
  async function fetchPerformerList(
46
- params = {
47
- pageNo: '1',
48
- pageSize: '30',
49
- searchKeyword: '',
50
- styleId: '',
51
- }
48
+ params: Partial<{
49
+ pageNo: string;
50
+ pageSize: string;
51
+ searchKeyword: string;
52
+ styleId: string;
53
+ }>
52
54
  ) {
55
+ params.pageNo = params.pageNo || '1';
56
+ params.pageSize = params.pageSize || '30';
53
57
  const accessToken = await getAccessToken();
54
58
  const resp = await post('/web/performer/list', accessToken, params);
55
59
  return resp.result.result.map((item) => ({
@@ -59,15 +63,11 @@ async function fetchPerformerList(
59
63
  }));
60
64
  }
61
65
 
62
- async function fetchPerformerInfo(
63
- params = {
64
- performerId: '',
65
- }
66
- ) {
66
+ async function fetchPerformerInfo(params: { performerId: string }) {
67
67
  const accessToken = await getAccessToken();
68
68
  const resp = await post('/web/performer/info', accessToken, params);
69
69
  return {
70
- id: params.id,
70
+ id: params.performerId,
71
71
  name: resp.result.name,
72
72
  content: resp.result.content,
73
73
  avatar: resp.result.avatar,
@@ -77,15 +77,11 @@ async function fetchPerformerInfo(
77
77
  };
78
78
  }
79
79
 
80
- async function fetchBrandInfo(
81
- params = {
82
- brandId: '',
83
- }
84
- ) {
80
+ async function fetchBrandInfo(params: { brandId: string }) {
85
81
  const accessToken = await getAccessToken();
86
82
  const resp = await post('/web/brand/info', accessToken, params);
87
83
  return {
88
- id: params.id,
84
+ id: params.brandId,
89
85
  name: resp.result.name,
90
86
  content: resp.result.content,
91
87
  avatar: resp.result.avatar,
@@ -94,13 +90,45 @@ async function fetchBrandInfo(
94
90
  };
95
91
  }
96
92
 
93
+ async function fetchSiteList(
94
+ params: Partial<{
95
+ pageNo: string;
96
+ pageSize: string;
97
+ searchKeyword: string;
98
+ }>
99
+ ) {
100
+ params.pageNo = params.pageNo || '1';
101
+ params.pageSize = params.pageSize || '30';
102
+ const accessToken = await getAccessToken();
103
+ const resp = await post('/web/site/list', accessToken, params);
104
+ return resp.result.result.map((item) => ({
105
+ title: `${item.cityName} - ${item.name}`,
106
+ link: `${HOST}/venue/${item.id}`,
107
+ description: `id: ${item.id}`,
108
+ }));
109
+ }
110
+
111
+ async function fetchSiteInfo(params: { siteId: string }) {
112
+ const accessToken = await getAccessToken();
113
+ const resp = await post('/web/site/info', accessToken, params);
114
+ return {
115
+ id: params.siteId,
116
+ name: `${resp.result.cityName} - ${resp.result.name}`,
117
+ address: resp.result.address,
118
+ avatar: resp.result.avatar,
119
+ poster: resp.result.poster,
120
+ };
121
+ }
122
+
97
123
  async function fetchBrandList(
98
- params = {
99
- pageNo: '1',
100
- pageSize: '30',
101
- searchKeyword: '',
102
- }
124
+ params: Partial<{
125
+ pageNo: string;
126
+ pageSize: string;
127
+ searchKeyword: string;
128
+ }>
103
129
  ) {
130
+ params.pageNo = params.pageNo || '1';
131
+ params.pageSize = params.pageSize || '30';
104
132
  const accessToken = await getAccessToken();
105
133
  const resp = await post('/web/brand/list', accessToken, params);
106
134
  return resp.result.result.map((item) => ({
@@ -131,7 +159,7 @@ async function fetchCityList(keyword = '') {
131
159
  // so we need to fetch all city items and then extract styles from them
132
160
  async function fetchStyleList(keyword = '') {
133
161
  const resp = await fetchParams();
134
- let styles = resp.result.flatMap((item) => item.styles);
162
+ let styles = resp.result.flatMap((item) => item.styles) as Array<{ key: string; showName: string }>;
135
163
  styles = uniqBy(styles, 'key');
136
164
  styles = sortBy(styles, 'key');
137
165
  return styles
@@ -143,16 +171,16 @@ async function fetchStyleList(keyword = '') {
143
171
  }));
144
172
  }
145
173
 
146
- async function fetchDictionary(cityCode, showStyle) {
174
+ async function fetchDictionary(cityCode: string, showStyle: string) {
147
175
  const resp = await fetchParams();
148
- const target = resp.result.find((item) => item.cityCode === cityCode);
176
+ const target = resp.result.find((item) => String(item.cityCode) === cityCode);
149
177
  if (!target) {
150
178
  return {};
151
179
  }
152
180
  return {
153
181
  cityName: target.cityName,
154
- showName: target.styles.find((item) => item.key === showStyle)?.showName,
182
+ showName: target.styles.find((item) => String(item.key) === showStyle)?.showName,
155
183
  };
156
184
  }
157
185
 
158
- export { fetchActivityList, fetchCityList, fetchStyleList, fetchPerformerList, fetchPerformerInfo, fetchBrandList, fetchBrandInfo, fetchDictionary };
186
+ export { fetchActivityList, fetchCityList, fetchStyleList, fetchPerformerList, fetchPerformerInfo, fetchSiteList, fetchSiteInfo, fetchBrandList, fetchBrandInfo, fetchDictionary };
@@ -0,0 +1,41 @@
1
+ import { Data, Route } from '@/types';
2
+ import { TITLE, HOST } from './const';
3
+ import { fetchActivityList, fetchSiteInfo } from './service';
4
+ import { Context } from 'hono';
5
+
6
+ export const route: Route = {
7
+ path: '/site/:siteId',
8
+ categories: ['shopping'],
9
+ example: '/showstart/site/3583',
10
+ parameters: { siteId: '演出场地 (编号)' },
11
+ features: {
12
+ requireConfig: false,
13
+ requirePuppeteer: false,
14
+ antiCrawler: false,
15
+ supportBT: false,
16
+ supportPodcast: false,
17
+ supportScihub: false,
18
+ },
19
+ radar: [
20
+ {
21
+ source: ['www.showstart.com/venue/:id'],
22
+ },
23
+ ],
24
+ name: '按场地 - 演出更新',
25
+ maintainers: ['lchtao26'],
26
+ handler,
27
+ description: `:::tip
28
+ - 演出场地 ID 查询: \`/showstart/search/site/:keyword\`, 如: [https://rsshub.app/showstart/search/site/酒球会](https://rsshub.app/showstart/search/site/酒球会)
29
+ :::`,
30
+ };
31
+
32
+ async function handler(ctx: Context): Promise<Data> {
33
+ const siteId = Number.parseInt(ctx.req.param('siteId')).toString();
34
+ const [activityList, siteInfo] = await Promise.all([fetchActivityList({ siteId }), fetchSiteInfo({ siteId })]);
35
+ return {
36
+ title: `${TITLE} - ${siteInfo.name}`,
37
+ description: siteInfo.address,
38
+ link: HOST,
39
+ item: activityList,
40
+ };
41
+ }
@@ -1,9 +1,9 @@
1
- import got from '@/utils/got';
2
1
  import md5 from '@/utils/md5';
2
+ import ofetch from '@/utils/ofetch';
3
3
 
4
4
  const uuid = (length = 20) => {
5
5
  const e = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + Date.now();
6
- const r = [];
6
+ const r: string[] = [];
7
7
  for (let i = 0; i < length; i++) {
8
8
  r.push(e.charAt(Math.floor(Math.random() * e.length)));
9
9
  }
@@ -35,10 +35,11 @@ const getAccessToken = async () => {
35
35
  return cookieMap.get('accessToken');
36
36
  };
37
37
 
38
- const post = async (requestPath, accessToken = md5(Date.now().toString()), payload) => {
38
+ const post = async (requestPath: string, accessToken = md5(Date.now().toString()), payload?: any) => {
39
39
  const traceId = uuid(32) + Date.now();
40
40
 
41
- const { data: response } = await got.post(`https://www.showstart.com/api${requestPath}`, {
41
+ const response = await ofetch(`https://www.showstart.com/api${requestPath}`, {
42
+ method: 'POST',
42
43
  headers: {
43
44
  cdeviceinfo: encodeURIComponent(JSON.stringify(devioceInfo)),
44
45
  cdeviceno: cookieMap.get('token'),
@@ -53,14 +54,14 @@ const post = async (requestPath, accessToken = md5(Date.now().toString()), paylo
53
54
  cusname: '',
54
55
  cusut: '',
55
56
  cversion: '999',
56
- },
57
- json: payload,
57
+ } as HeadersInit,
58
+ body: payload,
58
59
  });
59
60
 
60
61
  return response;
61
62
  };
62
63
 
63
- function sortBy(items, key) {
64
+ function sortBy(items: any[], key: string) {
64
65
  return items.sort((a, b) => {
65
66
  if (a[key] < b[key]) {
66
67
  return -1;
@@ -72,7 +73,7 @@ function sortBy(items, key) {
72
73
  });
73
74
  }
74
75
 
75
- function uniqBy(items, key) {
76
+ function uniqBy(items: any[], key: string) {
76
77
  const set = new Set();
77
78
  return items.filter((item) => {
78
79
  if (set.has(item[key])) {