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,181 @@
1
+ import { type Data, type DataItem, type Route, ViewType } from '@/types';
2
+
3
+ import { art } from '@/utils/render';
4
+ import cache from '@/utils/cache';
5
+ import ofetch from '@/utils/ofetch';
6
+ import { parseDate } from '@/utils/parse-date';
7
+
8
+ import { type CheerioAPI, type Cheerio, load } from 'cheerio';
9
+ import type { Element } from 'domhandler';
10
+ import { type Context } from 'hono';
11
+ import path from 'node:path';
12
+
13
+ export const handler = async (ctx: Context): Promise<Data> => {
14
+ const { category = 'news' } = ctx.req.param();
15
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '7', 10);
16
+
17
+ const baseUrl: string = 'http://www.ccg.org.cn';
18
+ const targetUrl: string = new URL(category, baseUrl).href;
19
+
20
+ const response = await ofetch(targetUrl);
21
+ const $: CheerioAPI = load(response);
22
+ const language = $('html').attr('lang') ?? 'zh';
23
+
24
+ let items: DataItem[] = [];
25
+
26
+ items = $('ul.huodong-list li')
27
+ .slice(0, limit)
28
+ .toArray()
29
+ .map((el): Element => {
30
+ const $el: Cheerio<Element> = $(el);
31
+
32
+ const title: string = $el.find('h5').text();
33
+ const image: string | undefined = $el.find('div.huodong-img img').attr('src');
34
+ const description: string | undefined = art(path.join(__dirname, 'templates/description.art'), {
35
+ images: image
36
+ ? [
37
+ {
38
+ src: image,
39
+ alt: title,
40
+ },
41
+ ]
42
+ : undefined,
43
+ intro: $el.find('p').html(),
44
+ });
45
+ const pubDateStr: string | undefined = $el.find('span').text();
46
+ const linkUrl: string | undefined = $el.find('a').attr('href');
47
+ const upDatedStr: string | undefined = pubDateStr;
48
+
49
+ const processedItem: DataItem = {
50
+ title,
51
+ description,
52
+ pubDate: pubDateStr ? parseDate(pubDateStr, 'YYYY年M月D日') : undefined,
53
+ link: linkUrl,
54
+ content: {
55
+ html: description,
56
+ text: description,
57
+ },
58
+ image,
59
+ banner: image,
60
+ updated: upDatedStr ? parseDate(upDatedStr, 'YYYY年M月D日') : undefined,
61
+ language,
62
+ };
63
+
64
+ return processedItem;
65
+ });
66
+
67
+ items = await Promise.all(
68
+ items.map((item) => {
69
+ if (!item.link) {
70
+ return item;
71
+ }
72
+
73
+ return cache.tryGet(item.link, async (): Promise<DataItem> => {
74
+ const detailResponse = await ofetch(item.link);
75
+ const $$: CheerioAPI = load(detailResponse);
76
+
77
+ const title: string = $$('div.pinpai-page h3').text();
78
+ const pubDateStr: string | undefined = $$('span.time').text();
79
+
80
+ $$('div.pinpai-page h3').remove();
81
+ $$('div.pinpai-page span.time').remove();
82
+
83
+ const description: string | undefined = art(path.join(__dirname, 'templates/description.art'), {
84
+ description: $$('div.pinpai-page').html(),
85
+ });
86
+
87
+ const upDatedStr: string | undefined = pubDateStr;
88
+
89
+ const processedItem: DataItem = {
90
+ title,
91
+ description,
92
+ pubDate: pubDateStr ? parseDate(pubDateStr, 'YYYY年M月D日') : item.pubDate,
93
+ content: {
94
+ html: description,
95
+ text: description,
96
+ },
97
+ updated: upDatedStr ? parseDate(upDatedStr, 'YYYY年M月D日') : item.updated,
98
+ language,
99
+ };
100
+
101
+ return {
102
+ ...item,
103
+ ...processedItem,
104
+ };
105
+ });
106
+ })
107
+ );
108
+
109
+ const author: string = $('h1.nav-logo').first().text();
110
+
111
+ return {
112
+ title: `${author} - ${$('title').text()}`,
113
+ link: targetUrl,
114
+ item: items,
115
+ allowEmpty: true,
116
+ image: new URL('wp-content/themes/ccg/imgs/nav-logo.png', baseUrl).href,
117
+ author,
118
+ language,
119
+ id: targetUrl,
120
+ };
121
+ };
122
+
123
+ export const route: Route = {
124
+ path: '/:category?',
125
+ name: '动态',
126
+ url: 'www.ccg.org.cn',
127
+ maintainers: ['nczitzk'],
128
+ handler,
129
+ example: '/ccg/news',
130
+ parameters: {
131
+ category: {
132
+ description: '分类,默认为 `news`,即新闻动态,可在对应分类页 URL 中找到',
133
+ options: [
134
+ {
135
+ label: '新闻动态',
136
+ value: 'news',
137
+ },
138
+ {
139
+ label: '媒体报道',
140
+ value: 'mtbd',
141
+ },
142
+ ],
143
+ },
144
+ },
145
+ description: `::: tip
146
+ 订阅 [新闻动态](http://www.ccg.org.cn/news),其源网址为 \`http://www.ccg.org.cn/news\`,请参考该 URL 指定部分构成参数,此时路由为 [\`/ccg/news\`](https://rsshub.app/ccg/news)。
147
+ :::
148
+
149
+ | 分类 | ID |
150
+ | -------------------------------------- | ----------------------------------- |
151
+ | [新闻动态](http://www.ccg.org.cn/news) | [news](https://rsshub.app/ccg/news) |
152
+ | [媒体报道](http://www.ccg.org.cn/mtbd) | [mtbd](https://rsshub.app/ccg/mtbd) |
153
+ `,
154
+ categories: ['new-media'],
155
+ features: {
156
+ requireConfig: false,
157
+ requirePuppeteer: false,
158
+ antiCrawler: false,
159
+ supportRadar: true,
160
+ supportBT: false,
161
+ supportPodcast: false,
162
+ supportScihub: false,
163
+ },
164
+ radar: [
165
+ {
166
+ source: ['www.ccg.org.cn/category'],
167
+ target: '/:category',
168
+ },
169
+ {
170
+ title: '新闻动态',
171
+ source: ['www.ccg.org.cn/news'],
172
+ target: '/news',
173
+ },
174
+ {
175
+ title: '媒体报道',
176
+ source: ['www.ccg.org.cn/mtbd'],
177
+ target: '/mtbd',
178
+ },
179
+ ],
180
+ view: ViewType.Articles,
181
+ };
@@ -0,0 +1,9 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '全球化智库',
5
+ url: 'ccg.org.cn',
6
+ categories: ['new-media'],
7
+ description: '',
8
+ lang: 'zh-CN',
9
+ };
@@ -0,0 +1,21 @@
1
+ {{ if images }}
2
+ {{ each images image }}
3
+ {{ if image?.src }}
4
+ <figure>
5
+ <img
6
+ {{ if image.alt }}
7
+ alt="{{ image.alt }}"
8
+ {{ /if }}
9
+ src="{{ image.src }}">
10
+ </figure>
11
+ {{ /if }}
12
+ {{ /each }}
13
+ {{ /if }}
14
+
15
+ {{ if intro }}
16
+ <blockquote>{{ intro }}</blockquote>
17
+ {{ /if }}
18
+
19
+ {{ if description }}
20
+ {{@ description }}
21
+ {{ /if }}
@@ -13,6 +13,7 @@ export const route: Route = {
13
13
  supportBT: false,
14
14
  supportPodcast: false,
15
15
  supportScihub: false,
16
+ nsfw: true,
16
17
  },
