rsshub 1.0.0-master.ff3a9ce → 1.0.0-master.ff3ea5a

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.

Potentially problematic release.


This version of rsshub might be problematic. Click here for more details.

Files changed (388) hide show
  1. package/lib/config.ts +38 -0
  2. package/lib/errors/index.tsx +3 -2
  3. package/lib/middleware/debug.ts +6 -4
  4. package/lib/middleware/header.ts +4 -2
  5. package/lib/registry.test.ts +24 -1
  6. package/lib/registry.ts +40 -11
  7. package/lib/router.js +1 -1
  8. package/lib/routes/121/namespace.ts +9 -0
  9. package/lib/routes/121/templates/description.art +17 -0
  10. package/lib/routes/121/weather-live.ts +104 -0
  11. package/lib/routes/141jav/index.ts +3 -0
  12. package/lib/routes/141ppv/index.ts +3 -0
  13. package/lib/routes/163/news/rank.ts +1 -1
  14. package/lib/routes/18comic/album.ts +59 -64
  15. package/lib/routes/18comic/index.ts +1 -0
  16. package/lib/routes/18comic/search.ts +53 -4
  17. package/lib/routes/18comic/utils.ts +70 -1
  18. package/lib/routes/2048/index.ts +1 -0
  19. package/lib/routes/30secondsofcode/utils.ts +0 -1
  20. package/lib/routes/6park/index.ts +1 -1
  21. package/lib/routes/7mmtv/index.ts +1 -0
  22. package/lib/routes/91porn/index.ts +1 -0
  23. package/lib/routes/95mm/tab.ts +1 -0
  24. package/lib/routes/agefans/detail.ts +1 -1
  25. package/lib/routes/aliyun/database-month.ts +1 -1
  26. package/lib/routes/anthropic/research.ts +112 -0
  27. package/lib/routes/apnews/topics.ts +2 -1
  28. package/lib/routes/apnews/utils.ts +1 -1
  29. package/lib/routes/apple/design.ts +54 -0
  30. package/lib/routes/apple/namespace.ts +1 -1
  31. package/lib/routes/aqara/post.ts +1 -1
  32. package/lib/routes/augmentcode/blog.ts +161 -0
  33. package/lib/routes/augmentcode/namespace.ts +9 -0
  34. package/lib/routes/augmentcode/templates/description.art +17 -0
  35. package/lib/routes/azul/namespace.ts +9 -0
  36. package/lib/routes/azul/packages.ts +105 -0
  37. package/lib/routes/banshujiang/index.ts +763 -0
  38. package/lib/routes/banshujiang/namespace.ts +9 -0
  39. package/lib/routes/banshujiang/templates/description.art +17 -0
  40. package/lib/routes/bfl/announcements.ts +1 -1
  41. package/lib/routes/bilibili/cache.ts +78 -0
  42. package/lib/routes/bilibili/danmaku.ts +1 -1
  43. package/lib/routes/bilibili/dynamic.ts +8 -2
  44. package/lib/routes/bilibili/video.ts +31 -73
  45. package/lib/routes/biquge/index.ts +1 -1
  46. package/lib/routes/bsky/keyword.ts +15 -10
  47. package/lib/routes/capitalmind/insights.ts +40 -0
  48. package/lib/routes/capitalmind/namespace.ts +8 -0
  49. package/lib/routes/capitalmind/podcasts.ts +41 -0
  50. package/lib/routes/capitalmind/utils.ts +122 -0
  51. package/lib/routes/cartoonmad/comic.ts +1 -1
  52. package/lib/routes/chikubi/index.ts +1 -0
  53. package/lib/routes/chikubi/tag.ts +1 -0
  54. package/lib/routes/chocolatey/namespace.ts +9 -0
  55. package/lib/routes/chocolatey/packages.ts +122 -0
  56. package/lib/routes/cmde/index.ts +1 -1
  57. package/lib/routes/cockroachlabs/blog.ts +113 -0
  58. package/lib/routes/cockroachlabs/namespace.ts +7 -0
  59. package/lib/routes/cool18/index.ts +4 -1
  60. package/lib/routes/coomer/index.ts +12 -6
  61. package/lib/routes/coomer/namespace.ts +1 -1
  62. package/lib/routes/copymanga/comic.ts +7 -9
  63. package/lib/routes/css-tricks/articles.ts +48 -0
  64. package/lib/routes/css-tricks/collections.ts +62 -0
  65. package/lib/routes/css-tricks/namespace.ts +8 -0
  66. package/lib/routes/css-tricks/popular.ts +39 -0
  67. package/lib/routes/css-tricks/utils.ts +103 -0
  68. package/lib/routes/cursor/changelog.ts +26 -17
  69. package/lib/routes/cursor/namespace.ts +1 -1
  70. package/lib/routes/cw/utils.ts +6 -13
  71. package/lib/routes/dealstreetasia/home.ts +1 -1
  72. package/lib/routes/dedao/index.ts +3 -3
  73. package/lib/routes/deepl/blog.ts +422 -0
  74. package/lib/routes/deepl/namespace.ts +9 -0
  75. package/lib/routes/deepl/templates/description.art +21 -0
  76. package/lib/routes/deeplearning/the-batch.ts +1 -1
  77. package/lib/routes/dev.to/guides.ts +100 -0
  78. package/lib/routes/dev.to/namespace.ts +8 -0
  79. package/lib/routes/dev.to/top.ts +105 -0
  80. package/lib/routes/dgut/jwb.ts +73 -0
  81. package/lib/routes/dgut/namespace.ts +9 -0
  82. package/lib/routes/digitalpolicyalert/activity-tracker.ts +135 -0
  83. package/lib/routes/digitalpolicyalert/namespace.ts +9 -0
  84. package/lib/routes/dnaindia/common.ts +26 -8
  85. package/lib/routes/douban/other/list.ts +3 -3
  86. package/lib/routes/e-hentai/index.ts +4 -1
  87. package/lib/routes/ehentai/tag.ts +1 -0
  88. package/lib/routes/englishhome/index.ts +55 -0
  89. package/lib/routes/englishhome/namespace.ts +6 -0
  90. package/lib/routes/epicgames/index.ts +2 -2
  91. package/lib/routes/espn/news.ts +1 -1
  92. package/lib/routes/expats/czech-news.ts +272 -0
  93. package/lib/routes/expats/namespace.ts +9 -0
  94. package/lib/routes/fanbox/index.ts +1 -0
  95. package/lib/routes/fanbox/utils.ts +1 -1
  96. package/lib/routes/fansly/tag.ts +1 -0
  97. package/lib/routes/fantia/search.ts +1 -1
  98. package/lib/routes/fantube/creator.ts +69 -0
  99. package/lib/routes/fantube/namespace.ts +7 -0
  100. package/lib/routes/fantube/templates/post.art +17 -0
  101. package/lib/routes/fantube/types.ts +100 -0
  102. package/lib/routes/fantube/utils.ts +268 -0
  103. package/lib/routes/follow/profile.ts +1 -1
  104. package/lib/routes/followin/news.ts +1 -1
  105. package/lib/routes/foresightnews/util.ts +1 -1
  106. package/lib/routes/freexcomic/book.ts +4 -1
  107. package/lib/routes/gamer/hot.ts +5 -5
  108. package/lib/routes/gaoyu/blog.ts +145 -0
  109. package/lib/routes/gaoyu/namespace.ts +9 -0
  110. package/lib/routes/gaoyu/templates/description.art +7 -0
  111. package/lib/routes/geocaching/blogs.ts +2 -2
  112. package/lib/routes/github/namespace.ts +1 -1
  113. package/lib/routes/github/private-feed.ts +229 -0
  114. package/lib/routes/github/star.ts +1 -1
  115. package/lib/routes/google/extension.ts +9 -10
  116. package/lib/routes/gov/beijing/bphc/index.ts +1 -1
  117. package/lib/routes/gov/ccdi/index.ts +1 -1
  118. package/lib/routes/gov/chongqing/sydwgkzp.ts +22 -6
  119. package/lib/routes/gov/customs/list.ts +1 -1
  120. package/lib/routes/gov/general/general.ts +1 -1
  121. package/lib/routes/gov/hangzhou/zwfw.ts +1 -1
  122. package/lib/routes/gov/pbc/goutongjiaoliu.ts +1 -1
  123. package/lib/routes/gov/shenzhen/szlh/index.ts +77 -0
  124. package/lib/routes/gov/shenzhen/szlh/namespace.ts +8 -0
  125. package/lib/routes/grist/utils.ts +5 -4
  126. package/lib/routes/hanime1/search.ts +4 -2
  127. package/lib/routes/hellogithub/report.ts +1 -1
  128. package/lib/routes/hit/hitgs.ts +240 -54
  129. package/lib/routes/hit/templates/description.art +7 -0
  130. package/lib/routes/hlju/namespace.ts +8 -0
  131. package/lib/routes/hlju/news.ts +141 -0
  132. package/lib/routes/hostmonit/cloudflareyes.ts +1 -1
  133. package/lib/routes/hotukdeals/index.ts +1 -1
  134. package/lib/routes/hyperdash/namespace.ts +7 -0
  135. package/lib/routes/hyperdash/templates/description.art +34 -0
  136. package/lib/routes/hyperdash/top-traders.ts +84 -0
  137. package/lib/routes/hyperdash/utils.ts +49 -0
  138. package/lib/routes/hypergryph/arknights/announce.ts +1 -1
  139. package/lib/routes/ielts/index.ts +1 -1
  140. package/lib/routes/infoq/topic.ts +16 -13
  141. package/lib/routes/instagram/web-api/index.ts +17 -13
  142. package/lib/routes/instagram/web-api/utils.ts +46 -63
  143. package/lib/routes/jamesclear/book-summaries.ts +40 -0
  144. package/lib/routes/jamesclear/great-speeches.ts +40 -0
  145. package/lib/routes/jamesclear/namespace.ts +8 -0
  146. package/lib/routes/jamesclear/quotes.ts +40 -0
  147. package/lib/routes/jamesclear/three-two-one.ts +41 -0
  148. package/lib/routes/jamesclear/utils.ts +22 -0
  149. package/lib/routes/japanpost/utils.ts +2 -2
  150. package/lib/routes/javbus/index.ts +3 -0
  151. package/lib/routes/javdb/tags.ts +1 -0
  152. package/lib/routes/javlibrary/star.ts +1 -0
  153. package/lib/routes/javtiful/actress.ts +3 -0
  154. package/lib/routes/javtiful/channel.ts +3 -0
  155. package/lib/routes/javtrailers/casts.ts +3 -0
  156. package/lib/routes/jetbrains/comments.ts +99 -0
  157. package/lib/routes/jetbrains/namespace.ts +8 -0
  158. package/lib/routes/jimmyspa/books.ts +1 -1
  159. package/lib/routes/jimmyspa/news.ts +1 -1
  160. package/lib/routes/jpxgmn/tab.ts +3 -0
  161. package/lib/routes/kakuyomu/works.ts +3 -0
  162. package/lib/routes/kaopu/news.ts +1 -1
  163. package/lib/routes/kemono/const.ts +1 -1
  164. package/lib/routes/kemono/index.ts +12 -11
  165. package/lib/routes/kemono/namespace.ts +1 -1
  166. package/lib/routes/kiro/blog.ts +131 -0
  167. package/lib/routes/kiro/changelog.ts +128 -0
  168. package/lib/routes/kiro/namespace.ts +9 -0
  169. package/lib/routes/konachan/post.ts +3 -0
  170. package/lib/routes/kovidgoyal/kitty/changelog.ts +83 -0
  171. package/lib/routes/kovidgoyal/namespace.ts +7 -0
  172. package/lib/routes/kunchengblog/essay.ts +1 -1
  173. package/lib/routes/landiannews/category.ts +1 -1
  174. package/lib/routes/landiannews/index.ts +1 -1
  175. package/lib/routes/landiannews/tag.ts +1 -1
  176. package/lib/routes/line/utils.ts +1 -1
  177. package/lib/routes/lineageos/changes.ts +79 -0
  178. package/lib/routes/lineageos/namespace.ts +9 -0
  179. package/lib/routes/linkedin/cn/renderer.ts +1 -1
  180. package/lib/routes/liquipedia/cs-matches.ts +42 -14
  181. package/lib/routes/literotica/new.ts +1 -0
  182. package/lib/routes/lofter/tag.ts +27 -3
  183. package/lib/routes/makerworld/contest.ts +51 -0
  184. package/lib/routes/makerworld/namespace.ts +7 -0
  185. package/lib/routes/makerworld/trending.ts +45 -0
  186. package/lib/routes/makerworld/user-upload.ts +54 -0
  187. package/lib/routes/makerworld/utils.ts +18 -0
  188. package/lib/routes/manhuagui/comic.ts +1 -1
  189. package/lib/routes/manus/blog.ts +77 -0
  190. package/lib/routes/manus/namespace.ts +7 -0
  191. package/lib/routes/mastodon/tag.ts +48 -0
  192. package/lib/routes/mathpix/blog.ts +155 -0
  193. package/lib/routes/mathpix/namespace.ts +9 -0
  194. package/lib/routes/mathpix/templates/description.art +21 -0
  195. package/lib/routes/mckinsey/cn/category-map.ts +9 -15
  196. package/lib/routes/mckinsey/cn/index.ts +77 -40
  197. package/lib/routes/melonbooks/search.ts +1 -0
  198. package/lib/routes/metacritic/index.ts +2 -2
  199. package/lib/routes/meteoblue/namespace.ts +8 -0
  200. package/lib/routes/meteoblue/weathernews.ts +75 -0
  201. package/lib/routes/meteor/index.ts +1 -1
  202. package/lib/routes/microsoft/addon.ts +7 -9
  203. package/lib/routes/mihoyo/zzz/news.ts +106 -0
  204. package/lib/routes/missav/new.ts +2 -1
  205. package/lib/routes/mit/hanlab.ts +61 -0
  206. package/lib/routes/mit/namespace.ts +6 -0
  207. package/lib/routes/mittrchina/index.ts +3 -3
  208. package/lib/routes/mixcloud/config.ts +129 -0
  209. package/lib/routes/mixcloud/index.ts +163 -107
  210. package/lib/routes/mixcloud/user-playlist.ts +31 -0
  211. package/lib/routes/mixi2/community.ts +72 -0
  212. package/lib/routes/mixi2/discovery.ts +52 -0
  213. package/lib/routes/mixi2/home.ts +51 -0
  214. package/lib/routes/mixi2/namespace.ts +8 -0
  215. package/lib/routes/mixi2/user.ts +77 -0
  216. package/lib/routes/mixi2/utils.ts +56 -0
  217. package/lib/routes/modelscope/learn.ts +94 -0
  218. package/lib/routes/moodysmismicrosite/report.ts +1 -1
  219. package/lib/routes/musify/index.ts +130 -0
  220. package/lib/routes/musify/namespace.ts +9 -0
  221. package/lib/routes/musikguru/namespace.ts +9 -0
  222. package/lib/routes/musikguru/news.ts +146 -0
  223. package/lib/routes/musikguru/templates/description.art +21 -0
  224. package/lib/routes/myfans/post.ts +1 -0
  225. package/lib/routes/nankai/cc-notice.ts +114 -0
  226. package/lib/routes/nankai/jwc.ts +131 -0
  227. package/lib/routes/nankai/namespace.ts +7 -0
  228. package/lib/routes/nankai/notice.ts +84 -0
  229. package/lib/routes/nankai/yzb.ts +97 -0
  230. package/lib/routes/neu/yz.ts +172 -0
  231. package/lib/routes/newslaundry/explainer.ts +30 -0
  232. package/lib/routes/newslaundry/namespace.ts +8 -0
  233. package/lib/routes/newslaundry/nl-cheatsheet.ts +30 -0
  234. package/lib/routes/newslaundry/nl-collaborations.ts +30 -0
  235. package/lib/routes/newslaundry/podcast.ts +61 -0
  236. package/lib/routes/newslaundry/reports.ts +30 -0
  237. package/lib/routes/newslaundry/shot.ts +30 -0
  238. package/lib/routes/newslaundry/subscriber-only.ts +30 -0
  239. package/lib/routes/newslaundry/templates/description.art +28 -0
  240. package/lib/routes/newslaundry/utils.ts +108 -0
  241. package/lib/routes/newswav/latest.ts +100 -0
  242. package/lib/routes/newswav/namespace.ts +7 -0
  243. package/lib/routes/nhentai/index.ts +1 -0
  244. package/lib/routes/nifd/research.ts +16 -0
  245. package/lib/routes/nio/namespace.ts +9 -0
  246. package/lib/routes/nio/nioradio.ts +75 -0
  247. package/lib/routes/njust/cs.ts +58 -0
  248. package/lib/routes/njust/utils.ts +1 -1
  249. package/lib/routes/ntdm/video.ts +1 -1
  250. package/lib/routes/nuaa/utils/pypasswaf.ts +1 -1
  251. package/lib/routes/oilchem/index.ts +1 -1
  252. package/lib/routes/oncc/money18.ts +1 -1
  253. package/lib/routes/openai/cookbook.ts +1 -1
  254. package/lib/routes/paulgraham/article.ts +2 -2
  255. package/lib/routes/picuki/profile.ts +4 -0
  256. package/lib/routes/pixiv/bookmarks.ts +1 -1
  257. package/lib/routes/pixiv/novel-api/series/sfw.ts +1 -1
  258. package/lib/routes/pixiv/novels.ts +2 -2
  259. package/lib/routes/pixiv/user.ts +1 -1
  260. package/lib/routes/playno1/av.ts +1 -0
  261. package/lib/routes/pornhub/model.ts +3 -7
  262. package/lib/routes/pornhub/pornstar.ts +2 -7
  263. package/lib/routes/pornhub/users.ts +2 -7
  264. package/lib/routes/pornhub/utils.ts +12 -1
  265. package/lib/routes/qingting/podcast.ts +2 -1
  266. package/lib/routes/qipamaijia/index.ts +1 -0
  267. package/lib/routes/questmobile/report.ts +1 -1
  268. package/lib/routes/railway/index.ts +73 -0
  269. package/lib/routes/railway/namespace.ts +8 -0
  270. package/lib/routes/reuters/common.ts +0 -3
  271. package/lib/routes/rockthejvm/articles.ts +167 -0
  272. package/lib/routes/rockthejvm/namespace.ts +9 -0
  273. package/lib/routes/rockthejvm/templates/description.art +7 -0
  274. package/lib/routes/samrdprc/namespace.ts +7 -0
  275. package/lib/routes/samrdprc/news.ts +79 -0
  276. package/lib/routes/sankei/namespace.ts +7 -0
  277. package/lib/routes/sankei/news.ts +68 -0
  278. package/lib/routes/sankei/topics.ts +71 -0
  279. package/lib/routes/sciencenet/user.ts +1 -1
  280. package/lib/routes/scoop/apps.ts +188 -0
  281. package/lib/routes/scoop/namespace.ts +9 -0
  282. package/lib/routes/scoop/templates/description.art +56 -0
  283. package/lib/routes/scpta/namespace.ts +8 -0
  284. package/lib/routes/scpta/news.ts +101 -0
  285. package/lib/routes/seekingalpha/index.ts +1 -1
  286. package/lib/routes/sehuatang/index.ts +29 -31
  287. package/lib/routes/setn/index.ts +11 -2
  288. package/lib/routes/seu/cyber/index.ts +78 -0
  289. package/lib/routes/sicau/jiaowu.ts +42 -34
  290. package/lib/routes/sis001/forum.ts +1 -0
  291. package/lib/routes/sjtu/seiee/icisee.ts +67 -0
  292. package/lib/routes/sketis/isabelle-dev/blog/index.ts +1 -1
  293. package/lib/routes/smartlink/index.ts +13 -3
  294. package/lib/routes/sohu/mp.ts +17 -6
  295. package/lib/routes/sotwe/namespace.ts +1 -0
  296. package/lib/routes/sotwe/user.ts +98 -0
  297. package/lib/routes/spankbang/new-videos.ts +1 -0
  298. package/lib/routes/spglobal/ratings.ts +1 -1
  299. package/lib/routes/stanford/blog.ts +77 -0
  300. package/lib/routes/stanford/namespace.ts +7 -0
  301. package/lib/routes/syosetu/index.ts +1 -1
  302. package/lib/routes/t66y/index.ts +1 -0
  303. package/lib/routes/taobao/mysql.ts +157 -0
  304. package/lib/routes/taobao/namespace.ts +2 -2
  305. package/lib/routes/techcrunch/category.ts +48 -0
  306. package/lib/routes/telegram/channel.ts +2 -2
  307. package/lib/routes/tesla/cx.ts +1 -1
  308. package/lib/routes/test/index.ts +1 -1
  309. package/lib/routes/themoviedb/episodes.ts +1 -1
  310. package/lib/routes/thewirehindi/category.ts +78 -0
  311. package/lib/routes/thewirehindi/index.ts +43 -0
  312. package/lib/routes/thewirehindi/namespace.ts +7 -0
  313. package/lib/routes/thewirehindi/templates/description.art +9 -0
  314. package/lib/routes/thewirehindi/utils.ts +33 -0
  315. package/lib/routes/threads/utils.ts +2 -2
  316. package/lib/routes/tidb/blog.ts +314 -0
  317. package/lib/routes/tidb/namespace.ts +9 -0
  318. package/lib/routes/tumblr/namespace.ts +17 -0
  319. package/lib/routes/tumblr/posts.ts +74 -0
  320. package/lib/routes/tumblr/utils.ts +110 -0
  321. package/lib/routes/tver/namespace.ts +7 -0
  322. package/lib/routes/tver/series.ts +98 -0
  323. package/lib/routes/twitter/api/web-api/login.ts +1 -3
  324. package/lib/routes/twitter/api/web-api/utils.ts +23 -1
  325. package/lib/routes/twitter/utils.ts +21 -21
  326. package/lib/routes/udn/breaking-news.ts +2 -2
  327. package/lib/routes/uestc/auto.ts +1 -1
  328. package/lib/routes/uestc/cqe.ts +1 -1
  329. package/lib/routes/uestc/scse.ts +1 -1
  330. package/lib/routes/uestc/sice.ts +1 -1
  331. package/lib/routes/uestc/sise.ts +1 -1
  332. package/lib/routes/upc/jwc.ts +32 -46
  333. package/lib/routes/uptimerobot/rss.ts +1 -1
  334. package/lib/routes/visionias/daily-news-summary.ts +65 -0
  335. package/lib/routes/visionias/monthly-magazine.ts +68 -0
  336. package/lib/routes/visionias/news-today.ts +3 -13
  337. package/lib/routes/visionias/utils.ts +5 -5
  338. package/lib/routes/visionias/weekly-focus.ts +2 -2
  339. package/lib/routes/wdfxw/bookfree.ts +528 -0
  340. package/lib/routes/wdfxw/namespace.ts +8 -0
  341. package/lib/routes/wdfxw/templates/description.art +13 -0
  342. package/lib/routes/whu/swrh.ts +1 -1
  343. package/lib/routes/windsurf/blog.ts +118 -0
  344. package/lib/routes/windsurf/changelog.ts +100 -0
  345. package/lib/routes/windsurf/namespace.ts +9 -0
  346. package/lib/routes/windsurf/templates/description.art +21 -0
  347. package/lib/routes/x6d/index.ts +1 -1
  348. package/lib/routes/xbookcn/blog.ts +1 -0
  349. package/lib/routes/xiaohongshu/util.ts +1 -3
  350. package/lib/routes/xiaoyuzhou/pickup.ts +1 -1
  351. package/lib/routes/ximalaya/album.ts +32 -70
  352. package/lib/routes/ximalaya/types.ts +48 -0
  353. package/lib/routes/ximalaya/utils.ts +9 -7
  354. package/lib/routes/xmanhua/index.ts +1 -0
  355. package/lib/routes/xueqiu/cookies.ts +1 -1
  356. package/lib/routes/xueqiu/user.ts +1 -1
  357. package/lib/routes/xwenming/index.ts +184 -0
  358. package/lib/routes/xwenming/namespace.ts +9 -0
  359. package/lib/routes/yahoo/news/utils.ts +1 -1
  360. package/lib/routes/yande/post.ts +3 -0
  361. package/lib/routes/ymgal/game.ts +1 -0
  362. package/lib/routes/youtube/api/google.ts +27 -0
  363. package/lib/routes/youtube/api/youtubei.ts +70 -20
  364. package/lib/routes/youtube/community.ts +3 -1
  365. package/lib/routes/youtube/utils.ts +16 -14
  366. package/lib/routes/zaobao/util.ts +8 -5
  367. package/lib/routes/zhihu/activities.ts +3 -0
  368. package/lib/routes/zhihu/execlib/x-zse-96-v3.ts +5 -5
  369. package/lib/routes/zhizhuan100/namespace.ts +7 -0
  370. package/lib/routes/zhizhuan100/report.ts +79 -0
  371. package/lib/routes/zimuxia/portfolio.ts +1 -1
  372. package/lib/routes/zju/sis/index.ts +161 -0
  373. package/lib/server.ts +5 -0
  374. package/lib/types.ts +58 -54
  375. package/lib/utils/helpers.ts +1 -1
  376. package/lib/utils/logger.ts +1 -1
  377. package/lib/utils/proxy/index.ts +102 -18
  378. package/lib/utils/proxy/multi-proxy.ts +139 -0
  379. package/lib/utils/proxy/unify-proxy.ts +3 -1
  380. package/lib/utils/puppeteer-utils.test.ts +1 -1
  381. package/lib/utils/puppeteer.test.ts +14 -27
  382. package/lib/utils/puppeteer.ts +51 -37
  383. package/lib/utils/readable-social.test.ts +65 -0
  384. package/lib/utils/readable-social.ts +15 -1
  385. package/lib/utils/request-rewriter/fetch.ts +42 -4
  386. package/package.json +54 -56
  387. package/lib/routes/mixcloud/queries.ts +0 -2274
  388. package/lib/routes-deprecated/dev.to/top.js +0 -40
