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,189 @@
1
+ import { type Data, type DataItem, type Route, ViewType } from '@/types';
2
+
3
+ import ofetch from '@/utils/ofetch';
4
+ import { parseDate } from '@/utils/parse-date';
5
+
6
+ import { type CheerioAPI, load } from 'cheerio';
7
+ import { type Context } from 'hono';
8
+
9
+ export const handler = async (ctx: Context): Promise<Data> => {
10
+ const { category } = ctx.req.param();
11
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '100', 10);
12
+
13
+ const apiSlug = 'wp-json/wp/v2';
14
+ const baseUrl: string = 'https://60s.aa1.cn';
15
+
16
+ const apiUrl = new URL(`${apiSlug}/posts`, baseUrl).href;
17
+ const apiSearchUrl = new URL(`${apiSlug}/categories`, baseUrl).href;
18
+
19
+ const searchResponse = await ofetch(apiSearchUrl, {
20
+ query: {
21
+ search: category,
22
+ },
23
+ });
24
+
25
+ const categoryObj = searchResponse.find((c) => c.slug === category || c.name === category);
26
+ const categoryId: number | undefined = categoryObj?.id ?? undefined;
27
+ const categorySlug: string | undefined = categoryObj?.slug ?? undefined;
28
+
29
+ const response = await ofetch(apiUrl, {
30
+ query: {
31
+ _embed: 'true',
32
+ per_page: limit,
33
+ categories: categoryId,
34
+ },
35
+ });
36
+
37
+ const targetUrl: string = new URL(categorySlug ? `category/${categorySlug}` : '', baseUrl).href;
38
+
39
+ const targetResponse = await ofetch(targetUrl);
40
+ const $: CheerioAPI = load(targetResponse);
41
+ const language = $('html').attr('lang') ?? 'zh';
42
+
43
+ let items: DataItem[] = [];
44
+
45
+ items = response.slice(0, limit).map((item): DataItem => {
46
+ const title: string = item.title?.rendered ?? item.title;
47
+ const description: string | undefined = item.content.rendered;
48
+ const pubDate: number | string = item.date_gmt;
49
+ const linkUrl: string | undefined = item.link;
50
+
51
+ const terminologies = item._embedded?.['wp:term'];
52
+
53
+ const categories: string[] = terminologies?.flat().map((c) => c.name) ?? [];
54
+ const authors: DataItem['author'] =
55
+ item._embedded?.author.map((author) => ({
56
+ name: author.name,
57
+ url: author.link,
58
+ avatar: author.avatar_urls?.['96'] ?? author.avatar_urls?.['48'] ?? author.avatar_urls?.['24'] ?? undefined,
59
+ })) ?? [];
60
+ const guid: string = item.guid?.rendered ?? item.guid;
61
+ const image: string | undefined = item._embedded?.['wp:featuredmedia']?.[0].source_url ?? undefined;
62
+ const updated: number | string = item.modified_gmt ?? pubDate;
63
+
64
+ const processedItem: DataItem = {
65
+ title,
66
+ description,
67
+ pubDate: pubDate ? parseDate(pubDate) : undefined,
68
+ link: linkUrl ?? guid,
69
+ category: categories,
70
+ author: authors,
71
+ guid,
72
+ id: guid,
73
+ content: {
74
+ html: description,
75
+ text: description,
76
+ },
77
+ image,
78
+ banner: image,
79
+ updated: updated ? parseDate(updated) : undefined,
80
+ language,
81
+ };
82
+
83
+ return processedItem;
84
+ });
85
+
86
+ const title: string = $('title').text();
87
+
88
+ return {
89
+ title,
90
+ description: $('meta[name="description"]').attr('content'),
91
+ link: targetUrl,
92
+ item: items,
93
+ allowEmpty: true,
94
+ image: $('header#header-div img').attr('src'),
95
+ author: title.split(/-/).pop(),
96
+ language,
97
+ id: targetUrl,
98
+ };
99
+ };
100
+
101
+ export const route: Route = {
102
+ path: '/60s/:category?',
103
+ name: '每日新闻',
104
+ url: '60s.aa1.cn',
105
+ maintainers: ['nczitzk'],
106
+ handler,
107
+ example: '/aa1/60s/news',
108
+ parameters: {
109
+ category: {
110
+ description: '分类,默认为全部,可在对应分类页 URL 中找到',
111
+ options: [
112
+ {
113
+ label: '全部',
114
+ value: '',
115
+ },
116
+ {
117
+ label: '新闻词文章数据',
118
+ value: 'freenewsdata',
119
+ },
120
+ {
121
+ label: '最新',
122
+ value: 'new',
123
+ },
124
+ {
125
+ label: '本平台同款自动发文章插件',
126
+ value: '1',
127
+ },
128
+ {
129
+ label: '每天60秒读懂世界',
130
+ value: 'news',
131
+ },
132
+ ],
133
+ },
134
+ },
135
+ description: `::: tip
136
+ 订阅 [每天60秒读懂世界](https://60s.aa1.cn/category/news),其源网址为 \`https://60s.aa1.cn/category/news\`,请参考该 URL 指定部分构成参数,此时路由为 [\`/aa1/60s/news\`](https://rsshub.app/aa1/60s/news) 或 [\`/aa1/60s/每天60秒读懂世界\`](https://rsshub.app/aa1/60s/每天60秒读懂世界)。
137
+ :::
138
+
139
+ | 分类 | ID |
140
+ | ---------------------------------------------------------- | ------------------------------------------------------- |
141
+ | [全部](https://60s.aa1.cn) | [<空>](https://rsshub.app/aa1/60s) |
142
+ | [新闻词文章数据](https://60s.aa1.cn/category/freenewsdata) | [freenewsdata](https://rsshub.app/aa1/60s/freenewsdata) |
143
+ | [最新](https://60s.aa1.cn/category/new) | [new](https://rsshub.app/aa1/60s/new) |
144
+ | [本平台同款自动发文章插件](https://60s.aa1.cn/category/1) | [1](https://rsshub.app/aa1/60s/1) |
145
+ | [每天 60 秒读懂世界](https://60s.aa1.cn/category/news) | [news](https://rsshub.app/aa1/60s/news) |
146
+ `,
147
+ categories: ['new-media'],
148
+ features: {
149
+ requireConfig: false,
150
+ requirePuppeteer: false,
151
+ antiCrawler: false,
152
+ supportRadar: true,
153
+ supportBT: false,
154
+ supportPodcast: false,
155
+ supportScihub: false,
156
+ },
157
+ radar: [
158
+ {
159
+ source: ['60s.aa1.cn', '60s.aa1.cn/category/:category'],
160
+ target: '/60s/:category',
161
+ },
162
+ {
163
+ title: '全部',
164
+ source: ['60s.aa1.cn'],
165
+ target: '/60s',
166
+ },
167
+ {
168
+ title: '新闻词文章数据',
169
+ source: ['60s.aa1.cn/category/freenewsdata'],
170
+ target: '/60s/freenewsdata',
171
+ },
172
+ {
173
+ title: '最新',
174
+ source: ['60s.aa1.cn/category/new'],
175
+ target: '/60s/new',
176
+ },
177
+ {
178
+ title: '本平台同款自动发文章插件',
179
+ source: ['60s.aa1.cn/category/1'],
180
+ target: '/60s/1',
181
+ },
182
+ {
183
+ title: '每天60秒读懂世界',
184
+ source: ['60s.aa1.cn/category/news'],
185
+ target: '/60s/news',
186
+ },
187
+ ],
188
+ view: ViewType.Articles,
189
+ };
@@ -1,9 +1,9 @@
1
1
  import type { Namespace } from '@/types';
