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,84 @@
1
+ import { Route } from '@/types';
2
+ import ofetch from '@/utils/ofetch';
3
+ const baseUrl = 'https://www.openrice.com';
4
+
5
+ export const route: Route = {
6
+ path: '/:lang/hongkong/voting/top/:categoryKey',
7
+ maintainers: ['after9'],
8
+ handler,
9
+ categories: ['shopping'],
10
+ example: '/openrice/zh/hongkong/voting/top/chinese',
11
+ parameters: { lang: '语言,缺省为 zh', categoryKey: '类别,缺省为 chinese' },
12
+ name: 'OpenRice 開飯熱店 - 年度餐廳投票',
13
+ description: `
14
+ lang: 语言,见下方列表
15
+ | 简体 | 繁體 | EN |
16
+ | ----- | ------ | ----- |
17
+ | zh-cn | zh | en |
18
+
19
+ categoryKey: 部分类别,见下方列表 (更多的类别可以在页面的link中对照获取)
20
+ | 中菜館 | 上海菜 | 粵菜 | 川菜 | 港式 | 粥粉麵店 | 廚師發辦 | 韓國菜 | 泰國菜 | 越南菜 |
21
+ | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
22
+ | chinese | shanghainese | guangdong | sichuan | hkstyle | congee_noodles | omakase | korean | thai | vietnamese |
23
+ `,
24
+ };
25
+
26
+ async function handler(ctx) {
27
+ const lang = ctx.req.param('lang') ?? 'zh';
28
+ const categoryKey = ctx.req.param('categoryKey') ?? 'chinese';
29
+
30
+ const apiPath = '/api/v2/voting/search/poi';
31
+ const urlPath = `/${lang}/hongkong/voting/top`;
32
+ let title: string, description: string;
33
+ switch (lang) {
34
+ case 'zh-cn':
35
+ title = 'OpenRice 开饭热店';
36
+ description = 'OpenRice用戶可以在網站或手機應用程式,點擊餐廳頁面中「投票」按鈕,即可完成投票。參加投票的用戶有機會參加大抽獎,贏取豐富獎品。';
37
+ break;
38
+ case 'en':
39
+ title = 'OpenRice Best Restaurant';
40
+ description =
41
+ 'OpenRice users can vote by clicking the "Vote" button on the restaurant page on the website or mobile app. Voters will have the opportunity to participate in the grand lottery and win grand prizes.';
42
+ break;
43
+ case 'zh':
44
+ default:
45
+ title = 'OpenRice 開飯熱店';
46
+ description = 'OpenRice用戶可以在網站或手機應用程式,點擊餐廳頁面中「投票」按鈕,即可完成投票。參加投票的用戶有機會參加大抽獎,贏取豐富獎品。';
47
+ }
48
+ const response = await ofetch(baseUrl + apiPath, {
49
+ headers: {
50
+ accept: 'application/json',
51
+ },
52
+ query: {
53
+ uiLang: lang,
54
+ uiCity: 'hongkong',
55
+ categoryKey,
56
+ shortlistIndexLt: 20,
57
+ startAt: 0,
58
+ regionId: 0,
59
+ rows: 20,
60
+ needTag: true,
61
+ _isPrivate: true,
62
+ },
63
+ });
64
+
65
+ const data = response.paginationResult.results;
66
+
67
+ const resultList = data.map((item) => {
68
+ const title = item.name ?? '';
69
+ const link = `${baseUrl}/${lang}/hongkong/r-${item.name}-r${item.poiId}`;
70
+ const description = `${item.district.name}-${item.categories.map((category) => category.name).join('-')}`;
71
+ return {
72
+ title,
73
+ description,
74
+ link,
75
+ };
76
+ });
77
+
78
+ return {
79
+ title,
80
+ link: baseUrl + urlPath,
81
+ description,
82
+ item: resultList,
83
+ };
84
+ }
@@ -1,10 +1,11 @@
1
1
  import { Route } from '@/types';
