rsshub 1.0.0-master.fb6d4f3 → 1.0.0-master.fb7e42c

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 (460) hide show
  1. package/lib/assets/logo.svg +1 -0
  2. package/lib/config.ts +10 -0
  3. package/lib/errors/index.test.ts +15 -5
  4. package/lib/errors/types/captcha.ts +5 -0
  5. package/lib/middleware/cache.ts +4 -0
  6. package/lib/middleware/parameter.ts +1 -1
  7. package/lib/registry.ts +6 -2
  8. package/lib/routes/10000link/info.ts +1 -1
  9. package/lib/routes/18comic/album.ts +1 -0
  10. package/lib/routes/18comic/blogs.ts +1 -0
  11. package/lib/routes/18comic/search.ts +1 -0
  12. package/lib/routes/199it/index.ts +1 -1
  13. package/lib/routes/21caijing/channel.ts +1 -1
  14. package/lib/routes/51cto/utils.ts +1 -1
  15. package/lib/routes/6v123/index.ts +487 -0
  16. package/lib/routes/6v123/namespace.ts +1 -0
  17. package/lib/routes/8kcos/cat.ts +3 -0
  18. package/lib/routes/8kcos/latest.ts +1 -0
  19. package/lib/routes/8kcos/tag.ts +1 -0
  20. package/lib/routes/91porn/author.ts +1 -0
  21. package/lib/routes/95mm/category.ts +1 -0
  22. package/lib/routes/95mm/tag.ts +1 -0
  23. package/lib/routes/aa1/60s.ts +189 -0
  24. package/lib/routes/{xinhuanet → aa1}/namespace.ts +3 -3
  25. package/lib/routes/abc/index.ts +1 -1
  26. package/lib/routes/abskoop/index.ts +3 -0
  27. package/lib/routes/abskoop/nsfw.ts +3 -0
  28. package/lib/routes/acgvinyl/namespace.ts +6 -0
  29. package/lib/routes/acgvinyl/news.ts +86 -0
  30. package/lib/routes/ally/rail.ts +1 -1
  31. package/lib/routes/amazfitwatchfaces/index.ts +1 -2
  32. package/lib/routes/anthropic/news.ts +13 -11
  33. package/lib/routes/apnews/mobile-api.ts +1 -1
  34. package/lib/routes/apnews/sitemap.ts +1 -1
  35. package/lib/routes/app-sales/index.ts +1 -1
  36. package/lib/routes/apple/apps.ts +2 -2
  37. package/lib/routes/apple/podcast.ts +58 -25
  38. package/lib/routes/apple/security-releases.ts +2 -2
  39. package/lib/routes/asiafruitchina/categories.ts +1 -1
  40. package/lib/routes/asiantolick/index.ts +3 -0
  41. package/lib/routes/asmr-200/index.ts +1 -0
  42. package/lib/routes/bandisoft/history.ts +2 -2
  43. package/lib/routes/bangumi.tv/group/reply.ts +1 -1
  44. package/lib/routes/banshujiang/index.ts +1 -1
  45. package/lib/routes/banyuetan/index.ts +1 -1
  46. package/lib/routes/baozimh/index.ts +21 -3
  47. package/lib/routes/baselang/index.ts +117 -0
  48. package/lib/routes/baselang/namespace.ts +6 -0
  49. package/lib/routes/bbc/learningenglish.ts +35 -20
  50. package/lib/routes/bestofjs/monthly.ts +137 -0
  51. package/lib/routes/bestofjs/namespace.ts +7 -0
  52. package/lib/routes/bestofjs/templates/description.art +36 -0
  53. package/lib/routes/bilibili/cache.ts +17 -1
  54. package/lib/routes/bilibili/dynamic.ts +34 -8
  55. package/lib/routes/bilibili/page.ts +1 -1
  56. package/lib/routes/bilibili/ranking.ts +25 -17
  57. package/lib/routes/bilibili/wasm-exec.ts +1 -1
  58. package/lib/routes/bilibili/weekly-recommend.ts +22 -6
  59. package/lib/routes/bjp/apod.ts +1 -1
  60. package/lib/routes/bnext/index.ts +58 -0
  61. package/lib/routes/bnext/namespace.ts +7 -0
  62. package/lib/routes/bookwalker/namespace.ts +9 -0
  63. package/lib/routes/bookwalker/search.ts +114 -0
  64. package/lib/routes/bookwalker/templates/description.art +13 -0
  65. package/lib/routes/booru/mmda.ts +1 -0
  66. package/lib/routes/buaa/jiaowu.ts +1 -1
  67. package/lib/routes/bullionvault/gold-news.ts +4 -4
  68. package/lib/routes/cast/index.ts +1 -1
  69. package/lib/routes/cbndata/information.ts +250 -0
  70. package/lib/routes/cbndata/namespace.ts +9 -0
  71. package/lib/routes/cbndata/templates/description.art +17 -0
  72. package/lib/routes/cccmc/index.ts +1 -1
  73. package/lib/routes/ccg/index.ts +181 -0
  74. package/lib/routes/ccg/namespace.ts +9 -0
  75. package/lib/routes/ccg/templates/description.art +21 -0
  76. package/lib/routes/chikubi/category.ts +1 -0
  77. package/lib/routes/chikubi/navigation.ts +1 -0
  78. package/lib/routes/chikubi/nipple-video-category.ts +1 -0
  79. package/lib/routes/chikubi/nipple-video-maker.ts +1 -0
  80. package/lib/routes/chikubi/search.ts +1 -0
  81. package/lib/routes/chinadaily/language.ts +1 -1
  82. package/lib/routes/chinaratings/credit-research.ts +1 -1
  83. package/lib/routes/chub/characters.ts +3 -0
  84. package/lib/routes/civitai/discussions.ts +1 -0
  85. package/lib/routes/civitai/models.ts +1 -0
  86. package/lib/routes/civitai/user.ts +3 -0
  87. package/lib/routes/cline/blog.ts +34 -23
  88. package/lib/routes/coolapk/utils.ts +5 -4
  89. package/lib/routes/coolbuy/index.ts +106 -0
  90. package/lib/routes/coolbuy/namespace.ts +9 -0
  91. package/lib/routes/coolbuy/templates/description.art +48 -0
  92. package/lib/routes/coolidge/film-guide.ts +60 -0
  93. package/lib/routes/coolidge/namespace.ts +7 -0
  94. package/lib/routes/coolidge/news.ts +65 -0
  95. package/lib/routes/coolidge/templates/description.art +4 -0
  96. package/lib/routes/coomer/index.ts +4 -6
  97. package/lib/routes/copymanga/comic.ts +2 -1
  98. package/lib/routes/cosplaytele/category.ts +1 -0
  99. package/lib/routes/cosplaytele/latest.ts +1 -0
  100. package/lib/routes/cosplaytele/popular.ts +1 -0
  101. package/lib/routes/cosplaytele/tag.ts +1 -0
  102. package/lib/routes/cpta/handler.ts +1 -1
  103. package/lib/routes/creative-comic/book.ts +1 -1
  104. package/lib/routes/crush/index.ts +77 -0
  105. package/lib/routes/crush/namespace.ts +7 -0
  106. package/lib/routes/cursor/blog.ts +84 -0
  107. package/lib/routes/daum/potplayer.ts +3 -3
  108. package/lib/routes/dbaplus/new.ts +392 -0
  109. package/lib/routes/dbaplus/templates/description.art +21 -0
  110. package/lib/routes/deepl/blog.ts +2 -3
  111. package/lib/routes/diariofruticola/filtro.ts +1 -1
  112. package/lib/routes/digitalpolicyalert/activity-tracker.ts +1 -1
  113. package/lib/routes/dlsite/campaign.ts +1 -0
  114. package/lib/routes/dlsite/ci-en/article.ts +1 -0
  115. package/lib/routes/dlsite/new.ts +1 -0
  116. package/lib/routes/dlsite/z-index/index.ts +3 -0
  117. package/lib/routes/dockerhub/utils.ts +1 -1
  118. package/lib/routes/dora-world/article.ts +2 -2
  119. package/lib/routes/dytt/index.ts +1 -2
  120. package/lib/routes/eeo/kuaixun.ts +154 -0
  121. package/lib/routes/eeo/namespace.ts +9 -0
  122. package/lib/routes/eeo/templates/description.art +7 -0
  123. package/lib/routes/ehentai/ehapi.ts +3 -3
  124. package/lib/routes/ehentai/favorites.ts +1 -0
  125. package/lib/routes/ehentai/search.ts +1 -0
  126. package/lib/routes/elecfans/article.ts +64 -0
  127. package/lib/routes/elecfans/namespace.ts +7 -0
  128. package/lib/routes/elecfans/soft.ts +69 -0
  129. package/lib/routes/engineering/namespace.ts +8 -0
  130. package/lib/routes/engineering/tag.ts +55 -0
  131. package/lib/routes/eventbrite/events.ts +152 -0
  132. package/lib/routes/eventbrite/namespace.ts +7 -0
  133. package/lib/routes/eventernote/actors.ts +61 -64
  134. package/lib/routes/everia/category.ts +1 -0
  135. package/lib/routes/everia/latest.ts +1 -0
  136. package/lib/routes/everia/search.ts +1 -0
  137. package/lib/routes/everia/tag.ts +1 -0
  138. package/lib/routes/expats/czech-news.ts +1 -1
  139. package/lib/routes/fangchan/list.ts +1 -1
  140. package/lib/routes/fansly/post.ts +1 -0
  141. package/lib/routes/fantia/search.ts +1 -0
  142. package/lib/routes/fantia/user.ts +1 -0
  143. package/lib/routes/finology/tag.ts +1 -1
  144. package/lib/routes/furaffinity/art.ts +1 -0
  145. package/lib/routes/furaffinity/browse.ts +1 -0
  146. package/lib/routes/furaffinity/commissions.ts +1 -0
  147. package/lib/routes/furaffinity/home.ts +1 -0
  148. package/lib/routes/furaffinity/journal-comments.ts +1 -0
  149. package/lib/routes/furaffinity/journals.ts +1 -0
  150. package/lib/routes/furaffinity/search.ts +1 -0
  151. package/lib/routes/furaffinity/shouts.ts +1 -0
  152. package/lib/routes/furaffinity/status.ts +1 -0
  153. package/lib/routes/furaffinity/submission-comments.ts +1 -0
  154. package/lib/routes/furaffinity/user.ts +1 -0
  155. package/lib/routes/furaffinity/watchers.ts +1 -0
  156. package/lib/routes/furaffinity/watching.ts +1 -0
  157. package/lib/routes/gamebase/news.ts +2 -2
  158. package/lib/routes/gamer/gnn-index.ts +8 -3
  159. package/lib/routes/gcores/categories.ts +1 -1
  160. package/lib/routes/gcores/collections.ts +1 -1
  161. package/lib/routes/gcores/tags.ts +1 -1
  162. package/lib/routes/gcores/topics.ts +1 -1
  163. package/lib/routes/gdufs/xwxy/index.ts +196 -0
  164. package/lib/routes/gelbooru/post.ts +1 -0
  165. package/lib/routes/genossenschaften/index.ts +2 -3
  166. package/lib/routes/github/activity.ts +1 -1
  167. package/lib/routes/gitstar-ranking/index.ts +1 -1
  168. package/lib/routes/go/jihs/idwr.ts +3 -4
  169. package/lib/routes/google/jules.ts +63 -0
  170. package/lib/routes/gov/mem/namespace.ts +7 -0
  171. package/lib/routes/gov/mem/zfxxgkpt.ts +96 -0
  172. package/lib/routes/gov/moa/gjs.ts +1 -1
  173. package/lib/routes/gov/mot/index.ts +157 -53
  174. package/lib/routes/grainoil/category.ts +1 -2
  175. package/lib/routes/gxmzu/lib.ts +2 -2
  176. package/lib/routes/gxmzu/utils/index.ts +2 -2
  177. package/lib/routes/hameln/chapter.ts +1 -1
  178. package/lib/routes/hanime1/previews.ts +1 -0
  179. package/lib/routes/hanime1/search.ts +1 -0
  180. package/lib/routes/hex-rays/index.ts +1 -1
  181. package/lib/routes/hit/hitgs.ts +1 -1
  182. package/lib/routes/hit/namespace.ts +1 -1
  183. package/lib/routes/hpoi/banner-item.ts +28 -11
  184. package/lib/routes/hpoi/info.ts +1 -1
  185. package/lib/routes/hudsonrivertrading/index.ts +122 -0
  186. package/lib/routes/hudsonrivertrading/namespace.ts +7 -0
  187. package/lib/routes/huggingface/daily-papers.ts +45 -9
  188. package/lib/routes/huijin-inv/namespace.ts +7 -0
  189. package/lib/routes/huijin-inv/news.ts +83 -0
  190. package/lib/routes/hupu/index.ts +170 -74
  191. package/lib/routes/hupu/types.ts +163 -0
  192. package/lib/routes/hust/gs.ts +1 -1
  193. package/lib/routes/hust/mse.ts +1 -1
  194. package/lib/routes/huxiu/util.ts +2 -2
  195. package/lib/routes/immich/cursed-knowledge.ts +49 -0
  196. package/lib/routes/immich/namespace.ts +7 -0
  197. package/lib/routes/infoq/presentations.ts +1 -1
  198. package/lib/routes/instagram/common-utils.ts +3 -3
  199. package/lib/routes/investor/index.ts +362 -148
  200. package/lib/routes/itch/devlog.ts +7 -3
  201. package/lib/routes/iwara/index.ts +3 -0
  202. package/lib/routes/iwara/subscriptions.ts +1 -0
  203. package/lib/routes/javbus/index.ts +1 -1
  204. package/lib/routes/javdb/actors.ts +1 -0
  205. package/lib/routes/javdb/index.ts +3 -0
  206. package/lib/routes/javdb/lists.ts +3 -0
  207. package/lib/routes/javdb/makers.ts +1 -0
  208. package/lib/routes/javdb/rankings.ts +1 -0
  209. package/lib/routes/javdb/search.ts +1 -0
  210. package/lib/routes/javdb/series.ts +1 -0
  211. package/lib/routes/javdb/videocodes.ts +1 -0
  212. package/lib/routes/javlibrary/bestrated.ts +3 -0
  213. package/lib/routes/javlibrary/bestreviews.ts +1 -0
  214. package/lib/routes/javlibrary/genre.ts +3 -0
  215. package/lib/routes/javlibrary/maker.ts +1 -0
  216. package/lib/routes/javlibrary/mostwanted.ts +3 -0
  217. package/lib/routes/javlibrary/newentries.ts +3 -0
  218. package/lib/routes/javlibrary/newrelease.ts +3 -0
  219. package/lib/routes/javlibrary/update.ts +3 -0
  220. package/lib/routes/javlibrary/user.ts +3 -0
  221. package/lib/routes/javlibrary/utils.ts +1 -1
  222. package/lib/routes/javtrailers/categories.ts +3 -0
  223. package/lib/routes/javtrailers/studios.ts +3 -0
  224. package/lib/routes/jbma/namespace.ts +17 -0
  225. package/lib/routes/jbma/report.ts +471 -0
  226. package/lib/routes/jetbrains/comments.ts +1 -1
  227. package/lib/routes/jingzhengu/utils.ts +1 -1
  228. package/lib/routes/jou/utils/index.ts +2 -2
  229. package/lib/routes/jpxgmn/search.ts +3 -0
  230. package/lib/routes/jpxgmn/weekly.ts +3 -0
  231. package/lib/routes/juejin/aicoding.ts +102 -0
  232. package/lib/routes/juejin/trending.ts +70 -20
  233. package/lib/routes/juejin/utils.ts +36 -51
  234. package/lib/routes/jumeili/home.ts +1 -1
  235. package/lib/routes/kakuyomu/works.ts +1 -1
  236. package/lib/routes/kemono/index.ts +11 -3
  237. package/lib/routes/kemono/templates/discord.art +1 -1
  238. package/lib/routes/kisskiss/blog.ts +1 -0
  239. package/lib/routes/komiic/comic.ts +2 -1
  240. package/lib/routes/koyso/index.ts +339 -0
  241. package/lib/routes/koyso/namespace.ts +9 -0
  242. package/lib/routes/koyso/templates/description.art +13 -0
  243. package/lib/routes/kpopping/kpics.ts +3 -4
  244. package/lib/routes/kpopping/news.ts +2 -2
  245. package/lib/routes/laimanhua/index.ts +1 -0
  246. package/lib/routes/letterboxd/index.ts +65 -0
  247. package/lib/routes/letterboxd/namespace.ts +8 -0
  248. package/lib/routes/lhratings/research.ts +1 -1
  249. package/lib/routes/literotica/category.ts +3 -0
  250. package/lib/routes/lovelive-anime/topics.ts +5 -6
  251. package/lib/routes/maccms/index.ts +1 -1
  252. package/lib/routes/mangadex/index.ts +3 -0
  253. package/lib/routes/mangadex/mdlist/feed.ts +1 -0
  254. package/lib/routes/mangadex/user/feed.ts +1 -0
  255. package/lib/routes/mangadex/user/follows.ts +1 -0
  256. package/lib/routes/manhuagui/comic.ts +1 -0
  257. package/lib/routes/manhuagui/subscribe.ts +1 -0
  258. package/lib/routes/manyvids/video.ts +3 -0
  259. package/lib/routes/mercari/util.ts +1 -1
  260. package/lib/routes/mihoyo/sr/news.ts +2 -1
  261. package/lib/routes/mihoyo/zzz/news.ts +2 -1
  262. package/lib/routes/mingpao/index.ts +1 -1
  263. package/lib/routes/musify/index.ts +2 -3
  264. package/lib/routes/mycard520/news.ts +2 -2
  265. package/lib/routes/nankai/ai-notice.ts +142 -0
  266. package/lib/routes/nankai/graduate-notice.ts +162 -0
  267. package/lib/routes/natgeo/natgeo.ts +3 -2
  268. package/lib/routes/naturalism/namespace.ts +7 -0
  269. package/lib/routes/naturalism/new.ts +59 -0
  270. package/lib/routes/netflav/index.ts +3 -0
  271. package/lib/routes/nhentai/search.ts +1 -0
  272. package/lib/routes/nhk/news-web-easy.ts +1 -1
  273. package/lib/routes/nicovideo/mylist.ts +39 -0
  274. package/lib/routes/nicovideo/types.ts +27 -0
  275. package/lib/routes/nicovideo/utils.ts +27 -1
  276. package/lib/routes/nikkei/cn/index.ts +1 -4
  277. package/lib/routes/nio/nioradio.ts +1 -1
  278. package/lib/routes/njxzc/utils/index.ts +2 -2
  279. package/lib/routes/notion/namespace.ts +2 -2
  280. package/lib/routes/now/news.ts +1 -1
  281. package/lib/routes/nytimes/index.ts +1 -1
  282. package/lib/routes/olevod/vod.ts +3 -0
  283. package/lib/routes/olevod/vodlist.ts +3 -0
  284. package/lib/routes/oreno3d/main.ts +1 -0
  285. package/lib/routes/oschina/column.ts +1 -2
  286. package/lib/routes/oschina/event.ts +1 -1
  287. package/lib/routes/osu/beatmaps/latest-ranked.ts +2 -3
  288. package/lib/routes/papers/category.ts +3 -4
  289. package/lib/routes/patreon/feed.ts +1 -0
  290. package/lib/routes/picuki/profile.ts +13 -5
  291. package/lib/routes/pixiv/bookmarks.ts +1 -0
  292. package/lib/routes/pixiv/illustfollow.ts +1 -0
  293. package/lib/routes/pixiv/novel-api/user-novels/sfw.ts +1 -1
  294. package/lib/routes/pixiv/novel-series.ts +17 -3
  295. package/lib/routes/pixiv/novels.ts +1 -0
  296. package/lib/routes/pixiv/ranking.ts +1 -0
  297. package/lib/routes/pixiv/search.ts +1 -0
  298. package/lib/routes/pixiv/user.ts +1 -0
  299. package/lib/routes/pixivision/utils.ts +1 -1
  300. package/lib/routes/pku/hr.ts +1 -1
  301. package/lib/routes/pku/scc/recruit.ts +1 -1
  302. package/lib/routes/pornhub/category-url.ts +1 -0
  303. package/lib/routes/pornhub/category.ts +1 -0
  304. package/lib/routes/pornhub/pornstar.ts +1 -0
  305. package/lib/routes/pornhub/search.ts +1 -0
  306. package/lib/routes/pornhub/users.ts +1 -0
  307. package/lib/routes/producthunt/templates/description.art +2 -2
  308. package/lib/routes/producthunt/today.ts +17 -8
  309. package/lib/routes/ps/trophy.ts +1 -1
  310. package/lib/routes/pubscholar/utils.ts +14 -1
  311. package/lib/routes/qq/lol/news.ts +1 -1
  312. package/lib/routes/qweather/3days.ts +14 -14
  313. package/lib/routes/qweather/now.ts +12 -10
  314. package/lib/routes/qweather/util.tsx +89 -0
  315. package/lib/routes/qwenlm/blog.ts +75 -0
  316. package/lib/routes/qwenlm/namespace.ts +6 -0
  317. package/lib/routes/radio-canada/latest.ts +30 -17
  318. package/lib/routes/rawkuma/manga.ts +1 -0
  319. package/lib/routes/ruc/ai.ts +1 -1
  320. package/lib/routes/ruc/hr.ts +1 -1
  321. package/lib/routes/samrdprc/index.ts +241 -0
  322. package/lib/routes/samrdprc/namespace.ts +1 -1
  323. package/lib/routes/scientificamerican/podcast.ts +2 -2
  324. package/lib/routes/scitechvista/index.ts +99 -0
  325. package/lib/routes/scitechvista/namespace.ts +7 -0
  326. package/lib/routes/scitechvista/templates/description.art +6 -0
  327. package/lib/routes/scoop/apps.ts +2 -4
  328. package/lib/routes/sdo/ff14risingstones/api.ts +78 -0
  329. package/lib/routes/sdo/ff14risingstones/constant.ts +338 -0
  330. package/lib/routes/sdo/ff14risingstones/posts.ts +80 -0
  331. package/lib/routes/sdo/ff14risingstones/strats.ts +75 -0
  332. package/lib/routes/sdo/ff14risingstones/templates/duties-party.art +41 -0
  333. package/lib/routes/sdo/ff14risingstones/templates/fc-party.art +26 -0
  334. package/lib/routes/sdo/ff14risingstones/templates/novice-network-party.art +9 -0
  335. package/lib/routes/sdo/ff14risingstones/templates/rp-party.art +15 -0
  336. package/lib/routes/sdo/ff14risingstones/timeline.ts +31 -0
  337. package/lib/routes/sdo/ff14risingstones/types/dynamic.ts +50 -0
  338. package/lib/routes/sdo/ff14risingstones/types/index.ts +3 -0
  339. package/lib/routes/sdo/ff14risingstones/types/other.ts +57 -0
  340. package/lib/routes/sdo/ff14risingstones/types/party.ts +111 -0
  341. package/lib/routes/sdo/ff14risingstones/user-dynamics.ts +32 -0
  342. package/lib/routes/sdo/ff14risingstones/user-posts.ts +32 -0
  343. package/lib/routes/sdo/ff14risingstones/user-resently.ts +38 -0
  344. package/lib/routes/sdo/ff14risingstones/user-strats.ts +32 -0
  345. package/lib/routes/sdo/ff14risingstones/utils.ts +215 -0
  346. package/lib/routes/sdo/namespace.ts +7 -0
  347. package/lib/routes/secretsanfrancisco/namespace.ts +7 -0
  348. package/lib/routes/secretsanfrancisco/rss.ts +101 -0
  349. package/lib/routes/secretsanfrancisco/templates/description.art +9 -0
  350. package/lib/routes/sehuatang/user.ts +1 -0
  351. package/lib/routes/showstart/utils.ts +1 -1
  352. package/lib/routes/shu/global.ts +6 -5
  353. package/lib/routes/shu/xxgk.ts +107 -0
  354. package/lib/routes/shuiguopai/index.ts +3 -0
  355. package/lib/routes/sis001/author.ts +1 -0
  356. package/lib/routes/sjtu/jwc.ts +1 -1
  357. package/lib/routes/skeb/following-creators.ts +1 -0
  358. package/lib/routes/skeb/following-works.ts +1 -0
  359. package/lib/routes/skeb/friend-works.ts +1 -0
  360. package/lib/routes/skeb/index.ts +1 -0
  361. package/lib/routes/skeb/search.ts +1 -0
  362. package/lib/routes/skeb/works.ts +44 -25
  363. package/lib/routes/skebetter/illust.ts +1 -0
  364. package/lib/routes/skebetter/index.ts +1 -0
  365. package/lib/routes/skebetter/manga.ts +1 -0
  366. package/lib/routes/sohu/mp.ts +1 -1
  367. package/lib/routes/sotwe/user.ts +1 -1
  368. package/lib/routes/sspai/index.ts +5 -1
  369. package/lib/routes/stcn/index.ts +1 -2
  370. package/lib/routes/stcn/rank.ts +1 -2
  371. package/lib/routes/surfshark/blog.ts +273 -77
  372. package/lib/routes/surfshark/templates/description.art +16 -4
  373. package/lib/routes/sustainabilitymag/articles.ts +1 -1
  374. package/lib/routes/syosetu/dev.ts +1 -1
  375. package/lib/routes/syosetu/ranking-isekai.ts +1 -1
  376. package/lib/routes/szse/disclosure/listed-notice.ts +44 -6
  377. package/lib/routes/t66y/post.ts +1 -0
  378. package/lib/routes/techcrunch/news.ts +1 -0
  379. package/lib/routes/techpowerup/index.ts +11 -11
  380. package/lib/routes/techpowerup/namespace.ts +1 -1
  381. package/lib/routes/techpowerup/review.ts +12 -12
  382. package/lib/routes/techpowerup/utils.ts +2 -2
  383. package/lib/routes/telegram/channel-media.ts +249 -0
  384. package/lib/routes/telegram/channel.ts +5 -4
  385. package/lib/routes/telegram/stories.ts +130 -0
  386. package/lib/routes/telegram/tglib/channel.ts +146 -117
  387. package/lib/routes/telegram/tglib/client.ts +37 -139
  388. package/lib/routes/tesla/cx.ts +1 -1
  389. package/lib/routes/test/index.ts +4 -0
  390. package/lib/routes/thegadgetflow/namespace.ts +7 -0
  391. package/lib/routes/thegadgetflow/rss.ts +99 -0
  392. package/lib/routes/thegadgetflow/templates/description.art +9 -0
  393. package/lib/routes/theverge/index.ts +20 -6
  394. package/lib/routes/threads/utils.ts +7 -3
  395. package/lib/routes/tidb/blog.ts +2 -2
  396. package/lib/routes/tmtpost/column.ts +1 -1
  397. package/lib/routes/toutiao/user.ts +2 -2
  398. package/lib/routes/trendforce/namespace.ts +9 -0
  399. package/lib/routes/trendforce/new.ts +113 -0
  400. package/lib/routes/tsinghua/news.ts +87 -0
  401. package/lib/routes/twitter/api/mobile-api/api.ts +1 -1
  402. package/lib/routes/twitter/api/web-api/api.ts +5 -1
  403. package/lib/routes/txrjy/fornumtopic.ts +2 -2
  404. package/lib/routes/typst/universe.ts +1 -1
  405. package/lib/routes/uber/blog.ts +87 -46
  406. package/lib/routes/uraaka-joshi/uraaka-joshi-user.ts +1 -0
  407. package/lib/routes/uraaka-joshi/uraaka-joshi.ts +3 -0
  408. package/lib/routes/wainao/topics.ts +1 -1
  409. package/lib/routes/wdfxw/bookfree.ts +1 -1
  410. package/lib/routes/weibo/utils.ts +17 -9
  411. package/lib/routes/wikipedia/current-events.ts +411 -0
  412. package/lib/routes/wikipedia/namespace.ts +7 -0
  413. package/lib/routes/wnacg/category.ts +3 -0
  414. package/lib/routes/wnacg/index.ts +3 -0
  415. package/lib/routes/wnacg/tag.ts +3 -0
  416. package/lib/routes/wohnnet/index.ts +2 -2
  417. package/lib/routes/xiaohongshu/user.ts +2 -2
  418. package/lib/routes/xiaohongshu/util.ts +16 -9
  419. package/lib/routes/xjtu/ee-jzxx.ts +1 -1
  420. package/lib/routes/xjtu/zs.ts +1 -1
  421. package/lib/routes/xsijishe/forum.ts +1 -0
  422. package/lib/routes/xsijishe/rank.ts +1 -0
  423. package/lib/routes/xwenming/index.ts +1 -1
  424. package/lib/routes/yahoo/news/utils.ts +7 -3
  425. package/lib/routes/ymgal/article.ts +1 -1
  426. package/lib/routes/yoasobi-music/media.ts +1 -1
  427. package/lib/routes/youtube/api/google.ts +20 -6
  428. package/lib/routes/youtube/api/subtitles.ts +86 -0
  429. package/lib/routes/youtube/api/youtubei.ts +7 -51
  430. package/lib/routes/youtube/channel.ts +1 -1
  431. package/lib/routes/youtube/community.ts +4 -4
  432. package/lib/routes/youtube/user.ts +1 -1
  433. package/lib/routes/yuanliao/index.ts +1 -1
  434. package/lib/routes/zaimanhua/comic.ts +1 -0
  435. package/lib/routes/zaimanhua/update.ts +1 -0
  436. package/lib/routes/zaker/utils.ts +1 -1
  437. package/lib/routes/zaobao/interactive.ts +18 -7
  438. package/lib/routes/zaobao/other.ts +3 -2
  439. package/lib/routes/zaobao/realtime.ts +3 -2
  440. package/lib/routes/zaobao/util.tsx +185 -0
  441. package/lib/routes/zaobao/zaobao.tsx +23 -0
  442. package/lib/routes/zaobao/znews.ts +3 -2
  443. package/lib/routes/zhihu/daily-section.ts +19 -24
  444. package/lib/routes/zhihu/daily.ts +8 -11
  445. package/lib/routes/zju/cse/index.ts +102 -0
  446. package/lib/routes/zodgame/forum.ts +1 -0
  447. package/lib/server.ts +1 -1
  448. package/lib/types.ts +1 -1
  449. package/lib/utils/puppeteer-utils.test.ts +5 -5
  450. package/lib/utils/puppeteer.test.ts +1 -1
  451. package/lib/views/index.tsx +4 -4
  452. package/package.json +55 -57
  453. package/lib/routes/gdufs/xwxy/xwxy-news.ts +0 -90
  454. package/lib/routes/hit/jwc.ts +0 -86
  455. package/lib/routes/picuki/utils.ts +0 -19
  456. package/lib/routes/qweather/templates/3days.art +0 -22
  457. package/lib/routes/qweather/templates/now.art +0 -16
  458. package/lib/routes/xinhuanet/app.ts +0 -109
  459. package/lib/routes/zaobao/templates/zaobao.art +0 -17
  460. package/lib/routes/zaobao/util.ts +0 -198