2
2
 
3
3
  export const namespace: Namespace = {
4
- name: '新华网',
5
- url: 'xinhuanet.com',
6
- categories: ['traditional-media'],
4
+ name: '夏柔',
5
+ url: 'aa1.cn',
6
+ categories: ['new-media'],
7
7
  description: '',
8
8
  lang: 'zh-CN',
9
9
  };
@@ -132,7 +132,7 @@ async function handler(ctx) {
132
132
  if (enclosureMatches) {
133
133
  const enclosureMatch = enclosureMatches
134
134
  .map((e) => e.match(new RegExp(enclosurePattern)))
135
- .sort((a, b) => Number.parseInt(a[2], 10) - Number.parseInt(b[2], 10))
135
+ .toSorted((a, b) => Number.parseInt(a[2], 10) - Number.parseInt(b[2], 10))
136
136
  .pop();
137
137
 
138
138
  item.enclosure_url = enclosureMatch[3];
@@ -16,6 +16,9 @@ export const route: Route = {
16
16
  maintainers: ['zhenhappy'],
17
17
  handler,
18
18
  url: 'ahhhhfs.com/',
19
+ features: {
20
+ nsfw: true,
21
+ },
19
22
  };
20
23
 
21
24
  async function handler(ctx) {
@@ -14,6 +14,9 @@ export const route: Route = {
14
14
  maintainers: ['zhenhappy'],
15
15
  handler,
16
16
  url: 'ahhhhfs.com/',
17
+ features: {
18
+ nsfw: true,
19
+ },
17
20
  };
18
21
 
19
22
  async function handler(ctx) {
@@ -0,0 +1,6 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'ACG Vinyl - 黑胶',
5
+ url: 'www.acgvinyl.com',
6
+ };
@@ -0,0 +1,86 @@
1
+ import { Route } from '@/types';
2
+ import cache from '@/utils/cache';
3
+ import ofetch from '@/utils/ofetch';
4
+ import { load } from 'cheerio';
5
+ import { parseDate } from '@/utils/parse-date';
6
+
7
+ export const route: Route = {
8
+ path: '/news',
9
+ categories: ['anime'],
10
+ example: '/news',
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.acgvinyl.com'],
22
+ target: '/news',
23
+ },
24
+ ],
25
+ name: 'News',
26
+ maintainers: ['williamgateszhao'],
27
+ handler,
28
+ url: 'www.acgvinyl.com/col.jsp?id=103',
29
+ zh: {
30
+ name: '黑胶新闻',
31
+ },
32
+ };
33
+
34
+ async function handler(ctx) {
35
+ const rootUrl = 'http://www.acgvinyl.com';
36
+
37
+ const newsIndexResponse = await ofetch(`${rootUrl}/col.jsp?id=103`);
38
+ const $ = load(newsIndexResponse);
39
+ const newsIndexJsonText = $('script:contains("window.__INITIAL_STATE__")').text().replaceAll('window.__INITIAL_STATE__=', '');
40
+ const newsIndexJson = JSON.parse(newsIndexJsonText);
41
+
42
+ const newsListResponse = await ofetch(`${rootUrl}/rajax/news_h.jsp?cmd=getWafNotCk_getList`, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'content-type': 'application/x-www-form-urlencoded',
46
+ },
47
+ body: new URLSearchParams({
48
+ page: '1',
49
+ pageSize: String(ctx.req.query('limit') ?? 20),
50
+ fromMid: newsIndexJson.modules.module366.id,
51
+ idList: `[${newsIndexJson.modules.module366.prop3}]`,
52
+ sortKey: newsIndexJson.modules.module366.blob0.sortKey,
53
+ sortType: newsIndexJson.modules.module366.blob0.sortType,
54
+ }).toString(),
55
+ });
56
+ const list = JSON.parse(newsListResponse);
57
+
58
+ if (!list?.success || !Array.isArray(list?.list)) {
59
+ return null;
60
+ }
61
+
62
+ const items = await Promise.all(
63
+ list.list.map((item) =>
64
+ cache.tryGet(item.url, async () => {
65
+ const detailResponse = await ofetch(`${rootUrl}${item.url}`);
66
+ const $ = load(detailResponse);
67
+ const detailJsonText = $('script:contains("window.__INITIAL_STATE__")').text().replaceAll('window.__INITIAL_STATE__=', '');
68
+ const detailJson = JSON.parse(detailJsonText);
69
+ const detail = load(detailJson.modules.module2.newsInfo.content);
70
+ detail('[style]').removeAttr('style');
71
+ return {
72
+ title: item.title,
73
+ link: `${rootUrl}${item.url}`,
74
+ pubDate: parseDate(item.date),
75
+ description: detail.html(),
76
+ };
77
+ })
78
+ )
79
+ );
80
+
81
+ return {
82
+ title: 'ACG Vinyl - 黑胶 - 黑胶新闻',
83
+ link: 'http://www.acgvinyl.com/col.jsp?id=103',
84
+ item: items,
85
+ };
86
+ }
@@ -86,7 +86,7 @@ async function handler(ctx) {
86
86
  uniqueItems.push(item!);
87
87
  }