2
2
  import cache from '@/utils/cache';
3
- import got from '@/utils/got';
3
+ import ofetch from '@/utils/ofetch';
4
4
  import { parseDate, parseRelativeDate } from '@/utils/parse-date';
5
5
  import timezone from '@/utils/timezone';
6
6
  import { load } from 'cheerio';
7
7
  import { fetchArticle } from '@/utils/wechat-mp';
8
+ import { config } from '@/config';
8
9
 
9
10
  const configs = {
10
11
  all: {
@@ -73,17 +74,34 @@ export const route: Route = {
73
74
  [osc_pl]: https://www.oschina.net/news/programming "开源中国 - 编程语言资讯"`,
74
75
  };
75
76
 
77
+ const getCookie = () =>
78
+ cache.tryGet(
79
+ 'oschina:cookie',
80
+ async () => {
81
+ const res = await ofetch.raw('https://www.oschina.net/news');
82
+ const cookie = res.headers
83
+ .getSetCookie()
84
+ .map((i) => i.split(';')[0])
85
+ .join('; ');
86
+ return cookie;
87
+ },
88
+ config.cache.routeExpire,
89
+ false
90
+ );
91
+
76
92
  async function handler(ctx) {
77
93
  const category = ctx.req.param('category') ?? 'all';
78
94
  const config = configs[category];
79
95
 
80
- const res = await got(config.ajaxUrl, {
96
+ const cookie = await getCookie();
97
+ const res = await ofetch(config.ajaxUrl, {
81
98
  headers: {
82
99
  Referer: config.link,
83
100
  'X-Requested-With': 'XMLHttpRequest',
101
+ Cookie: cookie,
84
102
  },
85
103
  });
86
- const $ = load(res.data);
104
+ const $ = load(res);
87
105
 
88
106
  $('.ad-wrap').remove();
89
107
 
@@ -104,23 +122,24 @@ async function handler(ctx) {
104
122
  list.map((item) =>
105
123
  cache.tryGet(item.link, async () => {
106
124
  if (/^https?:\/\/(my|www)\.oschina.net\/.*$/.test(item.link)) {
107
- const detail = await got(item.link, {
125
+ const detail = await ofetch(item.link, {
108
126
  headers: {
109
127
  Referer: config.link,
128
+ Cookie: cookie,
110
129
  },
111
130
  });
112
- const content = load(detail.data);
131
+ const content = load(detail);
113
132
  content('.ad-wrap').remove();
114
133
 
115
134
  item.description = content('.article-detail').html();
116
135
  item.author = content('.article-box__meta .item').first().text();
117
136
  } else if (/^https?:\/\/gitee\.com\/.*$/.test(item.link)) {
118
- const detail = await got(item.link, {
137
+ const detail = await ofetch(item.link, {
119
138
  headers: {
120
139
  Referer: config.link,
121
140
  },
122
141
  });
123
- const content = load(detail.data);
142
+ const content = load(detail);
124
143
 
125
144
  item.description = content('.file_content').html();
126
145
  } else if (/^https?:\/\/osc\.cool\/.*$/.test(item.link)) {
@@ -0,0 +1,126 @@
1
+ import { Route } from '@/types';
2
+ import { CreatorData, MediaRelation, PostData } from './types';
3
+
4
+ import cache from '@/utils/cache';
5
+ import ofetch from '@/utils/ofetch';
6
+ import * as cheerio from 'cheerio';
7
+ import { parseDate } from '@/utils/parse-date';
8
+ import path from 'node:path';
9
+ import { getCurrentPath } from '@/utils/helpers';
10
+ import { art } from '@/utils/render';
11
+ import { config } from '@/config';
12
+
13
+ const __dirname = getCurrentPath(import.meta.url);
14
+
15
+ export const route: Route = {
16
+ path: '/:creator',
17
+ categories: ['new-media'],
18
+ example: '/patreon/straightupsisters',
19
+ parameters: { creator: 'Patreon creator id, can be found in the url' },
20
+ features: {
21
+ requireConfig: [
22
+ {
23
+ name: 'PATREON_SESSION_ID',
24
+ optional: true,
25
+ description: 'The value of the session_id cookie after logging in to Patreon, required to access paid posts',
26
+ },
27
+ ],
28
+ },
29
+ radar: [
30
+ {
31
+ source: ['patreon.com/:creator'],
32
+ },
33
+ ],
34
+ name: 'Home',
35
+ maintainers: ['TonyRL'],
36
+ handler,
37
+ };
38
+
39
+ async function handler(ctx) {
40
+ const { creator } = ctx.req.param();
41
+
42
+ const baseUrl = 'https://www.patreon.com';
43
+ const link = `${baseUrl}/${creator}`;
44
+
45
+ const creatorData = (await cache.tryGet(`patreon:creator:${creator}`, async () => {
46
+ const response = await ofetch(link);
47
+
48
+ const $ = cheerio.load(response);
49
+ const nextData = JSON.parse($('#__NEXT_DATA__').text());
50
+ const bootstrapEnvelope = nextData.props.pageProps.bootstrapEnvelope;
51
+
52
+ return {
53
+ meta: bootstrapEnvelope.meta,
54
+ id: bootstrapEnvelope.pageBootstrap.campaign.data.id,
55
+ attributes: bootstrapEnvelope.pageBootstrap.campaign.data.attributes,
56
+ };
57
+ })) as CreatorData;
58
+
59
+ if (!creatorData.id) {
60
+ throw new Error('Creator not found');
61
+ }
62
+
63
+ let headers = {};
64
+ if (config.patreon?.sessionId) {
65
+ headers = {
66
+ Cookie: `session_id=${config.patreon.sessionId}`,
67
+ };
68
+ }
69
+
70
+ const posts = await ofetch<PostData>('https://www.patreon.com/api/posts', {
71
+ headers,
72
+ query: {
73
+ include:
74
+ 'campaign,access_rules,access_rules.tier.null,attachments_media,audio,audio_preview.null,drop,images,media,native_video_insights,poll.choices,poll.current_user_responses.user,poll.current_user_responses.choice,poll.current_user_responses.poll,user,user_defined_tags,ti_checks,video.null,content_unlock_options.product_variant.null',
75
+ 'fields[campaign]': 'currency,show_audio_post_download_links,avatar_photo_url,avatar_photo_image_urls,earnings_visibility,is_nsfw,is_monthly,name,url',
76
+ 'fields[post]':
77
+ 'change_visibility_at,comment_count,commenter_count,content,created_at,current_user_can_comment,current_user_can_delete,current_user_can_report,current_user_can_view,current_user_comment_disallowed_reason,current_user_has_liked,embed,image,insights_last_updated_at,is_paid,like_count,meta_image_url,min_cents_pledged_to_view,monetization_ineligibility_reason,post_file,post_metadata,published_at,patreon_url,post_type,pledge_url,preview_asset_type,thumbnail,thumbnail_url,teaser_text,title,upgrade_url,url,was_posted_by_campaign_owner,has_ti_violation,moderation_status,post_level_suspension_removal_date,pls_one_liners_by_category,video,video_preview,view_count,content_unlock_options,is_new_to_current_user,watch_state',
78
+ 'fields[post_tag]': 'tag_type,value',
79
+ 'fields[user]': 'image_url,full_name,url',
80
+ 'fields[access_rule]': 'access_rule_type,amount_cents',
81
+ 'fields[media]': 'id,image_urls,display,download_url,metadata,file_name',
82
+ 'fields[native_video_insights]': 'average_view_duration,average_view_pct,has_preview,id,last_updated_at,num_views,preview_views,video_duration',
83
+ 'fields[content-unlock-option]': 'content_unlock_type',
84
+ 'fields[product-variant]': 'price_cents,currency_code,checkout_url,is_hidden,published_at_datetime,content_type,orders_count,access_metadata',
85
+ 'filter[campaign_id]': creatorData.id,
86
+ 'filter[contains_exclusive_posts]': true,
87
+ 'filter[is_draft]': false,
88
+ sort: '-published_at',
89
+ 'json-api-use-default-includes': false,
90
+ 'json-api-version': '1.0',
91
+ },
92
+ });
93
+
94
+ const items = posts.data.map(({ attributes, relationships }) => {
95
+ for (const [key, value] of Object.entries(relationships)) {
96
+ if (value.data) {
97
+ relationships[key] = Array.isArray(value.data) ? value.data.map((item) => posts.included.find((i) => i.id === item.id)) : posts.included.find((i) => i.id === value.data.id);
98
+ }
99
+ }
100
+ if (attributes.video_preview) {
101
+ relationships.video_preview = posts.included.find((i) => Number.parseInt(i.id) === attributes.video_preview.media_id) as unknown as MediaRelation;
102
+ }
103
+
104
+ return {
105
+ title: attributes.title,
106
+ description: art(path.join(__dirname, 'templates/description.art'), {
107
+ attributes,
108
+ relationships,
109
+ included: posts.included,
110
+ }),
111
+ link: attributes.url,
112
+ pubDate: parseDate(attributes.published_at),
113
+ image: attributes.thumbnail?.url ?? attributes.image.url,
114
+ category: relationships.user_defined_tags?.map((tag) => tag.attributes.value),
115
+ };
116
+ });
117
+
118
+ return {
119
+ title: creatorData.meta.title,
120
+ description: creatorData.meta.desc,
121
+ link,
122
+ image: creatorData.attributes.avatar_photo_url,
123
+ item: items,
124
+ allowEmpty: true,
125
+ };
126
+ }
@@ -0,0 +1,7 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'Patreon',
5
+ url: 'www.patreon.com',
6
+ lang: 'en',
7
+ };
@@ -0,0 +1,39 @@
1
+ {{ if attributes.post_type === 'image_file' }}
2
+ {{ each attributes.post_metadata.image_order mediaIdStr }}
3
+ {{ set img = included.find((i) => i.id === mediaIdStr) }}
4
+ {{ if img }}
5
+ <img src="{{ img.attributes.image_urls.original }}" alt="{{ img.attributes.file_name }}"><br>
6
+ {{ /if }}
7
+ {{ /each }}
8
+
9
+ {{ else if attributes.post_type === 'video_external_file' }}
10
+ {{ if attributes.video_preview }}
11
+ <video controls preload="metadata" poster="{{ attributes.image.url }}">
12
+ <source src="{{ relationships.video_preview.attributes.download_url }}" type="video/mp4">
13
+ </video><br>
14
+ {{ /if }}
15
+
16
+ {{ else if attributes.post_type === 'audio_file' || attributes.post_type === 'podcast' }}
17
+ <img src="{{ attributes.thumbnail.url }}"><br>
18
+ {{ set url = relationships.audio.attributes.download_url || relationships.audio_preview.attributes.download_url }}
19
+ <audio controls preload="metadata">
20
+ <source src="{{ url }}" type="audio/mpeg">
21
+ </audio><br>
22
+
23
+ {{ else if attributes.post_type === 'video_embed' || attributes.post_type === 'link' }}
24
+ <img src="{{ attributes.image.url }}"><br>
25
+
26
+ {{ else }}
27
+ Post type: "{{ attributes.post_type }}" is not supported. <br>
28
+
29
+ {{ /if }}
30
+
31
+ {{ if attributes.content || attributes.teaser_text }}
32
+ {{@ attributes.content || attributes.teaser_text }}
33
+ {{ /if }}
34
+
35
+ {{ if relationships.attachments_media }}
36
+ {{ each relationships.attachments_media media }}
37
+ <a href="{{ media.attributes.download_url }}">{{ media.attributes.file_name }}</a><br>
38
+ {{ /each }}
39
+ {{ /if }}