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
@@ -1,6 +1,6 @@
1
1
  import { Route } from '@/types';
2
2
  import cache from '@/utils/cache';
3
- import got from '@/utils/got';
3
+ import ofetch from '@/utils/ofetch';
4
4
  import { parseDate } from '@/utils/parse-date';
5
5
  import { load } from 'cheerio';
6
6
 
@@ -37,12 +37,9 @@ async function handler(ctx) {
37
37
  const apiRootUrl = 'https://services.radio-canada.ca';
38
38
  const currentUrl = `${apiRootUrl}/neuro/sphere/v1/rci/${language}/continuous-feed?pageSize=50`;
39
39
 
40
- const response = await got({
41
- method: 'get',
42
- url: currentUrl,
43
- });
40
+ const response = await ofetch(currentUrl);
44
41
 
45
- const list = response.data.data.lineup.items.map((item) => ({
42
+ const list = response.data.lineup.items.map((item) => ({
46
43
  title: item.title,
47
44
  category: item.kicker,
48
45
  link: `${rootUrl}${item.url}`,
@@ -52,18 +49,15 @@ async function handler(ctx) {
52
49
  const items = await Promise.all(
53
50
  list.map((item) =>
54
51
  cache.tryGet(item.link, async () => {
55
- const detailResponse = await got({
56
- method: 'get',
57
- url: item.link,
58
- });
52
+ const detailResponse = await ofetch(item.link);
53
+
54
+ const $ = load(detailResponse);
59
55
 
60
- const $ = load(detailResponse.data);
61
56
  const rcState = $('script:contains("window._rcState_ = ")')
62
57
  .text()
63
- .match(/window\._rcState_ = (.*);/)[1];
64
- const rcStateJson = JSON.parse(rcState);
65
- const news = Object.values(rcStateJson.pagesV2.pages)[0];
66
- item.description = news.data.newsStory.body.html.replaceAll(String.raw`\n`, '<br>');
58
+ .match(/window\._rcState_ = (.*);/)?.[1];
59
+
60
+ item.description = rcState ? parseDescriptionFromState(rcState) : ($(`div[data-testid="newsStoryMedia"]`).html() ?? '') + ($('article > main').html() ?? '');
67
61
 
68
62
  return item;
69
63
  })
@@ -71,8 +65,27 @@ async function handler(ctx) {
71
65
  );
72
66
 
73
67
  return {
74
- title: response.data.meta.title,
75
- link: response.data.metric.metrikContent.omniture.url,
68
+ title: response.meta.title,
69
+ link: response.metric.metrikContent.omniture.url,
76
70
  item: items,
77
71
  };
78
72
  }
73
+
74
+ const parseDescriptionFromState = (rcState) => {
75
+ const rcStateJson = JSON.parse(rcState);
76
+ const news = Object.values(rcStateJson?.pages?.pages ?? {})[0] as any;
77
+
78
+ const headerImg = news?.data?.newsStory?.headerMultimediaItem?.picture;
79
+ const headerImgUrl = headerImg?.pattern ? headerImg?.pattern.replace('/q_auto,w_{width}', '').replace('{ratio}', '16x9') : '';
80
+ const header = `<figure><picture><img src="${headerImgUrl}" alt="${headerImg?.alt ?? ''}"></picture><figcaption>${headerImg?.legend ?? ''}</figcaption></figure>`;
81
+ const primer = news?.data?.newsStory?.primer?.replaceAll(String.raw`\n`, '') ?? '';
82
+ const body = news?.data?.newsStory?.body?.html?.replaceAll(String.raw`\n`, '') ?? '';
83
+ let bodyWithImg = body;
84
+ for (const [index, attachment] of (news?.data?.newsStory?.body?.attachments ?? []).entries()) {
85
+ const placeholder = `<!--body:attachment:${index}-->`;
86
+ const picture = attachment?.picture;
87
+ const imageUrl = picture?.pattern ? picture?.pattern.replace('/q_auto,w_{width}', '').replace('{ratio}', attachment?.dimensionRatio ?? '16x9') : '';
88
+ bodyWithImg = bodyWithImg.replace(placeholder, `<figure><picture><img src="${imageUrl}" alt="${picture?.alt ?? ''}"></picture><figcaption>${picture?.legend ?? ''}</figcaption></figure>`);
89
+ }
90
+ return header + primer + bodyWithImg;
91
+ };
@@ -19,6 +19,7 @@ export const route: Route = {
19
19
  supportBT: false,
20
20
  supportPodcast: false,
21
21
  supportScihub: false,
22
+ nsfw: true,
22
23
  },
23
24
  radar: [
24
25
  {
@@ -26,7 +26,7 @@ export const route: Route = {
26
26
  name: '高瓴人工智能学院',
27
27
  maintainers: ['yinhanyan'],
28
28
  handler: async (ctx) => {
29
- const category = ctx.req.param('category')?.replace(/-/g, '/') ?? 'newslist/notice';
29
+ const category = ctx.req.param('category')?.replaceAll('-', '/') ?? 'newslist/notice';
30
30
  const baseURL = `http://ai.ruc.edu.cn/${category}/`;
31
31
  const indexUrl = baseURL + 'index.htm';
32
32
  const response = await ofetch(indexUrl);
@@ -34,7 +34,7 @@ export const route: Route = {
34
34
  };
35
35
 
36
36
  async function handler(ctx) {
37
- const category = ctx.req.param('category')?.replace(/-/g, '/') ?? 'tzgg';
37
+ const category = ctx.req.param('category')?.replaceAll('-', '/') ?? 'tzgg';
38
38
 
39
39
  const rootUrl = 'http://hr.ruc.edu.cn';
40
40
  const currentUrl = `${rootUrl}/${category}/index.htm`;
@@ -0,0 +1,241 @@
1
+ import { type Data, type DataItem, type Route, ViewType } from '@/types';
2
+
3
+ import cache from '@/utils/cache';
4
+ import ofetch from '@/utils/ofetch';
5
+ import { parseDate } from '@/utils/parse-date';
6
+
7
+ import { type CheerioAPI, type Cheerio, load } from 'cheerio';
8
+ import type { Element } from 'domhandler';
9
+ import { type Context } from 'hono';
10
+
11
+ export const handler = async (ctx: Context): Promise<Data> => {
12
+ const { id = 'xwdt/gzdt' } = ctx.req.param();
13
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '17', 10);
14
+
15
+ const baseUrl: string = 'https://www.samrdprc.org.cn';
16
+ const targetUrl: string = new URL(id.endsWith('/') ? id : `${id}/`, baseUrl).href;
17
+
18
+ const response = await ofetch(targetUrl);
19
+ const $: CheerioAPI = load(response);
20
+ const language = $('html').attr('lang') ?? 'zh';
21
+
22
+ let items: DataItem[] = [];
23
+
24
+ items = $('div.boxl_ul ul li')
25
+ .slice(0, limit)
26
+ .toArray()
27
+ .map((el): Element => {
28
+ const $el: Cheerio<Element> = $(el);
29
+ const $aEl: Cheerio<Element> = $el.find('a').first();
30
+
31
+ const title: string = $aEl.text();
32
+ const pubDateStr: string | undefined = $el.find('span').text();
33
+ const linkUrl: string | undefined = $aEl.attr('href');
34
+ const upDatedStr: string | undefined = pubDateStr;
35
+
36
+ const processedItem: DataItem = {
37
+ title,
38
+ pubDate: pubDateStr ? parseDate(pubDateStr) : undefined,
39
+ link: linkUrl ? new URL(linkUrl, targetUrl).href : undefined,
40
+ updated: upDatedStr ? parseDate(upDatedStr) : undefined,
41
+ language,
42
+ };
43
+
44
+ return processedItem;
45
+ });
46
+
47
+ items = await Promise.all(
48
+ items.map((item) => {
49
+ if (!item.link) {
50
+ return item;
51
+ }
52
+
53
+ return cache.tryGet(item.link, async (): Promise<DataItem> => {
54
+ const detailResponse = await ofetch(item.link);
55
+ const $$: CheerioAPI = load(detailResponse);
56
+
57
+ const title: string = $$('div.show_tit').text();
58
+ const description: string | undefined = $$('div.TRS_Editor div.TRS_Editor').html() ?? undefined;
59
+ const pubDateStr: string | undefined = $$('div.show_tit2').text().split(/:/).pop()?.trim();
60
+ const categories: string[] = $$('meta[name="keywords"]').attr('content')?.split(/,/) ?? [];
61
+ const upDatedStr: string | undefined = pubDateStr;
62
+
63
+ const processedItem: DataItem = {
64
+ title,
65
+ description,
66
+ pubDate: pubDateStr ? parseDate(pubDateStr) : item.pubDate,
67
+ category: categories,
68
+ content: {
69
+ html: description,
70
+ text: description,
71
+ },
72
+ updated: upDatedStr ? parseDate(upDatedStr) : item.updated,
73
+ language,
74
+ };
75
+
76
+ return {
77
+ ...item,
78
+ ...processedItem,
79
+ };
80
+ });
81
+ })
82
+ );
83
+
84
+ return {
85
+ title: $('title').text(),
86
+ description: $('meta[name="description"]').attr('content'),
87
+ link: targetUrl,
88
+ item: items,
89
+ allowEmpty: true,
90
+ image: new URL('images/logo_DPRC.png', baseUrl).href,
91
+ author: $('meta[name="keyword"]').attr('content')?.split(/,/)[0],
92
+ language,
93
+ id: $('meta[property="og:url"]').attr('content'),
94
+ };
95
+ };
96
+
97
+ export const route: Route = {
98
+ path: '/:id{.+}?',
99
+ name: '栏目',
100
+ url: 'www.samrdprc.org.cn',
101
+ maintainers: ['nczitzk'],
102
+ handler,
103
+ example: '/samrdprc/xwdt/gzdt',
104
+ parameters: {
105
+ id: {
106
+ description: '栏目 id,默认为 `xwdt/gzdt`,即国内新闻,可在对应分类页 URL 中找到',
107
+ options: [
108
+ {
109
+ label: '新闻动态',
110
+ value: 'xwdt/gzdt',
111
+ },
112
+ {
113
+ label: '网站公告',
114
+ value: 'wzgg',
115
+ },
116
+ {
117
+ label: '汽车召回',
118
+ value: 'qczh',
119
+ },
120
+ {
121
+ label: '消费品召回',
122
+ value: 'xfpzh',
123
+ },
124
+ {
125
+ label: '技术报告',
126
+ value: 'yjgz/jsyj',
127
+ },
128
+ {
129
+ label: 'SAC/TC463',
130
+ value: 'yjgz/sactc',
131
+ },
132
+ {
133
+ label: '研究动态',
134
+ value: 'yjgz/yjfx',
135
+ },
136
+ {
137
+ label: '安全教育',
138
+ value: 'aqjy',
139
+ },
140
+ {
141
+ label: '国内法规',
142
+ value: 'flfg/gnfg',
143
+ },
144
+ ],
145
+ },
146
+ },
147
+ description: `::: tip
148
+ 订阅 [网站公告](https://www.samrdprc.org.cn/wzgg/),其源网址为 \`https://www.samrdprc.org.cn/wzgg/\`,请参考该 URL 指定部分构成参数,此时路由为 [\`/samrdprc/wzgg\`](https://rsshub.app/samrdprc/wzgg)。
149
+ :::
150
+
151
+ <details>
152
+ <summary>更多分类</summary>
153
+
154
+ #### 网站首页
155
+
156
+ | [新闻动态](https://www.samrdprc.org.cn/xwdt/gzdt/) | [网站公告](https://www.samrdprc.org.cn/wzgg/) | [汽车召回](https://www.samrdprc.org.cn/qczh/) | [消费品召回](https://www.samrdprc.org.cn/xfpzh/) |
157
+ | -------------------------------------------------- | --------------------------------------------- | --------------------------------------------- | ------------------------------------------------ |
158
+ | [xwdt/gzdt](https://rsshub.app/samrdprc/xwdt/gzdt) | [wzgg](https://rsshub.app/samrdprc/wzgg) | [qczh](https://rsshub.app/samrdprc/qczh) | [xfpzh](https://rsshub.app/samrdprc/xfpzh) |
159
+
160
+ #### 科学研究
161
+
162
+ | [技术报告](https://www.samrdprc.org.cn/yjgz/jsyj/) | [SAC/TC463](https://www.samrdprc.org.cn/yjgz/sactc/) | [研究动态](https://www.samrdprc.org.cn/yjgz/yjfx/) |
163
+ | -------------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------- |
164
+ | [yjgz/jsyj](https://rsshub.app/samrdprc/yjgz/jsyj) | [yjgz/sactc](https://rsshub.app/samrdprc/yjgz/sactc) | [yjgz/yjfx](https://rsshub.app/samrdprc/yjgz/yjfx) |
165
+
166
+ #### 安全教育
167
+
168
+ | [安全教育](https://www.samrdprc.org.cn/aqjy/) |
169
+ | --------------------------------------------- |
170
+ | [aqjy](https://rsshub.app/samrdprc/aqjy) |
171
+
172
+ #### 法律法规
173
+
174
+ | [国内法规](https://www.samrdprc.org.cn/flfg/gnfg/) |
175
+ | -------------------------------------------------- |
176
+ | [flfg/gnfg](https://rsshub.app/samrdprc/flfg/gnfg) |
177
+ </details>
178
+ `,
179
+ categories: ['government'],
180
+ features: {
181
+ requireConfig: false,
182
+ requirePuppeteer: false,
183
+ antiCrawler: false,
184
+ supportRadar: true,
185
+ supportBT: false,
186
+ supportPodcast: false,
187
+ supportScihub: false,
188
+ },
189
+ radar: [
190
+ {
191
+ source: ['www.samrdprc.org.cn/:id'],
192
+ target: '/:id',
193
+ },
194
+ {
195
+ title: '网站首页 - 新闻动态',
196
+ source: ['www.samrdprc.org.cn/xwdt/gzdt/'],
197
+ target: '/xwdt/gzdt',
198
+ },
199
+ {
200
+ title: '网站首页 - 网站公告',
201
+ source: ['www.samrdprc.org.cn/wzgg/'],
202
+ target: '/wzgg',
203
+ },
204
+ {
205
+ title: '网站首页 - 汽车召回',
206
+ source: ['www.samrdprc.org.cn/qczh/'],
207
+ target: '/qczh',
208
+ },
209
+ {
210
+ title: '网站首页 - 消费品召回',
211
+ source: ['www.samrdprc.org.cn/xfpzh/'],
212
+ target: '/xfpzh',
213
+ },
214
+ {
215
+ title: '科学研究 - 技术报告',
216
+ source: ['www.samrdprc.org.cn/yjgz/jsyj/'],
217
+ target: '/yjgz/jsyj',
218
+ },
219
+ {
220
+ title: '科学研究 - SAC/TC463',
221
+ source: ['www.samrdprc.org.cn/yjgz/sactc/'],
222
+ target: '/yjgz/sactc',
223
+ },
224
+ {
225
+ title: '科学研究 - 研究动态',
226
+ source: ['www.samrdprc.org.cn/yjgz/yjfx/'],
227
+ target: '/yjgz/yjfx',
228
+ },
229
+ {
230
+ title: '安全教育 - 安全教育',
231
+ source: ['www.samrdprc.org.cn/aqjy/'],
232
+ target: '/aqjy',
233
+ },
234
+ {
235
+ title: '法律法规 - 国内法规',
236
+ source: ['www.samrdprc.org.cn/flfg/gnfg/'],
237
+ target: '/flfg/gnfg',
238
+ },
239
+ ],
240
+ view: ViewType.Articles,
241
+ };
@@ -1,7 +1,7 @@
1
1
  import type { Namespace } from '@/types';
2
2
 
3
3
  export const namespace: Namespace = {
4
- name: '国家市场监督管理总局',
4
+ name: '国家市场监督管理总局缺陷产品管理中心',
5
5
  url: 'www.samrdprc.org.cn',
6
6
  lang: 'zh-CN',
7
7
  };
@@ -205,7 +205,7 @@ export const route: Route = {
205
205
  parameters: {
206
206
  id: 'ID, see below',
207
207
  },
208
- description: `:::tip
208
+ description: `::: tip
209
209
  If you subscribe to [Science Quickly](https://www.scientificamerican.com/podcast/science-quickly/),where the URL is \`https://www.scientificamerican.com/podcast/science-quickly/\`, extract the part \`https://www.scientificamerican.com/podcast/\` to the end, which is \`science-quickly\`, and use it as the parameter to fill in. Therefore, the route will be [\`/scientificamerican/podcast/science-quickly\`](https://rsshub.app/scientificamerican/podcast/science-quickly).
210
210
  :::
211
211
 
@@ -255,7 +255,7 @@ If you subscribe to [Science Quickly](https://www.scientificamerican.com/podcast
255
255
  parameters: {
256
256
  id: 'ID,见下表',
257
257
  },
258
- description: `:::tip
258
+ description: `::: tip
259
259
  若订阅 [Science Quickly](https://www.scientificamerican.com/podcast/science-quickly/),网址为 \`https://www.scientificamerican.com/podcast/science-quickly/\`,请截取 \`https://www.scientificamerican.com/podcast/\` 到末尾 \`/\` 的部分 \`science-quickly\` 作为 \`id\` 参数填入,此时目标路由为 [\`/scientificamerican/podcast/science-quickly\`](https://rsshub.app/scientificamerican/podcast/science-quickly)。
260
260
  :::
261
261
 
@@ -0,0 +1,99 @@
1
+ import { type Data, type DataItem, type Route } from '@/types';
2
+
3
+ import { namespace } from './namespace';
4
+ import ofetch from '@/utils/ofetch';
5
+ import { load } from 'cheerio';
6
+ import timezone from '@/utils/timezone';
7
+ import { parseDate } from '@/utils/parse-date';
8
+ import path from 'node:path';
9
+ import { art } from '@/utils/render';
10
+
11
+ const baseUrl = `https://${namespace.url}`;
12
+
13
+ function parseRocDate(rocDate: string | undefined): Date | undefined {
14
+ if (!rocDate) {
15
+ return undefined;
16
+ }
17
+ // Expect formats like 114/08/31
18
+ const parts = rocDate.trim().split('/');
19
+ if (parts.length !== 3) {
20
+ return undefined;
21
+ }
22
+ const [rocYearStr, monthStr, dayStr] = parts;
23
+ const rocYear = Number.parseInt(rocYearStr, 10);
24
+
25
+ const year = rocYear + 1911;
26
+ return parseDate(`${year}-${monthStr}-${dayStr}`, 'YYYY-MM-DD');
27
+ }
28
+
29
+ export const route: Route = {
30
+ path: '/',
31
+ categories: ['government'],
32
+ example: '/scitechvista',
33
+ features: {
34
+ requireConfig: false,
35
+ requirePuppeteer: false,
36
+ antiCrawler: false,
37
+ supportBT: false,
38
+ supportPodcast: false,
39
+ supportScihub: false,
40
+ },
41
+ radar: [
42
+ {
43
+ source: ['scitechvista.nat.gov.tw/'],
44
+ },
45
+ ],
46
+ name: '最新文章',
47
+ maintainers: ['johan456789'],
48
+ handler,
49
+ url: namespace.url,
50
+ };
51
+
52
+ async function handler(): Promise<Data> {
53
+ const currentUrl = `${baseUrl}/Article/C000003/new`;
54
+ const html = await ofetch(currentUrl);
55
+ const $ = load(html);
56
+
57
+ const language: string = $('html').attr('lang') || 'zh-TW';
58
+ const articleNodes = $('div.kf-diagramtext-list > div.kf-diagramtext-col').toArray();
59
+
60
+ const items: DataItem[] = articleNodes
61
+ .map((colEl) => {
62
+ const node = $(colEl);
63
+ const anchor = node.find('a[href*="/Article/C000003/detail"]').first();
64
+
65
+ const linkPath = anchor.attr('href');
66
+ const link = linkPath ? new URL(linkPath, baseUrl).href : undefined;
67
+
68
+ const title = node.find('div.kf-title').first().text().trim();
69
+
70
+ const dateText = node.find('div.kf-date > span').first().text().trim() || undefined;
71
+ const pubDate = dateText ? timezone(parseRocDate(dateText), +8) : undefined;
72
+
73
+ const imagePath = node.find('img').attr('src');
74
+ const image = imagePath ? new URL(imagePath, baseUrl).href : undefined;
75
+
76
+ const snippet = node.find('div.kf-txt').first().text().trim() || undefined;
77
+
78
+ const description = art(path.join(__dirname, 'templates/description.art'), {
79
+ image,
80
+ description: snippet,
81
+ });
82
+
83
+ return {
84
+ title,
85
+ description,
86
+ link,
87
+ pubDate,
88
+ image,
89
+ } as DataItem;
90
+ })
91
+ .filter(Boolean) as DataItem[];
92
+
93
+ return {
94
+ title: `${namespace.name} - 最新文章`,
95
+ link: currentUrl,
96
+ language,
97
+ item: items,
98
+ } as Data;
99
+ }
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '科技大觀園',
5
+ url: 'scitechvista.nat.gov.tw',
6
+ lang: 'zh-TW',
7
+ };
@@ -0,0 +1,6 @@
1
+ {{if image}}
2
+ <p><img src="{{image}}" alt=""/></p>
3
+ {{/if}}
4
+ {{if description}}
5
+ <p>{{@ description }}</p>
6
+ {{/if}}
@@ -158,11 +158,9 @@ export const route: Route = {
158
158
  description: 'Query, `s=2&d=1&n=true&dm=true&o=true` by default',
159
159
  },
160
160
  },
161
- description: `:::tip
161
+ description: `::: tip
162
162
  To subscribe to [Apps](https://scoop.sh/#/apps?s=2&d=1&n=true&dm=true&o=true), where the source URL is \`https://scoop.sh/#/apps?s=2&d=1&n=true&dm=true&o=true\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/scoop/apps/s=2&d=1&n=true&dm=true&o=true\`](https://rsshub.app/scoop/apps/s=2&d=1&n=true&dm=true&o=true).
163
-
164
- :::
165
- `,
163
+ :::`,
166
164
  categories: ['program-update'],
167
165
  features: {
168
166
  requireConfig: false,
@@ -0,0 +1,78 @@
1
+ import cache from '@/utils/cache';
2
+ import { API_URL } from './constant';
3
+ import type { DutiesPartyDetail, FreeCompanyPartyDetail, NoviceNetworkParty, PostDetail, Resently, UserDynamic, UserInfo, UserPost } from './types';
4
+ import { requestAPI } from './utils';
5
+
6
+ // 获取用户游戏近况
7
+ export const getResently = async (uid: string) => await requestAPI<Resently[]>(`${API_URL}/home/userInfo/getResently?uuid=${uid}`);
8
+
9
+ // 获取用户信息
10
+ export const getUserInfo = async (uid: string) => await requestAPI<UserInfo>(`${API_URL}/home/userInfo/getUserInfo?uuid=${uid}`);
11
+
12
+ // 获取用户帖子
13
+ export const getUserPosts = async (uid: string, type: 1 | 2) =>
14
+ await requestAPI<{
15
+ rows: UserPost[];
16
+ }>(`${API_URL}/home/userInfo/getUserPosts?uuid=${uid}&type=${type}`).then((res) => res.rows);
17
+
18
+ // 获取用户动态
19
+ export const getUserDynamic = async (uid: string) =>
20
+ await requestAPI<{
21
+ rows: UserDynamic[];
22
+ }>(`${API_URL}/home/userInfo/getUserDynamic?uuid=${uid}`).then((res) => res.rows);
23
+
24
+ // 获取帖子详情
25
+ export async function getPostsDetail(postID: string) {
26
+ try {
27
+ return await cache.tryGet(`sdo/ff14risingstones/post-detail:${postID}`, async () => await requestAPI<PostDetail>(`${API_URL}/home/posts/postsDetail?id=${postID}`));
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
32
+
33
+ // 获取导芽招募详情
34
+ export async function getNoviceNetworkRecruitDetail(recruitID: number) {
35
+ try {
36
+ return await cache.tryGet(`sdo/ff14risingstones/novice-network-recruit-detail:${recruitID}`, async () => await requestAPI<NoviceNetworkParty>(`${API_URL}/home/recruit/getNeDetail?id=${recruitID}`));
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+
42
+ // 获取副本招募详情
43
+ export async function getDutiesRecruitDetail(recruitID: number) {
44
+ try {
45
+ return await cache.tryGet(`sdo/ff14risingstones/duties-recruit-detail:${recruitID}`, async () => await requestAPI<DutiesPartyDetail>(`${API_URL}/home/recruit/getRecruitFbDetail?id=${recruitID}`));
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ // 获取部队招募详情
52
+ export async function getFreeCompanyRecruitDetail(recruitID: number) {
53
+ try {
54
+ return await cache.tryGet(`sdo/ff14risingstones/free-company-recruit-detail:${recruitID}`, async () => await requestAPI<FreeCompanyPartyDetail>(`${API_URL}/home/recruit/getRecruitGuildDetail?id=${recruitID}`));
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+
60
+ // 获取帖文列表
61
+ export async function getPosts(params: { type: 1 | 2; is_top?: 0 | 1; is_refine?: 0 | 1; limit?: number | string; order?: string; hotType?: string; part_id?: string }) {
62
+ const searchParams = new URLSearchParams();
63
+ for (const [key, value] of Object.entries(params)) {
64
+ if (value !== undefined) {
65
+ searchParams.set(key, value.toString());
66
+ }
67
+ }
68
+
69
+ return await requestAPI<{
70
+ rows: UserPost[];
71
+ }>(`${API_URL}/home/posts/postsList?${searchParams.toString()}`).then((res) => res.rows);
72
+ }
73
+
74
+ // 获取用户关注动态
75
+ export const getFollowDynamicList = async (limit: number | string) =>
76
+ await requestAPI<{
77
+ rows: UserDynamic[];
78
+ }>(`${API_URL}/home/dynamic/getFollowDynamicList?limit=${limit}`).then((res) => res.rows);