@@ -0,0 +1,162 @@
1
+ import { Route } from '@/types';
2
+ import got from '@/utils/got';
3
+ import { load } from 'cheerio';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import cache from '@/utils/cache';
6
+ import timezone from '@/utils/timezone';
7
+
8
+ export const route: Route = {
9
+ path: '/graduate/:type?',
10
+ categories: ['university'],
11
+ example: '/nankai/graduate/zxdt',
12
+ parameters: { type: '栏目编号(若为空则默认为"zxdt")' },
13
+ features: {
14
+ requireConfig: false,
15
+ requirePuppeteer: false,
16
+ antiCrawler: false,
17
+ supportBT: false,
18
+ supportPodcast: false,
19
+ supportScihub: false,
20
+ },
21
+ radar: [
22
+ {
23
+ source: ['graduate.nankai.edu.cn', 'graduate.nankai.edu.cn/:type/list.htm'],
24
+ target: '/graduate/:type?',
25
+ },
26
+ ],
27
+ name: '研究生院',
28
+ maintainers: ['ladeng07'],
29
+ description: `| 最新动态 | 综合信息 | 招生工作 | 培养管理 | 国际交流 | 学科建设 | 学位管理 |
30
+ | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
31
+ | zxdt | 82 | 83 | 84 | 85 | 86 | 87 |`,
32
+ url: 'graduate.nankai.edu.cn',
33
+ handler: async (ctx) => {
34
+ // 从 URL 参数中获取通知分类
35
+ const { type = 'zxdt' } = ctx.req.param();
36
+ const baseUrl = 'https://graduate.nankai.edu.cn';
37
+ const { data: response } = await got(`${baseUrl}/${type}/list.htm`);
38
+ const $ = load(response);
39
+
40
+ // 获取分类名称映射
41
+ const categoryMap: Record<string, string> = {
42
+ zxdt: '最新动态',
43
+ '82': '综合信息',
44
+ '83': '招生工作',
45
+ '84': '培养管理',
46
+ '85': '国际交流',
47
+ '86': '学科建设',
48
+ '87': '学位管理',
49
+ };
50
+
51
+ const categoryName = categoryMap[type] || '最新动态';
52
+
53
+ // 解析新闻列表
54
+ const list = $('.newslist li')
55
+ .not('#wp_paging_w6 li')
56
+ .toArray()
57
+ .map((li) => {
58
+ const $li = $(li);
59
+ const $titleDiv = $li.find('.title');
60
+ const $link = $titleDiv.find('a');
61
+ const $timeDiv = $li.find('.time');
62
+
63
+ const title = $link.attr('title');
64
+ let link = $link.attr('href') || '';
65
+
66
+ // 处理相对链接
67
+ link = link && !link.startsWith('http') ? `${baseUrl}${link}` : link;
68
+
69
+ // 提取日期
70
+ const dateStr = $timeDiv.text().trim();
71
+ const pubDate = timezone(parseDate(dateStr, 'YYYY-MM-DD'), +8);
72
+
73
+ return {
74
+ title,
75
+ link,
76
+ pubDate,
77
+ author: '研究生院',
78
+ description: '', // 初始化description属性
79
+ };
80
+ })
81
+ .filter((item) => item && item.link && item.title); // 过滤掉空项目和没有链接的项目
82
+
83
+ // 获取每篇文章的详细内容
84
+ const items = await Promise.all(
85
+ list.map((item) =>
86
+ cache.tryGet(item.link, async () => {
87
+ try {
88
+ const { data: response } = await got(item.link);
89
+ const $ = load(response);
90
+
91
+ // 尝试多种内容选择器
92
+ const $description = $('.wp_articlecontent');
93
+
94
+ // 处理相对链接,转换为绝对链接
95
+ if ($description.length > 0) {
96
+ // 处理链接
97
+ $description.find('a').each((i, el) => {
98
+ const $el = $(el);
99
+ const href = $el.attr('href');
100
+ if (href && !href.startsWith('http')) {
101
+ if (href.startsWith('/')) {
102
+ $el.attr('href', `${baseUrl}${href}`);
103
+ } else {
104
+ $el.attr('href', `${baseUrl}/${href}`);
105
+ }
106
+ }
107
+ });
108
+
109
+ // 处理图片
110
+ $description.find('img').each((i, el) => {
111
+ const $el = $(el);
112
+ let src = $el.attr('src');
113
+
114
+ if (src && !src.startsWith('http')) {
115
+ src = src.startsWith('/') ? `${baseUrl}${src}` : `${baseUrl}/${src}`;
116
+ $el.attr('src', src);
117
+ }
118
+ });
119
+
120
+ // 处理PDF播放器div,提取PDF链接
121
+ $description.find('.wp_pdf_player').each((i, el) => {
122
+ const $el = $(el);
123
+ const pdfSrc = $el.attr('pdfsrc');
124
+ const sudyfileAttr = ($el.attr('sudyfile-attr') || '{}').replaceAll("'", '"');
125
+
126
+ try {
127
+ const sudyfileAttrJson = JSON.parse(sudyfileAttr);
128
+ const fileName = sudyfileAttrJson.title || '未命名文件.pdf';
129
+ if (pdfSrc) {
130
+ let pdfUrl = pdfSrc;
131
+ if (!pdfUrl.startsWith('http')) {
132
+ pdfUrl = `${baseUrl}${pdfUrl}`;
133
+ }
134
+ // 替换PDF播放器为下载链接
135
+ $el.replaceWith(`<p><a href="${pdfUrl}" target="_blank">📄 ${fileName}</a></p>`);
136
+ }
137
+ } catch {
138
+ // 如果解析失败,保留原始内容
139
+ }
140
+ });
141
+ }
142
+
143
+ item.description = $description.html() || item.title;
144
+ } catch {
145
+ // 如果获取详细内容失败,返回基本信息
146
+ item.description = item.title + ' (获取详细内容失败)';
147
+ }
148
+ return item;
149
+ })
150
+ )
151
+ );
152
+
153
+ return {
154
+ // 源标题
155
+ title: `南开大学研究生院-${categoryName}`,
156
+ // 源链接
157
+ link: `${baseUrl}/${type}/list.htm`,
158
+ // 源文章
159
+ item: items,
160
+ };
161
+ },
162
+ };
@@ -16,14 +16,14 @@ async function loadContent(link) {
16
16
  .replaceAll(/&nbsp;/gi, ' ')
17
17
  .trim();
18
18
 
19
- $('.splide__arrows, .slide-control').remove();
19
+ $('.splide__arrows, .slide-control, [class^="ad-"], style').remove();
20
20
 
21
21
  let description = ($('article').eq(0).html() ?? '') + ($('article').eq(1).html() ?? '');
22
22
  if (/photo|gallery/.test(link)) {
23
23
  description = $('#content-album').html() + description;
24
24
  }
25
25
  return {
26
- title: $('title').text(),
26
+ title: $('h1.content-title').text().trim(),
27
27
  pubDate: parseDate(dtStr),
28
28
  description,
29
29
  category: $('.content-tag a')
@@ -66,6 +66,7 @@ async function handler(ctx) {
66
66
 
67
67
  const urlList = $('.article-link-content h4')
68
68
  .toArray()
69
+ .filter((i) => $(i).closest('.article-link-right').length === 0) // 移除右側熱門精選
69
70
  .map((i) => ({
70
71
  link: $(i).find('a[href]').first().attr('href'),
71
72
  }))
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Naturalism.org',
5
+ url: 'naturalism.org',
6
+ lang: 'en',
7
+ };
@@ -0,0 +1,59 @@
1
+ import { Route } from '@/types';
2
+
3
+ import cache from '@/utils/cache';
4
+ import ofetch from '@/utils/ofetch';
5
+ import { load } from 'cheerio';
6
+
7
+ export const route: Route = {
8
+ path: '/',
9
+ categories: ['other'],
10
+ example: '/naturalism',
11
+ radar: [
12
+ {
13
+ source: ['naturalism.org'],
14
+ },
15
+ ],
16
+ name: "What's New",
17
+ maintainers: ['TonyRL'],
18
+ handler,
19
+ url: 'naturalism.org',
20
+ };
21
+
22
+ async function handler() {
23
+ const baseUrl = 'https://naturalism.org';
24
+ const response = await ofetch(baseUrl);
25
+ const $ = load(response);
26
+
27
+ const list = $('.view-what-s-new .field-content a')
28
+ .toArray()
29
+ .map((element) => {
30
+ const a = $(element);
31
+ return {
32
+ title: a.text(),
33
+ link: new URL(a.attr('href'), baseUrl).href,
34
+ };
35
+ });
36
+
37
+ const items = await Promise.all(
38
+ list.map((item) =>
39
+ cache.tryGet(item.link, async () => {
40
+ const response = await ofetch(item.link);
41
+ const $ = load(response);
42
+
43
+ const content = $('#content');
44
+ content.find('h1').remove();
45
+
46
+ item.description = $('#content').html();
47
+
48
+ return item;
49
+ })
50
+ )
51
+ );
52
+
53
+ return {
54
+ title: $('head title').text(),
55
+ link: baseUrl,
56
+ image: `${baseUrl}/sites/naturalism.org/files/swirl-logo.png`,
57
+ item: items,
58
+ };
59
+ }
@@ -18,6 +18,9 @@ export const route: Route = {
18
18
  maintainers: ['TonyRL'],
19
19
  handler,
20
20
  url: 'netflav.com/',
21
+ features: {
22
+ nsfw: true,
23
+ },
21
24
  };
22
25
 
23
26
  async function handler() {
@@ -12,6 +12,7 @@ export const route: Route = {
12
12
  features: {
13
13
  antiCrawler: true,
14
14
  supportBT: true,
15
+ nsfw: true,
15
16
  },
16
17
  radar: [
17
18
  {
@@ -49,7 +49,7 @@ async function handler(ctx) {
49
49
  }))
50
50
  );
51
51
 
52
- items = items.sort((a, b) => b.pubDate - a.pubDate).slice(0, ctx.req.query('limit') ? Number(ctx.req.query('limit')) : 30);
52
+ items = items.toSorted((a, b) => b.pubDate - a.pubDate).slice(0, ctx.req.query('limit') ? Number(ctx.req.query('limit')) : 30);
53
53
 
54
54
  items = await Promise.all(
55
55
  items.map((item) =>
@@ -0,0 +1,39 @@
1
+ import { DataItem, Route } from '@/types';
2
+
3
+ import { getMylist, renderVideo } from './utils';
4
+ import { parseDate } from '@/utils/parse-date';
5
+
6
+ export const route: Route = {
7
+ name: 'Mylist',
8
+ path: '/mylist/:id',
9
+ parameters: { id: 'Mylist ID' },
10
+ example: '/nicovideo/mylist/2973737',
11
+ maintainers: ['esperecyan'],
12
+ radar: [
13
+ {
14
+ source: ['www.nicovideo.jp/user/:user/mylist/:id'],
15
+ target: '/mylist/:id',
16
+ },
17
+ ],
18
+ handler: async (ctx) => {
19
+ const { id } = ctx.req.param();
20
+
21
+ const mylist = await getMylist(id);
22
+
23
+ return {
24
+ title: `マイリスト ${mylist.name}‐ニコニコ動画`,
25
+ link: `https://www.nicovideo.jp/user/${mylist.owner.id}/mylist/${mylist.id}`,
26
+ language: 'ja',
27
+ item: mylist.items.map(
28
+ (item): DataItem => ({
29
+ title: item.video.title,
30
+ link: `https://www.nicovideo.jp/watch/${item.video.id}`,
31
+ pubDate: parseDate(item.addedAt),
32
+ author: [{ name: item.video.owner.name, avatar: item.video.owner.iconUrl, url: `https://www.nicovideo.jp/user/${item.video.owner.id}` }],
33
+ description: renderVideo(item.video, false),
34
+ image: item.video.thumbnail.nHdUrl ?? item.video.thumbnail.largeUrl ?? item.video.thumbnail.middleUrl ?? undefined,
35
+ })
36
+ ),
37
+ };
38
+ },
39
+ };
@@ -52,3 +52,30 @@ export interface VideoItem {
52
52
  series: null;
53
53
  essential: Essential;
54
54
  }
55
+
56
+ export type Mylist = {
57
+ id: number;
58
+ name: string;
59
+ description: string;
60
+ decoratedDescriptionHtml: string;
61
+ defaultSortKey: string;
62
+ defaultSortOrder: string;
63
+ items: MylistItem[];
64
+ totalItemCount: number;
65
+ hasNext: boolean;
66
+ isPublic: boolean;
67
+ owner: Owner;
68
+ hasInvisibleItems: boolean;
69
+ followerCount: number;
70
+ isFollowing: boolean;
71
+ };
72
+
73
+ type MylistItem = {
74
+ itemId: number;
75
+ watchId: string;
76
+ description: string;
77
+ decoratedDescriptionHtml: string;
78
+ addedAt: string;
79
+ status: string;
80
+ video: Essential;
81
+ };
@@ -1,4 +1,4 @@
1
- import { Essential, UserInfo, VideoItem } from './types';
1
+ import { Essential, Mylist, UserInfo, VideoItem } from './types';
2
2
 
3
3
  import ofetch from '@/utils/ofetch';
4
4
  import cache from '@/utils/cache';
@@ -31,4 +31,30 @@ export const getUserVideosById = (id: string) =>
31
31
  false
32
32
  ) as Promise<VideoItem[]>;
33
33
 
34
+ export const getMylist = (id: string): Promise<Mylist> =>
35
+ cache.tryGet<Mylist>(
36
+ `nicovideo:mylist:${id}`,
37
+ async () => {
38
+ const { data } = await ofetch(`https://nvapi.nicovideo.jp/v2/mylists/${id}`, {
39
+ headers: {
40
+ 'X-Frontend-Id': '6',
41
+ },
42
+ query: {
43
+ sortKey: 'addedAt',
44
+ sortOrder: 'desc',
45
+ /**
46
+ * @remarks
47
+ * Up to 500 items can be registered in a single mylist.
48
+ * @see https://qa.nicovideo.jp/faq/show/648?site_domain=default
49
+ */
50
+ pageSize: 500,
51
+ page: 1,
52
+ },
53
+ });
54
+ return data.mylist;
55
+ },
56
+ config.cache.routeExpire,
57
+ false
58
+ );
59
+
34
60
  export const renderVideo = (video: Essential, embed: boolean) => art(path.join(__dirname, 'templates/video.art'), { video, embed });
@@ -136,10 +136,7 @@ async function handler(ctx) {
136
136
 
137
137
  item.author = content('meta[name="author"]').attr('content');
138
138
  item.title = item.title ?? content('meta[name="twitter:title"]').attr('content');
139
- item.description = content('#contentDiv')
140
- .html()
141
- ?.replace(/&nbsp;/g, '')
142
- .replaceAll('<p></p>', '');
139
+ item.description = content('#contentDiv').html()?.replaceAll('&nbsp;', '').replaceAll('<p></p>', '');
143
140
 
144
141
  return item;
145
142
  })
@@ -7,7 +7,7 @@ export const route: Route = {
7
7
  path: '/nioradio/:albumid',
8
8
  categories: ['multimedia'],
9
9
  description: `
10
- :::tip
10
+ ::: tip
11
11
  **如何获取电台 ID?**
12
12
  打开蔚来 APP 后,点击“此地”→“NIO Radio”,找到自己想要转换为播客的专辑,分享后在生成的链接中找到\`container_id=\`后方的数字即可。
13
13
  常见电台 ID:
@@ -5,7 +5,7 @@ import timezone from '@/utils/timezone';
5
5
  import ofetch from '@/utils/ofetch'; // 使用默认导出的方式导入ofetch
6
6
 
7
7
  async function getNoticeList(ctx, url, host, titleSelector, dateSelector, contentSelector, listSelector) {
8
- const response = await ofetch(url).catch(() => null);
8
+ const response = await ofetch(url);
9
9
  if (!response) {
10
10
  return [];
11
11
  }
@@ -25,7 +25,7 @@ async function getNoticeList(ctx, url, host, titleSelector, dateSelector, conten
25
25
  const out = await Promise.all(
26
26
  list.map((item) =>
27
27
  cache.tryGet(item.link, async () => {
28
- const response = await ofetch(item.link).catch(() => null);
28
+ const response = await ofetch(item.link);
29
29
  if (!response || (response.status >= 300 && response.status < 400)) {
30
30
  return {
31
31
  ...item,
@@ -3,11 +3,11 @@ import type { Namespace } from '@/types';
3
3
  export const namespace: Namespace = {
4
4
  name: 'Notion',
5
5
  url: 'notion.so',
6
- description: `:::warning
6
+ description: `::: warning
7
7
  Need to set up Notion integration, please refer to [Route-specific Configurations](https://docs.rsshub.app/deploy/config#route-specific-configurations) for details.
8
8
  :::
9
9
 
10
- :::tip Recommendation
10
+ ::: tip Recommendation
11
11
  It is recommended to use with clipping tools such as Notion Web Clipper.
12
12
  :::`,
13
13
  lang: 'en',
@@ -100,7 +100,7 @@ async function handler(ctx) {
100
100
  link: `https://news.now.com/home/${category}/player?newsId=${item.newsId}`,
101
101
  pubDate: parseDate(item.publishDate, 'x'),
102
102
  category: [...item.sportTypes.map((t) => t.sportTypeNameChi), ...item.players.map((p) => p.playerFullNameChi), ...item.teams.map((t) => t.teamCodeChi)],
103
- image: item.newsPhotos?.filter((p) => p.sizeType === '3')?.[0]?.imageUrl,
103
+ image: item.newsPhotos?.find((p) => p.sizeType === '3')?.imageUrl,
104
104
  newsId: item.newsId,
105
105
  };
106
106
  })
@@ -136,7 +136,7 @@ async function handler(ctx) {
136
136
  // Match 感谢|謝.*?cn.letters@nytimes.com。
137
137
  const ending = /&#x611F;(&#x8C22|&#x8B1D);.*?cn\.letters@nytimes\.com&#x3002;/g;
138
138
 
139
- single.description = result.description?.replace(ending, '');
139
+ single.description = result.description?.replaceAll(ending, '');
140
140
 
141
141
  if (hasEnVersion) {
142
142
  single.title = result.title;
@@ -16,6 +16,9 @@ export const route: Route = {
16
16
  name: '视频',
17
17
  maintainers: ['fang63625'],
18
18
  handler,
19
+ features: {
20
+ nsfw: true,
21
+ },
19
22
  };
20
23
 
21
24
  async function handler(ctx) {
@@ -15,6 +15,9 @@ export const route: Route = {
15
15
  name: '最新视频',
16
16
  maintainers: ['fang63625'],
17
17
  handler,
18
+ features: {
19
+ nsfw: true,
20
+ },
18
21
  };
19
22
 
20
23
  async function handler() {
@@ -49,6 +49,7 @@ export const route: Route = {
49
49
  supportBT: false,
50
50
  supportPodcast: false,
51
51
  supportScihub: false,
52
+ nsfw: true,
52
53
  },
53
54
  name: 'Author Search',
54
55
  maintainers: ['xueli_sherryli'],
@@ -183,9 +183,8 @@ export const route: Route = {
183
183
  parameters: {
184
184
  id: '专栏 id,可在对应专栏页 URL 中找到',
185
185
  },
186
- description: `:::tip
186
+ description: `::: tip
187
187
  若订阅 [开源安全专栏](https://www.oschina.net/news/column?columnId=14),网址为 \`https://www.oschina.net/news/column?columnId=14\`,请截取 \`https://www.oschina.net/news/column?columnId=\` 到末尾的部分 \`14\` 作为 \`id\` 参数填入,此时目标路由为 [\`/oschina/column/14\`](https://rsshub.app/oschina/column/14)。
188
-
189
188
  :::
190
189
 
191
190
  <details>
@@ -198,7 +198,7 @@ export const route: Route = {
198
198
  parameters: {
199
199
  category: '分类,默认为 `latest`,即最新活动,可在对应分类页 URL 中找到',
200
200
  },
201
- description: `:::tip
201
+ description: `::: tip
202
202
  若订阅 [强力推荐](https://www.oschina.net/event?tab=recommend),网址为 \`https://www.oschina.net/event?tab=recommend\`,请截取 \`https://www.oschina.net/event?tab=\` 到末尾的部分 \`recommend\` 作为 \`category\` 参数填入,此时目标路由为 [\`/oschina/event/recommend\`](https://rsshub.app/oschina/event/recommend)。
203
203
  :::
204
204
 
@@ -34,7 +34,7 @@ This actual parameters should be passed as \`routeParams\` in URL Query String f
34
34
 
35
35
  /osu/latest-ranked/modeInTitle=true&includeMode=osu
36
36
 
37
- :::tip
37
+ ::: tip
38
38
  You could make use of \`difficultyLimit\` paramters to create a "high difficulty/low difficulty only" only feed.
39
39
 
40
40
  For example, if you only wants to play low star rating beatmap like 1 or 2 star, you could subscribe to:
@@ -49,8 +49,7 @@ with star rating higher than a certain threshold.
49
49
  /osu/latest-ranked/difficultyLimit=L6
50
50
 
51
51
  Now all beatmapsets that don't provided at least one beatmap with star rating higher than \`6.00\` will be filtered.
52
- :::
53
- `;
52
+ :::`;
54
53
 
55
54
  export const route: Route = {
56
55
  path: '/latest-ranked/:routeParams?',
@@ -123,7 +123,7 @@ export const route: Route = {
123
123
  description: 'Category ID, can be found in URL',
124
124
  },
125
125
  },
126
- description: `:::tip
126
+ description: `::: tip
127
127
  To subscribe to [Artificial Intelligence (cs.AI)](https://papers.cool/arxiv/cs.AI) (<https://papers.cool/arxiv/cs.AI>), extract \`arxiv/cs.AI\` from the URL as the \`category\` parameter. The resulting route will be [\`/papers/category/arxiv/cs.AI\`](https://rsshub.app/papers/category/arxiv/cs.AI).
128
128
  :::
129
129
 
@@ -1212,9 +1212,8 @@ To subscribe to [Artificial Intelligence (cs.AI)](https://papers.cool/arxiv/cs.A
1212
1212
  description: '分类 id,可在对应分类页 URL 中找到',
1213
1213
  },
1214
1214
  },
1215
- description: `:::tip
1215
+ description: `::: tip
1216
1216
  订阅 [人工智能 (cs.AI)](https://papers.cool/arxiv/cs.AI)(<https://papers.cool/arxiv/cs.AI>),请从 URL 中提取 \`arxiv/cs.AI\` 作为 \`category\` 参数,得到的路由将是 [\`/papers/category/arxiv/cs.AI\`](https://rsshub.app/papers/category/arxiv/cs.AI)。
1217
- :::
1218
- `,
1217
+ :::`,
1219
1218
  },
1220
1219
  };
@@ -22,6 +22,7 @@ export const route: Route = {
22
22
  description: 'The value of the session_id cookie after logging in to Patreon, required to access paid posts',
23
23
  },
24
24
  ],
25
+ nsfw: true,
25
26
  },
26
27
  radar: [
27
28
  {
@@ -6,8 +6,7 @@ import ofetch from '@/utils/ofetch';
6
6
  import { art } from '@/utils/render';
7
7
  import path from 'node:path';
8
8
  import { config } from '@/config';
9
- import { puppeteerGet } from './utils';
10
- import puppeteer from '@/utils/puppeteer';
9
+ import { getPuppeteerPage } from '@/utils/puppeteer';
11
10
  import NotFoundError from '@/errors/types/not-found';
12
11
 
13
12
  export const route: Route = {
@@ -87,9 +86,18 @@ async function handler(ctx) {
87
86
  });
88
87
  } catch (error) {
89
88
  if (error.status === 403) {
90
- const browser = await puppeteer();
91
- response = await puppeteerGet(profileUrl, browser);
92
- await browser.close();
89
+ const { page, destory } = await getPuppeteerPage(profileUrl, {
90
+ onBeforeLoad: async (page) => {
91
+ const expectResourceTypes = new Set(['document', 'script', 'xhr', 'fetch']);
92
+ await page.setRequestInterception(true);
93
+ page.on('request', (request) => {
94
+ expectResourceTypes.has(request.resourceType()) ? request.continue() : request.abort();
95
+ });
96
+ },
97
+ });
98
+ await page.waitForSelector('.content');
99
+ response = await page.content();
100
+ await destory();
93
101
  } else {
94
102
  throw new NotFoundError(error.message);
95
103
  }
@@ -20,6 +20,7 @@ export const route: Route = {
20
20
  supportBT: false,
21
21
  supportPodcast: false,
22
22
  supportScihub: false,
23
+ nsfw: true,
23
24
  },
24
25
  radar: [
25
26
  {
@@ -24,6 +24,7 @@ export const route: Route = {
24
24
  supportBT: false,
25
25
  supportPodcast: false,
26
26
  supportScihub: false,
27
+ nsfw: true,
27
28
  },
28
29
  radar: [
29
30
  {
@@ -15,7 +15,7 @@ export async function getSFWUserNovels(id: string, fullContent: boolean = false,
15
15
  });
16
16
 
17
17
  const novels = Object.keys(allData.body.novels)
18
- .sort((a, b) => Number(b) - Number(a))
18
+ .toSorted((a, b) => Number(b) - Number(a))
19
19
  .slice(0, Number.parseInt(String(limit), 10));
20
20
 
21
21
  if (novels.length === 0) {