rsshub 1.0.0-master.f9ec483 → 1.0.0-master.fa1dcc5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/lib/config.ts +42 -1
  2. package/lib/middleware/access-control.ts +3 -3
  3. package/lib/middleware/cache.ts +5 -3
  4. package/lib/middleware/template.test.ts +6 -0
  5. package/lib/middleware/template.tsx +3 -1
  6. package/lib/router.js +0 -6
  7. package/lib/routes/141jav/index.ts +1 -1
  8. package/lib/routes/141ppv/index.ts +1 -1
  9. package/lib/routes/36kr/hot-list.ts +1 -1
  10. package/lib/routes/36kr/index.ts +1 -1
  11. package/lib/routes/78dm/index.ts +429 -43
  12. package/lib/routes/78dm/namespace.ts +2 -0
  13. package/lib/routes/78dm/templates/description.art +17 -0
  14. package/lib/routes/abc/index.ts +10 -9
  15. package/lib/routes/aeon/category.ts +1 -1
  16. package/lib/routes/aeon/type.ts +1 -1
  17. package/lib/routes/afr/latest.ts +69 -0
  18. package/lib/routes/afr/namespace.ts +7 -0
  19. package/lib/routes/afr/navigation.ts +75 -0
  20. package/lib/routes/afr/query.ts +349 -0
  21. package/lib/routes/afr/utils.ts +80 -0
  22. package/lib/routes/aibase/discover.ts +1 -1
  23. package/lib/routes/aibase/news.ts +1 -1
  24. package/lib/routes/aibase/topic.ts +1 -1
  25. package/lib/routes/air-level/index.ts +49 -0
  26. package/lib/routes/air-level/levelrank.ts +65 -0
  27. package/lib/routes/air-level/namespace.ts +12 -0
  28. package/lib/routes/ajcass/namespace.ts +11 -0
  29. package/lib/routes/ajcass/shxyj.ts +73 -0
  30. package/lib/routes/alpinelinux/pkgs.ts +2 -2
  31. package/lib/routes/anime1/anime.ts +1 -1
  32. package/lib/routes/apnews/utils.ts +6 -2
  33. package/lib/routes/appleinsider/index.ts +1 -1
  34. package/lib/routes/aqara/region.ts +1 -1
  35. package/lib/routes/asus/bios.ts +0 -1
  36. package/lib/routes/baoyu/index.ts +57 -0
  37. package/lib/routes/baoyu/namespace.ts +8 -0
  38. package/lib/routes/bilibili/article.ts +37 -14
  39. package/lib/routes/bilibili/dynamic.ts +15 -7
  40. package/lib/routes/bilibili/followings-dynamic.ts +2 -2
  41. package/lib/routes/bilibili/manga-update.ts +3 -0
  42. package/lib/routes/bilibili/ranking.ts +188 -117
  43. package/lib/routes/bilibili/reply.ts +2 -0
  44. package/lib/routes/bilibili/templates/description.art +2 -0
  45. package/lib/routes/bing/daily-wallpaper.ts +5 -1
  46. package/lib/routes/bsky/posts.ts +0 -1
  47. package/lib/routes/bsky/templates/post.art +8 -1
  48. package/lib/routes/buaa/lib/space/newbook.ts +1 -1
  49. package/lib/routes/c114/namespace.ts +2 -0
  50. package/lib/routes/c114/roll.ts +71 -42
  51. package/lib/routes/cags/edu/index.ts +84 -0
  52. package/lib/routes/cags/namespace.ts +9 -0
  53. package/lib/routes/caixin/article.ts +1 -1
  54. package/lib/routes/caixin/blog.ts +2 -3
  55. package/lib/routes/caixin/category.ts +1 -1
  56. package/lib/routes/caixin/latest.ts +12 -16
  57. package/lib/routes/caixin/namespace.ts +1 -1
  58. package/lib/routes/caixin/utils-fulltext.ts +51 -0
  59. package/lib/routes/caixin/utils.ts +37 -37
  60. package/lib/routes/cara/likes.ts +1 -1
  61. package/lib/routes/cara/portfolio.ts +1 -1
  62. package/lib/routes/cara/timeline.ts +1 -1
  63. package/lib/routes/ccfa/index.ts +11 -11
  64. package/lib/routes/chub/characters.ts +1 -1
  65. package/lib/routes/cnbeta/namespace.ts +1 -1
  66. package/lib/routes/cngold/index.ts +195 -0
  67. package/lib/routes/cngold/namespace.ts +9 -0
  68. package/lib/routes/cnki/author.ts +120 -48
  69. package/lib/routes/cnki/utils.ts +4 -4
  70. package/lib/routes/coomer/artist.ts +1 -1
  71. package/lib/routes/coomer/namespace.ts +1 -1
  72. package/lib/routes/coomer/posts.ts +2 -2
  73. package/lib/routes/coomer/utils.ts +1 -1
  74. package/lib/routes/cpcaauto/index.ts +22 -22
  75. package/lib/routes/cs/zzkx.ts +1 -1
  76. package/lib/routes/csdn/blog.ts +17 -13
  77. package/lib/routes/cybersecurityventures/namespace.ts +7 -0
  78. package/lib/routes/cybersecurityventures/news.ts +121 -0
  79. package/lib/routes/cybersecurityventures/types.ts +17 -0
  80. package/lib/routes/daily/discussed.ts +22 -21
  81. package/lib/routes/daily/index.ts +14 -11
  82. package/lib/routes/daily/namespace.ts +1 -1
  83. package/lib/routes/daily/source.ts +186 -0
  84. package/lib/routes/daily/upvoted.ts +17 -17
  85. package/lib/routes/daily/user.ts +6 -23
  86. package/lib/routes/daily/utils.ts +27 -32
  87. package/lib/routes/dataguidance/index.ts +19 -30
  88. package/lib/routes/dcfever/news.ts +1 -1
  89. package/lib/routes/dcfever/reviews.ts +1 -1
  90. package/lib/routes/dcfever/trading-search.ts +1 -1
  91. package/lib/routes/dcfever/trading.ts +1 -1
  92. package/lib/routes/deeplearning/namespace.ts +3 -1
  93. package/lib/routes/deeplearning/templates/description.art +21 -0
  94. package/lib/routes/deeplearning/the-batch.ts +296 -0
  95. package/lib/routes/deepmind/blog.ts +1 -1
  96. package/lib/routes/digitalcameraworld/news.ts +1 -1
  97. package/lib/routes/discord/discord-api.ts +44 -2
  98. package/lib/routes/discord/search.ts +106 -0
  99. package/lib/routes/dn/news.ts +1 -1
  100. package/lib/routes/dockerhub/repositories.ts +42 -0
  101. package/lib/routes/dongqiudi/daily.ts +1 -1
  102. package/lib/routes/dw/namespace.ts +6 -0
  103. package/lib/routes/dw/news.ts +89 -0
  104. package/lib/routes/dw/rss.ts +62 -0
  105. package/lib/routes/dw/templates/description.art +23 -0
  106. package/lib/routes/dw/templates/liveblog.art +13 -0
  107. package/lib/routes/dw/templates/video.art +14 -0
  108. package/lib/routes/dw/utils.ts +172 -0
  109. package/lib/routes/ecnu/jwc.ts +5 -1
  110. package/lib/routes/espn/news.ts +1 -1
  111. package/lib/routes/fashionnetwork/namespace.ts +1 -1
  112. package/lib/routes/flyert/forum.ts +99 -0
  113. package/lib/routes/flyert/namespace.ts +1 -0
  114. package/lib/routes/flyert/templates/description.art +21 -0
  115. package/lib/routes/flyert/util.ts +188 -0
  116. package/lib/routes/follow/profile.ts +2 -2
  117. package/lib/routes/foresightnews/article.ts +1 -1
  118. package/lib/routes/foresightnews/column.ts +1 -1
  119. package/lib/routes/foresightnews/index.ts +3 -1
  120. package/lib/routes/foresightnews/news.ts +1 -1
  121. package/lib/routes/freecomputerbooks/index.ts +0 -10
  122. package/lib/routes/ftm/index.ts +1 -1
  123. package/lib/routes/furaffinity/art.ts +85 -0
  124. package/lib/routes/furaffinity/browse.ts +58 -0
  125. package/lib/routes/furaffinity/commissions.ts +55 -0
  126. package/lib/routes/furaffinity/home.ts +80 -0
  127. package/lib/routes/furaffinity/journal-comments.ts +64 -0
  128. package/lib/routes/furaffinity/journals.ts +56 -0
  129. package/lib/routes/furaffinity/namespace.ts +7 -0
  130. package/lib/routes/furaffinity/search.ts +72 -0
  131. package/lib/routes/furaffinity/shouts.ts +56 -0
  132. package/lib/routes/furaffinity/status.ts +58 -0
  133. package/lib/routes/furaffinity/submission-comments.ts +64 -0
  134. package/lib/{routes-deprecated/furaffinity/user.js → routes/furaffinity/user.ts} +53 -41
  135. package/lib/routes/furaffinity/watchers.ts +62 -0
  136. package/lib/routes/furaffinity/watching.ts +62 -0
  137. package/lib/routes/google/developers.ts +71 -0
  138. package/lib/routes/google/news.ts +26 -6
  139. package/lib/routes/gov/cbirc/index.ts +35 -35
  140. package/lib/routes/hamel/index.ts +81 -0
  141. package/lib/routes/hamel/namespace.ts +7 -0
  142. package/lib/routes/hellogithub/volume.ts +3 -0
  143. package/lib/routes/hket/index.ts +13 -1
  144. package/lib/routes/hostmonit/cloudflareyesv6.ts +1 -1
  145. package/lib/routes/hrbeu/sec/list.ts +80 -0
  146. package/lib/routes/hrbust/jwzx.ts +6 -0
  147. package/lib/routes/hunau/gfxy/index.ts +1 -1
  148. package/lib/routes/hunau/ied.ts +1 -1
  149. package/lib/routes/hunau/jwc.ts +1 -1
  150. package/lib/routes/hunau/xky/index.ts +1 -1
  151. package/lib/routes/hust/gs.ts +4 -3
  152. package/lib/routes/idolmaster/namespace.ts +7 -0
  153. package/lib/routes/idolmaster/news.ts +112 -0
  154. package/lib/routes/ieee/author.ts +95 -0
  155. package/lib/routes/ikea/cn/low-price.ts +2 -1
  156. package/lib/routes/imdb/chart.ts +1 -1
  157. package/lib/routes/inspirehep/author.ts +9 -1
  158. package/lib/routes/isct/namespace.ts +11 -0
  159. package/lib/routes/isct/news.ts +66 -0
  160. package/lib/routes/javtrailers/casts.ts +41 -0
  161. package/lib/routes/javtrailers/categories.ts +40 -0
  162. package/lib/routes/javtrailers/namespace.ts +7 -0
  163. package/lib/routes/javtrailers/studios.ts +39 -0
  164. package/lib/routes/javtrailers/templates/description.art +31 -0
  165. package/lib/routes/javtrailers/types.ts +59 -0
  166. package/lib/routes/javtrailers/utils.ts +48 -0
  167. package/lib/routes/jiemian/list.ts +1 -1
  168. package/lib/routes/jiuyangongshe/community.ts +1 -1
  169. package/lib/routes/jlu/phy/index.ts +55 -0
  170. package/lib/routes/joins/chinese.ts +13 -13
  171. package/lib/routes/kcna/news.ts +7 -5
  172. package/lib/routes/keep/user.ts +1 -1
  173. package/lib/routes/langchain/index.ts +74 -0
  174. package/lib/routes/langchain/namespace.ts +7 -0
  175. package/lib/routes/last-origin/namespace.ts +7 -0
  176. package/lib/routes/last-origin/news.ts +65 -0
  177. package/lib/routes/linkresearcher/index.ts +108 -46
  178. package/lib/routes/linkresearcher/namespace.ts +8 -2
  179. package/lib/routes/linkresearcher/templates/bilingual.art +7 -0
  180. package/lib/routes/linkresearcher/types.ts +103 -0
  181. package/lib/routes/liulinblog/itnews.ts +1 -1
  182. package/lib/routes/lofter/collection.ts +1 -1
  183. package/lib/routes/lofter/tag.ts +1 -1
  184. package/lib/routes/logrocket/index.ts +71 -0
  185. package/lib/routes/logrocket/namespace.ts +7 -0
  186. package/lib/routes/m-78/namespace.ts +7 -0
  187. package/lib/routes/m-78/news.ts +115 -0
  188. package/lib/routes/m-78/types.ts +13 -0
  189. package/lib/routes/mastodon/account-id.ts +1 -1
  190. package/lib/routes/mastodon/acct.ts +1 -1
  191. package/lib/routes/mastodon/timeline-local.ts +2 -2
  192. package/lib/routes/mastodon/timeline-remote.ts +2 -2
  193. package/lib/routes/mastodon/utils.ts +1 -1
  194. package/lib/routes/metacritic/index.ts +1 -1
  195. package/lib/routes/mi/utils.ts +1 -1
  196. package/lib/routes/mihoyo/bbs/official.ts +2 -1
  197. package/lib/routes/misskey/utils.ts +19 -1
  198. package/lib/routes/mittrchina/index.ts +2 -2
  199. package/lib/routes/natgeo/natgeo.ts +25 -24
  200. package/lib/routes/nbd/daily.ts +1 -1
  201. package/lib/routes/nielsberglund/index.ts +78 -0
  202. package/lib/routes/nielsberglund/namespace.ts +7 -0
  203. package/lib/routes/nytimes/rss.ts +57 -0
  204. package/lib/routes/openrice/chart.ts +68 -0
  205. package/lib/routes/openrice/templates/chart.art +9 -0
  206. package/lib/routes/openrice/voting.ts +84 -0
  207. package/lib/routes/oschina/news.ts +26 -7
  208. package/lib/routes/patreon/feed.ts +126 -0
  209. package/lib/routes/patreon/namespace.ts +7 -0
  210. package/lib/routes/patreon/templates/description.art +39 -0
  211. package/lib/routes/patreon/types.ts +387 -0
  212. package/lib/routes/pixiv/api/get-illust-detail.ts +22 -0
  213. package/lib/routes/pixiv/novel-api/content/nsfw.ts +73 -0
  214. package/lib/routes/pixiv/novel-api/content/sfw.ts +63 -0
  215. package/lib/routes/pixiv/novel-api/content/types.ts +254 -0
  216. package/lib/routes/pixiv/novel-api/content/utils.ts +133 -0
  217. package/lib/routes/pixiv/novel-api/series/nsfw.ts +84 -0
  218. package/lib/routes/pixiv/novel-api/series/sfw.ts +70 -0
  219. package/lib/routes/pixiv/novel-api/series/types.ts +94 -0
  220. package/lib/routes/pixiv/novel-api/user-novels/nsfw.ts +82 -0
  221. package/lib/routes/pixiv/novel-api/user-novels/sfw.ts +74 -0
  222. package/lib/routes/pixiv/novel-api/user-novels/types.ts +133 -0
  223. package/lib/routes/pixiv/novel-series.ts +52 -0
  224. package/lib/routes/pixiv/novels.ts +69 -44
  225. package/lib/routes/pixiv/utils.ts +3 -0
  226. package/lib/routes/plurk/anonymous.ts +1 -1
  227. package/lib/routes/plurk/hotlinks.ts +1 -1
  228. package/lib/routes/plurk/news.ts +1 -1
  229. package/lib/routes/plurk/search.ts +1 -1
  230. package/lib/routes/qstheory/index.ts +121 -0
  231. package/lib/routes/qstheory/magazine.ts +64 -0
  232. package/lib/routes/qstheory/namespace.ts +7 -0
  233. package/lib/routes/qstheory/utils.ts +25 -0
  234. package/lib/routes/ruc/ai.ts +1 -1
  235. package/lib/routes/scmp/coronavirus.ts +1 -1
  236. package/lib/routes/scu/jwc/tzgg.ts +75 -0
  237. package/lib/routes/scu/namespace.ts +7 -0
  238. package/lib/routes/scu/scupi/_utils.ts +62 -0
  239. package/lib/routes/scu/scupi/notice.ts +41 -0
  240. package/lib/routes/solidot/namespace.ts +1 -1
  241. package/lib/routes/stbu/jsjxy.ts +4 -1
  242. package/lib/routes/steam/search.ts +7 -0
  243. package/lib/routes/sycl/feeds.ts +1 -1
  244. package/lib/routes/syosetu/dev.ts +67 -0
  245. package/lib/routes/syosetu/index.ts +85 -0
  246. package/lib/routes/syosetu/namespace.ts +2 -2
  247. package/lib/routes/syosetu/ranking-isekai.ts +93 -0
  248. package/lib/routes/syosetu/ranking-r18.ts +192 -0
  249. package/lib/routes/syosetu/ranking.ts +285 -0
  250. package/lib/routes/syosetu/search.ts +161 -0
  251. package/lib/routes/syosetu/templates/description.art +73 -0
  252. package/lib/routes/syosetu/types/ranking-r18.ts +60 -0
  253. package/lib/routes/syosetu/types/ranking.ts +67 -0
  254. package/lib/routes/syosetu/types/search.ts +138 -0
  255. package/lib/routes/syosetu/utils.ts +50 -0
  256. package/lib/routes/telegram/channel.ts +31 -1
  257. package/lib/routes/telegram/scripts/get-telegram-session.mjs +16 -6
  258. package/lib/routes/telegram/stickerpack.ts +1 -1
  259. package/lib/routes/telegram/tglib/channel.ts +12 -9
  260. package/lib/routes/telegram/tglib/client.ts +13 -9
  261. package/lib/routes/test/index.ts +4 -0
  262. package/lib/routes/theblockbeats/index.ts +1 -1
  263. package/lib/routes/thegradient/index.ts +80 -0
  264. package/lib/routes/thegradient/namespace.ts +7 -0
  265. package/lib/routes/theinitium/app.ts +4 -0
  266. package/lib/routes/thepaper/channel.ts +1 -1
  267. package/lib/routes/thepaper/factpaper.ts +1 -1
  268. package/lib/routes/thepaper/featured.ts +1 -1
  269. package/lib/routes/thepaper/list.ts +1 -1
  270. package/lib/routes/thepaper/user.ts +174 -0
  271. package/lib/routes/tongji/sem/_utils.ts +65 -0
  272. package/lib/routes/tongji/sem/notice.ts +58 -0
  273. package/lib/routes/toutiao/a-bogus.ts +540 -0
  274. package/lib/routes/toutiao/namespace.ts +7 -0
  275. package/lib/routes/toutiao/templates/video.art +7 -0
  276. package/lib/routes/toutiao/types.ts +443 -0
  277. package/lib/routes/toutiao/user.ts +127 -0
  278. package/lib/routes/twitter/api/mobile-api/api.ts +8 -0
  279. package/lib/routes/twitter/api/web-api/utils.ts +21 -9
  280. package/lib/routes/twitter/namespace.ts +1 -0
  281. package/lib/routes/twitter/utils.ts +7 -1
  282. package/lib/routes/vertikal/latest.ts +73 -0
  283. package/lib/routes/vertikal/namespace.ts +7 -0
  284. package/lib/routes/vice/topic.ts +1 -1
  285. package/lib/routes/vocus/publication.ts +1 -1
  286. package/lib/routes/vocus/user.ts +1 -1
  287. package/lib/routes/wallstreetcn/calendar.ts +90 -0
  288. package/lib/routes/wallstreetcn/hot.ts +2 -2
  289. package/lib/routes/wallstreetcn/live.ts +1 -1
  290. package/lib/routes/wallstreetcn/news.ts +5 -3
  291. package/lib/routes/weibo/timeline.ts +3 -2
  292. package/lib/routes/wellcee/rent.ts +1 -1
  293. package/lib/routes/wufazhuce/namespace.ts +7 -0
  294. package/lib/routes/wufazhuce/one.ts +90 -0
  295. package/lib/routes/xiaoheihe/discount.ts +72 -28
  296. package/lib/routes/xiaohongshu/user.ts +40 -3
  297. package/lib/routes/xiaohongshu/util.ts +112 -105
  298. package/lib/routes/xsijishe/rank.ts +33 -7
  299. package/lib/routes/xueqiu/cookies.ts +13 -18
  300. package/lib/routes/yahoo/news/listid.ts +4 -1
  301. package/lib/routes/yahoo/news/provider-helper.ts +4 -1
  302. package/lib/routes/yahoo/news/provider.ts +4 -1
  303. package/lib/routes/yande/post.ts +13 -3
  304. package/lib/routes/youtube/user.ts +37 -25
  305. package/lib/routes/zhonglun/index.ts +5 -6
  306. package/lib/routes/zjut/cs/index.ts +1 -1
  307. package/lib/utils/got.ts +2 -1
  308. package/lib/utils/helpers.test.ts +13 -1
  309. package/lib/utils/helpers.ts +10 -0
  310. package/lib/utils/ofetch.ts +3 -0
  311. package/lib/utils/request-rewriter/fetch.test.ts +94 -0
  312. package/lib/utils/request-rewriter/fetch.ts +14 -1
  313. package/lib/views/error.tsx +1 -1
  314. package/package.json +40 -37
  315. package/lib/routes/78dm/templates/image.art +0 -1
  316. package/lib/routes/deeplearning/thebatch.ts +0 -74
  317. package/lib/routes/syosetu/chapter.ts +0 -87
  318. package/lib/routes/xiaohongshu/notes.ts +0 -39
  319. package/lib/routes-deprecated/furaffinity/browse.js +0 -44
  320. package/lib/routes-deprecated/furaffinity/commissions.js +0 -39
  321. package/lib/routes-deprecated/furaffinity/favorites.js +0 -56
  322. package/lib/routes-deprecated/furaffinity/gallery.js +0 -56
  323. package/lib/routes-deprecated/furaffinity/home.js +0 -72
  324. package/lib/routes-deprecated/furaffinity/journal-comments.js +0 -50
  325. package/lib/routes-deprecated/furaffinity/journals.js +0 -49
  326. package/lib/routes-deprecated/furaffinity/scraps.js +0 -56
  327. package/lib/routes-deprecated/furaffinity/search.js +0 -56
  328. package/lib/routes-deprecated/furaffinity/shouts.js +0 -40
  329. package/lib/routes-deprecated/furaffinity/status.js +0 -38
  330. package/lib/routes-deprecated/furaffinity/submission-comments.js +0 -50
  331. package/lib/routes-deprecated/furaffinity/watchers.js +0 -47
  332. package/lib/routes-deprecated/furaffinity/watching.js +0 -47
  333. package/lib/routes-deprecated/ieee/author.js +0 -30
  334. package/lib/routes-deprecated/qstheory/index.js +0 -122
