rsshub 1.0.0-master.ff487f3 → 1.0.0-master.ff76aa7

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 (532) hide show
  1. package/README.md +13 -48
  2. package/lib/api/radar/rules/all.ts +3 -6
  3. package/lib/api/radar/rules/one.ts +3 -6
  4. package/lib/config.ts +50 -2
  5. package/lib/errors/index.test.ts +1 -1
  6. package/lib/errors/index.tsx +1 -1
  7. package/lib/index.ts +1 -1
  8. package/lib/middleware/anti-hotlink.test.ts +191 -6
  9. package/lib/middleware/anti-hotlink.ts +29 -1
  10. package/lib/middleware/logger.ts +2 -2
  11. package/lib/middleware/parameter.test.ts +22 -5
  12. package/lib/middleware/parameter.ts +47 -17
  13. package/lib/middleware/template.tsx +10 -2
  14. package/lib/registry.test.ts +8 -0
  15. package/lib/registry.ts +2 -0
  16. package/lib/router.js +1 -9
  17. package/lib/routes/4ksj/forum.ts +54 -20
  18. package/lib/routes/500px/tribe-set.ts +3 -2
  19. package/lib/routes/51cto/recommend.ts +45 -7
  20. package/lib/routes/5eplay/index.ts +1 -51
  21. package/lib/routes/5eplay/utils.ts +5 -3
  22. package/lib/routes/a9vg/index.ts +214 -0
  23. package/lib/routes/a9vg/namespace.ts +1 -0
  24. package/lib/routes/a9vg/templates/description.art +17 -0
  25. package/lib/routes/abc/index.ts +2 -2
  26. package/lib/routes/academia/namespace.ts +1 -1
  27. package/lib/routes/agri/index.ts +307 -0
  28. package/lib/routes/agri/namespace.ts +8 -0
  29. package/lib/routes/agri/templates/description.art +21 -0
  30. package/lib/routes/aibase/discover.ts +388 -0
  31. package/lib/routes/aibase/namespace.ts +8 -0
  32. package/lib/routes/aibase/news.ts +118 -0
  33. package/lib/routes/aibase/templates/description.art +100 -0
  34. package/lib/routes/aibase/topic.ts +614 -0
  35. package/lib/routes/aibase/util.ts +114 -0
  36. package/lib/routes/anime1/anime.ts +63 -0
  37. package/lib/routes/anime1/namespace.ts +6 -0
  38. package/lib/routes/anime1/search.ts +57 -0
  39. package/lib/routes/apnews/api.ts +77 -0
  40. package/lib/routes/apnews/rss.ts +2 -2
  41. package/lib/routes/apnews/sitemap.ts +99 -0
  42. package/lib/routes/apnews/topics.ts +2 -2
  43. package/lib/routes/apnews/utils.ts +2 -1
  44. package/lib/routes/apple/podcast.ts +20 -16
  45. package/lib/routes/asus/bios.ts +88 -21
  46. package/lib/routes/asus/templates/bios.art +13 -6
  47. package/lib/routes/bangumi/templates/tv/subject.art +6 -0
  48. package/lib/routes/bangumi/tv/other/followrank.ts +19 -22
  49. package/lib/routes/bangumi/tv/user/collections.ts +172 -0
  50. package/lib/routes/behance/user.ts +14 -3
  51. package/lib/routes/beijingprice/index.ts +12 -12
  52. package/lib/routes/bestblogs/feeds.ts +107 -0
  53. package/lib/routes/bestblogs/namespace.ts +6 -0
  54. package/lib/routes/bilibili/api-interface.d.ts +1 -0
  55. package/lib/routes/bilibili/bangumi.ts +3 -2
  56. package/lib/routes/bilibili/bilibili-recommend.ts +42 -0
  57. package/lib/routes/bilibili/cache.ts +41 -9
  58. package/lib/routes/bilibili/dynamic.ts +103 -105
  59. package/lib/routes/bilibili/followings-dynamic.ts +3 -1
  60. package/lib/routes/bilibili/followings-video.ts +9 -3
  61. package/lib/routes/bilibili/readlist.ts +3 -2
  62. package/lib/routes/bilibili/utils.ts +90 -3
  63. package/lib/routes/bilibili/video.ts +8 -9
  64. package/lib/routes/bilibili/vsearch.ts +1 -1
  65. package/lib/routes/binance/announcement.ts +168 -0
  66. package/lib/routes/binance/types.ts +26 -0
  67. package/lib/routes/bitget/announcement.ts +200 -0
  68. package/lib/routes/bitget/namespace.ts +6 -0
  69. package/lib/routes/bitget/type.ts +26 -0
  70. package/lib/routes/bjnews/cat.ts +9 -1
  71. package/lib/routes/bjp/apod.ts +4 -2
  72. package/lib/routes/buaa/jiaowu.ts +1 -1
  73. package/lib/routes/buaa/lib/space/newbook.ts +171 -0
  74. package/lib/routes/buaa/lib/space/templates/newbook.art +44 -0
  75. package/lib/routes/bupt/jwc.ts +130 -0
  76. package/lib/routes/caixin/latest.ts +3 -2
  77. package/lib/routes/cbpanet/index.ts +380 -0
  78. package/lib/routes/cbpanet/namespace.ts +8 -0
  79. package/lib/routes/ccfa/index.ts +216 -0
  80. package/lib/routes/ccfa/namespace.ts +8 -0
  81. package/lib/routes/ccfa/templates/description.art +7 -0
  82. package/lib/routes/cctv/category.ts +16 -12
  83. package/lib/routes/cctv/xwlb.ts +32 -10
  84. package/lib/routes/cdu/jwgg.ts +79 -0
  85. package/lib/routes/cdu/namespace.ts +6 -0
  86. package/lib/routes/ceph/blog.ts +72 -0
  87. package/lib/routes/ceph/namespace.ts +7 -0
  88. package/lib/routes/changba/user.ts +6 -5
  89. package/lib/routes/chikubi/category.ts +41 -0
  90. package/lib/routes/chikubi/index.ts +66 -0
  91. package/lib/routes/chikubi/namespace.ts +15 -0
  92. package/lib/routes/chikubi/navigation.ts +66 -0
  93. package/lib/routes/chikubi/nipple-video-category.ts +49 -0
  94. package/lib/routes/chikubi/nipple-video-maker.ts +49 -0
  95. package/lib/routes/chikubi/search.ts +39 -0
  96. package/lib/routes/chikubi/tag.ts +41 -0
  97. package/lib/routes/chikubi/utils.ts +135 -0
  98. package/lib/routes/chinanews/index.ts +1 -1
  99. package/lib/routes/chinaventure/index.ts +1 -1
  100. package/lib/routes/chlinlearn/daily-blog.ts +7 -0
  101. package/lib/routes/cisia/index.ts +264 -0
  102. package/lib/routes/cisia/namespace.ts +8 -0
  103. package/lib/routes/cjlu/namespace.ts +10 -0
  104. package/lib/routes/cjlu/yjsy/index.ts +107 -0
  105. package/lib/routes/cls/subject.ts +153 -0
  106. package/lib/routes/cls/templates/description.art +21 -0
  107. package/lib/routes/cohere/index.ts +54 -0
  108. package/lib/routes/cohere/namespace.ts +6 -0
  109. package/lib/routes/damai/activity.ts +3 -2
  110. package/lib/routes/dcfever/trading.ts +3 -5
  111. package/lib/routes/dcfever/utils.ts +13 -4
  112. package/lib/routes/dealstreetasia/home.ts +72 -0
  113. package/lib/routes/dealstreetasia/namespace.ts +6 -0
  114. package/lib/routes/dealstreetasia/section.ts +57 -0
  115. package/lib/routes/deepin/thread.ts +102 -0
  116. package/lib/routes/deeplearning/thebatch.ts +30 -18
  117. package/lib/routes/devolverdigital/blog.ts +59 -42
  118. package/lib/routes/devtrium/namespace.ts +6 -0
  119. package/lib/routes/devtrium/posts.ts +55 -0
  120. package/lib/routes/discourse/official.ts +55 -0
  121. package/lib/routes/dlsite/campaign.ts +1 -2
  122. package/lib/routes/dlsite/new.ts +1 -2
  123. package/lib/routes/dlsite/{index.ts → z-index/index.ts} +1 -1
  124. package/lib/routes/dockerhub/build.ts +1 -1
  125. package/lib/routes/dockerhub/utils.ts +4 -3
  126. package/lib/routes/douban/movie/coming.ts +68 -0
  127. package/lib/routes/douban/templates/movie_coming.art +27 -0
  128. package/lib/routes/douyin/types.ts +795 -0
  129. package/lib/routes/douyin/user.ts +51 -23
  130. package/lib/routes/douyin/utils.ts +1 -87
  131. package/lib/routes/dykszx/namespace.ts +8 -0
  132. package/lib/routes/dykszx/news.ts +88 -0
  133. package/lib/routes/eagle/blog.ts +13 -2
  134. package/lib/routes/eastmoney/report/index.ts +63 -15
  135. package/lib/routes/eastmoney/templates/stock_description.art +36 -0
  136. package/lib/routes/eastmoney/utils.ts +35 -0
  137. package/lib/routes/easynomad/joblist.ts +56 -0
  138. package/lib/routes/easynomad/namespace.ts +6 -0
  139. package/lib/routes/economist/espresso.ts +3 -2
  140. package/lib/routes/economist/full.ts +3 -2
  141. package/lib/routes/epicgames/index.ts +1 -1
  142. package/lib/routes/espn/namespace.ts +6 -0
  143. package/lib/routes/espn/news.ts +120 -0
  144. package/lib/routes/espn/templates/media.art +19 -0
  145. package/lib/routes/famitsu/category.ts +1 -1
  146. package/lib/routes/fanbox/index.ts +1 -1
  147. package/lib/routes/fanbox/types.ts +1 -5
  148. package/lib/routes/fediverse/timeline.ts +2 -2
  149. package/lib/routes/flashcat/blog.ts +61 -0
  150. package/lib/routes/flashcat/namespace.ts +6 -0
  151. package/lib/routes/follow/namespace.ts +6 -0
  152. package/lib/routes/follow/profile.ts +83 -0
  153. package/lib/routes/follow/types.ts +78 -0
  154. package/lib/routes/ftm/index.ts +60 -0
  155. package/lib/routes/ftm/namespace.ts +6 -0
  156. package/lib/routes/galxe/index.ts +94 -0
  157. package/lib/routes/galxe/namespace.ts +9 -0
  158. package/lib/routes/gamer/ani/anime.ts +10 -3
  159. package/lib/routes/gamer/ani/new-anime.ts +4 -3
  160. package/lib/routes/gamer/gnn-index.ts +31 -11
  161. package/lib/routes/gamer/hot.ts +4 -3
  162. package/lib/routes/gamersky/ent.ts +57 -0
  163. package/lib/routes/gamersky/namespace.ts +10 -0
  164. package/lib/routes/gamersky/news.ts +91 -0
  165. package/lib/routes/gamersky/review.ts +80 -0
  166. package/lib/routes/gamersky/utils.ts +94 -0
  167. package/lib/routes/gdut/oa-news.ts +12 -17
  168. package/lib/routes/geekpark/index.ts +219 -0
  169. package/lib/routes/geekpark/namespace.ts +8 -0
  170. package/lib/routes/geekpark/templates/description.art +21 -0
  171. package/lib/routes/gisreportsonline/index.ts +60 -0
  172. package/lib/routes/gisreportsonline/namespace.ts +6 -0
  173. package/lib/routes/github/activity.ts +2 -1
  174. package/lib/routes/github/advisor.ts +97 -0
  175. package/lib/routes/github/comments.ts +32 -30
  176. package/lib/routes/github/discussions.ts +194 -0
  177. package/lib/routes/github/issue.ts +1 -1
  178. package/lib/routes/github/pulls.ts +1 -1
  179. package/lib/routes/gmcmonline/chinacustoms.ts +130 -0
  180. package/lib/routes/gmcmonline/namespace.ts +8 -0
  181. package/lib/routes/go/mhlw/pdf.ts +87 -0
  182. package/lib/routes/go/namespace.ts +8 -0
  183. package/lib/routes/go/niid/idwr-dl.ts +104 -0
  184. package/lib/routes/gov/cbirc/index.ts +371 -0
  185. package/lib/routes/gov/chongqing/sydwgkzp.ts +4 -4
  186. package/lib/routes/gov/cn/namespace.ts +8 -0
  187. package/lib/routes/gov/{news → cn/news}/index.ts +11 -7
  188. package/lib/routes/gov/csrc/csrc.ts +541 -0
  189. package/lib/routes/gov/lswz/index.ts +289 -0
  190. package/lib/routes/gov/moa/moa.ts +3 -3
  191. package/lib/routes/gov/moa/szcpxx.ts +115 -0
  192. package/lib/routes/gov/moa/zdscxx.ts +71 -21
  193. package/lib/routes/gov/ndrc/fggz.ts +637 -2
  194. package/lib/routes/gov/ndrc/namespace.ts +8 -0
  195. package/lib/routes/gov/ndrc/xwdt.ts +28 -8
  196. package/lib/routes/gov/ndrc/zfxxgk.ts +106 -0
  197. package/lib/routes/gov/zj/search.ts +17 -12
  198. package/lib/routes/gq/news.ts +3 -2
  199. package/lib/routes/gs/developer/blog.ts +58 -0
  200. package/lib/routes/gs/namespace.ts +9 -0
  201. package/lib/routes/guancha/member.ts +1 -1
  202. package/lib/routes/hackernews/index.ts +16 -5
  203. package/lib/routes/healthz.ts +8 -0
  204. package/lib/routes/hellogithub/index.ts +17 -67
  205. package/lib/routes/hellogithub/report.ts +1 -1
  206. package/lib/routes/hex-rays/index.ts +23 -29
  207. package/lib/routes/hfut/hf/notice.ts +43 -0
  208. package/lib/routes/hfut/hf/utils.ts +80 -0
  209. package/lib/routes/hfut/namespace.ts +6 -0
  210. package/lib/routes/hfut/xc/notice.ts +43 -0
  211. package/lib/routes/hfut/xc/utils.ts +73 -0
  212. package/lib/routes/hket/index.ts +80 -76
  213. package/lib/routes/hko/earthquake.ts +56 -0
  214. package/lib/routes/hko/namespace.ts +8 -0
  215. package/lib/routes/hko/weather.ts +56 -0
  216. package/lib/routes/hottoys/index.ts +63 -0
  217. package/lib/routes/hottoys/namespace.ts +6 -0
  218. package/lib/routes/hpoi/all.ts +17 -6
  219. package/lib/routes/hpoi/character.ts +18 -6
  220. package/lib/routes/hpoi/info.ts +11 -6
  221. package/lib/routes/hpoi/user.ts +16 -4
  222. package/lib/routes/hpoi/utils.ts +36 -3
  223. package/lib/routes/hpoi/work.ts +18 -6
  224. package/lib/routes/huggingface/blog-zh.ts +1 -1
  225. package/lib/routes/hust/gs.ts +281 -0
  226. package/lib/routes/hust/mse.ts +575 -0
  227. package/lib/routes/hust/namespace.ts +1 -1
  228. package/lib/routes/i-cable/namespace.ts +6 -0
  229. package/lib/routes/i-cable/news.ts +77 -0
  230. package/lib/routes/i-cable/templates/description.art +8 -0
  231. package/lib/routes/imhcg/blog.ts +47 -0
  232. package/lib/routes/imhcg/namespace.ts +7 -0
  233. package/lib/routes/imop/namespace.ts +10 -0
  234. package/lib/routes/imop/tianshu.ts +53 -0
  235. package/lib/routes/infzm/hot.ts +39 -0
  236. package/lib/routes/infzm/index.ts +3 -30
  237. package/lib/routes/infzm/utils.ts +34 -0
  238. package/lib/routes/ipsw.dev/index.ts +64 -0
  239. package/lib/routes/ipsw.dev/namespace.ts +7 -0
  240. package/lib/routes/ipsw.dev/templates/description.art +20 -0
  241. package/lib/routes/iwara/subscriptions.ts +1 -1
  242. package/lib/routes/javtiful/actress.ts +37 -0
  243. package/lib/routes/javtiful/channel.ts +37 -0
  244. package/lib/routes/javtiful/namespace.ts +6 -0
  245. package/lib/routes/javtiful/templates/description.art +7 -0
  246. package/lib/routes/javtiful/utils.ts +18 -0
  247. package/lib/routes/jianshu/collection.ts +3 -2
  248. package/lib/routes/jianshu/home.ts +3 -2
  249. package/lib/routes/jianshu/user.ts +3 -2
  250. package/lib/routes/jike/topic.ts +10 -3
  251. package/lib/routes/jike/user.ts +3 -2
  252. package/lib/routes/jjwxc/book.ts +18 -14
  253. package/lib/routes/joins/chinese.ts +218 -0
  254. package/lib/routes/joins/namespace.ts +8 -0
  255. package/lib/routes/joins/templates/description.art +17 -0
  256. package/lib/routes/kakuyomu/namespace.ts +6 -0
  257. package/lib/routes/kakuyomu/types.ts +6 -0
  258. package/lib/routes/kakuyomu/works.ts +73 -0
  259. package/lib/routes/kaopu/news.ts +3 -3
  260. package/lib/routes/kisskiss/blog.ts +74 -0
  261. package/lib/routes/kisskiss/namespace.ts +6 -0
  262. package/lib/routes/konachan/namespace.ts +7 -0
  263. package/lib/routes/konachan/post.ts +84 -0
  264. package/lib/routes/lemmy/index.ts +30 -3
  265. package/lib/routes/lemmy/namespace.ts +1 -0
  266. package/lib/routes/link3/events.ts +86 -0
  267. package/lib/routes/link3/namespace.ts +6 -0
  268. package/lib/routes/link3/profile.ts +143 -0
  269. package/lib/routes/lmu/jobs.ts +96 -0
  270. package/lib/routes/lmu/namespace.ts +17 -0
  271. package/lib/routes/lmu/templates/jobPosting.art +11 -0
  272. package/lib/routes/lofter/collection.ts +87 -0
  273. package/lib/routes/lofter/user.ts +1 -1
  274. package/lib/routes/lorientlejour/index.ts +186 -0
  275. package/lib/routes/lorientlejour/namespace.ts +7 -0
  276. package/lib/routes/lorientlejour/templates/description.art +18 -0
  277. package/lib/routes/lovelive-anime/namespace.ts +1 -1
  278. package/lib/routes/lovelive-anime/news.ts +56 -26
  279. package/lib/routes/lovelive-anime/schedules.ts +18 -6
  280. package/lib/routes/lovelive-anime/templates/description.art +1 -1
  281. package/lib/routes/lovelive-anime/templates/scheduleDesc.art +0 -1
  282. package/lib/routes/lovelive-anime/topics.ts +1 -1
  283. package/lib/routes/luma/index.ts +92 -0
  284. package/lib/routes/luma/namespace.ts +6 -0
  285. package/lib/routes/malaysiakini/index.ts +179 -0
  286. package/lib/routes/malaysiakini/namespace.ts +11 -0
  287. package/lib/routes/manhuagui/comic.ts +1 -1
  288. package/lib/routes/mastodon/account-id.ts +26 -3
  289. package/lib/routes/mastodon/acct.ts +15 -4
  290. package/lib/routes/mastodon/timeline-local.ts +14 -3
  291. package/lib/routes/mastodon/timeline-remote.ts +14 -3
  292. package/lib/routes/meishichina/index.ts +1997 -0
  293. package/lib/routes/meishichina/namespace.ts +8 -0
  294. package/lib/routes/mi/crowdfunding.ts +43 -22
  295. package/lib/routes/mi/templates/crowdfunding.art +28 -0
  296. package/lib/routes/mi/types.ts +40 -0
  297. package/lib/routes/mi/utils.ts +80 -0
  298. package/lib/routes/misskey/featured-notes.ts +3 -2
  299. package/lib/routes/misskey/user-timeline.ts +3 -2
  300. package/lib/routes/misskey/utils.ts +1 -0
  301. package/lib/routes/natgeo/dailyphoto.ts +4 -3
  302. package/lib/routes/natgeo/dailyselection.ts +17 -2
  303. package/lib/routes/ncku/csie.ts +83 -0
  304. package/lib/routes/ncku/namespace.ts +6 -0
  305. package/lib/routes/ncku/phys.ts +95 -0
  306. package/lib/routes/news/namespace.ts +1 -1
  307. package/lib/routes/newyorker/news.ts +29 -21
  308. package/lib/routes/nhk/news.ts +32 -15
  309. package/lib/routes/nicovideo/namespace.ts +7 -0
  310. package/lib/routes/nicovideo/templates/video.art +7 -0
  311. package/lib/routes/nicovideo/types.ts +54 -0
  312. package/lib/routes/nicovideo/utils.ts +37 -0
  313. package/lib/routes/nicovideo/video.ts +47 -0
  314. package/lib/routes/nikkei/cn/index.ts +12 -1
  315. package/lib/routes/nytimes/book.ts +25 -28
  316. package/lib/routes/nytimes/daily-briefing-chinese.ts +4 -4
  317. package/lib/routes/nytimes/index.ts +16 -9
  318. package/lib/routes/nytimes/namespace.ts +1 -1
  319. package/lib/routes/obsidian/namespace.ts +6 -0
  320. package/lib/routes/obsidian/publish.ts +83 -0
  321. package/lib/routes/obsidian/utils.ts +8 -0
  322. package/lib/routes/oct0pu5/namespace.ts +10 -0
  323. package/lib/routes/oct0pu5/rss.ts +48 -0
  324. package/lib/routes/oncc/templates/article.art +1 -1
  325. package/lib/routes/papers/index.ts +7 -1
  326. package/lib/routes/parliament.uk/commonslibrary.ts +55 -0
  327. package/lib/routes/parliament.uk/lordslibrary.ts +55 -0
  328. package/lib/routes/parliament.uk/namespace.ts +6 -0
  329. package/lib/routes/pconline/focus.ts +143 -0
  330. package/lib/routes/pconline/namespace.ts +10 -0
  331. package/lib/routes/people/index.ts +6 -2
  332. package/lib/routes/picnob/user.ts +11 -3
  333. package/lib/routes/picuki/profile.ts +50 -39
  334. package/lib/routes/pixiv/ranking.ts +1 -0
  335. package/lib/routes/pixivision/index.ts +84 -0
  336. package/lib/routes/pixivision/namespace.ts +6 -0
  337. package/lib/routes/pixivision/utils.ts +86 -0
  338. package/lib/routes/pku/bbs/hot.ts +1 -1
  339. package/lib/routes/pornhub/category.ts +3 -2
  340. package/lib/routes/pornhub/model.ts +6 -7
  341. package/lib/routes/pornhub/pornstar.ts +67 -19
  342. package/lib/routes/pornhub/search.ts +3 -2
  343. package/lib/routes/pornhub/users.ts +3 -5
  344. package/lib/routes/qiche365/namespace.ts +5 -0
  345. package/lib/routes/qiche365/recall.ts +53 -0
  346. package/lib/routes/qidian/namespace.ts +1 -1
  347. package/lib/routes/questn/community.ts +76 -0
  348. package/lib/routes/questn/events.ts +101 -0
  349. package/lib/routes/questn/namespace.ts +6 -0
  350. package/lib/routes/questn/util.ts +16 -0
  351. package/lib/routes/rebase/geekdaily.ts +35 -0
  352. package/lib/routes/rebase/namespace.ts +6 -0
  353. package/lib/routes/resonac/namespace.ts +6 -0
  354. package/lib/routes/resonac/products.ts +85 -0
  355. package/lib/routes/reuters/common.ts +54 -1
  356. package/lib/routes/rss3/index.ts +22 -13
  357. package/lib/routes/rss3/interfaces/metadata.ts +67 -0
  358. package/lib/routes/rsshub/transform/html.ts +114 -75
  359. package/lib/routes/samd/news.ts +1 -1
  360. package/lib/routes/sciencenet/user.ts +3 -1
  361. package/lib/routes/scmp/utils.ts +2 -2
  362. package/lib/routes/scut/gzic/media.ts +71 -0
  363. package/lib/routes/scut/gzic/news.ts +65 -0
  364. package/lib/routes/scut/gzic/notice.ts +88 -0
  365. package/lib/routes/sdu/{cs.ts → cs/index.ts} +46 -12
  366. package/lib/routes/sdu/cs/yjsgz.ts +85 -0
  367. package/lib/routes/sdu/gjsw.ts +80 -0
  368. package/lib/routes/sdu/namespace.ts +2 -2
  369. package/lib/routes/sdu/qd/xszxqd.ts +98 -0
  370. package/lib/routes/sdu/qd/xyb.ts +82 -0
  371. package/lib/routes/sdu/ygb.ts +90 -0
  372. package/lib/routes/showstart/search.ts +33 -1
  373. package/lib/routes/sis001/author.ts +52 -0
  374. package/lib/routes/sis001/common.ts +38 -0
  375. package/lib/routes/sis001/forum.ts +2 -29
  376. package/lib/routes/sjtu/jwc.ts +4 -1
  377. package/lib/routes/sjtu/namespace.ts +1 -1
  378. package/lib/routes/sjtu/seiee/index.ts +97 -0
  379. package/lib/routes/skeb/following-creators.ts +52 -0
  380. package/lib/routes/skeb/following-works.ts +52 -0
  381. package/lib/routes/skeb/friend-works.ts +52 -0
  382. package/lib/routes/skeb/index.ts +131 -0
  383. package/lib/routes/skeb/namespace.ts +6 -0
  384. package/lib/routes/skeb/search.ts +77 -0
  385. package/lib/routes/skeb/templates/creator.art +8 -0
  386. package/lib/routes/skeb/templates/work.art +10 -0
  387. package/lib/routes/skeb/utils.ts +155 -0
  388. package/lib/routes/skeb/works.ts +88 -0
  389. package/lib/routes/skebetter/illust.ts +83 -0
  390. package/lib/routes/skebetter/index.ts +83 -0
  391. package/lib/routes/skebetter/manga.ts +65 -0
  392. package/lib/routes/skebetter/namespace.ts +6 -0
  393. package/lib/routes/skebetter/utils.ts +72 -0
  394. package/lib/routes/smzdm/product.ts +85 -0
  395. package/lib/routes/solidot/main.ts +28 -12
  396. package/lib/routes/soundon/namespace.ts +6 -0
  397. package/lib/routes/soundon/podcast.ts +80 -0
  398. package/lib/routes/soundon/types.ts +67 -0
  399. package/lib/routes/spankbang/namespace.ts +6 -0
  400. package/lib/routes/spankbang/new-videos.ts +90 -0
  401. package/lib/routes/spankbang/templates/video.art +7 -0
  402. package/lib/routes/sse/sselawsrules.ts +370 -0
  403. package/lib/routes/sspai/index.ts +2 -2
  404. package/lib/routes/straitstimes/index.ts +135 -0
  405. package/lib/routes/straitstimes/namespace.ts +7 -0
  406. package/lib/routes/straitstimes/templates/description.art +27 -0
  407. package/lib/routes/sustainabilitymag/articles.ts +2 -0
  408. package/lib/routes/sustainabilitymag/namespace.ts +1 -1
  409. package/lib/routes/swjtu/scai/bks.ts +76 -0
  410. package/lib/routes/szftedu/dongtai.ts +62 -0
  411. package/lib/routes/szftedu/gonggao.ts +62 -0
  412. package/lib/routes/szftedu/namespace.ts +6 -0
  413. package/lib/routes/szse/rule.ts +315 -42
  414. package/lib/routes/taoguba/blog.ts +1 -1
  415. package/lib/routes/taoguba/index.ts +1 -1
  416. package/lib/routes/telegram/blog.ts +3 -2
  417. package/lib/routes/telegram/channel.ts +34 -3
  418. package/lib/routes/telegram/stickerpack.ts +3 -2
  419. package/lib/routes/tencent/news/author.ts +2 -1
  420. package/lib/routes/test/index.ts +50 -43
  421. package/lib/routes/the/index.ts +8 -4
  422. package/lib/routes/theblockbeats/index.ts +10 -5
  423. package/lib/routes/theinitium/app.ts +137 -0
  424. package/lib/routes/theinitium/templates/description.art +17 -0
  425. package/lib/routes/threads/index.ts +26 -20
  426. package/lib/routes/tju/cic/index.ts +2 -2
  427. package/lib/routes/tju/news/index.ts +2 -2
  428. package/lib/routes/tju/oaa/index.ts +2 -2
  429. package/lib/routes/towardsdatascience/latest.ts +67 -0
  430. package/lib/routes/towardsdatascience/namespace.ts +6 -0
  431. package/lib/routes/ttv/index.ts +1 -1
  432. package/lib/routes/tvb/news.ts +2 -1
  433. package/lib/routes/twitch/live.ts +3 -2
  434. package/lib/routes/twitch/video.ts +15 -6
  435. package/lib/routes/twitter/api/index.ts +2 -0
  436. package/lib/routes/twitter/api/mobile-api/login.ts +6 -1
  437. package/lib/routes/twitter/api/web-api/api.ts +34 -10
  438. package/lib/routes/twitter/api/web-api/constants.ts +18 -15
  439. package/lib/routes/twitter/api/web-api/login.ts +75 -0
  440. package/lib/routes/twitter/api/web-api/utils.ts +147 -52
  441. package/lib/routes/twitter/home-latest.ts +60 -0
  442. package/lib/routes/twitter/list.ts +5 -2
  443. package/lib/routes/twitter/media.ts +13 -4
  444. package/lib/routes/twitter/tweet.ts +1 -0
  445. package/lib/routes/twitter/user.ts +15 -6
  446. package/lib/routes/uber/blog.ts +1 -1
  447. package/lib/routes/udn/breaking-news.ts +2 -2
  448. package/lib/routes/uestc/bbs.ts +97 -0
  449. package/lib/routes/uestc/gr.ts +65 -37
  450. package/lib/routes/uestc/jwc.ts +49 -28
  451. package/lib/routes/uestc/namespace.ts +1 -1
  452. package/lib/routes/ustc/scms.ts +97 -0
  453. package/lib/routes/v2ex/topics.ts +1 -0
  454. package/lib/routes/vimeo/category.ts +4 -3
  455. package/lib/routes/vimeo/usr-videos.ts +3 -2
  456. package/lib/routes/voronoiapp/author.ts +41 -0
  457. package/lib/routes/voronoiapp/common.ts +247 -0
  458. package/lib/routes/voronoiapp/editors-pick.ts +28 -0
  459. package/lib/routes/voronoiapp/home.ts +29 -0
  460. package/lib/routes/voronoiapp/latest.ts +28 -0
  461. package/lib/routes/voronoiapp/namespace.ts +6 -0
  462. package/lib/routes/voronoiapp/popular.ts +49 -0
  463. package/lib/routes/voronoiapp/search.ts +33 -0
  464. package/lib/routes/voronoiapp/types.d.ts +78 -0
  465. package/lib/routes/wchscu/namespace.ts +6 -0
  466. package/lib/routes/wchscu/recruit.ts +73 -0
  467. package/lib/routes/wechat/ershcimi.ts +4 -2
  468. package/lib/routes/weibo/namespace.ts +1 -0
  469. package/lib/routes/weibo/oasis/user.ts +1 -1
  470. package/lib/routes/weibo/super-index.ts +23 -11
  471. package/lib/routes/weibo/user.ts +22 -3
  472. package/lib/routes/weibo/utils.ts +0 -4
  473. package/lib/routes/whu/cs.ts +11 -3
  474. package/lib/routes/whu/gs/index.ts +2 -1
  475. package/lib/routes/whu/news.ts +27 -2
  476. package/lib/routes/withgoogle/explorables.ts +54 -0
  477. package/lib/routes/withgoogle/namespace.ts +6 -0
  478. package/lib/routes/xbookcn/blog.ts +66 -0
  479. package/lib/routes/xbookcn/namespace.ts +6 -0
  480. package/lib/routes/xiaohongshu/notes.ts +10 -2
  481. package/lib/routes/xiaohongshu/user.ts +30 -6
  482. package/lib/routes/xiaohongshu/util.ts +3 -1
  483. package/lib/routes/xiaoyuzhou/podcast.ts +35 -7
  484. package/lib/routes/xidian/cs.ts +143 -0
  485. package/lib/routes/xidian/gr.ts +289 -0
  486. package/lib/routes/xidian/jwc.ts +1 -0
  487. package/lib/routes/xidian/namespace.ts +1 -1
  488. package/lib/routes/xueqiu/cookies.ts +17 -2
  489. package/lib/routes/xueqiu/favorite.ts +16 -2
  490. package/lib/routes/xueqiu/stock-info.ts +6 -12
  491. package/lib/routes/yamap/articles.ts +62 -0
  492. package/lib/routes/yamap/namespace.ts +6 -0
  493. package/lib/routes/yande/namespace.ts +1 -1
  494. package/lib/routes/yande/post.ts +7 -7
  495. package/lib/routes/yicai/carousel.ts +48 -0
  496. package/lib/routes/yicai/utils.ts +23 -17
  497. package/lib/routes/yilinzazhi/index.ts +58 -0
  498. package/lib/routes/yilinzazhi/latest.ts +103 -0
  499. package/lib/routes/yilinzazhi/namespace.ts +8 -0
  500. package/lib/routes/youtube/playlist.ts +3 -2
  501. package/lib/routes/yystv/docs.ts +28 -19
  502. package/lib/routes/zaobao/util.ts +41 -43
  503. package/lib/routes/zhihu/activities.ts +2 -1
  504. package/lib/routes/zhihu/answers.ts +5 -1
  505. package/lib/routes/zhihu/execlib/x-zse-96-v3.ts +2 -0
  506. package/lib/routes/zhihu/timeline.ts +6 -1
  507. package/lib/routes/zhihu/utils.ts +15 -7
  508. package/lib/routes/zhihu/zhuanlan.ts +8 -7
  509. package/lib/routes/zsxq/types.ts +9 -0
  510. package/lib/routes/zsxq/utils.ts +4 -3
  511. package/lib/setup.test.ts +1 -1
  512. package/lib/types.ts +6 -0
  513. package/lib/utils/cache/redis.ts +1 -1
  514. package/lib/utils/camelcase-keys.spec.ts +127 -0
  515. package/lib/utils/camelcase-keys.ts +27 -0
  516. package/lib/utils/common-utils.ts +1 -0
  517. package/lib/utils/otel/metric.ts +3 -2
  518. package/lib/utils/request-rewriter/fetch.ts +1 -1
  519. package/lib/views/index.tsx +3 -6
  520. package/lib/views/json.ts +1 -1
  521. package/lib/views/rss.tsx +7 -0
  522. package/package.json +55 -55
  523. package/lib/routes/a9vg/a9vg.ts +0 -45
  524. package/lib/routes/sse/lawandrules.ts +0 -68
  525. package/lib/routes-deprecated/anime1/anime.js +0 -25
  526. package/lib/routes-deprecated/anime1/search.js +0 -25
  527. package/lib/routes-deprecated/dykszx/news.js +0 -60
  528. package/lib/routes-deprecated/gamersky/ent.js +0 -89
  529. package/lib/routes-deprecated/gamersky/news.js +0 -34
  530. package/lib/routes-deprecated/geekpark/breakingnews.js +0 -25
  531. package/lib/routes-deprecated/hko/weather.js +0 -44
  532. package/lib/routes-deprecated/konachan/post-popular-recent.js +0 -67
