@moontaiworks/fanbox-dl 1.0.0

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 (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/bundle/index.cjs +2 -0
  4. package/dist/bundle/index.cjs.map +1 -0
  5. package/dist/bundle/index.d.cts +296 -0
  6. package/dist/bundle/index.d.ts +296 -0
  7. package/dist/bundle/index.js +2 -0
  8. package/dist/bundle/index.js.map +1 -0
  9. package/dist/cjs/client-options.d.ts +8 -0
  10. package/dist/cjs/client-options.d.ts.map +1 -0
  11. package/dist/cjs/client-options.js +3 -0
  12. package/dist/cjs/client-options.js.map +1 -0
  13. package/dist/cjs/client.d.ts +31 -0
  14. package/dist/cjs/client.d.ts.map +1 -0
  15. package/dist/cjs/client.js +107 -0
  16. package/dist/cjs/client.js.map +1 -0
  17. package/dist/cjs/downloader/asset.d.ts +30 -0
  18. package/dist/cjs/downloader/asset.d.ts.map +1 -0
  19. package/dist/cjs/downloader/asset.js +99 -0
  20. package/dist/cjs/downloader/asset.js.map +1 -0
  21. package/dist/cjs/downloader/cli.d.ts +8 -0
  22. package/dist/cjs/downloader/cli.d.ts.map +1 -0
  23. package/dist/cjs/downloader/cli.js +168 -0
  24. package/dist/cjs/downloader/cli.js.map +1 -0
  25. package/dist/cjs/downloader/discovery.d.ts +12 -0
  26. package/dist/cjs/downloader/discovery.d.ts.map +1 -0
  27. package/dist/cjs/downloader/discovery.js +87 -0
  28. package/dist/cjs/downloader/discovery.js.map +1 -0
  29. package/dist/cjs/downloader/errors.d.ts +5 -0
  30. package/dist/cjs/downloader/errors.d.ts.map +1 -0
  31. package/dist/cjs/downloader/errors.js +40 -0
  32. package/dist/cjs/downloader/errors.js.map +1 -0
  33. package/dist/cjs/downloader/index.d.ts +3 -0
  34. package/dist/cjs/downloader/index.d.ts.map +1 -0
  35. package/dist/cjs/downloader/index.js +8 -0
  36. package/dist/cjs/downloader/index.js.map +1 -0
  37. package/dist/cjs/downloader/logger.d.ts +16 -0
  38. package/dist/cjs/downloader/logger.d.ts.map +1 -0
  39. package/dist/cjs/downloader/logger.js +51 -0
  40. package/dist/cjs/downloader/logger.js.map +1 -0
  41. package/dist/cjs/downloader/manifest.d.ts +31 -0
  42. package/dist/cjs/downloader/manifest.d.ts.map +1 -0
  43. package/dist/cjs/downloader/manifest.js +53 -0
  44. package/dist/cjs/downloader/manifest.js.map +1 -0
  45. package/dist/cjs/downloader/markdown.d.ts +4 -0
  46. package/dist/cjs/downloader/markdown.d.ts.map +1 -0
  47. package/dist/cjs/downloader/markdown.js +62 -0
  48. package/dist/cjs/downloader/markdown.js.map +1 -0
  49. package/dist/cjs/downloader/options.d.ts +24 -0
  50. package/dist/cjs/downloader/options.d.ts.map +1 -0
  51. package/dist/cjs/downloader/options.js +135 -0
  52. package/dist/cjs/downloader/options.js.map +1 -0
  53. package/dist/cjs/downloader/path.d.ts +15 -0
  54. package/dist/cjs/downloader/path.d.ts.map +1 -0
  55. package/dist/cjs/downloader/path.js +79 -0
  56. package/dist/cjs/downloader/path.js.map +1 -0
  57. package/dist/cjs/downloader/resolver.d.ts +16 -0
  58. package/dist/cjs/downloader/resolver.d.ts.map +1 -0
  59. package/dist/cjs/downloader/resolver.js +21 -0
  60. package/dist/cjs/downloader/resolver.js.map +1 -0
  61. package/dist/cjs/downloader/scheduler.d.ts +19 -0
  62. package/dist/cjs/downloader/scheduler.d.ts.map +1 -0
  63. package/dist/cjs/downloader/scheduler.js +124 -0
  64. package/dist/cjs/downloader/scheduler.js.map +1 -0
  65. package/dist/cjs/downloader/sync.d.ts +21 -0
  66. package/dist/cjs/downloader/sync.d.ts.map +1 -0
  67. package/dist/cjs/downloader/sync.js +317 -0
  68. package/dist/cjs/downloader/sync.js.map +1 -0
  69. package/dist/cjs/endpoints/creator-get.d.ts +7 -0
  70. package/dist/cjs/endpoints/creator-get.d.ts.map +1 -0
  71. package/dist/cjs/endpoints/creator-get.js +5 -0
  72. package/dist/cjs/endpoints/creator-get.js.map +1 -0
  73. package/dist/cjs/endpoints/creator-list-following.d.ts +4 -0
  74. package/dist/cjs/endpoints/creator-list-following.d.ts.map +1 -0
  75. package/dist/cjs/endpoints/creator-list-following.js +5 -0
  76. package/dist/cjs/endpoints/creator-list-following.js.map +1 -0
  77. package/dist/cjs/endpoints/fanbox-envelope.d.ts +4 -0
  78. package/dist/cjs/endpoints/fanbox-envelope.d.ts.map +1 -0
  79. package/dist/cjs/endpoints/fanbox-envelope.js +3 -0
  80. package/dist/cjs/endpoints/fanbox-envelope.js.map +1 -0
  81. package/dist/cjs/endpoints/models/creator.d.ts +40 -0
  82. package/dist/cjs/endpoints/models/creator.d.ts.map +1 -0
  83. package/dist/cjs/endpoints/models/creator.js +3 -0
  84. package/dist/cjs/endpoints/models/creator.js.map +1 -0
  85. package/dist/cjs/endpoints/models/plan.d.ts +17 -0
  86. package/dist/cjs/endpoints/models/plan.d.ts.map +1 -0
  87. package/dist/cjs/endpoints/models/plan.js +3 -0
  88. package/dist/cjs/endpoints/models/plan.js.map +1 -0
  89. package/dist/cjs/endpoints/models/post.d.ts +134 -0
  90. package/dist/cjs/endpoints/models/post.d.ts.map +1 -0
  91. package/dist/cjs/endpoints/models/post.js +3 -0
  92. package/dist/cjs/endpoints/models/post.js.map +1 -0
  93. package/dist/cjs/endpoints/models/user.d.ts +6 -0
  94. package/dist/cjs/endpoints/models/user.d.ts.map +1 -0
  95. package/dist/cjs/endpoints/models/user.js +3 -0
  96. package/dist/cjs/endpoints/models/user.js.map +1 -0
  97. package/dist/cjs/endpoints/plan-list-creator.d.ts +7 -0
  98. package/dist/cjs/endpoints/plan-list-creator.d.ts.map +1 -0
  99. package/dist/cjs/endpoints/plan-list-creator.js +5 -0
  100. package/dist/cjs/endpoints/plan-list-creator.js.map +1 -0
  101. package/dist/cjs/endpoints/plan-list-supporting.d.ts +4 -0
  102. package/dist/cjs/endpoints/plan-list-supporting.d.ts.map +1 -0
  103. package/dist/cjs/endpoints/plan-list-supporting.js +5 -0
  104. package/dist/cjs/endpoints/plan-list-supporting.js.map +1 -0
  105. package/dist/cjs/endpoints/post-info.d.ts +7 -0
  106. package/dist/cjs/endpoints/post-info.d.ts.map +1 -0
  107. package/dist/cjs/endpoints/post-info.js +5 -0
  108. package/dist/cjs/endpoints/post-info.js.map +1 -0
  109. package/dist/cjs/endpoints/post-list-creator.d.ts +10 -0
  110. package/dist/cjs/endpoints/post-list-creator.d.ts.map +1 -0
  111. package/dist/cjs/endpoints/post-list-creator.js +5 -0
  112. package/dist/cjs/endpoints/post-list-creator.js.map +1 -0
  113. package/dist/cjs/endpoints/post-list-home.d.ts +5 -0
  114. package/dist/cjs/endpoints/post-list-home.d.ts.map +1 -0
  115. package/dist/cjs/endpoints/post-list-home.js +5 -0
  116. package/dist/cjs/endpoints/post-list-home.js.map +1 -0
  117. package/dist/cjs/endpoints/post-list-supporting.d.ts +5 -0
  118. package/dist/cjs/endpoints/post-list-supporting.d.ts.map +1 -0
  119. package/dist/cjs/endpoints/post-list-supporting.js +5 -0
  120. package/dist/cjs/endpoints/post-list-supporting.js.map +1 -0
  121. package/dist/cjs/endpoints/post-paginate-creator.d.ts +8 -0
  122. package/dist/cjs/endpoints/post-paginate-creator.d.ts.map +1 -0
  123. package/dist/cjs/endpoints/post-paginate-creator.js +5 -0
  124. package/dist/cjs/endpoints/post-paginate-creator.js.map +1 -0
  125. package/dist/cjs/fanbox-headers.d.ts +7 -0
  126. package/dist/cjs/fanbox-headers.d.ts.map +1 -0
  127. package/dist/cjs/fanbox-headers.js +23 -0
  128. package/dist/cjs/fanbox-headers.js.map +1 -0
  129. package/dist/cjs/http.d.ts +31 -0
  130. package/dist/cjs/http.d.ts.map +1 -0
  131. package/dist/cjs/http.js +200 -0
  132. package/dist/cjs/http.js.map +1 -0
  133. package/dist/cjs/index.d.ts +3 -0
  134. package/dist/cjs/index.d.ts.map +1 -0
  135. package/dist/cjs/index.js +7 -0
  136. package/dist/cjs/index.js.map +1 -0
  137. package/dist/cjs/types.d.ts +16 -0
  138. package/dist/cjs/types.d.ts.map +1 -0
  139. package/dist/cjs/types.js +3 -0
  140. package/dist/cjs/types.js.map +1 -0
  141. package/dist/esm/client-options.d.ts +8 -0
  142. package/dist/esm/client-options.d.ts.map +1 -0
  143. package/dist/esm/client-options.js +2 -0
  144. package/dist/esm/client-options.js.map +1 -0
  145. package/dist/esm/client.d.ts +31 -0
  146. package/dist/esm/client.d.ts.map +1 -0
  147. package/dist/esm/client.js +102 -0
  148. package/dist/esm/client.js.map +1 -0
  149. package/dist/esm/downloader/asset.d.ts +30 -0
  150. package/dist/esm/downloader/asset.d.ts.map +1 -0
  151. package/dist/esm/downloader/asset.js +91 -0
  152. package/dist/esm/downloader/asset.js.map +1 -0
  153. package/dist/esm/downloader/cli.d.ts +8 -0
  154. package/dist/esm/downloader/cli.d.ts.map +1 -0
  155. package/dist/esm/downloader/cli.js +164 -0
  156. package/dist/esm/downloader/cli.js.map +1 -0
  157. package/dist/esm/downloader/discovery.d.ts +12 -0
  158. package/dist/esm/downloader/discovery.d.ts.map +1 -0
  159. package/dist/esm/downloader/discovery.js +84 -0
  160. package/dist/esm/downloader/discovery.js.map +1 -0
  161. package/dist/esm/downloader/errors.d.ts +5 -0
  162. package/dist/esm/downloader/errors.d.ts.map +1 -0
  163. package/dist/esm/downloader/errors.js +36 -0
  164. package/dist/esm/downloader/errors.js.map +1 -0
  165. package/dist/esm/downloader/index.d.ts +3 -0
  166. package/dist/esm/downloader/index.d.ts.map +1 -0
  167. package/dist/esm/downloader/index.js +6 -0
  168. package/dist/esm/downloader/index.js.map +1 -0
  169. package/dist/esm/downloader/logger.d.ts +16 -0
  170. package/dist/esm/downloader/logger.d.ts.map +1 -0
  171. package/dist/esm/downloader/logger.js +47 -0
  172. package/dist/esm/downloader/logger.js.map +1 -0
  173. package/dist/esm/downloader/manifest.d.ts +31 -0
  174. package/dist/esm/downloader/manifest.d.ts.map +1 -0
  175. package/dist/esm/downloader/manifest.js +46 -0
  176. package/dist/esm/downloader/manifest.js.map +1 -0
  177. package/dist/esm/downloader/markdown.d.ts +4 -0
  178. package/dist/esm/downloader/markdown.d.ts.map +1 -0
  179. package/dist/esm/downloader/markdown.js +59 -0
  180. package/dist/esm/downloader/markdown.js.map +1 -0
  181. package/dist/esm/downloader/options.d.ts +24 -0
  182. package/dist/esm/downloader/options.d.ts.map +1 -0
  183. package/dist/esm/downloader/options.js +130 -0
  184. package/dist/esm/downloader/options.js.map +1 -0
  185. package/dist/esm/downloader/path.d.ts +15 -0
  186. package/dist/esm/downloader/path.d.ts.map +1 -0
  187. package/dist/esm/downloader/path.js +69 -0
  188. package/dist/esm/downloader/path.js.map +1 -0
  189. package/dist/esm/downloader/resolver.d.ts +16 -0
  190. package/dist/esm/downloader/resolver.d.ts.map +1 -0
  191. package/dist/esm/downloader/resolver.js +18 -0
  192. package/dist/esm/downloader/resolver.js.map +1 -0
  193. package/dist/esm/downloader/scheduler.d.ts +19 -0
  194. package/dist/esm/downloader/scheduler.d.ts.map +1 -0
  195. package/dist/esm/downloader/scheduler.js +120 -0
  196. package/dist/esm/downloader/scheduler.js.map +1 -0
  197. package/dist/esm/downloader/sync.d.ts +21 -0
  198. package/dist/esm/downloader/sync.d.ts.map +1 -0
  199. package/dist/esm/downloader/sync.js +311 -0
  200. package/dist/esm/downloader/sync.js.map +1 -0
  201. package/dist/esm/endpoints/creator-get.d.ts +7 -0
  202. package/dist/esm/endpoints/creator-get.d.ts.map +1 -0
  203. package/dist/esm/endpoints/creator-get.js +2 -0
  204. package/dist/esm/endpoints/creator-get.js.map +1 -0
  205. package/dist/esm/endpoints/creator-list-following.d.ts +4 -0
  206. package/dist/esm/endpoints/creator-list-following.d.ts.map +1 -0
  207. package/dist/esm/endpoints/creator-list-following.js +2 -0
  208. package/dist/esm/endpoints/creator-list-following.js.map +1 -0
  209. package/dist/esm/endpoints/fanbox-envelope.d.ts +4 -0
  210. package/dist/esm/endpoints/fanbox-envelope.d.ts.map +1 -0
  211. package/dist/esm/endpoints/fanbox-envelope.js +2 -0
  212. package/dist/esm/endpoints/fanbox-envelope.js.map +1 -0
  213. package/dist/esm/endpoints/models/creator.d.ts +40 -0
  214. package/dist/esm/endpoints/models/creator.d.ts.map +1 -0
  215. package/dist/esm/endpoints/models/creator.js +2 -0
  216. package/dist/esm/endpoints/models/creator.js.map +1 -0
  217. package/dist/esm/endpoints/models/plan.d.ts +17 -0
  218. package/dist/esm/endpoints/models/plan.d.ts.map +1 -0
  219. package/dist/esm/endpoints/models/plan.js +2 -0
  220. package/dist/esm/endpoints/models/plan.js.map +1 -0
  221. package/dist/esm/endpoints/models/post.d.ts +134 -0
  222. package/dist/esm/endpoints/models/post.d.ts.map +1 -0
  223. package/dist/esm/endpoints/models/post.js +2 -0
  224. package/dist/esm/endpoints/models/post.js.map +1 -0
  225. package/dist/esm/endpoints/models/user.d.ts +6 -0
  226. package/dist/esm/endpoints/models/user.d.ts.map +1 -0
  227. package/dist/esm/endpoints/models/user.js +2 -0
  228. package/dist/esm/endpoints/models/user.js.map +1 -0
  229. package/dist/esm/endpoints/plan-list-creator.d.ts +7 -0
  230. package/dist/esm/endpoints/plan-list-creator.d.ts.map +1 -0
  231. package/dist/esm/endpoints/plan-list-creator.js +2 -0
  232. package/dist/esm/endpoints/plan-list-creator.js.map +1 -0
  233. package/dist/esm/endpoints/plan-list-supporting.d.ts +4 -0
  234. package/dist/esm/endpoints/plan-list-supporting.d.ts.map +1 -0
  235. package/dist/esm/endpoints/plan-list-supporting.js +2 -0
  236. package/dist/esm/endpoints/plan-list-supporting.js.map +1 -0
  237. package/dist/esm/endpoints/post-info.d.ts +7 -0
  238. package/dist/esm/endpoints/post-info.d.ts.map +1 -0
  239. package/dist/esm/endpoints/post-info.js +2 -0
  240. package/dist/esm/endpoints/post-info.js.map +1 -0
  241. package/dist/esm/endpoints/post-list-creator.d.ts +10 -0
  242. package/dist/esm/endpoints/post-list-creator.d.ts.map +1 -0
  243. package/dist/esm/endpoints/post-list-creator.js +2 -0
  244. package/dist/esm/endpoints/post-list-creator.js.map +1 -0
  245. package/dist/esm/endpoints/post-list-home.d.ts +5 -0
  246. package/dist/esm/endpoints/post-list-home.d.ts.map +1 -0
  247. package/dist/esm/endpoints/post-list-home.js +2 -0
  248. package/dist/esm/endpoints/post-list-home.js.map +1 -0
  249. package/dist/esm/endpoints/post-list-supporting.d.ts +5 -0
  250. package/dist/esm/endpoints/post-list-supporting.d.ts.map +1 -0
  251. package/dist/esm/endpoints/post-list-supporting.js +2 -0
  252. package/dist/esm/endpoints/post-list-supporting.js.map +1 -0
  253. package/dist/esm/endpoints/post-paginate-creator.d.ts +8 -0
  254. package/dist/esm/endpoints/post-paginate-creator.d.ts.map +1 -0
  255. package/dist/esm/endpoints/post-paginate-creator.js +2 -0
  256. package/dist/esm/endpoints/post-paginate-creator.js.map +1 -0
  257. package/dist/esm/fanbox-headers.d.ts +7 -0
  258. package/dist/esm/fanbox-headers.d.ts.map +1 -0
  259. package/dist/esm/fanbox-headers.js +19 -0
  260. package/dist/esm/fanbox-headers.js.map +1 -0
  261. package/dist/esm/http.d.ts +31 -0
  262. package/dist/esm/http.d.ts.map +1 -0
  263. package/dist/esm/http.js +195 -0
  264. package/dist/esm/http.js.map +1 -0
  265. package/dist/esm/index.d.ts +3 -0
  266. package/dist/esm/index.d.ts.map +1 -0
  267. package/dist/esm/index.js +2 -0
  268. package/dist/esm/index.js.map +1 -0
  269. package/dist/esm/types.d.ts +16 -0
  270. package/dist/esm/types.d.ts.map +1 -0
  271. package/dist/esm/types.js +2 -0
  272. package/dist/esm/types.js.map +1 -0
  273. package/package.json +98 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 月太げつたい🌸
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,148 @@
1
+ # @moontaiworks/fanbox-dl
2
+
3
+ A cli downloader or a read-only TypeScript SDK for building pixivFANBOX applications.
4
+
5
+ [![NPM Version](https://img.shields.io/npm/v/@moontaiworks/fanbox-dl)](https://www.npmjs.com/package/@moontaiworks/fanbox-dl)
6
+ [![NPM Downloads](https://img.shields.io/npm/d18m/@moontaiworks/fanbox-dl)](https://www.npmjs.com/package/@moontaiworks/fanbox-dl)
7
+ [![Documentation](https://github.com/moontaiworks/fanbox-dl/actions/workflows/docs.yml/badge.svg)](https://github.com/moontaiworks/fanbox-dl/actions/workflows/docs.yml)
8
+ [![codecov](https://codecov.io/gh/moontaiworks/fanbox-dl/branch/main/graph/badge.svg)](https://codecov.io/gh/moontaiworks/fanbox-dl)
9
+
10
+ ## CLI Downloader
11
+
12
+ Run the downloader through your package manager, or install it globally:
13
+
14
+ ```bash
15
+ npx @moontaiworks/fanbox-dl download --creator creator-id
16
+ ```
17
+
18
+ ```bash
19
+ npm install -g @moontaiworks/fanbox-dl
20
+ fanbox-dl download --creator creator-id
21
+ ```
22
+
23
+ Authenticated downloads read `FANBOX_SESSION_ID` by default:
24
+
25
+ ```bash
26
+ FANBOX_SESSION_ID=your-session-id npx @moontaiworks/fanbox-dl download \
27
+ --supporting \
28
+ --output ./fanbox-downloads
29
+ ```
30
+
31
+ You can also pass a cookie file exported from your logged-in browser session:
32
+
33
+ ```bash
34
+ npx @moontaiworks/fanbox-dl download \
35
+ --creator creator-id \
36
+ --cookie-file ./cookies.txt
37
+ ```
38
+
39
+ Preview the selected creators and posts without downloading:
40
+
41
+ ```bash
42
+ npx @moontaiworks/fanbox-dl download --creator creator-id --dry-run
43
+ ```
44
+
45
+ At least one creator selector is required: `--creator`, `--following`, or
46
+ `--supporting`.
47
+
48
+ ### CLI Options
49
+
50
+ | Option | Description | Example | Default |
51
+ | --------------------------- | ------------------------------------------------------------------------------------------------------ | -------------------------------- | ------------------- |
52
+ | `--creator <id>` | Add a creator ID to download. Can be repeated. | `--creator alpha --creator beta` | None |
53
+ | `--following` | Download posts from followed creators. Requires authentication. | `--following` | `false` |
54
+ | `--supporting` | Download posts from supporting creators. Requires authentication. | `--supporting` | `false` |
55
+ | `--ignore-creator <id>` | Exclude a creator ID from the selected creators. Can be repeated. | `--ignore-creator beta` | None |
56
+ | `--cookie <value>` | Raw `FANBOXSESSID`, `FANBOXSESSID=...`, or a full Cookie header. | `--cookie "FANBOXSESSID=..."` | `FANBOX_SESSION_ID` |
57
+ | `--cookie-file <path>` | Read a raw cookie value or Netscape `cookies.txt`. FANBOX cookies are selected automatically. | `--cookie-file ./cookies.txt` | None |
58
+ | `--user-agent <value>` | Send the same User-Agent as the browser session that produced your cookie. | `--user-agent "Mozilla/5.0 ..."` | random string |
59
+ | `--output <path>` | Directory where downloaded creators and posts are stored. | `--output ./fanbox-downloads` | `fanbox-downloads` |
60
+ | `--dry-run` | List selected creators and discovered post summaries without writing files or requesting post details. | `--dry-run` | `false` |
61
+ | `--flat-posts` | Store post files directly under each creator directory instead of one directory per post. | `--flat-posts` | `false` |
62
+ | `--verify-assets` | Verify existing asset size and SHA-256 before deciding whether to skip a file. | `--verify-assets` | `false` |
63
+ | `--concurrency <n>` | Maximum number of concurrent requests. Must be greater than `0`. | `--concurrency 3` | `3` |
64
+ | `--request-interval-ms <n>` | Delay between request starts, in milliseconds. | `--request-interval-ms 1000` | `0` |
65
+ | `--rate-limit-pause-ms <n>` | Pause duration after HTTP 429 when FANBOX does not send `Retry-After`. | `--rate-limit-pause-ms 60000` | `60000` |
66
+ | `--max-retries <n>` | Retry attempts for retryable request failures. | `--max-retries 5` | `5` |
67
+ | `--log-format json\|pretty` | Choose JSON Lines logs or human-readable logs. | `--log-format pretty` | `json` |
68
+ | `--log-level <level>` | Show logs at this level or higher. One of `debug`, `info`, `warn`, or `error`. | `--log-level debug` | `info` |
69
+ | `--help` | Show CLI help. | `--help` | None |
70
+
71
+ ### CLI Notes
72
+
73
+ The downloader stores each post as `metadata.json`, `content.md`, and asset
74
+ files in a per-post directory. Asset file names include a two-digit sequence
75
+ number, so files are easy to browse in order.
76
+
77
+ It keeps a per-creator `manifest.json`, skips unchanged posts, resumes `.part`
78
+ files with HTTP Range requests when supported, and can verify existing SHA-256
79
+ hashes with `--verify-assets`.
80
+
81
+ Passing `--cookie` is convenient but may leave the session value in shell
82
+ history. `--cookie-file` accepts either a raw cookie value or a Netscape
83
+ `cookies.txt` export from your own logged-in browser session. When using
84
+ `cookies.txt`, FANBOX cookies such as `FANBOXSESSID` and `cf_clearance` are
85
+ selected automatically.
86
+
87
+ Run `fanbox-dl --help` for the full CLI option list.
88
+
89
+ ## SDK
90
+
91
+ ### Installation
92
+
93
+ ```bash
94
+ npm install @moontaiworks/fanbox-dl
95
+ ```
96
+
97
+ ### Usage
98
+
99
+ FANBOX uses the `FANBOXSESSID` cookie for authenticated requests. Obtain it from
100
+ your own browser session and keep it outside source control.
101
+
102
+ ```typescript
103
+ import { FanboxClient } from "@moontaiworks/fanbox-dl";
104
+
105
+ const fanbox = new FanboxClient({
106
+ cookie: `FANBOXSESSID=${process.env.FANBOX_SESSION_ID}`,
107
+ });
108
+
109
+ const creators = await fanbox.listFollowingCreators();
110
+ const supportingPlans = await fanbox.listSupportingPlans();
111
+
112
+ const pageUrls = await fanbox.paginateCreatorPosts({
113
+ creatorId: creators[0].creatorId,
114
+ sort: "newest",
115
+ });
116
+
117
+ const posts = await fanbox.listCreatorPosts({
118
+ creatorId: supportingPlans[0].creatorId,
119
+ limit: 10,
120
+ sort: "newest",
121
+ });
122
+
123
+ const post = await fanbox.getPost({ postId: posts[0].id });
124
+ ```
125
+
126
+ The SDK also provides `listHomePosts()` and `listSupportingPosts()` for
127
+ authenticated timelines. It intentionally exposes read-only endpoints: it does
128
+ not follow creators, like posts, or create comments.
129
+
130
+ ### Documentation
131
+
132
+ API documentation is automatically generated using [TypeDoc](https://typedoc.org/) and published to GitHub Pages.
133
+
134
+ - **View the latest documentation**: [GitHub Pages](https://moontaiworks.github.io/fanbox-dl/)
135
+
136
+ ## Testing
137
+
138
+ Tests inject a local HTTP transport and do not require a real FANBOX session.
139
+
140
+ Run:
141
+
142
+ ```bash
143
+ pnpm test
144
+ ```
145
+
146
+ ## Contributing
147
+
148
+ Contributions are welcome! Please feel free to submit a Pull Request.
@@ -0,0 +1,2 @@
1
+ "use strict";var x=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var _=t=>{throw TypeError(t)};var W=(t,e)=>{for(var r in e)x(t,r,{get:e[r],enumerable:!0})},z=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of M(e))!$.call(t,o)&&o!==r&&x(t,o,{get:()=>e[o],enumerable:!(s=q(e,o))||s.enumerable});return t};var J=t=>z(x({},"__esModule",{value:!0}),t);var L=(t,e,r)=>e.has(t)||_("Cannot "+r);var n=(t,e,r)=>(L(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>e.has(t)?_("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),g=(t,e,r,s)=>(L(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(L(t,e,"access private method"),r);var Pt={};W(Pt,{FanboxApiError:()=>f,FanboxClient:()=>b});module.exports=J(Pt);var C="creator.get";var O="creator.listFollowing";var w="plan.listCreator";var E="plan.listSupporting";var I="post.info";var U="post.listCreator";var F="post.listHome";var G="post.listSupporting";var N="post.paginateCreator";function B(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??X()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function X(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}var k=require("http2");var Y=":authority",K=":method",Q=":path",V=":scheme",Z=":status",p,S,v,T=class{constructor(){P(this,S);P(this,p,new Map)}async close(){let e=[...n(this,p).values()];n(this,p).clear(),await Promise.all(e.map(tt))}request(e){let r=nt(e),s=i(this,S,v).call(this,r.url),o=et(r),m=s.request(o,{endStream:!r.body});return new Promise((h,d)=>{let A=!1;m.once("error",d),m.once("response",l=>{A=!0;let D=it(l[Z]);h(rt({body:m,headers:st(l),status:D}))}),m.once("close",()=>{A||d(new H("HTTP/2 stream closed before response"))}),r.body!==void 0&&pt(m,r.body).catch(l=>{m.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,S=new WeakSet,v=function(e){let r=e.origin,s=n(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let o=(0,k.connect)(r);return o.once("close",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),o.once("error",()=>{n(this,p).get(r)===o&&n(this,p).delete(r)}),n(this,p).set(r,o),o};var H=class extends Error{constructor(e){super(e),this.name="HttpError"}};function tt(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function et(t){let e={[Y]:t.url.host,[K]:t.method.toUpperCase(),[Q]:`${t.url.pathname}${t.url.search}`,[V]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{ot(s)||(e[s]=r)}),e}function rt(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await j(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>j(t.body)}}function st(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let o of s)e.append(r,o);else e.set(r,s);return e}function ot(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function nt(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function it(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function j(t){let e=[];for await(let r of t)e.push(at(r));return Buffer.concat(e).toString("utf8")}function at(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function pt(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new H("Unsupported HTTP request body")}var ut="https://api.fanbox.cc",f=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},c,y,R,a,u,b=class{constructor(e={}){P(this,a);P(this,c);P(this,y);P(this,R);g(this,c,e.baseUrl??ut),g(this,y,B({cookie:e.cookie,userAgent:e.userAgent})),g(this,R,e.transport??new T)}getCreator(e){return i(this,a,u).call(this,C,e)}getPost(e){return i(this,a,u).call(this,I,e)}listCreatorPlans(e){return i(this,a,u).call(this,w,e)}listCreatorPosts(e){return i(this,a,u).call(this,U,e)}listFollowingCreators(){return i(this,a,u).call(this,O)}listHomePosts(e={}){return i(this,a,u).call(this,F,e)}listSupportingPlans(){return i(this,a,u).call(this,E)}listSupportingPosts(e={}){return i(this,a,u).call(this,G,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,N,e)}};c=new WeakMap,y=new WeakMap,R=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,n(this,c).endsWith("/")?n(this,c):`${n(this,c)}/`);for(let[h,d]of Object.entries(r))d!==void 0&&s.searchParams.set(h,String(d));let o=await n(this,R).request({headers:n(this,y),method:"GET",url:s}),m=await mt(o);if(!o.ok)throw new f(o,m);return m.body};async function mt(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}0&&(module.exports={FanboxApiError,FanboxClient});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["export { FanboxApiError, FanboxClient } from \"./client.js\";\nexport type * from \"./types.js\";\n","import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport type ListFollowingCreatorsResult = CreatorSummary[];\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport type ListCreatorPostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\n continue;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: HttpResponse, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n async #get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","FanboxApiError","FanboxClient","__toCommonJS","CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","import_node_http2","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
@@ -0,0 +1,296 @@
1
+ import { Readable } from 'node:stream';
2
+
3
+ interface HttpRequest {
4
+ body?: BodyInit | undefined;
5
+ headers?: Headers | Record<string, string>;
6
+ method?: string;
7
+ url: string | URL;
8
+ }
9
+ interface HttpResponse {
10
+ body: Readable;
11
+ headers: Headers;
12
+ json(): Promise<unknown>;
13
+ ok: boolean;
14
+ status: number;
15
+ statusText: string;
16
+ text(): Promise<string>;
17
+ }
18
+ interface HttpTransport {
19
+ close(): Promise<void>;
20
+ request(request: HttpRequest | string | URL): Promise<HttpResponse>;
21
+ }
22
+ type BodyInit = Blob | string | Uint8Array;
23
+
24
+ interface FanboxClientOptions {
25
+ baseUrl?: string;
26
+ cookie?: string;
27
+ transport?: HttpTransport;
28
+ userAgent?: string;
29
+ }
30
+
31
+ interface FanboxUser {
32
+ iconUrl: string;
33
+ name: string;
34
+ userId: string;
35
+ }
36
+
37
+ interface Creator {
38
+ category: string;
39
+ coverImageUrl: null | string;
40
+ creatorId: string;
41
+ description: string;
42
+ hasAdultContent: boolean;
43
+ hasBoothShop: boolean;
44
+ hasPublishedPost: boolean;
45
+ isAcceptingRequest: boolean;
46
+ isFollowed: boolean;
47
+ isStopped: boolean;
48
+ isSupported: boolean;
49
+ profileItems: CreatorProfileItem[];
50
+ profileLinks: string[];
51
+ user: FanboxUser;
52
+ }
53
+ interface CreatorProfileImage {
54
+ id: string;
55
+ imageUrl: string;
56
+ thumbnailUrl: string;
57
+ type: "image";
58
+ }
59
+ type CreatorProfileItem = CreatorProfileImage | CreatorProfileUnknownItem;
60
+ interface CreatorProfileUnknownItem {
61
+ [key: string]: unknown;
62
+ id: string;
63
+ type: string;
64
+ }
65
+ interface CreatorSummary {
66
+ creatorId: string;
67
+ description: string;
68
+ hasAdultContent: boolean;
69
+ iconUrl: string;
70
+ isFollowed: boolean;
71
+ isSupported: boolean;
72
+ name: string;
73
+ userId: string;
74
+ }
75
+
76
+ declare const CREATOR_GET_PATH = "creator.get";
77
+ interface GetCreatorParams {
78
+ creatorId: string;
79
+ }
80
+ type GetCreatorResult = Creator;
81
+
82
+ declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
83
+ type ListFollowingCreatorsResult = CreatorSummary[];
84
+
85
+ interface Plan {
86
+ coverImageUrl: null | string;
87
+ creatorId: string;
88
+ description: string;
89
+ fee: number;
90
+ hasAdultContent: boolean;
91
+ id: string;
92
+ paymentMethod: null | string;
93
+ perks: string[];
94
+ title: string;
95
+ user: FanboxUser;
96
+ }
97
+ interface SupportingPlan extends Plan {
98
+ paymentMethod: string;
99
+ }
100
+
101
+ declare const PLAN_LIST_CREATOR_PATH = "plan.listCreator";
102
+ interface ListCreatorPlansParams {
103
+ creatorId: string;
104
+ }
105
+ type ListCreatorPlansResult = Plan[];
106
+
107
+ declare const PLAN_LIST_SUPPORTING_PATH = "plan.listSupporting";
108
+ type ListSupportingPlansResult = SupportingPlan[];
109
+
110
+ type ArticleBlock = ArticleFileBlock | ArticleHeaderBlock | ArticleImageBlock | ArticleParagraphBlock | ArticleUnknownBlock | ArticleUrlEmbedBlock;
111
+ interface ArticleFileBlock {
112
+ fileId: string;
113
+ type: "file";
114
+ }
115
+ interface ArticleHeaderBlock {
116
+ text: string;
117
+ type: "header";
118
+ }
119
+ interface ArticleImageBlock {
120
+ imageId: string;
121
+ type: "image";
122
+ }
123
+ interface ArticleParagraphBlock {
124
+ text: string;
125
+ type: "p";
126
+ }
127
+ interface ArticlePost extends PostBase {
128
+ body: ArticlePostBody;
129
+ type: "article";
130
+ }
131
+ interface ArticlePostBody {
132
+ blocks: ArticleBlock[];
133
+ fileMap: Record<string, PostFile>;
134
+ imageMap: Record<string, PostImage>;
135
+ urlEmbedMap: Record<string, unknown>;
136
+ }
137
+ interface ArticleUnknownBlock {
138
+ [key: string]: unknown;
139
+ type: string;
140
+ }
141
+ interface ArticleUrlEmbedBlock {
142
+ type: "url_embed";
143
+ urlEmbedId: string;
144
+ }
145
+ interface FilePost extends PostBase {
146
+ body: FilePostBody;
147
+ type: "file";
148
+ }
149
+ interface FilePostBody {
150
+ files: PostFile[];
151
+ text: string;
152
+ }
153
+ interface ImagePost extends PostBase {
154
+ body: ImagePostBody;
155
+ type: "image";
156
+ }
157
+ interface ImagePostBody {
158
+ images: PostImage[];
159
+ text: string;
160
+ }
161
+ interface NeighboringPost {
162
+ id: string;
163
+ publishedDatetime: string;
164
+ title: string;
165
+ }
166
+ type Post = ArticlePost | FilePost | ImagePost | TextPost | UnknownPost | VideoPost;
167
+ interface PostCover {
168
+ type: "cover_image" | "post_image";
169
+ url: string;
170
+ }
171
+ interface PostFile {
172
+ extension: string;
173
+ id: string;
174
+ name: string;
175
+ size: number;
176
+ url: string;
177
+ }
178
+ interface PostImage {
179
+ extension: string;
180
+ height: number;
181
+ id: string;
182
+ originalUrl: string;
183
+ thumbnailUrl: string;
184
+ width: number;
185
+ }
186
+ interface PostListParams {
187
+ limit?: number;
188
+ maxId?: string;
189
+ maxPublishedDatetime?: string;
190
+ }
191
+ type PostSort = "newest" | "oldest";
192
+ interface PostSummary {
193
+ commentCount: number;
194
+ cover: null | PostCover;
195
+ creatorId: string;
196
+ excerpt: string;
197
+ feeRequired: number;
198
+ hasAdultContent: boolean;
199
+ id: string;
200
+ isCommentingRestricted: boolean;
201
+ isLiked: boolean;
202
+ isPinned: boolean;
203
+ isRestricted: boolean;
204
+ likeCount: number;
205
+ publishedDatetime: string;
206
+ tags: string[];
207
+ title: string;
208
+ updatedDatetime: string;
209
+ user: FanboxUser;
210
+ }
211
+ interface TextPost extends PostBase {
212
+ body: TextPostBody;
213
+ type: "text";
214
+ }
215
+ interface TextPostBody {
216
+ text: string;
217
+ }
218
+ interface UnknownPost extends PostBase {
219
+ type: string;
220
+ }
221
+ type UnknownPostBody = Record<string, unknown>;
222
+ interface VideoPost extends PostBase {
223
+ body: VideoPostBody;
224
+ type: "video";
225
+ }
226
+ interface VideoPostBody {
227
+ text: string;
228
+ video: {
229
+ serviceProvider: string;
230
+ videoId: string;
231
+ };
232
+ }
233
+ interface PostBase extends Omit<PostSummary, "cover"> {
234
+ body: unknown;
235
+ coverImageUrl: null | string;
236
+ imageForShare: null | string;
237
+ nextPost: NeighboringPost | null;
238
+ prevPost: NeighboringPost | null;
239
+ type: string;
240
+ }
241
+
242
+ declare const POST_INFO_PATH = "post.info";
243
+ interface GetPostParams {
244
+ postId: string;
245
+ }
246
+ type GetPostResult = Post;
247
+
248
+ declare const POST_LIST_CREATOR_PATH = "post.listCreator";
249
+ interface ListCreatorPostsParams extends PostListParams {
250
+ creatorId: string;
251
+ firstId?: string;
252
+ firstPublishedDatetime?: string;
253
+ sort?: PostSort;
254
+ }
255
+ type ListCreatorPostsResult = PostSummary[];
256
+
257
+ declare const POST_LIST_HOME_PATH = "post.listHome";
258
+ type ListHomePostsParams = PostListParams;
259
+ type ListHomePostsResult = PostSummary[];
260
+
261
+ declare const POST_LIST_SUPPORTING_PATH = "post.listSupporting";
262
+ type ListSupportingPostsParams = PostListParams;
263
+ type ListSupportingPostsResult = PostSummary[];
264
+
265
+ declare const POST_PAGINATE_CREATOR_PATH = "post.paginateCreator";
266
+ interface PaginateCreatorPostsParams {
267
+ creatorId: string;
268
+ sort?: PostSort;
269
+ }
270
+ type PaginateCreatorPostsResult = string[];
271
+
272
+ declare class FanboxApiError extends Error {
273
+ readonly body: unknown;
274
+ readonly status: number;
275
+ readonly statusText: string;
276
+ constructor(response: HttpResponse, body: unknown);
277
+ }
278
+ declare class FanboxClient {
279
+ #private;
280
+ constructor(options?: FanboxClientOptions);
281
+ getCreator(params: GetCreatorParams): Promise<GetCreatorResult>;
282
+ getPost(params: GetPostParams): Promise<GetPostResult>;
283
+ listCreatorPlans(params: ListCreatorPlansParams): Promise<ListCreatorPlansResult>;
284
+ listCreatorPosts(params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
285
+ listFollowingCreators(): Promise<ListFollowingCreatorsResult>;
286
+ listHomePosts(params?: ListHomePostsParams): Promise<ListHomePostsResult>;
287
+ listSupportingPlans(): Promise<ListSupportingPlansResult>;
288
+ listSupportingPosts(params?: ListSupportingPostsParams): Promise<ListSupportingPostsResult>;
289
+ paginateCreatorPosts(params: PaginateCreatorPostsParams): Promise<PaginateCreatorPostsResult>;
290
+ }
291
+
292
+ interface FanboxEnvelope<T> {
293
+ body: T;
294
+ }
295
+
296
+ export { type ArticleBlock, type ArticleFileBlock, type ArticleHeaderBlock, type ArticleImageBlock, type ArticleParagraphBlock, type ArticlePost, type ArticlePostBody, type ArticleUnknownBlock, type ArticleUrlEmbedBlock, CREATOR_GET_PATH, CREATOR_LIST_FOLLOWING_PATH, type Creator, type CreatorProfileImage, type CreatorProfileItem, type CreatorProfileUnknownItem, type CreatorSummary, FanboxApiError, FanboxClient, type FanboxClientOptions, type FanboxEnvelope, type FanboxUser, type FilePost, type FilePostBody, type GetCreatorParams, type GetCreatorResult, type GetPostParams, type GetPostResult, type ImagePost, type ImagePostBody, type ListCreatorPlansParams, type ListCreatorPlansResult, type ListCreatorPostsParams, type ListCreatorPostsResult, type ListFollowingCreatorsResult, type ListHomePostsParams, type ListHomePostsResult, type ListSupportingPlansResult, type ListSupportingPostsParams, type ListSupportingPostsResult, type NeighboringPost, PLAN_LIST_CREATOR_PATH, PLAN_LIST_SUPPORTING_PATH, POST_INFO_PATH, POST_LIST_CREATOR_PATH, POST_LIST_HOME_PATH, POST_LIST_SUPPORTING_PATH, POST_PAGINATE_CREATOR_PATH, type PaginateCreatorPostsParams, type PaginateCreatorPostsResult, type Plan, type Post, type PostCover, type PostFile, type PostImage, type PostListParams, type PostSort, type PostSummary, type SupportingPlan, type TextPost, type TextPostBody, type UnknownPost, type UnknownPostBody, type VideoPost, type VideoPostBody };