@@ -0,0 +1,95 @@
1
+ import { Route } from '@/types';
2
+ import cache from '@/utils/cache';
3
+ import ofetch from '@/utils/ofetch';
4
+ import { load } from 'cheerio';
5
+ import path from 'node:path';
6
+ import { parseDate } from '@/utils/parse-date';
7
+ import { art } from '@/utils/render';
8
+ import { getCurrentPath } from '@/utils/helpers';
9
+ const __dirname = getCurrentPath(import.meta.url);
10
+
11
+ export const route: Route = {
12
+ name: 'IEEE Author Articles',
13
+ maintainers: ['Derekmini'],
14
+ categories: ['journal'],
15
+ path: '/author/:aid/:sortType',
16
+ parameters: {
17
+ aid: 'Author ID',
18
+ sortType: 'Sort Type of papers',
19
+ },
20
+ features: {
21
+ requireConfig: false,
22
+ requirePuppeteer: false,
23
+ antiCrawler: false,
24
+ supportBT: false,
25
+ supportPodcast: false,
26
+ supportScihub: true,
27
+ },
28
+ example: '/ieee/author/37264968900/newest',
29
+ handler,
30
+ };
31
+
32
+ async function handler(ctx) {
33
+ const { aid, sortType } = ctx.req.param();
34
+ const count = ctx.req.query('limit') || 10;
35
+ const host = 'https://ieeexplore.ieee.org';
36
+
37
+ const res = await ofetch(`${host}/rest/author/${aid}`);
38
+ const author = res[0];
39
+ const title = `${author.preferredName} on IEEE Xplore`;
40
+ const link = `${host}/author/${aid}`;
41
+ const description = author.bioParagraphs.join(' ');
42
+ const image = `${host}${author.photoUrl}`;
43
+
44
+ const response = await ofetch(`${host}/rest/search`, {
45
+ method: 'POST',
46
+ body: {
47
+ rowsPerPage: count,
48
+ searchWithin: [`"Author Ids": ${aid}`],
49
+ sortType,
50
+ },
51
+ });
52
+
53
+ const list = response.records.map((item) => ({
54
+ title: item.articleTitle,
55
+ link: item.htmlLink,
56
+ doi: item.doi,
57
+ authors: 'authors' in item ? item.authors.map((itemAuth) => itemAuth.preferredName).join('; ') : 'Do not have author',
58
+ abstract: 'abstract' in item ? item.abstract : '',
59
+ }));
60
+
61
+ const items = await Promise.all(
62
+ list.map((item) =>
63
+ cache.tryGet(item.link, async () => {
64
+ if (item.abstract !== '') {
65
+ const res = await ofetch(`${host}${item.link}`, {
66
+ parseResponse: (txt) => txt,
67
+ });
68
+ const $ = load(res);
69
+ const metadataMatch = $.html().match(/metadata=(.*);/);
70
+ const metadata = metadataMatch ? JSON.parse(metadataMatch[1]) : null;
71
+ item.pubDate = metadata?.insertDate ? parseDate(metadata.insertDate) : undefined;
72
+ item.abstract = load(metadata?.abstract || '').text();
73
+ }
74
+ return {
75
+ ...item,
76
+ description: renderDescription(item),
77
+ };
78
+ })
79
+ )
80
+ );
81
+
82
+ return {
83
+ title,
84
+ link,
85
+ description,
86
+ item: items,
87
+ image,
88
+ };
89
+ }
90
+
91
+ function renderDescription(item: { title: string; authors: string; abstract: string; doi: string }) {
92
+ return art(path.join(__dirname, 'templates/description.art'), {
93
+ item,
94
+ });
95
+ }
@@ -32,7 +32,7 @@ async function handler() {
32
32
  headers: generateRequestHeaders(),
33
33
  searchParams: {
34
34
  processOutOfStock: 'SORT',
35
- groupId: 'cms_低价好物_cms-商品列表-_0',
35
+ groupId: 'cms_product_cn--zh--8b08af400ac511ec909ec36c6e99b004_0_0',
36
36
  page: 1,
37
37
  size: 200,
38
38
  },
@@ -42,6 +42,7 @@ async function handler() {
42
42
  title: 'IKEA 宜家 - 低价优选',
43
43
  link: 'https://www.ikea.cn/cn/zh/campaigns/wo3-men2-de-chao1-zhi2-di1-jia4-pub8b08af40',
44
44
  description: '低价优选',
45
+ allowEmpty: true,
45
46
  item: response.data.products.map((element) => generateProductItem(element)),
46
47
  };
47
48
  }