88
88
  }
89
- items = uniqueItems.sort((a, b) => b.pubDate - a.pubDate).slice(0, ctx.req.query('limit') || 20);
89
+ items = uniqueItems.toSorted((a, b) => b.pubDate - a.pubDate).slice(0, ctx.req.query('limit') || 20);
90
90
 
91
91
  items = await Promise.all(
92
92
  items.map((item) =>
@@ -270,11 +270,10 @@ export const route: Route = {
270
270
  description: 'Search Params',
271
271
  },
272
272
  },
273
- description: `:::tip
273
+ description: `::: tip
274
274
  If you subscribe to [Updated watch faces for Amazfit X](https://amazfitwatchfaces.com/amazfit-x/updated),where the URL is \`https://amazfitwatchfaces.com/amazfit-x/updated\`, extract the part \`https://amazfitwatchfaces.com/\` to the end, which is \`amazfit-x/updated\`, and use it as the parameter to fill in. Therefore, the route will be [\`/amazfitwatchfaces/amazfit-x/updated\`](https://rsshub.app/amazfitwatchfaces/amazfit-x/updated).
275
275
 
276
276
  If you subscribe to [TOP for the last 6 months (Only new) - Xiaomi Smart Band 9](https://amazfitwatchfaces.com/mi-band/top?compatible=Smart_Band_9&topof=6months),where the URL is \`https://amazfitwatchfaces.com/mi-band/top?compatible=Smart_Band_9&topof=6months\`, extract the part \`https://amazfitwatchfaces.com/\` to the end, which is \`mi-band/top\`, and use it as the parameter to fill in. Therefore, the route will be [\`/amazfitwatchfaces/mi-band/top/compatible=Smart_Band_9&topof=6months\`](https://rsshub.app/amazfitwatchfaces/mi-band/top/compatible=Smart_Band_9&topof=6months).
277
-
278
277
  :::
279
278
 
280
279
  <details>
@@ -1,7 +1,7 @@
1
1
  import ofetch from '@/utils/ofetch';
2
2
  import { load } from 'cheerio';
3
3
  import cache from '@/utils/cache';
4
- import { Route } from '@/types';
4
+ import { DataItem, Route } from '@/types';
5
5
  import pMap from 'p-map';
6
6
 
7
7
  export const route: Route = {
@@ -20,18 +20,20 @@ export const route: Route = {
20
20
  url: 'www.anthropic.com/news',
21
21
  };
22
22
 
23
- async function handler() {
23
+ async function handler(ctx) {
24
24
  const link = 'https://www.anthropic.com/news';
25
25
  const response = await ofetch(link);
26
26
  const $ = load(response);
27
+ const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20;
27
28
 
28
- const list = $('.contentFadeUp a')
29
+ const list: DataItem[] = $('.contentFadeUp a')
29
30
  .toArray()
30
- .map((e) => {
31
- e = $(e);
32
- const title = e.find('h3[class^="PostCard_post-heading__"]').text().trim();
33
- const href = e.attr('href');
34
- const pubDate = e.find('div[class^="PostList_post-date__"]').text().trim();
31
+ .slice(0, limit)
32
+ .map((el) => {
33
+ const $el = $(el);
34
+ const title = $el.find('h3').text().trim();
35
+ const href = $el.attr('href') ?? '';
36
+ const pubDate = $el.find('p.detail-m.agate').text().trim() || $el.find('div[class^="PostList_post-date__"]').text().trim(); // legacy selector used roughly before Jan 2025
35
37
  const fullLink = href.startsWith('http') ? href : `https://www.anthropic.com${href}`;
36
38
  return {
37
39
  title,
@@ -43,8 +45,8 @@ async function handler() {
43
45
  const out = await pMap(
44
46
  list,
45
47
  (item) =>
46
- cache.tryGet(item.link, async () => {
47
- const response = await ofetch(item.link);
48
+ cache.tryGet(item.link!, async () => {
49
+ const response = await ofetch(item.link!);
48
50
  const $ = load(response);
49
51
 
50
52
  $('div[class^="PostDetail_b-social-share"]').remove();
@@ -61,7 +63,7 @@ async function handler() {
61
63
  }
62
64
  });
63
65
 
64
- item.description = content.html();
66
+ item.description = content.html() ?? undefined;
65
67
 
66
68
  return item;
67
69
  }),
@@ -81,7 +81,7 @@ async function handler(ctx) {
81
81
  }
82
82
  })
83
83
  .filter(Boolean)
84
- .sort((a, b) => b.pubDate - a.pubDate)
84
+ .toSorted((a, b) => b.pubDate - a.pubDate)
85
85
  .slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20);
86
86
 
87
87
  const items = ctx.req.query('fulltext') === 'true' ? await pMap(list, (item) => fetchArticle(item), { concurrency: 10 }) : list;
@@ -79,7 +79,7 @@ async function handler(ctx) {
79
79
  return res;
80
80
  })
81
81
  .filter((e) => Boolean(e.link) && !new URL(e.link).pathname.split('/').includes('hub'))
82
- .sort((a, b) => (a.pubDate && b.pubDate ? b.pubDate - a.pubDate : b.lastmod - a.lastmod))
82
+ .toSorted((a, b) => (a.pubDate && b.pubDate ? b.pubDate - a.pubDate : b.lastmod - a.lastmod))
83
83
  .slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20);
84
84
 
85
85
  const items = ctx.req.query('fulltext') === 'true' ? await pMap(list, (item) => fetchArticle(item), { concurrency: 20 }) : list;
@@ -130,7 +130,7 @@ export const route: Route = {
130
130
  ],
131
131
  },
132
132
  },
133
- description: `:::tip
133
+ description: `::: tip
134
134
  To subscribe to [Highlights](https://www.app-sales.net/highlights/), where the source URL is \`https://www.app-sales.net/highlights/\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/app-sales/highlights\`](https://rsshub.app/app-sales/highlights).
135
135
  :::
136
136
 
@@ -130,7 +130,7 @@ async function handler(ctx) {
130
130
  return {
131
131
  title: `${appName} ${item.versionDisplay} for ${p}`,
132
132
  link: currentUrl,
133
- description: item.releaseNotes?.replace(/\n/g, '<br>'),
133
+ description: item.releaseNotes?.replaceAll('\n', '<br>'),
134
134
  category: [p],
135
135
  guid: `apple/apps/${country}/${id}/${pid}#${item.versionDisplay}`,
136
136
  pubDate: parseDate(item.releaseTimestamp),
@@ -147,7 +147,7 @@ async function handler(ctx) {
147
147
  item: items,
148
148
  title: `${title} - Apple App Store`,
149
149
  link: currentUrl,
150
- description: description?.replace(/\n/g, ' '),
150
+ description: description?.replaceAll('\n', ' '),
151
151
  language: $('html').prop('lang'),
152
152
  image: $('meta[property="og:image"]').prop('content'),
153
153
  icon,
@@ -1,7 +1,9 @@
1
1
  import { Route } from '@/types';
2
- import got from '@/utils/got';
2
+ import ofetch from '@/utils/ofetch';
3
3
  import { load } from 'cheerio';
4
4
  import { parseDate } from '@/utils/parse-date';
5
+ import cache from '@/utils/cache';
6
+ import { config } from '@/config';
5
7
 
6
8
  export const route: Route = {
7
9
  path: '/podcast/:id/:region?',
@@ -21,7 +23,7 @@ export const route: Route = {
21
23
  },
22
24
  radar: [
23
25
  {
24
- source: ['podcasts.apple.com/:region/podcast/:id'],
26
+ source: ['podcasts.apple.com/:region/podcast/:showName/:id', 'podcasts.apple.com/:region/podcast/:id'],
25
27
  },
26
28
  ],
27
29
  name: '播客',
@@ -32,42 +34,73 @@ export const route: Route = {
32
34
 
33
35
  async function handler(ctx) {
34
36
  const { id, region } = ctx.req.param();
35
- const link = `https://podcasts.apple.com/${region || `cn`}/podcast/${id}`;
36
- const response = await got({
37
- method: 'get',
38
- url: link,
39
- });
37
+ const numericId = id.match(/id(\d+)/)?.[1];
38
+ const baseUrl = 'https://podcasts.apple.com';
39
+ const link = `${baseUrl}/${region || `cn`}/podcast/${id}`;
40
40
 
41
- const $ = load(response.data);
41
+ const response = await ofetch(link);
42
42
 
43
- const schemaShow = JSON.parse($(String.raw`#schema\:show`).text());
44
- const serializedServerData = JSON.parse($('#serialized-server-data').text());
43
+ const $ = load(response);
45
44
 
46
- const seoEpisodes = schemaShow.workExample;
47
- const originEpisodes = serializedServerData[0].data.shelves.find((item) => item.contentType === 'episode').items;
45
+ const serializedServerData = JSON.parse($('#serialized-server-data').text());
48
46
  const header = serializedServerData[0].data.shelves.find((item) => item.contentType === 'showHeaderRegular').items[0];
49
47
 
50
- const episodes = originEpisodes.map((item) => {
48
+ const bearerToken = await cache.tryGet(
49
+ 'apple:podcast:bearer',
50
+ async () => {
51
+ const moduleAddress = new URL($('head script[type="module"]').attr('src'), baseUrl).href;
52
+ const modulesResponse = await ofetch(moduleAddress, {
53
+ parseResponse: (txt) => txt,
54
+ });
55
+ const bearerToken = modulesResponse.match(/="(eyJhbGci.*?)",/)[1];
56
+
57
+ return bearerToken as string;
58
+ },
59
+ config.cache.contentExpire,
60
+ false
61
+ );
62
+
63
+ const episodeReponse = await ofetch(`https://amp-api.podcasts.apple.com/v1/catalog/us/podcasts/${numericId}/episodes`, {
64
+ query: {
65
+ 'extend[podcast-channels]': 'editorialArtwork,subscriptionArtwork,subscriptionOffers',
66
+ include: 'channel',
67
+ limit: 25,
68
+ with: 'entitlements',
69
+ l: 'en-US',
70
+ },
71
+ headers: {
72
+ Authorization: `Bearer ${bearerToken}`,
73
+ Origin: baseUrl,
74
+ },
75
+ });
76
+
77
+ const episodes = episodeReponse.data.map(({ attributes: item }) => {
51
78
  // Try to keep line breaks in the description
52
- const matchedSeoEpisode = seoEpisodes.find((seoEpisode) => seoEpisode.name === item.title) || null;
53
- const episodeDescription = (matchedSeoEpisode ? matchedSeoEpisode.description : item.summary).replaceAll('\n', '<br>');
79
+ const offer = item.offers[0];
54
80
 
55
81
  return {
56
- title: item.title,
57
- enclosure_url: item.playAction.episodeOffer.streamUrl,
58
- enclosure_type: 'audio/mp4',
59
- itunes_duration: item.duration,
60
- link: item.playAction.episodeOffer.storeUrl,
61
- pubDate: parseDate(item.releaseDate),
62
- description: episodeDescription,
82
+ title: item.name,
83
+ enclosure_url: item.assetUrl || offer.hlsUrl,
84
+ enclosure_type: item.assetUrl ? 'audio/mp4' : 'application/vnd.apple.mpegurl',
85
+ itunes_duration: (item.durationInMilliseconds || offer.durationInMilliseconds) / 1000,
86
+ link: item.url,
87
+ pubDate: parseDate(item.releaseDateTime),
88
+ description: item.description.standard.replaceAll('\n', '<br>'),
89
+ author: item.artistName,
90
+ itunes_item_image: item.artwork.url.replace(/\{w\}x\{h\}(?:\{c\}|bb)\.\{f\}/, '3000x3000bb.webp'),
91
+ category: item.genreNames,
63
92
  };
64
93
  });
65
94
 
95
+ const channel = episodeReponse.data.find((d) => d.type === 'podcast-episodes').relationships.channel.data.find((d) => d.type === 'podcast-channels')?.attributes;
96
+
66
97
  return {
67
- title: header.title,
68
- link: header.contextAction.podcastOffer.storeUrl,
98
+ title: channel?.name ?? header.title,
99
+ link: channel?.url ?? header.contextAction.podcastOffer.storeUrl,
69
100
  itunes_author: header.contextAction.podcastOffer.author,
70
101
  item: episodes,
71
- description: header.description.replaceAll('\n', ' '),
102
+ description: (header.description || channel?.description.standard)?.replaceAll('\n', ' '),
103
+ image: ((channel?.logoArtwork || channel?.subscriptionArtwork)?.url || header.contextAction.podcastOffer.artwork.template).replace(/\{w\}x\{h\}(?:\{c\}|bb)\.\{f\}/, '3000x3000bb.webp'),
104
+ itunes_category: header.metadata.find((d) => Object.hasOwn(d, 'category')).category?.title || header.metadata.find((d) => Object.hasOwn(d, 'category')).category,
72
105
  };
73
106
  }
@@ -133,7 +133,7 @@ export const route: Route = {
133
133
  description: 'Language, `en-us` by default',
134
134
  },
135
135
  },
136
- description: `:::tip
136
+ description: `::: tip
137
137
  To subscribe to [Apple security releases](https://support.apple.com/en-us/100100), where the source URL is \`https://support.apple.com/en-us/100100\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/apple/security-releases/en-us\`](https://rsshub.app/apple/security-releases/en-us).
138
138
  :::
139
139
  `,
@@ -171,7 +171,7 @@ To subscribe to [Apple security releases](https://support.apple.com/en-us/100100
171
171
  description: '语言,默认为 `en-us`,可在对应页 URL 中找到',
172
172
  },
173
173
  },
174
- description: `:::tip
174
+ description: `::: tip
175
175
  若订阅 [Apple 安全性发布](https://support.apple.com/zh-cn/100100),网址为 \`https://support.apple.com/zh-cn/100100\`,请截取 \`https://support.apple.com/\` 到末尾 \`/100100\` 的部分 \`zh-cn\` 作为 \`language\` 参数填入,此时目标路由为 [\`/apple/security-releases/zh-cn\`](https://rsshub.app/apple/security-releases/zh-cn)。
176
176
  :::
177
177
  `,
@@ -364,7 +364,7 @@ export const route: Route = {
364
364
  ],
365
365
  },
366
366
  },
367
- description: `:::tip
367
+ description: `::: tip
368
368
  若订阅 [橙](https://asiafruitchina.net/categories?gspx=chengzi),网址为 \`https://asiafruitchina.net/categories?gspx=chengzi\`,请截取 \`https://asiafruitchina.net/categories?gspx=\` 到末尾的部分 \`chengzi\` 作为 \`category\` 参数填入,此时目标路由为 [\`/asiafruitchina/categories/chengzi\`](https://rsshub.app/asiafruitchina/categories/chengzi)。
369
369
  :::
370
370
 
@@ -19,6 +19,9 @@ export const route: Route = {
19
19
  maintainers: [],
20
20
  handler,
21
21
  url: 'asiantolick.com/',
22
+ features: {
23
+ nsfw: true,
24
+ },
22
25
  };
23
26
 
24
27
  async function handler(ctx) {
@@ -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
  parameters: {
24
25
  order: '排序字段,默认按照资源的收录日期来排序,详见下表',
@@ -214,7 +214,7 @@ export const route: Route = {
214
214
  options: languageOptions,
215
215
  },
216
216
  },
217
- description: `:::tip
217
+ description: `::: tip
218
218
  To subscribe to [Bandizip Version History](https://www.bandisoft.com/bandizip/history/), where the source URL is \`https://www.bandisoft.com/bandizip/history/\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/bandisoft/history/bandizip\`](https://rsshub.app/bandisoft/history/bandizip).
219
219
  :::
220
220
 
@@ -289,7 +289,7 @@ To subscribe to [Bandizip Version History](https://www.bandisoft.com/bandizip/hi
289
289
  options: languageOptions,
290
290
  },
291
291
  },
292
- description: `:::tip
292
+ description: `::: tip
293
293
  若订阅 [Bandizip 更新记录](https://cn.bandisoft.com/bandizip/history/),网址为 \`https://cn.bandisoft.com/bandizip/history/\`,请截取 \`cn\` 作为 \`category\` 参数填入,此时目标路由为 [\`/bandisoft/:language?/:id?\`](https://rsshub.app/bandisoft/:language?/:id?)。
294
294
  :::
295
295
 
@@ -56,7 +56,7 @@ async function handler(ctx) {
56
56
  date: $el.children().first().find('small').children().remove().end().text().slice(3),
57
57
  };
58
58
  });
59
- const finalLatestReplies = [...latestReplies, ...latestSubReplies].sort((a, b) => (a.id < b.id ? 1 : -1));
59
+ const finalLatestReplies = [...latestReplies, ...latestSubReplies].toSorted((a, b) => (a.id < b.id ? 1 : -1));
60
60
 
61
61
  const postTopic = {
62
62
  title,