package/README.md CHANGED
@@ -12,29 +12,15 @@
12
12
  [![Test coverage](https://img.shields.io/codecov/c/github/DIYgod/RSSHub.svg?style=flat-square&logo=codecov)](https://app.codecov.io/gh/DIYgod/RSSHub/branch/master)
13
13
  [![Visitors](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FDIYgod%2FRSSHub&count_bg=%23FF752E&title_bg=%23555555&icon=rss.svg&icon_color=%23FF752E&title=RSS+lovers&edge_flat=true)](https://github.com/DIYgod/RSSHub)
14
14
 
15
- [![Telegram group](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.swo.moe%2Fstats%2Ftelegram%2Frsshub&query=count&color=2CA5E0&label=Telegram%20Group&logo=telegram&cacheSeconds=3600&style=flat-square)](https://t.me/rsshub) [![Telegram channel](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.swo.moe%2Fstats%2Ftelegram%2FawesomeRSSHub&query=count&color=2CA5E0&label=Telegram%20Channel&logo=telegram&cacheSeconds=3600&style=flat-square)](https://t.me/awesomeRSSHub) [![Twitter](https://img.shields.io/badge/any_text-Follow-blue?color=2CA5E0&label=Twitter&logo=twitter&cacheSeconds=3600&style=flat-square)](https://x.com/intent/follow?screen_name=_RSSHub)
15
+ [![Telegram group](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.swo.moe%2Fstats%2Ftelegram%2Frsshub&query=count&color=2CA5E0&label=Telegram%20Group&logo=telegram&cacheSeconds=3600&style=flat-square)](https://t.me/rsshub) [![Telegram channel](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.swo.moe%2Fstats%2Ftelegram%2FawesomeRSSHub&query=count&color=2CA5E0&label=Telegram%20Channel&logo=telegram&cacheSeconds=3600&style=flat-square)](https://t.me/awesomeRSSHub) [![X (Twitter)](https://img.shields.io/badge/any_text-Follow-blue?color=2CA5E0&label=Twitter&logo=X&cacheSeconds=3600&style=flat-square)](https://x.com/intent/follow?screen_name=_RSSHub)
16
16
 
17
17
  ## Introduction
18
18
 
19
- RSSHub is an open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything.
19
+ RSSHub is the world's largest RSS network, consisting of over 5,000 global instances.
20
20
 
21
21
  RSSHub delivers millions of contents aggregated from all kinds of sources, our vibrant open source community is ensuring the deliver of RSSHub's new routes, new features and bug fixes.
22
22
 
23
- RSSHub can be used with browser extension [RSSHub Radar](https://github.com/DIYgod/RSSHub-Radar) and mobile auxiliary app [RSSBud](https://github.com/Cay-Zhang/RSSBud) (iOS) and [RSSAid](https://github.com/LeetaoGoooo/RSSAid) (Android)
24
-
25
- [English docs](https://docs.rsshub.app) | [Telegram Group](https://t.me/rsshub) | [Telegram Channel](https://t.me/awesomeRSSHub) | [Twitter](https://x.com/intent/follow?screen_name=_RSSHub) | [中文文档](https://docs.rsshub.app/zh/)
26
-
27
- ## Special Thanks
28
-
29
- ### Contributors
30
-
31
- [![](https://opencollective.com/RSSHub/contributors.svg?width=890)](https://github.com/DIYgod/RSSHub/graphs/contributors)
32
-
33
- Logo designer [sheldonrrr](https://dribbble.com/sheldonrrr)
34
-
35
- ### Backers
36
-
37
- <a href="https://www.cloudflare.com" target="_blank"><img height="50px" src="https://i.imgur.com/7Ph27Fq.png"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.netlify.com" target="_blank"><img height="40px" src="https://i.imgur.com/cU01915.png"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://1password.com" target="_blank"><img height="40px" src="https://i.imgur.com/a2XjflO.png"></a>
23
+ [Documentation](https://docs.rsshub.app) | [Telegram Group](https://t.me/rsshub) | [Telegram Channel](https://t.me/awesomeRSSHub) | [X (Twitter)](https://x.com/intent/follow?screen_name=_RSSHub)
38
24
 
39
25
  ## Related Projects
40
26
 
@@ -43,53 +29,32 @@ Logo designer [sheldonrrr](https://dribbble.com/sheldonrrr)
43
29
  - [RSSAid](https://github.com/LeetaoGoooo/RSSAid) | RSSHub Radar for Android platform built with Flutter.
44
30
  - [DocSearch](https://github.com/Fatpandac/DocSearch) | Link RSSHub DocSearch into Raycast
45
31
 
46
- ## Join Us
32
+ ## Contribute
47
33
 
48
34
  We welcome all pull requests. Suggestions and feedback are also welcomed [here](https://github.com/DIYgod/RSSHub/issues).
49
35
 
50
- Refer to [Join Us](https://docs.rsshub.app/joinus/)
36
+ Refer to [Quick Start](https://docs.rsshub.app/joinus/)
51
37
 
52
38
  ## Deployment
53
39
 
54
40
  Refer to [Deployment](https://docs.rsshub.app/deploy/)
55
41
 
56
- ## Support RSSHub
57
-
58
- Refer to [Support RSSHub](https://docs.rsshub.app/sponsor/)
59
-
60
- RSSHub is open source and completely free under the MIT license. However, just like any other open source project, as the project grows, the hosting, development and maintenance requires funding support.
61
-
62
- You can support RSSHub via donations.
63
-
64
- ### Recurring Donation
65
-
66
- Recurring donors will be rewarded via express issue response, or even have your name displayed on our GitHub page and website.
67
-
68
- - Become a Sponser on [GitHub](https://github.com/sponsors/DIYgod)
69
- - Become a Sponser on [Patreon](https://www.patreon.com/DIYgod)
70
- - Become a Sponser on [Open Collective](https://opencollective.com/RSSHub)
71
- - Become a Sponser on [爱发电](https://afdian.net/@diygod)
72
- - Contact us directly: <i@diygod.me>
42
+ ## Special Thanks
73
43
 
74
- ### One-time Donation
44
+ <div align="center">
75
45
 
76
- We accept donations via the following ways:
46
+ [![](https://opencollective.com/RSSHub/contributors.svg?width=890)](https://github.com/DIYgod/RSSHub/graphs/contributors)
77
47
 
78
- - [WeChat Pay](https://archive.diygod.me/images/wx.jpg)
79
- - [Alipay](https://archive.diygod.me/images/zfb.jpg)
80
- - [Paypal](https://www.paypal.me/DIYgod)
48
+ Logo designer [sheldonrrr](https://dribbble.com/sheldonrrr)
81
49
 
82
- Open source is a very expensive thing. RSSHub would not be possible without the help of these individuals and organizations.
50
+ [![](https://raw.githubusercontent.com/DIYgod/sponsors/main/sponsors.simple.svg)](https://github.com/DIYgod/sponsors)
83
51
 
84
- <p align="center">
85
- <a href="https://github.com/DIYgod/sponsors">
86
- <img src="https://raw.githubusercontent.com/DIYgod/sponsors/main/sponsors.wide.svg" />
87
- </a>
88
- </p>
52
+ <a href="https://www.cloudflare.com" target="_blank"><img height="50px" src="https://i.imgur.com/7Ph27Fq.png"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.netlify.com" target="_blank"><img height="40px" src="https://i.imgur.com/cU01915.png"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://1password.com" target="_blank"><img height="40px" src="https://i.imgur.com/a2XjflO.png"></a>
53
+ </div>
89
54
 
90
55
  ## Author
91
56
 
92
57
  **RSSHub** © [DIYgod](https://github.com/DIYgod), Released under the [MIT](./LICENSE) License.<br>
93
58
  Authored and maintained by DIYgod with help from contributors ([list](https://github.com/DIYgod/RSSHub/contributors)).
94
59
 
95
- > Blog [@DIYgod](https://diygod.cc) · GitHub [@DIYgod](https://github.com/DIYgod) · Twitter [@DIYgod](https://x.com/DIYgod) · Telegram Channel [@awesomeDIYgod](https://t.me/awesomeDIYgod)
60
+ > Blog [@DIYgod](https://diygod.cc) · GitHub [@DIYgod](https://github.com/DIYgod) · X (Twitter) [@DIYgod](https://x.com/DIYgod) · Telegram Channel [@awesomeDIYgod](https://t.me/awesomeDIYgod)
@@ -1,13 +1,10 @@
1
1
  import { namespaces } from '@/registry';
2
2
  import { parse } from 'tldts';
3
- import { RadarItem } from '@/types';
3
+ import { RadarDomain } from '@/types';
4
4
  import { createRoute, RouteHandler } from '@hono/zod-openapi';
5
5
 
6
6
  const radar: {
7
- [domain: string]: {
8
- _name: string;
9
- [subdomain: string]: RadarItem[] | string;
10
- };
7
+ [domain: string]: RadarDomain;
11
8
  } = {};
12
9
 
13
10
  for (const namespace in namespaces) {
@@ -23,7 +20,7 @@ for (const namespace in namespaces) {
23
20
  if (!radar[domain]) {
24
21
  radar[domain] = {
25
22
  _name: namespaces[namespace].name,
26
- };
23
+ } as RadarDomain;
27
24
  }
28
25
  if (!radar[domain][subdomain]) {
29
26
  radar[domain][subdomain] = [];
@@ -1,13 +1,10 @@
1
1
  import { namespaces } from '@/registry';
2
2
  import { parse } from 'tldts';
3
- import { RadarItem } from '@/types';
3
+ import { RadarDomain } from '@/types';
4
4
  import { z, createRoute, RouteHandler } from '@hono/zod-openapi';
5
5
 
6
6
  const radar: {
7
- [domain: string]: {
8
- _name: string;
9
- [subdomain: string]: RadarItem[] | string;
10
- };
7
+ [domain: string]: RadarDomain;
11
8
  } = {};
12
9
 
13
10
  for (const namespace in namespaces) {
@@ -23,7 +20,7 @@ for (const namespace in namespaces) {
23
20
  if (!radar[domain]) {
24
21
  radar[domain] = {
25
22
  _name: namespaces[namespace].name,
26
- };
23
+ } as RadarDomain;
27
24
  }
28
25
  if (!radar[domain][subdomain]) {
29
26
  radar[domain][subdomain] = [];
package/lib/config.ts CHANGED
@@ -47,6 +47,10 @@ export type Config = {
47
47
  debugInfo: string;
48
48
  loggerLevel: string;
49
49
  noLogfiles?: boolean;
50
+ otel: {
51
+ seconds_bucket?: string;
52
+ milliseconds_bucket?: string;
53
+ };
50
54
  showLoggerTimestamp?: boolean;
51
55
  sentry: {
52
56
  dsn?: string;
@@ -70,11 +74,14 @@ export type Config = {
70
74
  temperature?: number;
71
75
  maxTokens?: number;
72
76
  endpoint: string;
73
- prompt?: string;
77
+ inputOption: string;
78
+ promptTitle: string;
79
+ promptDescription: string;
74
80
  };
75
81
  bilibili: {
76
82
  cookies: Record<string, string | undefined>;
77
83
  dmImgList?: string;
84
+ dmImgInter?: string;
78
85
  };
79
86
  bitbucket: {
80
87
  username?: string;
@@ -177,6 +184,16 @@ export type Config = {
177
184
  lightnovel: {
178
185
  cookie?: string;
179
186
  };
187
+ lorientlejour: {
188
+ token?: string;
189
+ username?: string;
190
+ password?: string;
191
+ };
192
+ malaysiakini: {
193
+ email?: string;
194
+ password?: string;
195
+ refreshToken?: string;
196
+ };
180
197
  manhuagui: {
181
198
  cookie?: string;
182
199
  };
@@ -250,6 +267,9 @@ export type Config = {
250
267
  scihub: {
251
268
  host?: string;
252
269
  };
270
+ skeb: {
271
+ bearerToken?: string;
272
+ };
253
273
  spotify: {
254
274
  clientId?: string;
255
275
  clientSecret?: string;
@@ -273,6 +293,10 @@ export type Config = {
273
293
  authenticationSecret?: string[];
274
294
  authToken?: string[];
275
295
  };
296
+ uestc: {
297
+ bbsCookie?: string;
298
+ bbsAuthStr?: string;
299
+ };
276
300
  weibo: {
277
301
  app_key?: string;
278
302
  app_secret?: string;
@@ -412,6 +436,10 @@ const calculateValue = () => {
412
436
  debugInfo: envs.DEBUG_INFO || 'true',
413
437
  loggerLevel: envs.LOGGER_LEVEL || 'info',
414
438
  noLogfiles: toBoolean(envs.NO_LOGFILES, false),
439
+ otel: {
440
+ seconds_bucket: envs.OTEL_SECONDS_BUCKET || '0.01,0.1,1,2,5,15,30,60',
441
+ milliseconds_bucket: envs.OTEL_MILLISECONDS_BUCKET || '10,20,50,100,250,500,1000,5000,15000',
442
+ },
415
443
  showLoggerTimestamp: toBoolean(envs.SHOW_LOGGER_TIMESTAMP, false),
416
444
  sentry: {
417
445
  dsn: envs.SENTRY,
@@ -436,13 +464,16 @@ const calculateValue = () => {
436
464
  temperature: toInt(envs.OPENAI_TEMPERATURE, 0.2),
437
465
  maxTokens: toInt(envs.OPENAI_MAX_TOKENS, 0) || undefined,
438
466
  endpoint: envs.OPENAI_API_ENDPOINT || 'https://api.openai.com/v1',
439
- prompt: envs.OPENAI_PROMPT || 'Please summarize the following article and reply with markdown format.',
467
+ inputOption: envs.OPENAI_INPUT_OPTION || 'description',
468
+ promptDescription: envs.OPENAI_PROMPT || 'Please summarize the following article and reply with markdown format.',
469
+ promptTitle: envs.OPENAI_PROMPT_TITLE || 'Please translate the following title into Simplified Chinese and reply only translated text.',
440
470
  },
441
471
 
442
472
  // Route-specific Configurations
443
473
  bilibili: {
444
474
  cookies: bilibili_cookies,
445
475
  dmImgList: envs.BILIBILI_DM_IMG_LIST,
476
+ dmImgInter: envs.BILIBILI_DM_IMG_INTER,
446
477
  },
447
478
  bitbucket: {
448
479
  username: envs.BITBUCKET_USERNAME,
@@ -546,6 +577,16 @@ const calculateValue = () => {
546
577
  lightnovel: {
547
578
  cookie: envs.SECURITY_KEY,
548
579
  },
580
+ lorientlejour: {
581
+ token: envs.LORIENTLEJOUR_TOKEN,
582
+ username: envs.LORIENTLEJOUR_USERNAME,
583
+ password: envs.LORIENTLEJOUR_PASSWORD,
584
+ },
585
+ malaysiakini: {
586
+ email: envs.MALAYSIAKINI_EMAIL,
587
+ password: envs.MALAYSIAKINI_PASSWORD,
588
+ refreshToken: envs.MALAYSIAKINI_REFRESHTOKEN,
589
+ },
549
590
  manhuagui: {
550
591
  cookie: envs.MHGUI_COOKIE,
551
592
  },
@@ -619,6 +660,9 @@ const calculateValue = () => {
619
660
  scihub: {
620
661
  host: envs.SCIHUB_HOST || 'https://sci-hub.se/',
621
662
  },
663
+ skeb: {
664
+ bearerToken: envs.SKEB_BEARER_TOKEN,
665
+ },
622
666
  spotify: {
623
667
  clientId: envs.SPOTIFY_CLIENT_ID,
624
668
  clientSecret: envs.SPOTIFY_CLIENT_SECRET,
@@ -646,6 +690,10 @@ const calculateValue = () => {
646
690
  authenticationSecret: envs.TWITTER_AUTHENTICATION_SECRET?.split(','),
647
691
  authToken: envs.TWITTER_AUTH_TOKEN?.split(','),
648
692
  },
693
+ uestc: {
694
+ bbsCookie: envs.UESTC_BBS_COOKIE,
695
+ bbsAuthStr: envs.UESTC_BBS_AUTH_STR,
696
+ },
649
697
  weibo: {
650
698
  app_key: envs.WEIBO_APP_KEY,
651
699
  app_secret: envs.WEIBO_APP_SECRET,
@@ -22,7 +22,7 @@ describe('httperror', () => {
22
22
  it(`httperror`, async () => {
23
23
  const response = await request.get('/test/httperror');
24
24
  expect(response.status).toBe(503);
25
- expect(response.text).toMatch('FetchError: [GET] &quot;https://httpbingo.org/status/404&quot;: 404 Not Found');
25
+ expect(response.text).toContain('FetchError: [GET] &quot;https://httpbingo.org/status/404&quot;: 404 Not Found');
26
26
  }, 20000);
27
27
  });
28
28
 
@@ -67,7 +67,7 @@ export const errorHandler: ErrorHandler = (error, ctx) => {
67
67
  const message = `${error.name}: ${errorMessage}`;
68
68
 
69
69
  logger.error(`Error in ${requestPath}: ${message}`);
70
- requestMetric.error({ path: requestPath, method: ctx.req.method, status: ctx.res.status });
70
+ requestMetric.error({ path: matchedRoute, method: ctx.req.method, status: ctx.res.status });
71
71
 
72
72
  return config.isPackage || ctx.req.query('format') === 'json'
73
73
  ? ctx.json({
package/lib/index.ts CHANGED
@@ -18,7 +18,7 @@ if (config.listenInaddrAny) {
18
18
 
19
19
  const server = serve({
20
20
  fetch: app.fetch,
21
- hostname: config.listenInaddrAny ? undefined : '127.0.0.1',
21
+ hostname: config.listenInaddrAny ? '::' : '127.0.0.1',
22
22
  port,
23
23
  });
24
24
 
@@ -116,6 +116,148 @@ const expects = {
116
116
  desc: '<video src="https://i3.wp.com/mock.com/DIYgod/DIYgod/RSSHub"></video> - Powered by RSSHub',
117
117
  },
118
118
  },
119
+ extraComplicated: {
120
+ origin: {
121
+ items: [
122
+ {
123
+ content:
124
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n\n<a href="http://mock.com/DIYgod/RSSHub"></a>\n<img src="https://mock.com/DIYgod/RSSHub.jpg" data-src="/DIYgod/RSSHub0.jpg" referrerpolicy="no-referrer">\n<img data-src="/DIYgod/RSSHub.jpg" src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img data-mock="/DIYgod/RSSHub.png" src="https://mock.com/DIYgod/RSSHub.png" referrerpolicy="no-referrer">\n<img mock="/DIYgod/RSSHub.gif" src="https://mock.com/DIYgod/RSSHub.gif" referrerpolicy="no-referrer">\n<img src="http://mock.com/DIYgod/DIYgod/RSSHub" referrerpolicy="no-referrer">\n<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
125
+ itunes: {},
126
+ },
127
+ {
128
+ content: '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">',
129
+ itunes: {},
130
+ },
131
+ {
132
+ content:
133
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
134
+ enclosure: {
135
+ url: 'https://mock.com/DIYgod/RSSHub.png',
136
+ type: 'image/png',
137
+ },
138
+ itunes: {
139
+ image: 'https://mock.com/DIYgod/RSSHub.gif',
140
+ },
141
+ },
142
+ ],
143
+ image: {
144
+ link: 'https://github.com/DIYgod/RSSHub',
145
+ url: 'https://mock.com/DIYgod/RSSHub.png',
146
+ title: 'Test complicated',
147
+ },
148
+ description: '<img src="http://mock.com/DIYgod/DIYgod/RSSHub"> - Powered by RSSHub',
149
+ },
150
+ processed: {
151
+ items: [
152
+ {
153
+ content:
154
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n\n<a href="http://mock.com/DIYgod/RSSHub"></a>\n<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" data-src="/DIYgod/RSSHub0.jpg" referrerpolicy="no-referrer">\n<img data-src="/DIYgod/RSSHub.jpg" src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img data-mock="/DIYgod/RSSHub.png" src="https://i3.wp.com/mock.com/DIYgod/RSSHub.png" referrerpolicy="no-referrer">\n<img mock="/DIYgod/RSSHub.gif" src="https://i3.wp.com/mock.com/DIYgod/RSSHub.gif" referrerpolicy="no-referrer">\n<img src="https://i3.wp.com/mock.com/DIYgod/DIYgod/RSSHub" referrerpolicy="no-referrer">\n<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
155
+ itunes: {},
156
+ },
157
+ {
158
+ content: '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">',
159
+ itunes: {},
160
+ },
161
+ {
162
+ content:
163
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
164
+ enclosure: {
165
+ url: 'https://i3.wp.com/mock.com/DIYgod/RSSHub.png',
166
+ type: 'image/png',
167
+ },
168
+ itunes: {
169
+ image: 'https://i3.wp.com/mock.com/DIYgod/RSSHub.gif',
170
+ },
171
+ },
172
+ ],
173
+ image: {
174
+ link: 'https://github.com/DIYgod/RSSHub',
175
+ url: 'https://i3.wp.com/mock.com/DIYgod/RSSHub.png',
176
+ title: 'Test complicated',
177
+ },
178
+ description: '<img src="https://i3.wp.com/mock.com/DIYgod/DIYgod/RSSHub"> - Powered by RSSHub',
179
+ },
180
+ urlencoded: {
181
+ items: [
182
+ {
183
+ content:
184
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" referrerpolicy="no-referrer">\n\n<a href="http://mock.com/DIYgod/RSSHub"></a>\n<img src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" data-src="/DIYgod/RSSHub0.jpg" referrerpolicy="no-referrer">\n<img data-src="/DIYgod/RSSHub.jpg" src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" referrerpolicy="no-referrer">\n<img data-mock="/DIYgod/RSSHub.png" src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.png" referrerpolicy="no-referrer">\n<img mock="/DIYgod/RSSHub.gif" src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.gif" referrerpolicy="no-referrer">\n<img src="https://images.weserv.nl?url=http%3A%2F%2Fmock.com%2FDIYgod%2FDIYgod%2FRSSHub" referrerpolicy="no-referrer">\n<img src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
185
+ itunes: {},
186
+ },
187
+ {
188
+ content: '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" referrerpolicy="no-referrer">',
189
+ itunes: {},
190
+ },
191
+ {
192
+ content:
193
+ '<a href="https://mock.com/DIYgod/RSSHub"></a>\n<img src="https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.jpg" referrerpolicy="no-referrer">\n<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" referrerpolicy="no-referrer">',
194
+ enclosure: {
195
+ url: 'https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.png',
196
+ type: 'image/png',
197
+ },
198
+ itunes: {
199
+ image: 'https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.gif',
200
+ },
201
+ },
202
+ ],
203
+ image: {
204
+ link: 'https://github.com/DIYgod/RSSHub',
205
+ url: 'https://images.weserv.nl?url=https%3A%2F%2Fmock.com%2FDIYgod%2FRSSHub.png',
206
+ title: 'Test complicated',
207
+ },
208
+ description: '<img src="https://images.weserv.nl?url=http%3A%2F%2Fmock.com%2FDIYgod%2FDIYgod%2FRSSHub"> - Powered by RSSHub',
209
+ },
210
+ },
211
+ extraMultimedia: {
212
+ origin: {
213
+ items: [
214
+ {
215
+ content:
216
+ '<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://mock.com/DIYgod/RSSHub.mp4"></video>\n<video poster="https://mock.com/DIYgod/RSSHub.jpg">\n<source src="https://mock.com/DIYgod/RSSHub.mp4" type="video/mp4">\n<source src="https://mock.com/DIYgod/RSSHub.webm" type="video/webm">\n</video>\n<audio src="https://mock.com/DIYgod/RSSHub.mp3"></audio>\n<iframe src="https://mock.com/DIYgod/RSSHub.html" referrerpolicy="no-referrer"></iframe>',
217
+ },
218
+ {
219
+ content: '<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://mock.com/DIYgod/RSSHub.mp4"></video>',
220
+ enclosure: {
221
+ url: 'https://mock.com/DIYgod/RSSHub.mp4',
222
+ type: 'video/mp4',
223
+ },
224
+ },
225
+ ],
226
+ description: '<video src="http://mock.com/DIYgod/DIYgod/RSSHub"></video> - Powered by RSSHub',
227
+ },
228
+ relayed: {
229
+ items: [
230
+ {
231
+ content:
232
+ '<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4"></video>\n<video poster="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg">\n<source src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4" type="video/mp4">\n<source src="https://i3.wp.com/mock.com/DIYgod/RSSHub.webm" type="video/webm">\n</video>\n<audio src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp3"></audio>\n<iframe src="https://mock.com/DIYgod/RSSHub.html" referrerpolicy="no-referrer"></iframe>',
233
+ },
234
+ {
235
+ content: '<img src="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4"></video>',
236
+ enclosure: {
237
+ url: 'https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4',
238
+ type: 'video/mp4',
239
+ },
240
+ },
241
+ ],
242
+ description: '<video src="https://i3.wp.com/mock.com/DIYgod/DIYgod/RSSHub"></video> - Powered by RSSHub',
243
+ },
244
+ partlyRelayed: {
245
+ items: [
246
+ {
247
+ content:
248
+ '<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4"></video>\n<video poster="https://i3.wp.com/mock.com/DIYgod/RSSHub.jpg">\n<source src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4" type="video/mp4">\n<source src="https://i3.wp.com/mock.com/DIYgod/RSSHub.webm" type="video/webm">\n</video>\n<audio src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp3"></audio>\n<iframe src="https://mock.com/DIYgod/RSSHub.html" referrerpolicy="no-referrer"></iframe>',
249
+ },
250
+ {
251
+ content: '<img src="https://mock.com/DIYgod/RSSHub.jpg" referrerpolicy="no-referrer">\n<video src="https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4"></video>',
252
+ enclosure: {
253
+ url: 'https://i3.wp.com/mock.com/DIYgod/RSSHub.mp4',
254
+ type: 'video/mp4',
255
+ },
256
+ },
257
+ ],
258
+ description: '<video src="https://i3.wp.com/mock.com/DIYgod/DIYgod/RSSHub"></video> - Powered by RSSHub',
259
+ },
260
+ },
119
261
  };
120
262
 
121
263
  const testAntiHotlink = async (path, expectObj, query?: string | Record<string, any>) => {
@@ -142,12 +284,55 @@ const testAntiHotlink = async (path, expectObj, query?: string | Record<string,
142
284
  return parsed;
143
285
  };
144
286
 
145
- const expectImgOrigin = (query?: string | Record<string, any>) => testAntiHotlink('/test/complicated', expects.complicated.origin, query);
146
- const expectImgProcessed = (query?: string | Record<string, any>) => testAntiHotlink('/test/complicated', expects.complicated.processed, query);
147
- const expectImgUrlencoded = (query?: string | Record<string, any>) => testAntiHotlink('/test/complicated', expects.complicated.urlencoded, query);
148
- const expectMultimediaOrigin = (query?: string | Record<string, any>) => testAntiHotlink('/test/multimedia', expects.multimedia.origin, query);
149
- const expectMultimediaRelayed = (query?: string | Record<string, any>) => testAntiHotlink('/test/multimedia', expects.multimedia.relayed, query);
150
- const expectMultimediaPartlyRelayed = (query?: string | Record<string, any>) => testAntiHotlink('/test/multimedia', expects.multimedia.partlyRelayed, query);
287
+ const testAntiHotlinkExtra = async (path, expectObj, query?: string | Record<string, any>) => {
288
+ const app = (await import('@/app')).default;
289
+
290
+ path += query ? `?${new URLSearchParams(query).toString()}` : '';
291
+
292
+ const response = await app.request(path);
293
+ const parsed = await parser.parseString(await response.text());
294
+ const obj = {
295
+ description: parsed.description,
296
+ image: parsed.image,
297
+ items: parsed.items.slice(0, expectObj.items.length).map((e) => ({
298
+ content: e.content,
299
+ enclosure: e.enclosure,
300
+ itunes: e.itunes,
301
+ })),
302
+ };
303
+ expect(obj).toEqual(expectObj);
304
+
305
+ return parsed;
306
+ };
307
+
308
+ const expectImgOrigin = async (query?: string | Record<string, any>) => {
309
+ await testAntiHotlink('/test/complicated', expects.complicated.origin, query);
310
+ await testAntiHotlinkExtra('/test/complicated', expects.extraComplicated.origin, query);
311
+ };
312
+ const expectImgProcessed = async (query?: string | Record<string, any>) => {
313
+ await testAntiHotlink('/test/complicated', expects.complicated.processed, query);
314
+ await testAntiHotlinkExtra('/test/complicated', expects.extraComplicated.processed, query);
315
+ };
316
+
317
+ const expectImgUrlencoded = async (query?: string | Record<string, any>) => {
318
+ await testAntiHotlink('/test/complicated', expects.complicated.urlencoded, query);
319
+ await testAntiHotlinkExtra('/test/complicated', expects.extraComplicated.urlencoded, query);
320
+ };
321
+
322
+ const expectMultimediaOrigin = async (query?: string | Record<string, any>) => {
323
+ await testAntiHotlink('/test/multimedia', expects.multimedia.origin, query);
324
+ await testAntiHotlinkExtra('/test/multimedia', expects.extraMultimedia.origin, query);
325
+ };
326
+
327
+ const expectMultimediaRelayed = async (query?: string | Record<string, any>) => {
328
+ await testAntiHotlink('/test/multimedia', expects.multimedia.relayed, query);
329
+ await testAntiHotlinkExtra('/test/multimedia', expects.extraMultimedia.relayed, query);
330
+ };
331
+
332
+ const expectMultimediaPartlyRelayed = async (query?: string | Record<string, any>) => {
333
+ await testAntiHotlink('/test/multimedia', expects.multimedia.partlyRelayed, query);
334
+ await testAntiHotlinkExtra('/test/multimedia', expects.extraMultimedia.partlyRelayed, query);
335
+ };
151
336
 
152
337
  describe('anti-hotlink', () => {
153
338
  it('template-legacy', async () => {
@@ -17,7 +17,7 @@ const matchPath = (path: string, paths: string[]) => {
17
17
  return false;
18
18
  };
19
19
 
20
- // return ture if the path needs to be processed
20
+ // return true if the path needs to be processed
21
21
  const filterPath = (path: string) => {
22
22
  const include = config.hotlink.includePaths;
23
23
  const exclude = config.hotlink.excludePaths;
@@ -44,6 +44,18 @@ const parseUrl = (str: string) => {
44
44
 
45
45
  return url;
46
46
  };
47
+
48
+ const replaceUrl = (template?: string, url?: string) => {
49
+ if (!template || !url) {
50
+ return url;
51
+ }
52
+ const oldUrl = parseUrl(url);
53
+ if (oldUrl && oldUrl.protocol !== 'data:') {
54
+ return interpolate(template, oldUrl);
55
+ }
56
+ return url;
57
+ };
58
+
47
59
  const replaceUrls = ($: CheerioAPI, selector: string, template: string, attribute = 'src') => {
48
60
  $(selector).each(function () {
49
61
  const oldSrc = $(this).attr(attribute);
@@ -120,6 +132,9 @@ const middleware: MiddlewareHandler = async (ctx, next) => {
120
132
  // image link
121
133
  const data: Data = ctx.get('data');
122
134
  if (data) {
135
+ if (data.image) {
136
+ data.image = replaceUrl(imageHotlinkTemplate, data.image);
137
+ }
123
138
  if (data.description) {
124
139
  data.description = process(data.description, imageHotlinkTemplate, multimediaHotlinkTemplate);
125
140
  }
@@ -129,6 +144,19 @@ const middleware: MiddlewareHandler = async (ctx, next) => {
129
144
  if (item.description) {
130
145
  item.description = process(item.description, imageHotlinkTemplate, multimediaHotlinkTemplate);
131
146
  }
147
+ if (item.enclosure_url && item.enclosure_type) {
148
+ if (item.enclosure_type.startsWith('image/')) {
149
+ item.enclosure_url = replaceUrl(imageHotlinkTemplate, item.enclosure_url);
150
+ } else if (/^(video|audio)\//.test(item.enclosure_type)) {
151
+ item.enclosure_url = replaceUrl(multimediaHotlinkTemplate, item.enclosure_url);
152
+ }
153
+ }
154
+ if (item.image) {
155
+ item.image = replaceUrl(imageHotlinkTemplate, item.image);
156
+ }
157
+ if (item.itunes_item_image) {
158
+ item.itunes_item_image = replaceUrl(imageHotlinkTemplate, item.itunes_item_image);
159
+ }
132
160
  }
133
161
  }
134
162
 
@@ -26,7 +26,7 @@ const colorStatus = (status: number) => {
26
26
  };
27
27
 
28
28
  const middleware: MiddlewareHandler = async (ctx, next) => {
29
- const { method, raw } = ctx.req;
29
+ const { method, raw, routePath } = ctx.req;
30
30
  const path = getPath(raw);
31
31
 
32
32
  logger.info(`${LogPrefix.Incoming} ${method} ${path}`);
@@ -38,7 +38,7 @@ const middleware: MiddlewareHandler = async (ctx, next) => {
38
38
  const status = ctx.res.status;
39
39
 
40
40
  logger.info(`${LogPrefix.Outgoing} ${method} ${path} ${colorStatus(status)} ${time(start)}`);
41
- requestMetric.success(Date.now() - start, { path, method, status });
41
+ requestMetric.success(Date.now() - start, { path: routePath, method, status });
42
42
  };
43
43
 
44
44
  export default middleware;
@@ -427,7 +427,8 @@ describe('multi parameter', () => {
427
427
  });
428
428
 
429
429
  describe('openai', () => {
430
- it(`chatgpt`, async () => {
430
+ it('processes both title and description', async () => {
431
+ config.openai.inputOption = 'both';
431
432
  const responseWithGpt = await app.request('/test/gpt?chatgpt=true');
432
433
  const responseNormal = await app.request('/test/gpt');
433
434
 
@@ -437,9 +438,25 @@ describe('openai', () => {
437
438
  const parsedGpt = await parser.parseString(await responseWithGpt.text());
438
439
  const parsedNormal = await parser.parseString(await responseNormal.text());
439
440
 
440
- expect(parsedGpt.items[0].content).not.toBe(undefined);
441
- expect(parsedGpt.items[0].content).toBe(parsedNormal.items[0].content);
442
- expect(parsedGpt.items[1].content).not.toBe(undefined);
443
- expect(parsedGpt.items[1].content).not.toBe(parsedNormal.items[1].content);
441
+ expect(parsedGpt.items[0].title).not.toBe(parsedNormal.items[0].title);
442
+ expect(parsedGpt.items[0].title).toContain('AI processed content.');
443
+ expect(parsedGpt.items[0].content).not.toBe(parsedNormal.items[0].content);
444
+ expect(parsedGpt.items[0].content).toContain('AI processed content.');
445
+ });
446
+
447
+ it('processes title or description', async () => {
448
+ // test title
449
+ config.openai.inputOption = 'title';
450
+ const responseTitleOnly = await app.request('/test/gpt?chatgpt=true');
451
+ const parsedTitleOnly = await parser.parseString(await responseTitleOnly.text());
452
+ expect(parsedTitleOnly.items[0].title).toContain('AI processed content.');
453
+ expect(parsedTitleOnly.items[0].content).not.toContain('AI processed content.');
454
+
455
+ // test description
456
+ config.openai.inputOption = 'description';
457
+ const responseDescriptionOnly = await app.request('/test/gpt?chatgpt=true');
458
+ const parsedDescriptionOnly = await parser.parseString(await responseDescriptionOnly.text());
459
+ expect(parsedDescriptionOnly.items[0].title).not.toContain('AI processed content.');
460
+ expect(parsedDescriptionOnly.items[0].content).toContain('AI processed content.');
444
461
  });
445
462
  });