@@ -3,7 +3,7 @@ import ofetch from '@/utils/ofetch';
3
3
  import * as cheerio from 'cheerio';
4
4
  import type { Context } from 'hono';
5
5
  import { ChartTitleSearchConnection } from './types';
6
- import path from 'path';
6
+ import path from 'node:path';
7
7
  import { getCurrentPath } from '@/utils/helpers';
8
8
  import { art } from '@/utils/render';
9
9
 
@@ -19,7 +19,15 @@ export const route: Route = {
19
19
  handler,
20
20
  };
21
21
 
22
- export const getAuthorById = (id: string) => cache.tryGet(`inspirehep:author:${id}`, () => ofetch<AuthorResponse>(`${baseUrl}/api/authors/${id}`));
22
+ export const getAuthorById = (id: string) =>
23
+ cache.tryGet(`inspirehep:author:${id}`, () =>
24
+ ofetch<AuthorResponse>(`${baseUrl}/api/authors/${id}`, {
25
+ headers: {
26
+ accept: 'application/vnd+inspire.record.ui+json',
27
+ },
28
+ parseResponse: JSON.parse,
29
+ })
30
+ );
23
31
 
24
32
  async function handler(ctx) {
25
33
  const id = ctx.req.param('id');
@@ -0,0 +1,11 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Institute of Science Tokyo',
5
+ url: 'isct.ac.jp',
6
+ lang: 'ja',
7
+
8
+ ja: {
9
+ name: '東京科学大学',
10
+ },
11
+ };
@@ -0,0 +1,66 @@
1
+ import { Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
+ import { parseDate } from '@/utils/parse-date';
4
+ import { decode } from 'entities';
5
+
6
+ interface NewsItem {
7
+ ID: string;
8
+ TITLE: string;
9
+ PUBLISH_DATE: string;
10
+ META_DESCRIPTION: string;
11
+ MEDIA_CD: string;
12
+ }
13
+
14
+ export const route: Route = {
15
+ path: '/news/:lang',
16
+ categories: ['university'],
17
+ example: '/isct/news/ja',
18
+ parameters: { lang: 'language, could be ja or en' },
19
+ features: {
20
+ requireConfig: false,
21
+ requirePuppeteer: false,
22
+ antiCrawler: false,
23
+ supportBT: false,
24
+ supportPodcast: false,
25
+ supportScihub: false,
26
+ },
27
+ radar: [
28
+ {
29
+ source: ['www.isct.ac.jp/:lang/news'],
30
+ target: '/news/:lang',
31
+ },
32
+ ],
33
+ name: 'News',
34
+ maintainers: ['catyyy'],
35
+ handler: async (ctx) => {
36
+ const { lang = 'ja' } = ctx.req.param();
37
+ const response = await ofetch(`https://www.isct.ac.jp/expansion/get_media_list_json.php?lang_cd=${lang}`);
38
+
39
+ const decodedResponse = decode(response);
40
+ const data = JSON.parse(decodedResponse);
41
+ const itemsArray: NewsItem[] = Object.values(data);
42
+
43
+ const items = itemsArray.map((item) => ({
44
+ // 文章标题
45
+ title: item.TITLE,
46
+ // 文章链接
47
+ link: 'news/' + item.MEDIA_CD,
48
+ // 文章正文
49
+ description: item.META_DESCRIPTION,
50
+ // 文章发布日期
51
+ pubDate: parseDate(item.PUBLISH_DATE),
52
+ // 如果有的话,文章作者
53
+ // author: item.user.login,
54
+ // 如果有的话,文章分类
55
+ // category: item.labels.map((label) => label.name),
56
+ }));
57
+ return {
58
+ // 源标题
59
+ title: `ISCT News - ${lang}`,
60
+ // 源链接
61
+ link: `https://www.isct.ac.jp/${lang}/news`,
62
+ // 源文章
63
+ item: items,
64
+ };
65
+ },
66
+ };
@@ -0,0 +1,41 @@
1
+ import { Route } from '@/types';
2
+
3
+ import ofetch from '@/utils/ofetch';
4
+ import cache from '@/utils/cache';
5
+ import { baseUrl, getItem, headers, parseList } from './utils';
6
+
7
+ export const route: Route = {
8
+ path: '/casts/:cast',
9
+ categories: ['multimedia'],
10
+ example: '/javtrailers/casts/hibiki-otsuki',
11
+ parameters: { cast: 'Cast name, can be found in the URL of the cast page' },
12
+ radar: [
13
+ {
14
+ source: ['javtrailers.com/casts/:category'],
15
+ },
16
+ ],
17
+ name: 'Casts',
18
+ maintainers: ['TonyRL'],
19
+ url: 'javtrailers.com/casts',
20
+ handler,
21
+ };
22
+
23
+ async function handler(ctx) {
24
+ const { cast } = ctx.req.param();
25
+
26
+ const response = await ofetch(`${baseUrl}/api/casts/${cast}?page=0`, {
27
+ headers,
28
+ });
29
+
30
+ const list = parseList(response.videos);
31
+
32
+ const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
33
+
34
+ return {
35
+ title: `Watch ${response.cast.name} Jav Online | Japanese Adult Video - JavTrailers.com`,
36
+ description: response.cast.castWiki?.description.replaceAll('\n', ' ') ?? `Watch ${response.cast.name} Jav video’s free, we have the largest Jav collections with high definition`,
37
+ image: response.cast.avatar,
38
+ link: `${baseUrl}/casts/${cast}`,
39
+ item: items,
40
+ };
41
+ }
@@ -0,0 +1,40 @@
1
+ import { Route } from '@/types';
2
+
3
+ import ofetch from '@/utils/ofetch';
4
+ import cache from '@/utils/cache';
5
+ import { baseUrl, getItem, headers, parseList } from './utils';
6
+
7
+ export const route: Route = {
8
+ path: '/categories/:category',
9
+ categories: ['multimedia'],
10
+ example: '/javtrailers/categories/50001755',
11
+ parameters: { category: 'Category name, can be found in the URL of the category page' },
12
+ radar: [
13
+ {
14
+ source: ['javtrailers.com/categories/:category'],
15
+ },
16
+ ],
17
+ name: 'Categories',
18
+ maintainers: ['TonyRL'],
19
+ url: 'javtrailers.com/categories',
20
+ handler,
21
+ };
22
+
23
+ async function handler(ctx) {
24
+ const { category } = ctx.req.param();
25
+
26
+ const response = await ofetch(`${baseUrl}/api/categories/${category}?page=0`, {
27
+ headers,
28
+ });
29
+
30
+ const list = parseList(response.videos);
31
+
32
+ const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
33
+
34
+ return {
35
+ title: `Watch ${response.category.name} Jav Online | Japanese Adult Video - JavTrailers.com`,
36
+ description: `Watch ${response.category.name} Jav video’s free, we have the largest Jav collections with high definition`,
37
+ link: `${baseUrl}/categories/${category}`,
38
+ item: items,
39
+ };
40
+ }
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'JavTrailers',
5
+ url: 'javtrailers.com',
6
+ lang: 'ja',
7
+ };
@@ -0,0 +1,39 @@
1
+ import { Route } from '@/types';
2
+
3
+ import ofetch from '@/utils/ofetch';
4
+ import cache from '@/utils/cache';
5
+ import { baseUrl, getItem, headers, parseList } from './utils';
6
+
7
+ export const route: Route = {
8
+ path: '/studios/:studio',
9
+ categories: ['multimedia'],
10
+ example: '/javtrailers/studios/s1-no-1-style',
11
+ parameters: { studio: 'Studio name, can be found in the URL of the studio page' },
12
+ radar: [
13
+ {
14
+ source: ['javtrailers.com/studios/:category'],
15
+ },
16
+ ],
17
+ name: 'Studios',
18
+ maintainers: ['TonyRL'],
19
+ handler,
20
+ };
21
+
22
+ async function handler(ctx) {
23
+ const { studio } = ctx.req.param();
24
+
25
+ const response = await ofetch(`${baseUrl}/api/studios/${studio}?page=0`, {
26
+ headers,
27
+ });
28
+
29
+ const list = parseList(response.videos);
30
+
31
+ const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
32
+
33
+ return {
34
+ title: `${response.studio.hotDvdIds?.join(' ') ?? response.studio.name} Jav Online | Japanese Adult Video - JavTrailers.com`,
35
+ description: 'Watch Jav made by Prestige free, with high definition, we have over 4,000 studios available for free streaming.',
36
+ link: `${baseUrl}/studios/${studio}`,
37
+ item: items,
38
+ };
39
+ }
@@ -0,0 +1,31 @@
1
+ {{ if videoInfo.image }}
2
+ <img src="{{ videoInfo.image }}"><br>
3
+ {{ /if }}
4
+
5
+ {{ if videoInfo.dvdId }}<b>DVD ID:</b> {{ videoInfo.dvdId }}<br>{{ /if }}
6
+ {{ if videoInfo.contentId }}<b>Content ID:</b> {{ videoInfo.contentId }}<br>{{ /if }}
7
+ {{ if videoInfo.releaseDate }}<b>Release Date:</b> {{ videoInfo.releaseDate }}<br>{{ /if }}
8
+ {{ if videoInfo.duration }}<b>Duration:</b> {{ videoInfo.duration }} mins<br>{{ /if }}
9
+ {{ if videoInfo.director }}<b>Director:</b> {{ videoInfo.director }} {{ videoInfo.jpDirector }}<br>{{ /if }}
10
+ {{ if videoInfo.studio }}<b>Studio:</b> {{ videoInfo.studio.name }}<br>{{ /if }}
11
+ {{ if videoInfo.categories }}
12
+ <b>Categories:</b>
13
+ {{ each videoInfo.categories c }}
14
+ {{ c.name }},
15
+ {{ /each }}
16
+ <br>
17
+ {{ /if }}
18
+ {{ if videoInfo.casts }}
19
+ <b>Cast(s):</b>
20
+ {{ each videoInfo.casts c }}
21
+ {{ c.name }} {{ c.jpName }}
22
+ {{ /each }}
23
+ <br>
24
+ {{ /if }}
25
+
26
+
27
+ {{ if videoInfo.gallery }}
28
+ {{ each videoInfo.gallery g }}
29
+ <img src="{{ g }}" ><br>
30
+ {{ /each }}
31
+ {{ /if }}
@@ -0,0 +1,59 @@
1
+ export interface Video {
2
+ _id: string;
3
+ categories: Category[];
4
+ casts: Cast[];
5
+ director: string;
6
+ gallery: string[];
7
+ title: string;
8
+ javLink: JavLink;
9
+ contentId: string;
10
+ dvdId: string;
11
+ studio: Studio;
12
+ releaseDate: string;
13
+ duration: number;
14
+ image: string;
15
+ jpDirector: string;
16
+ jpTitle: string;
17
+ /**
18
+ * HLS stream URL
19
+ */
20
+ trailer: string;
21
+ zhTitle: string;
22
+ __v: number;
23
+ }
24
+
25
+ interface Category {
26
+ _id: string;
27
+ slug: string;
28
+ name: string;
29
+ jpName: string;
30
+ zhName: string;
31
+ }
32
+
33
+ interface Cast {
34
+ _id: string;
35
+ slug: string;
36
+ ruby: string;
37
+ link: string;
38
+ name: string;
39
+ jpName: string;
40
+ avatar: string;
41
+ __v: number;
42
+ }
43
+
44
+ interface JavLink {
45
+ _id: string;
46
+ link: string;
47
+ processed: boolean;
48
+ isProfessional: boolean;
49
+ upcoming: boolean;
50
+ __v: number;
51
+ }
52
+
53
+ interface Studio {
54
+ _id: string;
55
+ slug: string;
56
+ name: string;
57
+ link: string;
58
+ jpName: string;
59
+ }
@@ -0,0 +1,48 @@
1
+ import { Video } from './types';
2
+
3
+ import ofetch from '@/utils/ofetch';
4
+ import { parseDate } from '@/utils/parse-date';
5
+ import { art } from '@/utils/render';
6
+ import path from 'node:path';
7
+ import { getCurrentPath } from '@/utils/helpers';
8
+ const __dirname = getCurrentPath(import.meta.url);
9
+
10
+ export const baseUrl = 'https://javtrailers.com';
11
+ export const headers = {
12
+ Authorization: 'AELAbPQCh_fifd93wMvf_kxMD_fqkUAVf@BVgb2!md@TNW8bUEopFExyGCoKRcZX',
13
+ };
14
+
15
+ export const hdGallery = (gallery) =>
16
+ gallery.map((item) => {
17
+ if (item.startsWith('https://pics.dmm.co.jp/')) {
18
+ return item.replace(/-(\d+)\.jpg$/, 'jp-$1.jpg');
19
+ } else if (item.startsWith('https://image.mgstage.com/')) {
20
+ return item.replace(/cap_t1_/, 'cap_e_');
21
+ }
22
+ return item;
23
+ });
24
+
25
+ export const parseList = (videos) =>
26
+ videos.map((item) => ({
27
+ title: `${item.dvdId} ${item.title}`,
28
+ link: `${baseUrl}/video/${item.contentId}`,
29
+ pubDate: parseDate(item.releaseDate),
30
+ contentId: item.contentId,
31
+ }));
32
+
33
+ export const getItem = async (item) => {
34
+ const response = await ofetch(`${baseUrl}/api/video/${item.contentId}`, {
35
+ headers,
36
+ });
37
+
38
+ const videoInfo: Video = response.video;
39
+ videoInfo.gallery = hdGallery(videoInfo.gallery);
40
+
41
+ item.description = art(path.join(__dirname, 'templates/description.art'), {
42
+ videoInfo,
43
+ });
44
+ item.author = videoInfo.casts.map((cast) => `${cast.name} ${cast.jpName}`).join(', ');
45
+ item.category = videoInfo.categories.map((category) => `${category.name}/${category.jpName}/${category.zhName}`);
46
+
47
+ return item;
48
+ };
@@ -10,5 +10,5 @@ function handler(ctx) {
10
10
  const id = ctx.req.param('id');
11
11
 
12
12
  const redirectTo = `/jiemian${id ? `/lists/${id}` : ''}`;
13
- ctx.redirect(redirectTo);
13
+ ctx.set('redirect', redirectTo);
14
14
  }