17
18
  name: 'Category',
18
19
  maintainers: ['SnowAgar25'],
@@ -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
  name: 'Navigation',
19
20
  maintainers: ['SnowAgar25'],
@@ -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
  name: '動画カテゴリー',
19
20
  maintainers: ['SnowAgar25'],
@@ -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
  name: 'AVメーカー',
19
20
  maintainers: ['SnowAgar25'],
@@ -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
  name: 'Search',
19
20
  maintainers: ['SnowAgar25'],
@@ -222,7 +222,7 @@ export const route: Route = {
222
222
  ],
223
223
  },
224
224
  },
225
- description: `:::tip
225
+ description: `::: tip
226
226
  若订阅 [精彩推荐](https://language.chinadaily.com.cn/thelatest),网址为 \`https://language.chinadaily.com.cn/thelatest\`,请截取 \`https://language.chinadaily.com.cn/\` 到末尾的部分 \`thelatest\` 作为 \`category\` 参数填入,此时目标路由为 [\`/chinadaily/language/thelatest\`](https://rsshub.app/chinadaily/language/thelatest)。
227
227
  :::
228
228
 
@@ -121,7 +121,7 @@ export const route: Route = {
121
121
  parameters: {
122
122
  category: '分类,默认为 `Industry/Comment`,即行业评论,可在对应分类页 URL 中找到',
123
123
  },
124
- description: `:::tip
124
+ description: `::: tip
125
125
  若订阅 [行业评论](https://www.chinaratings.com.cn/CreditResearch/Industry/Comment/),网址为 \`https://www.chinaratings.com.cn/CreditResearch/Industry/Comment/\`,请截取 \`https://www.chinaratings.com.cn/CreditResearch/\` 到末尾 \`/\` 的部分 \`Industry/Comment\` 作为 \`category\` 参数填入,此时目标路由为 [\`/chinaratings/CreditResearch/Industry/Comment\`](https://rsshub.app/chinaratings/CreditResearch/Industry/Comment)。
126
126
  :::
127
127
  `,
@@ -9,6 +9,9 @@ export const route: Route = {
9
9
  name: 'Characters',
10
10
  maintainers: ['flameleaf'],
11
11
  handler,
12
+ features: {
13
+ nsfw: true,
14
+ },
12
15
  };
13
16
 
14
17
  async function handler() {
@@ -21,6 +21,7 @@ export const route: Route = {
21
21
  supportBT: false,
22
22
  supportPodcast: false,
23
23
  supportScihub: false,
24
+ nsfw: true,
24
25
  },
25
26
  radar: [
26
27
  {
@@ -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
  {
@@ -16,6 +16,9 @@ export const route: Route = {
16
16
  name: 'User Article',
17
17
  maintainers: ['TonyRL'],
18
18
  handler,
19
+ features: {
20
+ nsfw: true,
21
+ },
19
22
  };
20
23
 
21
24
  async function handler(ctx) {
@@ -1,4 +1,4 @@
1
- import { load } from 'cheerio';
1
+ import { load, type CheerioAPI } from 'cheerio';
2
2
  import got from '@/utils/got';
3
3
  import { parseDate } from '@/utils/parse-date';
4
4
  import { Route, DataItem } from '@/types';
@@ -7,45 +7,49 @@ const rootUrl = 'https://cline.bot';
7
7
  const blogUrl = `${rootUrl}/blog`;
8
8
 
9
9
  // Extract article information from DOM
10
- function extractArticlesFromDOM($) {
11
- return $('article')
10
+ function extractArticlesFromDOM($: CheerioAPI): DataItem[] {
11
+ return $('article.group')
12
12
  .toArray()
13
13
  .map((article) => {
14
14
  const element = $(article);
15
- const title = element.find('h2').first().text().trim();
16
- const linkEl = element.find('a').first();
17
- const link = linkEl.attr('href');
15
+
16
+ const title = element.find('h2').text().trim();
17
+ const link = element.find('a').first().attr('href');
18
18
  const fullLink = link ? (link.startsWith('http') ? link : `${rootUrl}${link.startsWith('/') ? link : `/${link}`}`) : '';
19
19
 
20
- const metaEl = element.find('.text-xs.text-slate-500');
21
- const author = metaEl.find('span').first().text().trim();
22
- const dateStr = metaEl.find('span').eq(2).text().trim();
23
- const pubDate = dateStr ? parseDate(dateStr) : undefined;
20
+ // Extract date and author with single regex
21
+ const metaText = element.find('.text-sm.text-slate-500').text().trim();
22
+ const metaMatch = metaText.match(/^([^•]+)\s*•\s*([A-Za-z]+\s+\d{1,2},?\s+\d{4})/);
23
+ const author = metaMatch ? metaMatch[1].trim() : 'Cline Team';
24
+ const pubDate = metaMatch ? parseDate(metaMatch[2]) : undefined;
24
25
 
25
- const summary = element.find('.text-slate-600').text().trim();
26
+ const summary = element.find('p.text-slate-600').text().trim();
26
27
  const imgSrc = element.find('img').attr('src') || '';
27
28
 
28
- return {
29
- title,
30
- link: fullLink,
31
- pubDate,
32
- author,
33
- description: `<img src="${imgSrc}" /><p>${summary}</p>`,
34
- };
29
+ return title && link
30
+ ? {
31
+ title,
32
+ link: fullLink,
33
+ pubDate,
34
+ author,
35
+ description: imgSrc ? `<img src="${imgSrc}" alt="${title}" /><p>${summary}</p>` : `<p>${summary}</p>`,
36
+ }
37
+ : null;
35
38
  })
36
- .filter((item) => item.title && item.link);
39
+ .filter(Boolean) as DataItem[];
37
40
  }
38
41
 
39
42
  async function handler() {
40
- // Get blog homepage
43
+ // Use the archive page which has all articles
44
+ const archiveUrl = `${rootUrl}/blog/archive`;
45
+
41
46
  const response = await got({
42
47
  method: 'get',
43
- url: blogUrl,
48
+ url: archiveUrl,
44
49
  });
45
50
 
46
51
  const $ = load(response.data);
47
-
48
- const articles: DataItem[] = extractArticlesFromDOM($);
52
+ const articles = extractArticlesFromDOM($);
49
53
 
50
54
  if (articles.length === 0) {
51
55
  throw new Error('No articles found.');
@@ -56,6 +60,7 @@ async function handler() {
56
60
  link: blogUrl,
57
61
  item: articles,
58
62
  description: 'Cline Official Blog - AI Coding Assistant',
63
+ language: 'en' as const,
59
64
  };
60
65
  }
61
66
 
@@ -72,6 +77,12 @@ export const route: Route = {
72
77
  supportPodcast: false,
73
78
  supportScihub: false,
74
79
  },
80
+ radar: [
81
+ {
82
+ source: ['cline.bot/blog/archive', 'cline.bot/blog'],
83
+ target: '/blog',
84
+ },
85
+ ],
75
86
  name: 'Blog',
76
87
  maintainers: ['yeshan333'],
77
88
  description: 'Cline Official Blog articles',
@@ -24,6 +24,7 @@ const get_app_token = () => {
24
24
  };
25
25
 
26
26
  const base_url = 'https://api.coolapk.com';
27
+ const v2_api_url = 'https://api2.coolapk.com';
27
28
 
28
29
  const getHeaders = () => ({
29
30
  'X-Requested-With': 'XMLHttpRequest',
@@ -58,10 +59,10 @@ const parseTuwenFromRaw = (raw) =>
58
59
 
59
60
  const parseDynamic = async (item) => {
60
61
  const pubDate = parseDate(item.dateline, 'X');
61
- if (item.entityType === 'sponsorCard' || item.shareUrl === undefined) {
62
+ if (item.entityType === 'sponsorCard' || !item.url) {
62
63
  return;
63
64
  }
64
- const itemUrl = item.shareUrl.split('?')[0];
65
+ const itemUrl = `${v2_api_url}/v6${item.url.replace('/feed/', '/feed/detail?id=')}`;
65
66
  let description, title;
66
67
  const type = Number.parseInt(item.type);
67
68
  switch (type) {
@@ -135,8 +136,8 @@ const parseDynamic = async (item) => {
135
136
  title,
136
137
  description,
137
138
  pubDate,
138
- link: item.shareUrl,
139
- guid: itemUrl,
139
+ link: `https://www.coolapk.com${item.url}`,
140
+ // guid: itemUrl,
140
141
  author: item.username,
141
142
  };
142
143
  };
@@ -0,0 +1,106 @@
1
+ import { type Data, type DataItem, type Route, ViewType } from '@/types';
2
+
3
+ import { art } from '@/utils/render';
4
+ import ofetch from '@/utils/ofetch';
5
+
6
+ import { type CheerioAPI, load } from 'cheerio';
7
+ import { type Context } from 'hono';
8
+ import path from 'node:path';
9
+
10
+ export const handler = async (ctx: Context): Promise<Data> => {
11
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '50', 10);
12
+
13
+ const baseUrl: string = 'https://coolbuy.com';
14
+ const imageBaseUrl: string = 'https://mcache.ifanr.cn';
15
+ const apiUrl: string = new URL('api/v1.4/product_preview', baseUrl).href;
16
+
17
+ const response = await ofetch(apiUrl, {
18
+ query: {
19
+ order_by: '-id',
20
+ limit,
21
+ page: 0,
22
+ offset: 0,
23
+ },
24
+ });
25
+
26
+ const targetResponse = await ofetch(baseUrl);
27
+ const $: CheerioAPI = load(targetResponse);
28
+ const language = $('html').attr('lang') ?? 'zh';
29
+
30
+ const items: DataItem[] = response.objects.slice(0, limit).map((item): DataItem => {
31
+ const title: string = item.title;
32
+ const image: string | undefined = item.cover_image?.split(/\?/)?.[0];
33
+ const banner: string | undefined = item.display_image?.split(/\?/)?.[0];
34
+
35
+ const description: string | undefined = art(path.join(__dirname, 'templates/description.art'), {
36
+ summary: item.summary,
37
+ price: item.price,
38
+ original_price: item.original_price,
39
+ highest_price: item.highest_price,
40
+ highest_original_price: item.highest_original_price,
41
+ images: [banner, image].filter(Boolean).map((image) => ({
42
+ src: image,
43
+ alt: title,
44
+ })),
45
+ });
46
+
47
+ const linkUrl: string | undefined = item.visit_url;
48
+ const guid: string = `coolbuy-${item.id}#${item.price}`;
49
+
50
+ const processedItem: DataItem = {
51
+ title,
52
+ description,
53
+ link: linkUrl ?? new URL(item.id, baseUrl).href,
54
+ guid,
55
+ id: guid,
56
+ content: {
57
+ html: description,
58
+ text: description,
59
+ },
60
+ image,
61
+ banner: image,
62
+ language,
63
+ };
64
+
65
+ return processedItem;
66
+ });
67
+
68
+ return {
69
+ title: $('title').text(),
70
+ description: $('meta[property="og:description"]').attr('content'),
71
+ link: baseUrl,
72
+ item: items,
73
+ allowEmpty: true,
74
+ image: new URL('static/coolbuy/packages/dongguan/dist/images/97be46f6.png', imageBaseUrl).href,
75
+ language,
76
+ id: baseUrl,
77
+ };
78
+ };
79
+
80
+ export const route: Route = {
81
+ path: '/',
82
+ name: '产品',
83
+ url: 'coolbuy.com',
84
+ maintainers: ['nczitzk'],
85
+ handler,
86
+ example: '/coolbuy',
87
+ parameters: undefined,
88
+ description: undefined,
89
+ categories: ['shopping'],
90
+ features: {
91
+ requireConfig: false,
92
+ requirePuppeteer: false,
93
+ antiCrawler: false,
94
+ supportRadar: true,
95
+ supportBT: false,
96
+ supportPodcast: false,
97
+ supportScihub: false,
98
+ },
99
+ radar: [
100
+ {
101
+ source: ['coolbuy.com'],
102
+ target: '/',
103
+ },
104
+ ],
105
+ view: ViewType.Articles,
106
+ };
@@ -0,0 +1,9 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: '玩物志',
5
+ url: 'coolbuy.com',
6
+ categories: ['shopping'],
7
+ description: '',
8
+ lang: 'zh-CN',
9
+ };
@@ -0,0 +1,48 @@
1
+ <table>
2
+ <tbody>
3
+ {{ if summary }}
4
+ <tr>
5
+ <th>简介</th>
6
+ <td>{{ summary }}</td>
7
+ </tr>
8
+ {{ /if }}
9
+ {{ if price }}
10
+ <tr>
11
+ <th>价格</th>
12
+ <td>{{ price }}</td>
13
+ </tr>
14
+ {{ /if }}
15
+ {{ if original_price }}
16
+ <tr>
17
+ <th>原价</th>
18
+ <td>{{ original_price }}</td>
19
+ </tr>
20
+ {{ /if }}
21
+ {{ if highest_price }}
22
+ <tr>
23
+ <th>价格(最高)</th>
24
+ <td>{{ highest_price }}</td>
25
+ </tr>
26
+ {{ /if }}
27
+ {{ if highest_original_price }}
28
+ <tr>
29
+ <th>原价(最高)</th>
30
+ <td>{{ highest_original_price }}</td>
31
+ </tr>
32
+ {{ /if }}
33
+ </tbody>
34
+ </table>
35
+
36
+ {{ if images }}
37
+ {{ each images image }}
38
+ {{ if image?.src }}
39
+ <figure>
40
+ <img
41
+ {{ if image.alt }}
42
+ alt="{{ image.alt }}"
43
+ {{ /if }}
44
+ src="{{ image.src }}">
45
+ </figure>
46
+ {{ /if }}
47
+ {{ /each }}
48
+ {{ /if }}
@@ -0,0 +1,60 @@
1
+ import { type Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
+ import { load } from 'cheerio';
4
+ import { art } from '@/utils/render';
5
+ import path from 'node:path';
6
+
7
+ const handler = async () => {
8
+ const link = 'https://coolidge.org/film-guide';
9
+ const html = await ofetch(link);
10
+ const $ = load(html);
11
+
12
+ const container = $('#block-coolidge-content > article > div.node__content > div').first();
13
+
14
+ const cover = container.find('p').eq(0).find('img').first().attr('src');
15
+ const title = container.find('p').eq(1).text().trim();
16
+ const description = container.find('p').eq(2).text().trim();
17
+ const linkEl = container.find('a').first();
18
+ const itemLink = linkEl.attr('href');
19
+
20
+ const absoluteCover = cover ? new URL(cover, link).href : undefined;
21
+ const absoluteItemLink = itemLink ? new URL(itemLink, link).href : undefined;
22
+
23
+ const rendered = art(path.join(__dirname, 'templates/description.art'), {
24
+ image: absoluteCover,
25
+ intro: description,
26
+ });
27
+
28
+ return {
29
+ title: 'Coolidge Corner Theatre - Film Guide',
30
+ link,
31
+ description: 'Film Guide',
32
+ item: [
33
+ {
34
+ title,
35
+ description: rendered,
36
+ link: absoluteItemLink ?? link,
37
+ guid: absoluteItemLink ?? absoluteCover ?? link,
38
+ },
39
+ ],
40
+ };
41
+ };
42
+
43
+ export const route: Route = {
44
+ path: '/film-guide',
45
+ name: 'Film Guide',
46
+ url: 'coolidge.org/film-guide',
47
+ maintainers: ['johan456789'],
48
+ example: '/coolidge/film-guide',
49
+ categories: ['blog'],
50
+ features: {
51
+ requireConfig: false,
52
+ requirePuppeteer: false,
53
+ antiCrawler: false,
54
+ supportRadar: false,
55
+ supportBT: false,
56
+ supportPodcast: false,
57
+ supportScihub: false,
58
+ },
59
+ handler,
60
+ };