@@ -1,4 +1,4 @@
1
- import { type Data, type DataItem, type Route, ViewType } from '@/types';
1
+ import { type Data, type DataItem, type Route, ViewType, type Language } from '@/types';
2
2
 
3
3
  import ofetch from '@/utils/ofetch';
4
4
  import { parseDate } from '@/utils/parse-date';
@@ -10,7 +10,7 @@ import { type Context } from 'hono';
10
10
  export const handler = async (ctx: Context): Promise<Data> => {
11
11
  const limit: number = Number.parseInt(ctx.req.query('limit') ?? '100', 10);
12
12
 
13
- const baseUrl: string = 'https://www.cursor.com';
13
+ const baseUrl: string = 'https://cursor.com';
14
14
  const targetUrl: string = new URL('changelog', baseUrl).href;
15
15
 
16
16
  const response = await ofetch(targetUrl, {
@@ -19,24 +19,34 @@ export const handler = async (ctx: Context): Promise<Data> => {
19
19
  },
20
20
  });
21
21
  const $: CheerioAPI = load(response);
22
- const language = $('html').attr('lang') ?? 'en';
22
+ const language = ($('html').attr('lang') ?? 'en') as Language;
23
23
 
24
24
  const items: DataItem[] = $('article.relative')
25
25
  .slice(0, limit)
26
26
  .toArray()
27
- .map((el): Element => {
27
+ .map((el): DataItem => {
28
28
  const $el: Cheerio<Element> = $(el);
29
29
 
30
- const version: string = $el.find('div.items-center p').first().text();
30
+ let version: string = '';
31
+ let pubDateStr: string | undefined;
31
32
 
32
- const title: string = `[${version}] ${$el
33
- .find(String.raw`h2 a.hover\:underline`)
34
- .contents()
35
- .first()
36
- .text()}`;
37
- const pubDateStr: string | undefined = $el.find('div.inline-flex p').first().text().trim();
38
- const linkUrl: string | undefined = $el.find(String.raw`h2 a.hover\:underline`).attr('href');
39
- const guid: string = `cursor-changelog-${version}`;
33
+ $el.find('div').each((_, div) => {
34
+ const text = $(div).text().trim();
35
+ const dateVersionMatch = text.match(/^(\w+\s+\d{1,2},\s+\d{4})(\d+\.\d+)$/);
36
+ if (dateVersionMatch) {
37
+ pubDateStr = dateVersionMatch[1];
38
+ version = dateVersionMatch[2];
39
+ return false; // Stop after finding first match
40
+ }
41
+ });
42
+
43
+ const linkEl = $el.find('a[href^="/changelog/"]').first();
44
+ const titleText = linkEl.length ? linkEl.text().trim() : $el.find('h2').first().text().trim();
45
+
46
+ const title: string = version ? `[${version}] ${titleText}` : titleText;
47
+
48
+ const linkUrl: string | undefined = linkEl.attr('href');
49
+ const guid: string = `cursor-changelog-${version || 'unknown'}`;
40
50
  const upDatedStr: string | undefined = pubDateStr;
41
51
 
42
52
  const $h2El = $el.find('h2').first();
@@ -64,8 +74,7 @@ export const handler = async (ctx: Context): Promise<Data> => {
64
74
  };
65
75
 
66
76
  return processedItem;
67
- })
68
- .filter((_): _ is DataItem => true);
77
+ });
69
78
 
70
79
  return {
71
80
  title: $('title').text(),
@@ -81,7 +90,7 @@ export const handler = async (ctx: Context): Promise<Data> => {
81
90
  export const route: Route = {
82
91
  path: '/changelog',
83
92
  name: 'Changelog',
84
- url: 'www.cursor.com',
93
+ url: 'cursor.com',
85
94
  maintainers: ['p3psi-boo', 'nczitzk'],
86
95
  handler,
87
96
  example: '/cursor/changelog',
@@ -99,7 +108,7 @@ export const route: Route = {
99
108
  },
100
109
  radar: [
101
110
  {
102
- source: ['www.cursor.com/changelog'],
111
+ source: ['cursor.com/changelog'],
103
112
  target: '/changelog',
104
113
  },
105
114
  ],
@@ -2,7 +2,7 @@ import type { Namespace } from '@/types';
2
2
 
3
3
  export const namespace: Namespace = {
4
4
  name: 'Cursor',
5
- url: 'www.cursor.com',
5
+ url: 'cursor.com',
6
6
  description: '',
7
7
  lang: 'en',
8
8
  };
@@ -4,6 +4,7 @@ import { parseDate } from '@/utils/parse-date';
4
4
  import { getCookies, setCookies } from '@/utils/puppeteer-utils';
5
5
  import logger from '@/utils/logger';
6
6
  let cookie;
7
+ import ofetch from '@/utils/ofetch';
7
8
 
8
9
  const baseUrl = 'https://www.cw.com.tw';
9
10
 
@@ -89,20 +90,12 @@ const parseItems = (list, browser, tryGet) =>
89
90
  Promise.all(
90
91
  list.map((item) =>
91
92
  tryGet(item.link, async () => {
92
- const page = await browser.newPage();
93
- await page.setRequestInterception(true);
94
- page.on('request', (request) => {
95
- request.resourceType() === 'document' || request.resourceType() === 'script' ? request.continue() : request.abort();
93
+ const response = await ofetch(item.link, {
94
+ headers: {
95
+ Cookie: await getCookie(browser, tryGet),
96
+ 'User-Agent': browser.userAgent(),
97
+ },
96
98
  });
97
- await setCookies(page, cookie, 'cw.com.tw');
98
- logger.http(`Requesting ${item.link}`);
99
- await page.goto(item.link, {
100
- waitUntil: 'domcontentloaded',
101
- });
102
- await page.waitForSelector('.article__head .container');
103
-
104
- const response = await page.evaluate(() => document.documentElement.innerHTML);
105
- await page.close();
106
99
  const $ = load(response);
107
100
 
108
101
  const meta = JSON.parse($('head script[type="application/ld+json"]').eq(0).text());
@@ -58,7 +58,7 @@ async function fetchPage() {
58
58
  title: item.post_title || item.title || 'No Title',
59
59
  link: item.post_url || item.link || '',
60
60
  description: item.post_excerpt || item.excerpt || '',
61
- pubDate: item.post_date ? new Date(item.post_date).toUTCString() : (item.date ? new Date(item.date).toUTCString() : ''),
61
+ pubDate: item.post_date ? new Date(item.post_date).toUTCString() : item.date ? new Date(item.date).toUTCString() : '',
62
62
  category: item.category_link ? item.category_link.replaceAll(/(<([^>]+)>)/gi, '') : '', // Clean HTML if category_link exists
63
63
  image: item.image_url ? item.image_url.replace(/\?.*$/, '') : '', // Remove query parameters if image_url exists
64
64
  }));
@@ -29,10 +29,10 @@ async function handler(ctx) {
29
29
 
30
30
  const data = JSON.parse(response.data.match(/window.__INITIAL_STATE__= (.*);<\/script>/)[1]);
31
31
 
32
- let items = (category === 'news' ? data.news : (category === 'figure' ? data.figure : data.videoList)).map((item) => ({
32
+ let items = (category === 'news' ? data.news : category === 'figure' ? data.figure : data.videoList).map((item) => ({
33
33
  title: item.title,
34
34
  pubDate: parseDate(item.online_time),
35
- link: `${rootUrl}/${category === 'news' ? 'article/' : (category === 'figure' ? 'people/' : '')}${item.online_time.split('T')[0].split('-').join('')}/${item.token}`,
35
+ link: `${rootUrl}/${category === 'news' ? 'article/' : category === 'figure' ? 'people/' : ''}${item.online_time.split('T')[0].split('-').join('')}/${item.token}`,
36
36
  }));
37
37
 
38
38
  items = await Promise.all(
@@ -53,7 +53,7 @@ async function handler(ctx) {
53
53
  );
54
54
 
55
55
  return {
56
- title: `得到${category === 'video' ? '' : '大事件'} - ${category === 'news' ? '新闻' : (category === 'figure' ? '人物故事' : '视频')}`,
56
+ title: `得到${category === 'video' ? '' : '大事件'} - ${category === 'news' ? '新闻' : category === 'figure' ? '人物故事' : '视频'}`,
57
57
  link: rootUrl,
58
58
  item: items,
59
59
  description: data.description,
@@ -0,0 +1,422 @@
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 { lang = 'en' } = ctx.req.param();
15
+ const limit: number = Number.parseInt(ctx.req.query('limit') ?? '30', 10);
16
+
17
+ const baseUrl: string = 'https://www.deepl.com';
18
+ const targetUrl: string = new URL(`${lang}/blog`, baseUrl).href;
19
+
20
+ const response = await ofetch(targetUrl);
21
+ const $: CheerioAPI = load(response);
22
+ const language = $('html').attr('lang') ?? lang;
23
+
24
+ let items: DataItem[] = [];
25
+
26
+ items = $('h4, h6')
27
+ .slice(0, limit)
28
+ .toArray()
29
+ .map((el): Element => {
30
+ const $el: Cheerio<Element> = $(el).parent().parent();
31
+
32
+ const title: string = $el.find('h4, h6').text();
33
+ const image: string | undefined = $el.find('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').text(),
44
+ });
45
+ const pubDateStr: string | undefined = $el.find('time').attr('datetime');
46
+ const linkUrl: string | undefined = $el.attr('href');
47
+ const authorsArr: string[] = $el.find('span.me-6 span').last().text().split(/,\s/);
48
+ const authors: DataItem['author'] = authorsArr.map((author) => ({
49
+ name: author,
50
+ url: undefined,
51
+ avatar: undefined,
52
+ }));
53
+ const upDatedStr: string | undefined = pubDateStr;
54
+
55
+ const processedItem: DataItem = {
56
+ title,
57
+ description,
58
+ pubDate: pubDateStr ? parseDate(pubDateStr) : undefined,
59
+ link: linkUrl ? new URL(linkUrl, baseUrl).href : undefined,
60
+ author: authors,
61
+ content: {
62
+ html: description,
63
+ text: description,
64
+ },
65
+ image,
66
+ banner: image,
67
+ updated: upDatedStr ? parseDate(upDatedStr) : undefined,
68
+ language,
69
+ };
70
+
71
+ return processedItem;
72
+ });
73
+
74
+ items = await Promise.all(
75
+ items.map((item) => {
76
+ if (!item.link) {
77
+ return item;
78
+ }
79
+
80
+ return cache.tryGet(item.link, async (): Promise<DataItem> => {
81
+ const detailResponse = await ofetch(item.link);
82
+ const $$: CheerioAPI = load(detailResponse);
83
+
84
+ const title: string = $$('h1[data-contentful-field-id="title"]').text();
85
+ const description: string | undefined =
86
+ item.description +
87
+ art(path.join(__dirname, 'templates/description.art'), {
88
+ description: $$('div.my-redesign-3').html(),
89
+ });
90
+ const pubDateStr: string | undefined = $$('time').first().attr('datetime');
91
+ const authorsArr: string[] = $$('span[data-contentful-field-id="author"] span').last().text().split(/,\s/);
92
+ const authors: DataItem['author'] = authorsArr.map((author) => ({
93
+ name: author,
94
+ url: undefined,
95
+ avatar: undefined,
96
+ }));
97
+ const image: string | undefined = $$('meta[property="og:image"]').attr('content') ?? $$('picture[data-contentful-field-id="image"] img').attr('src');
98
+ const upDatedStr: string | undefined = pubDateStr;
99
+
100
+ const processedItem: DataItem = {
101
+ title,
102
+ description,
103
+ pubDate: pubDateStr ? parseDate(pubDateStr) : item.pubDate,
104
+ author: authors,
105
+ content: {
106
+ html: description,
107
+ text: description,
108
+ },
109
+ image,
110
+ banner: image,
111
+ updated: upDatedStr ? parseDate(upDatedStr) : item.updated,
112
+ language,
113
+ };
114
+
115
+ return {
116
+ ...item,
117
+ ...processedItem,
118
+ };
119
+ });
120
+ })
121
+ );
122
+
123
+ return {
124
+ title: $('title').text(),
125
+ description: $('meta[property="og:description"]').attr('content'),
126
+ link: targetUrl,
127
+ item: items,
128
+ allowEmpty: true,
129
+ image: $('meta[property="og:image"]').attr('content'),
130
+ language,
131
+ id: $('meta[property="og:url"]').attr('content'),
132
+ };
133
+ };
134
+
135
+ const languageOptions = [
136
+ {
137
+ label: 'Deutsch',
138
+ value: 'de',
139
+ },
140
+ {
141
+ label: 'English',
142
+ value: 'en',
143
+ },
144
+ {
145
+ label: 'Español',
146
+ value: 'es',
147
+ },
148
+ {
149
+ label: '日本語',
150
+ value: 'ja',
151
+ },
152
+ {
153
+ label: 'Français',
154
+ value: 'fr',
155
+ },
156
+ {
157
+ label: 'Italiano',
158
+ value: 'it',
159
+ },
160
+ {
161
+ label: 'Bahasa Indonesia',
162
+ value: 'id',
163
+ },
164
+ {
165
+ label: '한국어',
166
+ value: 'ko',
167
+ },
168
+ {
169
+ label: 'Nederlands',
170
+ value: 'nl',
171
+ },
172
+ {
173
+ label: 'Čeština',
174
+ value: 'cs',
175
+ },
176
+ {
177
+ label: 'Svenska',
178
+ value: 'sv',
179
+ },
180
+ {
181
+ label: 'Polski',
182
+ value: 'pl',
183
+ },
184
+ {
185
+ label: 'Português (Brasil)',
186
+ value: 'pt-BR',
187
+ },
188
+ {
189
+ label: 'Português',
190
+ value: 'pt-PT',
191
+ },
192
+ {
193
+ label: 'Türkçe',
194
+ value: 'tr',
195
+ },
196
+ {
197
+ label: 'Русский',
198
+ value: 'ru',
199
+ },
200
+ {
201
+ label: '简体中文',
202
+ value: 'zh',
203
+ },
204
+ {
205
+ label: 'Українська',
206
+ value: 'uk',
207
+ },
208
+ {
209
+ label: 'العربية',
210
+ value: 'ar',
211
+ },
212
+ ];
213
+
214
+ export const route: Route = {
215
+ path: '/blog/:lang?',
216
+ name: 'Blog',
217
+ url: 'www.deepl.com',
218
+ maintainers: ['nczitzk'],
219
+ handler,
220
+ example: '/deepl/blog/en',
221
+ parameters: {
222
+ lang: {
223
+ description: 'Language, `en` as English by default',
224
+ options: languageOptions,
225
+ },
226
+ },
227
+ description: `:::tip
228
+ To subscribe to [Blog](https://www.deepl.com/en/blog), where the source URL is \`https://www.deepl.com/en/blog\`, extract the certain parts from this URL to be used as parameters, resulting in the route as [\`/deepl/blog/en\`](https://rsshub.app/deepl/blog/en).
229
+
230
+ :::
231
+
232
+ <details>
233
+ <summary>More languages</summary>
234
+
235
+ | Language | ID |
236
+ | ------------------------------------------------------ | -------------------------------------------- |
237
+ | [Deutsch](https://www.deepl.com/de/blog) | [de](https://rsshub.app/deepl/blog/de) |
238
+ | [English](https://www.deepl.com/en/blog) | [en](https://rsshub.app/deepl/blog/en) |
239
+ | [Español](https://www.deepl.com/es/blog) | [es](https://rsshub.app/deepl/blog/es) |
240
+ | [日本語](https://www.deepl.com/ja/blog) | [ja](https://rsshub.app/deepl/blog/ja) |
241
+ | [Français](https://www.deepl.com/fr/blog) | [fr](https://rsshub.app/deepl/blog/fr) |
242
+ | [Italiano](https://www.deepl.com/it/blog) | [it](https://rsshub.app/deepl/blog/it) |
243
+ | [Bahasa Indonesia](https://www.deepl.com/id/blog) | [id](https://rsshub.app/deepl/blog/id) |
244
+ | [한국어](https://www.deepl.com/ko/blog) | [ko](https://rsshub.app/deepl/blog/ko) |
245
+ | [Nederlands](https://www.deepl.com/nl/blog) | [nl](https://rsshub.app/deepl/blog/nl) |
246
+ | [Čeština](https://www.deepl.com/cs/blog) | [cs](https://rsshub.app/deepl/blog/cs) |
247
+ | [Svenska](https://www.deepl.com/sv/blog) | [sv](https://rsshub.app/deepl/blog/sv) |
248
+ | [Polski](https://www.deepl.com/pl/blog) | [pl](https://rsshub.app/deepl/blog/pl) |
249
+ | [Português (Brasil)](https://www.deepl.com/pt-BR/blog) | [pt-BR](https://rsshub.app/deepl/blog/pt-BR) |
250
+ | [Português](https://www.deepl.com/pt-PT/blog) | [pt-PT](https://rsshub.app/deepl/blog/pt-PT) |
251
+ | [Türkçe](https://www.deepl.com/tr/blog) | [tr](https://rsshub.app/deepl/blog/tr) |
252
+ | [Русский](https://www.deepl.com/ru/blog) | [ru](https://rsshub.app/deepl/blog/ru) |
253
+ | [简体中文](https://www.deepl.com/zh/blog) | [zh](https://rsshub.app/deepl/blog/zh) |
254
+ | [Українська](https://www.deepl.com/uk/blog) | [uk](https://rsshub.app/deepl/blog/uk) |
255
+ | [العربية](https://www.deepl.com/ar/blog) | [ar](https://rsshub.app/deepl/blog/ar) |
256
+
257
+ </details>
258
+ `,
259
+ categories: ['new-media'],
260
+ features: {
261
+ requireConfig: false,
262
+ requirePuppeteer: false,
263
+ antiCrawler: false,
264
+ supportRadar: true,
265
+ supportBT: false,
266
+ supportPodcast: false,
267
+ supportScihub: false,
268
+ },
269
+ radar: [
270
+ {
271
+ source: ['www.deepl.com/:lang/blog'],
272
+ target: (params) => {
273
+ const lang: string = params.lang;
274
+
275
+ return `/deepl/blog${lang ? `/${lang}` : ''}`;
276
+ },
277
+ },
278
+ {
279
+ title: 'Deutsch',
280
+ source: ['www.deepl.com/de/blog'],
281
+ target: '/blog/de',
282
+ },
283
+ {
284
+ title: 'English',
285
+ source: ['www.deepl.com/en/blog'],
286
+ target: '/blog/en',
287
+ },
288
+ {
289
+ title: 'Español',
290
+ source: ['www.deepl.com/es/blog'],
291
+ target: '/blog/es',
292
+ },
293
+ {
294
+ title: '日本語',
295
+ source: ['www.deepl.com/ja/blog'],
296
+ target: '/blog/ja',
297
+ },
298
+ {
299
+ title: 'Français',
300
+ source: ['www.deepl.com/fr/blog'],
301
+ target: '/blog/fr',
302
+ },
303
+ {
304
+ title: 'Italiano',
305
+ source: ['www.deepl.com/it/blog'],
306
+ target: '/blog/it',
307
+ },
308
+ {
309
+ title: 'Bahasa Indonesia',
310
+ source: ['www.deepl.com/id/blog'],
311
+ target: '/blog/id',
312
+ },
313
+ {
314
+ title: '한국어',
315
+ source: ['www.deepl.com/ko/blog'],
316
+ target: '/blog/ko',
317
+ },
318
+ {
319
+ title: 'Nederlands',
320
+ source: ['www.deepl.com/nl/blog'],
321
+ target: '/blog/nl',
322
+ },
323
+ {
324
+ title: 'Čeština',
325
+ source: ['www.deepl.com/cs/blog'],
326
+ target: '/blog/cs',
327
+ },
328
+ {
329
+ title: 'Svenska',
330
+ source: ['www.deepl.com/sv/blog'],
331
+ target: '/blog/sv',
332
+ },
333
+ {
334
+ title: 'Polski',
335
+ source: ['www.deepl.com/pl/blog'],
336
+ target: '/blog/pl',
337
+ },
338
+ {
339
+ title: 'Português (Brasil)',
340
+ source: ['www.deepl.com/pt-BR/blog'],
341
+ target: '/blog/pt-BR',
342
+ },
343
+ {
344
+ title: 'Português',
345
+ source: ['www.deepl.com/pt-PT/blog'],
346
+ target: '/blog/pt-PT',
347
+ },
348
+ {
349
+ title: 'Türkçe',
350
+ source: ['www.deepl.com/tr/blog'],
351
+ target: '/blog/tr',
352
+ },
353
+ {
354
+ title: 'Русский',
355
+ source: ['www.deepl.com/ru/blog'],
356
+ target: '/blog/ru',
357
+ },
358
+ {
359
+ title: '简体中文',
360
+ source: ['www.deepl.com/zh/blog'],
361
+ target: '/blog/zh',
362
+ },
363
+ {
364
+ title: 'Українська',
365
+ source: ['www.deepl.com/uk/blog'],
366
+ target: '/blog/uk',
367
+ },
368
+ {
369
+ title: 'العربية',
370
+ source: ['www.deepl.com/ar/blog'],
371
+ target: '/blog/ar',
372
+ },
373
+ ],
374
+ view: ViewType.Articles,
375
+
376
+ zh: {
377
+ path: '/blog/:lang?',
378
+ name: '博客',
379
+ url: 'www.deepl.com',
380
+ maintainers: ['nczitzk'],
381
+ handler,
382
+ example: '/deepl/blog/en',
383
+ parameters: {
384
+ lang: {
385
+ description: '语言,默认为 `en`,可在对应语言页 URL 中找到',
386
+ options: languageOptions,
387
+ },
388
+ },
389
+ description: `:::tip
390
+ 若订阅 [博客](https://www.deepl.com/zh/blog),网址为 \`https://www.deepl.com/zh/blog\`,请截取 \`https://www.deepl.com/\` 到末尾 \`/blog\` 的部分 \`zh\` 作为 \`lang\` 参数填入,此时目标路由为 [\`/deepl/blog/zh\`](https://rsshub.app/deepl/blog/zh)。
391
+
392
+ :::
393
+
394
+ <details>
395
+ <summary>更多语言</summary>
396
+
397
+ | Language | ID |
398
+ | ------------------------------------------------------ | -------------------------------------------- |
399
+ | [Deutsch](https://www.deepl.com/de/blog) | [de](https://rsshub.app/deepl/blog/de) |
400
+ | [English](https://www.deepl.com/en/blog) | [en](https://rsshub.app/deepl/blog/en) |
401
+ | [Español](https://www.deepl.com/es/blog) | [es](https://rsshub.app/deepl/blog/es) |
402
+ | [日本語](https://www.deepl.com/ja/blog) | [ja](https://rsshub.app/deepl/blog/ja) |
403
+ | [Français](https://www.deepl.com/fr/blog) | [fr](https://rsshub.app/deepl/blog/fr) |
404
+ | [Italiano](https://www.deepl.com/it/blog) | [it](https://rsshub.app/deepl/blog/it) |
405
+ | [Bahasa Indonesia](https://www.deepl.com/id/blog) | [id](https://rsshub.app/deepl/blog/id) |
406
+ | [한국어](https://www.deepl.com/ko/blog) | [ko](https://rsshub.app/deepl/blog/ko) |
407
+ | [Nederlands](https://www.deepl.com/nl/blog) | [nl](https://rsshub.app/deepl/blog/nl) |
408
+ | [Čeština](https://www.deepl.com/cs/blog) | [cs](https://rsshub.app/deepl/blog/cs) |
409
+ | [Svenska](https://www.deepl.com/sv/blog) | [sv](https://rsshub.app/deepl/blog/sv) |
410
+ | [Polski](https://www.deepl.com/pl/blog) | [pl](https://rsshub.app/deepl/blog/pl) |
411
+ | [Português (Brasil)](https://www.deepl.com/pt-BR/blog) | [pt-BR](https://rsshub.app/deepl/blog/pt-BR) |
412
+ | [Português](https://www.deepl.com/pt-PT/blog) | [pt-PT](https://rsshub.app/deepl/blog/pt-PT) |
413
+ | [Türkçe](https://www.deepl.com/tr/blog) | [tr](https://rsshub.app/deepl/blog/tr) |
414
+ | [Русский](https://www.deepl.com/ru/blog) | [ru](https://rsshub.app/deepl/blog/ru) |
415
+ | [简体中文](https://www.deepl.com/zh/blog) | [zh](https://rsshub.app/deepl/blog/zh) |
416
+ | [Українська](https://www.deepl.com/uk/blog) | [uk](https://rsshub.app/deepl/blog/uk) |
417
+ | [العربية](https://www.deepl.com/ar/blog) | [ar](https://rsshub.app/deepl/blog/ar) |
418
+
419
+ </details>
420
+ `,
421
+ },
422
+ };
@@ -0,0 +1,9 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'DeepL',
5
+ url: 'deepl.com',
6
+ categories: ['new-media'],
7
+ description: '',
8
+ lang: 'en',
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 }}
@@ -64,7 +64,7 @@ export const handler = async (ctx) => {
64
64
  cache.tryGet(item.link, async () => {
65
65
  const detailResponse = await ofetch(item.link);
66
66
 
67
- const post = detailResponse.pageProps?.cmsData?.post ?? undefined;
67
+ const post = detailResponse.pageProps?.post ?? undefined;
68
68
 
69
69
  if (!post) {
70
70
  return item;