@@ -4,7 +4,7 @@ import ofetch from '@/utils/ofetch';
4
4
  import { parseDate } from '@/utils/parse-date';
5
5
  import timezone from '@/utils/timezone';
6
6
  import md5 from '@/utils/md5';
7
- import path from 'path';
7
+ import path from 'node:path';
8
8
  import { getCurrentPath } from '@/utils/helpers';
9
9
  import { art } from '@/utils/render';
10
10
 
@@ -0,0 +1,55 @@
1
+ import { Route } from '@/types';
2
+ import got from '@/utils/got';
3
+ import { load } from 'cheerio';
4
+
5
+ export const route: Route = {
6
+ path: '/phy/:category/:column/:subcolumn?',
7
+ categories: ['university'],
8
+ example: '/jlu/phy/xzgz/tzgg',
9
+ parameters: {
10
+ category: '分类,为「行政工作」、「科学研究」、「人才培养」的拼音小写首字母。',
11
+ column: '栏目,当分类为「行政工作」时,为「通知公告」、「学院新闻」、「学院文件」的拼音小写首字母。当分类为「科学研究」时,为「科研动态」、「学术活动」的拼音小写首字母。当分类为「人才培养」时。为「本科生教育」、「研究生教育」、「学团工作」的拼音小写首字母。',
12
+ subcolumn: '子栏目。当栏目为「本科生教育」时,为「本科资讯」的拼音大写首字母,或为「教育思想大讨论系列活动」、「培养方案」的拼音小写首字母。当栏目为「研究生教育」时,为「教学通知」的拼音小写首字母。',
13
+ },
14
+ features: {
15
+ requireConfig: false,
16
+ requirePuppeteer: false,
17
+ antiCrawler: false,
18
+ supportBT: false,
19
+ supportPodcast: false,
20
+ supportScihub: false,
21
+ },
22
+ radar: [
23
+ {
24
+ source: ['phy.jlu.edu.cn/:category/:column', 'phy.jlu.edu.cn/:category/:column/:subcolumn'],
25
+ },
26
+ ],
27
+ name: '物理学院',
28
+ maintainers: ['tsurumi-yizhou'],
29
+ url: 'phy.jlu.edu.cn',
30
+ handler: async (ctx) => {
31
+ const { category, column, subcolumn } = ctx.req.param();
32
+ const query = subcolumn ? `${column}/${subcolumn}` : column;
33
+ const response = await got(`https://phy.jlu.edu.cn/${category}/${query}.htm`);
34
+ const $ = load(response.body);
35
+ const list = $('.tit-list ul li');
36
+
37
+ return {
38
+ title: '吉林大学物理学院',
39
+ link: 'https://phy.jlu.edu.cn/',
40
+ description: '吉林大学物理学院',
41
+ item: list.toArray().map((item) => {
42
+ const element = $(item).find('a');
43
+ const title = element.find('.tl-top').find('h3').text().trim();
44
+ const link = element.attr('href')!.replaceAll('../', 'https://phy.jlu.edu.cn/');
45
+ const date = element.find('.tl-top').find('.tl-date');
46
+ const pubDate = date.find('span').text().replaceAll('/', '').trim() + '-' + date.find('b').text();
47
+ return {
48
+ title,
49
+ link,
50
+ pubDate: new Date(pubDate),
51
+ };
52
+ }),
53
+ };
54
+ },
55
+ };
@@ -151,67 +151,67 @@ export const route: Route = {
151
151
  },
