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,9 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '经济观察网',
5
+ url: 'eeo.com.cn',
6
+ categories: ['finance'],
7
+ description: '',
8
+ lang: 'zh-CN',
9
+ };
@@ -0,0 +1,7 @@
1
+ {{ if intro }}
2
+ <blockquote>{{ intro }}</blockquote>
3
+ {{ /if }}
4
+
5
+ {{ if description }}
6
+ {{@ description }}
7
+ {{ /if }}
@@ -29,8 +29,8 @@ function ehgot(url) {
29
29
  function ehgot_thumb(cache, thumb_url) {
30
30
  return cache.tryGet(thumb_url, async () => {
31
31
  try {
32
- const buffer = await got({ method: 'get', url: thumb_url, headers });
33
- const data = new Buffer.from(buffer.rawBody).toString('base64');
32
+ const buffer = await got({ method: 'get', responseType: 'buffer', url: thumb_url, headers });
33
+ const data = buffer.body.toString('base64');
34
34
  const ext = path.extname(thumb_url).slice(1);
35
35
  return `data:image/${ext};base64,${data}`;
36
36
  } catch (error) {
@@ -72,7 +72,7 @@ async function parsePage(cache, data, get_bittorrent = false, embed_thumb = fals
72
72
 
73
73
  async function parseElement(cache, element) {
74
74
  const el = $(element);
75
- const title = el.find('div.glink').html();
75
+ const title = el.find('.glink').html();
76
76
  const rawDate = el.find('div[id^="posted_"]').text();
77
77
  const pubDate = rawDate ? timezone(rawDate, 0) : rawDate;
78
78
  let el_a;
@@ -20,6 +20,7 @@ export const route: Route = {
20
20
  supportBT: true,
21
21
  supportPodcast: false,
22
22
  supportScihub: false,
23
+ nsfw: true,
23
24
  },
24
25
  name: 'Favorites',
25
26
  maintainers: ['yindaheng98', 'syrinka'],
@@ -14,6 +14,7 @@ export const route: Route = {
14
14
  supportBT: true,
15
15
  supportPodcast: false,
16
16
  supportScihub: false,
17
+ nsfw: true,
17
18
  },
18
19
  name: 'Search',
19
20
  maintainers: ['yindaheng98', 'syrinka'],
@@ -0,0 +1,64 @@
1
+ import { Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
+ import { load } from 'cheerio';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import cache from '@/utils/cache';
6
+
7
+ export const route: Route = {
8
+ path: '/article/:atype',
9
+ categories: ['programming'],
10
+ example: '/elecfans/article/special',
11
+ parameters: { atype: '需获取文章的类别' },
12
+ features: {
13
+ requireConfig: false,
14
+ requirePuppeteer: false,
15
+ antiCrawler: false,
16
+ supportBT: false,
17
+ supportPodcast: false,
18
+ supportScihub: false,
19
+ },
20
+ name: '文章',
21
+ radar: [
22
+ {
23
+ source: ['www.elecfans.com'],
24
+ },
25
+ ],
26
+ maintainers: ['tian051011'],
27
+ handler: async (ctx) => {
28
+ const { atype } = ctx.req.param();
29
+ const response = await ofetch(`https://www.elecfans.com/article/${atype}/`);
30
+ const $ = load(response);
31
+ const list = $('#mainContent li')
32
+ .toArray()
33
+ .map((item) => {
34
+ item = $(item);
35
+ const a = item.find('a').eq(1);
36
+ return {
37
+ title: a.text(),
38
+ link: String(a.attr('href')),
39
+ };
40
+ });
41
+ const items = await Promise.all(
42
+ list.map((item) =>
43
+ cache.tryGet(item.link, async () => {
44
+ const response = await ofetch(item.link);
45
+ const $ = load(response);
46
+
47
+ item.pubDate = parseDate($('.article-info .time').first().text());
48
+ item.author = $('.article-info a').first().text();
49
+ item.description = $('.rticle-content .simditor-body').first().html();
50
+ item.category = $('.hot-main li > span')
51
+ .toArray()
52
+ .map((item) => $(item).text().trim());
53
+
54
+ return item;
55
+ })
56
+ )
57
+ );
58
+ return {
59
+ title: `elecfans ${atype} articles`,
60
+ link: `https://www.elecfans.com/article/${atype}/`,
61
+ item: items,
62
+ };
63
+ },
64
+ };
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '电子发烧友',
5
+ url: 'www.elecfans.com',
6
+ lang: 'zh-CN',
7
+ };
@@ -0,0 +1,69 @@
1
+ import { Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
+ import { load } from 'cheerio';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import cache from '@/utils/cache';
6
+
7
+ export const route: Route = {
8
+ path: '/soft/:atype',
9
+ categories: ['programming'],
10
+ example: '/elecfans/soft/special',
11
+ parameters: { atype: '需获取资料的类别' },
12
+ features: {
13
+ requireConfig: false,
14
+ requirePuppeteer: false,
15
+ antiCrawler: false,
16
+ supportBT: false,
17
+ supportPodcast: false,
18
+ supportScihub: false,
19
+ },
20
+ name: '资料',
21
+ radar: [
22
+ {
23
+ source: ['www.elecfans.com'],
24
+ },
25
+ ],
26
+ maintainers: ['tian051011'],
27
+ handler: async (ctx) => {
28
+ const { atype } = ctx.req.param();
29
+ const response = await ofetch(`https://www.elecfans.com/soft/${atype}/`);
30
+ const $ = load(response);
31
+ const list = $('#mainContent li')
32
+ .toArray()
33
+ .map((item) => {
34
+ item = $(item);
35
+ const a = item.find('a').eq(1);
36
+ return {
37
+ title: a.text(),
38
+ link: String(a.attr('href')),
39
+ };
40
+ });
41
+ const items = await Promise.all(
42
+ list.map((item) =>
43
+ cache.tryGet(item.link, async () => {
44
+ const response = await ofetch(item.link);
45
+ const $ = load(response);
46
+
47
+ item.pubDate = parseDate($('.data-info-content2021 .upload-date').eq(1).text());
48
+ const mid = $('#filed_mid2021').first().text();
49
+ const userInfoApi = `https://www.elecfans.com/webapi/user/getSoftUserInfo?mid=${mid}`;
50
+ item.author = await cache.tryGet(userInfoApi, async () => {
51
+ const userResponse = await ofetch(userInfoApi);
52
+ return userResponse.data.uname;
53
+ });
54
+ item.description = $('.simditor-body').first().html();
55
+ item.category = $('.nTags a > span')
56
+ .toArray()
57
+ .map((item) => $(item).text().trim());
58
+
59
+ return item;
60
+ })
61
+ )
62
+ );
63
+ return {
64
+ title: `elecfans ${atype} softs`,
65
+ link: `https://www.elecfans.com/soft/${atype}/`,
66
+ item: items,
67
+ };
68
+ },
69
+ };
@@ -0,0 +1,8 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Engineering.fyi',
5
+ url: 'engineering.fyi',
6
+ description: 'Programming Tutorials and Engineering Articles',
7
+ lang: 'en',
8
+ };
@@ -0,0 +1,55 @@
1
+ import { Route } from '@/types';
2
+ import got from '@/utils/got';
3
+ import { load } from 'cheerio';
4
+
5
+ export const route: Route = {
6
+ path: '/tag/:tag',
7
+ categories: ['programming'],
8
+ example: '/engineering/tag/javascript',
9
+ parameters: { tag: 'Browse programming languages, frameworks, and technologies' },
10
+ features: {
11
+ requireConfig: false,
12
+ requirePuppeteer: false,
13
+ antiCrawler: false,
14
+ supportBT: false,
15
+ supportPodcast: false,
16
+ supportScihub: false,
17
+ },
18
+ radar: [
19
+ {
20
+ source: ['engineering.fyi/tag/:tag'],
21
+ },
22
+ ],
23
+ name: 'Tag',
24
+ maintainers: ['suhang-only'],
25
+ handler,
26
+ description: `| JSON | Javascript | Java | Apache | AWS | SQL | React | Golang |
27
+ | ---- | ---------- | ---- | ------ | --- | --- | ----- | ------ |
28
+ | json | javascript | java | apache | aws | sql | react | golang |`,
29
+ };
30
+
31
+ async function handler(ctx) {
32
+ const tag = ctx.req.param('tag');
33
+ const { data: response } = await got(`https://engineering.fyi/tag/${tag}`);
34
+ const $ = load(response);
35
+ const items = $('div.text-card-foreground')
36
+ .toArray()
37
+ .map((item) => {
38
+ item = $(item);
39
+ const a = item.find('a').eq(2);
40
+ const description = item.find('.leading-relaxed');
41
+ const author = item.find('.truncate');
42
+ return {
43
+ title: a.text(),
44
+ link: a.attr('href'),
45
+ description: description.text(),
46
+ author: author.text(),
47
+ };
48
+ });
49
+
50
+ return {
51
+ title: `engineering.fyi ${tag}`,
52
+ link: `https://engineering.fyi/tag/${tag}`,
53
+ item: items,
54
+ };
55
+ }
@@ -0,0 +1,152 @@
1
+ import type { Data, DataItem, Route } from '@/types';
2
+ import { toTitleCase } from '@/utils/common-utils';
3
+ import ofetch from '@/utils/ofetch';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import { load } from 'cheerio';
6
+ import type { Context } from 'hono';
7
+
8
+ export const route: Route = {
9
+ path: '/:region/:eventType?/:includePromoted?',
10
+ categories: ['other'],
11
+ example: '/eventbrite/canada--toronto/all-events',
12
+ parameters: { eventType: 'category of events for filtering', region: 'Region or scope of events' },
13
+ features: {
14
+ requireConfig: false,
15
+ requirePuppeteer: false,
16
+ antiCrawler: false,
17
+ supportBT: false,
18
+ supportPodcast: false,
19
+ supportScihub: false,
20
+ },
21
+ radar: [
22
+ {
23
+ source: ['eventbrite.com/d/:region/:eventType'],
24
+ target: '/:region/:eventType',
25
+ },
26
+ {
27
+ source: ['eventbrite.ca/d/:region/:eventType'],
28
+ target: '/:region/:eventType',
29
+ },
30
+ ],
31
+ name: 'Events',
32
+ maintainers: ['elibroftw'],
33
+ handler: async (ctx: Context): Promise<Data> => {
34
+ const params = ctx.req.param();
35
+ const { region, includePromoted = 'false' } = params;
36
+ let eventType = params.eventType || 'all-events';
37
+ if (eventType === 'events') {
38
+ eventType = 'all-events';
39
+ }
40
+ const link = `https://www.eventbrite.com/d/${region}/${eventType}/`;
41
+ const response = await ofetch(link);
42
+ const $ = load(response);
43
+ const eventsApiUrl = new URL('https://www.eventbrite.com/api/v3/destination/events');
44
+ // exclude promoted events
45
+ const includePromotedBool = includePromoted !== 'false';
46
+ const eventListEl = $('div.search-results-panel-content section>ul>li')
47
+ .toArray()
48
+ .filter((item) => includePromotedBool || !$(item).text().includes('Promoted'));
49
+ const eventIds = eventListEl.map((item) => $(item).find('a.event-card-link').first().attr('data-event-id'));
50
+ eventsApiUrl.searchParams.append('event_ids', eventIds.join(','));
51
+ eventsApiUrl.searchParams.append('page_size', eventIds.length.toString());
52
+ eventsApiUrl.searchParams.append('expand', 'image,primary_venue,ticket_availability,primary_organizer');
53
+ const eventsData: EventbriteEvent[] = (await ofetch(eventsApiUrl.href)).events;
54
+ const items = eventListEl.map((item, index): DataItem => {
55
+ const el = $(item);
56
+ const a = el.find('.event-card-details a.event-card-link').first();
57
+ const fallbackTitle = a.attr('aria-label') || a.text() || a.html();
58
+
59
+ const eventData = eventsData[index];
60
+ if (eventData === undefined) {
61
+ const pElements = el.find('p');
62
+ return {
63
+ title: fallbackTitle,
64
+ author: pElements.length > 1 ? $(pElements[1]).text() : undefined,
65
+ };
66
+ }
67
+ const isPromoted = el.text().includes('Promoted');
68
+ return {
69
+ title: isPromoted ? `${eventData.name} (Promoted)` : eventData.name,
70
+ link: eventData.url,
71
+ pubDate: parseDate(eventData.published),
72
+ author: eventData.primary_organizer === undefined ? JSON.stringify(eventData) : eventData.primary_organizer.name,
73
+ category: eventData.tags.map((tag) => tag.display_name),
74
+ image: eventData.image.original.url,
75
+ description: eventData.summary,
76
+ id: eventData.eventbrite_event_id,
77
+ content: {
78
+ html: `${eventDate(eventData)}<br>${getAuthor(eventData)}<br>${getTicketPriceRange(eventData)}`,
79
+ text: '',
80
+ },
81
+ };
82
+ });
83
+
84
+ const formattedEventType = toTitleCase(eventType.replaceAll('-', ' '));
85
+ const formattedRegion = toTitleCase(region.replaceAll('-', ' '));
86
+
87
+ return {
88
+ title: `${formattedEventType} in ${formattedRegion}`,
89
+ link,
90
+ item: items,
91
+ };
92
+ },
93
+ };
94
+
95
+ function getAuthor(event: EventbriteEvent) {
96
+ return `<a href="${event.primary_organizer.url}">${event.primary_organizer.name}</a>`;
97
+ }
98
+
99
+ function getTicketPriceRange(event: EventbriteEvent) {
100
+ const minPrice = event.ticket_availability.minimum_ticket_price.display;
101
+ const maxPrice = event.ticket_availability.maximum_ticket_price.display;
102
+ if (minPrice === maxPrice) {
103
+ return minPrice;
104
+ }
105
+ return `${minPrice} - ${maxPrice}`;
106
+ }
107
+
108
+ function eventDate(event: EventbriteEvent): string {
109
+ const endDate = event.end_date;
110
+ const startDate = event.start_date;
111
+ const startTime = event.start_time;
112
+ const endTime = event.end_time;
113
+ if (startDate === endDate) {
114
+ return `${startDate} ${startTime} - ${endTime}`;
115
+ }
116
+ return `${startDate} ${startTime} - ${endDate} ${endTime}`;
117
+ }
118
+
119
+ interface EventbriteEvent {
120
+ name: string;
121
+ url: string;
122
+ published: string;
123
+ primary_organizer: {
124
+ name: string;
125
+ url: string;
126
+ };
127
+ summary: string;
128
+ tags: {
129
+ display_name: string;
130
+ }[];
131
+ image: {
132
+ url: string;
133
+ original: {
134
+ url: string;
135
+ };
136
+ };
137
+ eventbrite_event_id: string;
138
+ ticket_availability: {
139
+ maximum_ticket_price: {
140
+ display: string;
141
+ };
142
+ minimum_ticket_price: {
143
+ display: string;
144
+ };
145
+ is_free: boolean;
146
+ };
147
+ timezone: string;
148
+ start_date: string;
149
+ start_time: string;
150
+ end_date: string;
151
+ end_time: string;
152
+ }
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Eventbrite',
5
+ url: 'eventbrite.com',
6
+ lang: 'en',
7
+ };
@@ -1,5 +1,6 @@
1
- import { Route, ViewType } from '@/types';
2
- import got from '@/utils/got';
1
+ import { type DataItem, type Route, ViewType } from '@/types';
2
+ import type { Context } from 'hono';
3
+ import ofetch from '@/utils/ofetch';
3
4
  import { load } from 'cheerio';
4
5
 
5
6
  const dateStringRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
@@ -9,8 +10,8 @@ const timeStringRegexes = [
9
10
  /開場 (?<openHr>\d{2}):(?<openMin>\d{2}) 開演 - 終演 (?<closeHr>\d{2}):(?<closeMin>\d{2})/,
10
11
  ];
11
12
 
12
- const maxPages = 5;
13
- const pageCount = 10;
13
+ const maxPages = 3;
14
+ const pageCount = 20;
14
15
 
15
16
  export const route: Route = {
16
17
  path: '/actors/:name/:id',
@@ -28,7 +29,7 @@ export const route: Route = {
28
29
  },
29
30
  radar: [
30
31
  {
31
- source: ['www.eventernote.com/actors/:name/:id/events'],
32
+ source: ['www.eventernote.com/actors/:name/:id', 'www.eventernote.com/actors/:name/:id/events'],
32
33
  },
33
34
  ],
34
35
  name: '声优活动及演唱会',
@@ -36,90 +37,86 @@ export const route: Route = {
36
37
  handler,
37
38
  };
38
39
 
39
- async function handler(ctx) {
40
+ async function handler(ctx: Context) {
40
41
  const { name, id } = ctx.req.param();
41
42
 
42
43
  const title = `${name}のイベント・ライブ情報一覧`;
43
44
  const link = `https://www.eventernote.com/actors/${name}/${id}/events`;
44
45
 
45
- const events = [];
46
- for (let page = 1; page <= maxPages; page++) {
47
- const pageLink = link + `?limit=${pageCount}&page=${page}`;
48
- // eslint-disable-next-line no-await-in-loop
49
- const response = await got({
50
- method: 'get',
51
- url: pageLink,
52
- });
46
+ const pageLinks = Array.from({ length: maxPages }, (_, i) => link + `?limit=${pageCount}&page=${i + 1}`);
47
+ const responses = await Promise.all(pageLinks.map((pageUrl) => ofetch(pageUrl)));
53
48
 
54
- const data = response.data;
55
-
56
- const $ = load(data);
49
+ const events = responses.flatMap((response) => {
50
+ const $ = load(response);
57
51
  const list = $('li.clearfix');
58
52
 
59
53
  if (list.length === 0) {
60
- break;
54
+ return [] as DataItem[];
61
55
  }
62
56
 
63
- for (const event of list) {
64
- // extract event name
65
- const eventName = $('div.event > h4 > a', event).text();
66
-
67
- // extract event location
68
- const eventLocation = $('div.event > div.place > a', event).text();
69
-
70
- // extract event date
71
- const dateMatches = $('div.date > p', event).text().match(dateStringRegex);
72
- const eventYear = dateMatches.groups.year;
73
- const eventMonth = dateMatches.groups.month;
74
- const eventDay = dateMatches.groups.day;
75
-
76
- // extract event time
77
- const timeString = $('div.event > div.place > span.s', event).text();
78
- let eventTimeObj = {
79
- openHr: null,
80
- openMin: null,
81
- startHr: null,
82
- startMin: null,
83
- closeHr: null,
84
- closeMin: null,
85
- };
86
- for (const r of timeStringRegexes) {
87
- const m = timeString.match(r);
88
- if (m === null) {
89
- continue;
90
- }
91
- eventTimeObj = {
92
- ...eventTimeObj,
93
- ...m.groups,
57
+ const pageItems = list
58
+ .toArray()
59
+ .map((event) => {
60
+ // extract event name
61
+ const eventName = $('div.event > h4 > a', event).text();
62
+
63
+ // extract event location
64
+ const eventLocation = $('div.event > div.place > a', event).text();
65
+
66
+ // extract event date
67
+ const dateMatches = $('div.date > p', event).text().match(dateStringRegex);
68
+ const eventYear = dateMatches?.groups?.year;
69
+ const eventMonth = dateMatches?.groups?.month;
70
+ const eventDay = dateMatches?.groups?.day;
71
+
72
+ // extract event time
73
+ const timeString = $('div.event > div.place > span.s', event).text();
74
+ let eventTimeObj = {
75
+ openHr: null,
76
+ openMin: null,
77
+ startHr: null,
78
+ startMin: null,
79
+ closeHr: null,
80
+ closeMin: null,
94
81
  };
95
- }
82
+ for (const r of timeStringRegexes) {
83
+ const m = timeString.match(r);
84
+ if (m === null) {
85
+ continue;
86
+ }
87
+ eventTimeObj = {
88
+ ...eventTimeObj,
89
+ ...m.groups,
90
+ };
91
+ }
96
92
 
97
- // extract event link
98
- const link = $('div.event > h4 > a', event).attr('href');
93
+ // extract event link
94
+ const link = $('div.event > h4 > a', event).attr('href');
99
95
 
100
- // compute event description
101
- const eventDescription = `イベント ${eventName}
96
+ // compute event description
97
+ const eventDescription = `イベント ${eventName}
102
98
  開催場所 ${eventLocation}
103
99
  開場 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.openHr}:${eventTimeObj.openMin}
104
100
  開演 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.startHr}:${eventTimeObj.startMin}
105
- 終演 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.closeHr}:${eventTimeObj.closeHr}
101
+ 終演 ${eventYear}-${eventMonth}-${eventDay} ${eventTimeObj.closeHr}:${eventTimeObj.closeMin}
106
102
  `;
107
103
 
108
- events.push({
109
- title: eventName,
110
- description: eventDescription,
111
- link,
112
- });
113
- }
104
+ return {
105
+ title: eventName,
106
+ description: eventDescription,
107
+ link,
108
+ } as DataItem;
109
+ })
110
+ .filter(Boolean) as DataItem[];
114
111
 
115
- page += 1;
116
- }
112
+ return pageItems;
113
+ });
117
114
 
118
115
  return {
119
116
  title,
120
117
  link,
121
118
  description: title,
122
- language: 'ja',
119
+ language: 'ja' as const,
123
120
  allowEmpty: true,
124
121
  item: events,
125
122
  };
@@ -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
  {
@@ -17,6 +17,7 @@ export const route: Route = {
17
17
  supportBT: false,
18
18
  supportPodcast: false,
19
19
  supportScihub: false,
20
+ nsfw: true,
20
21
  },
21
22
  radar: [
22
23
  {
@@ -17,6 +17,7 @@ export const route: Route = {
17
17
  supportBT: false,
18
18
  supportPodcast: false,
19
19
  supportScihub: false,
20
+ nsfw: true,
20
21
  },
21
22
  name: 'Search',
22
23
  maintainers: ['KTachibanaM', 'AiraNadih'],
@@ -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
  {
@@ -164,7 +164,7 @@ export const route: Route = {
164
164
  ],
165
165
  },
166
166
  },
167
- description: `:::tip
167
+ description: `::: tip
168
168
  To subscribe to [Daily News](https://www.expats.cz/czech-news/daily-news), where the source URL is \`https://www.expats.cz/czech-news/daily-news\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/expats/czech-news/daily-news\`](https://rsshub.app/expats/czech-news/daily-news).
169
169
  :::
170
170
 
@@ -175,7 +175,7 @@ export const route: Route = {
175
175
  ],
176
176
  },
177
177
  },
178
- description: `:::tip
178
+ description: `::: tip
179
179
  若订阅 [列表](https://www.fangchan.com/),网址为 \`https://www.fangchan.com/\`,请截取 \`https://www.fangchan.com/\` 到末尾 \`.html\` 的部分 \`datalist\` 作为 \`id\` 参数填入,此时目标路由为 [\`/fangchan/datalist\`](https://rsshub.app/fangchan/datalist)。
180
180
  :::
181
181
 
@@ -14,6 +14,7 @@ export const route: Route = {
14
14
  supportBT: false,
15
15
  supportPodcast: false,
16
16
  supportScihub: false,
17
+ nsfw: true,
17
18
  },
18
19
  radar: [
19
20
  {