152
152
  {
153
153
  title: '财经',
154
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N1'],
154
+ source: ['chinese.joins.com/news/articleList.html'],
155
155
  target: '/chinese/S1N1',
156
156
  },
157
157
  {
158
158
  title: '国际',
159
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N2'],
159
+ source: ['chinese.joins.com/news/articleList.html'],
160
160
  target: '/chinese/S1N2',
161
161
  },
162
162
  {
163
163
  title: '北韩',
164
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N3'],
164
+ source: ['chinese.joins.com/news/articleList.html'],
165
165
  target: '/chinese/S1N3',
166
166
  },
167
167
  {
168
168
  title: '政治·社会',
169
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N4'],
169
+ source: ['chinese.joins.com/news/articleList.html'],
170
170
  target: '/chinese/S1N4',
171
171
  },
172
172
  {
173
173
  title: '中国观察',
174
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N5'],
174
+ source: ['chinese.joins.com/news/articleList.html'],
175
175
  target: '/chinese/S1N5',
176
176
  },
177
177
  {
178
178
  title: '社论',
179
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N26'],
179
+ source: ['chinese.joins.com/news/articleList.html'],
180
180
  target: '/chinese/S1N26',
181
181
  },
182
182
  {
183
183
  title: '专栏·观点',
184
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N11'],
184
+ source: ['chinese.joins.com/news/articleList.html'],
185
185
  target: '/chinese/S1N11',
186
186
  },
187
187
  {
188
188
  title: '军事·科技',
189
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N6'],
189
+ source: ['chinese.joins.com/news/articleList.html'],
190
190
  target: '/chinese/S1N6',
191
191
  },
192
192
  {
193
193
  title: '娱乐体育',
194
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N7'],
194
+ source: ['chinese.joins.com/news/articleList.html'],
195
195
  target: '/chinese/S1N7',
196
196
  },
197
197
  {
198
198
  title: '教育',
199
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N8'],
199
+ source: ['chinese.joins.com/news/articleList.html'],
200
200
  target: '/chinese/S1N8',
201
201
  },
202
202
  {
203
203
  title: '旅游美食',
204
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N9'],
204
+ source: ['chinese.joins.com/news/articleList.html'],
205
205
  target: '/chinese/S1N9',
206
206
  },
207
207
  {
208
208
  title: '时尚',
209
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N10'],
209
+ source: ['chinese.joins.com/news/articleList.html'],
210
210
  target: '/chinese/S1N10',
211
211
  },
212
212
  {
213
213
  title: '图集',
214
- source: ['chinese.joins.com/news/articleList.html?sc_section_code=S1N12'],
214
+ source: ['chinese.joins.com/news/articleList.html'],
215
215
  target: '/chinese/S1N12',
216
216
  },
217
217
  ],