@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
@@ -0,0 +1,47 @@
1
+ const LEVEL_WEIGHTS = {
2
+ debug: 10,
3
+ error: 40,
4
+ info: 20,
5
+ warn: 30,
6
+ };
7
+ export function createLogger(options = {}) {
8
+ const format = options.format ?? "json";
9
+ const minimumLevel = options.level ?? "info";
10
+ const write = options.write ?? ((line) => process.stdout.write(`${line}\n`));
11
+ const log = (level, event, message, fields = {}) => {
12
+ if (LEVEL_WEIGHTS[level] < LEVEL_WEIGHTS[minimumLevel]) {
13
+ return;
14
+ }
15
+ const entry = {
16
+ event,
17
+ level,
18
+ msg: message,
19
+ time: new Date().toISOString(),
20
+ ...fields,
21
+ };
22
+ write(format === "json"
23
+ ? JSON.stringify(entry)
24
+ : `${entry.time} ${level.toUpperCase()} ${event} ${message} ${JSON.stringify(fields)}`);
25
+ };
26
+ return {
27
+ debug: (event, message, fields) => {
28
+ log("debug", event, message, fields);
29
+ },
30
+ error: (event, message, fields) => {
31
+ log("error", event, message, fields);
32
+ },
33
+ info: (event, message, fields) => {
34
+ log("info", event, message, fields);
35
+ },
36
+ warn: (event, message, fields) => {
37
+ log("warn", event, message, fields);
38
+ },
39
+ };
40
+ }
41
+ export const silentLogger = {
42
+ debug: () => undefined,
43
+ error: () => undefined,
44
+ info: () => undefined,
45
+ warn: () => undefined,
46
+ };
47
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/downloader/logger.ts"],"names":[],"mappings":"AAiBA,MAAM,aAAa,GAA6B;IAC9C,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IAC7C,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,CACV,KAAe,EACf,KAAa,EACb,OAAe,EACf,SAAoB,EAAE,EACtB,EAAE;QACF,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG;YACZ,KAAK;YACL,KAAK;YACL,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,GAAG,MAAM;SACV,CAAC;QACF,KAAK,CACH,MAAM,KAAK,MAAM;YACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YACvB,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAChC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAChC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/B,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/B,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;CACtB,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface AssetManifestEntry {
2
+ bytes?: number;
3
+ error?: string;
4
+ path: string;
5
+ sha256?: string;
6
+ status: AssetStatus;
7
+ url: string;
8
+ }
9
+ export type AssetStatus = "complete" | "downloading" | "failed" | "obsolete" | "pending";
10
+ export interface CreatorManifest {
11
+ creatorId: string;
12
+ posts: Partial<Record<string, PostManifestEntry>>;
13
+ schemaVersion: 1;
14
+ }
15
+ export interface PostManifestEntry {
16
+ assets: Partial<Record<string, AssetManifestEntry>>;
17
+ directory: string;
18
+ error?: string;
19
+ id: string;
20
+ restricted: boolean;
21
+ status: PostStatus;
22
+ updatedDatetime: string;
23
+ }
24
+ export type PostStatus = "complete" | "failed" | "pending" | "skipped";
25
+ export declare class ManifestStore {
26
+ #private;
27
+ constructor(outputDirectory: string, creatorId: string);
28
+ load(): Promise<CreatorManifest>;
29
+ save(manifest: CreatorManifest): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/downloader/manifest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AACD,MAAM,MAAM,WAAW,GACnB,UAAU,GACV,aAAa,GACb,QAAQ,GACR,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,qBAAa,aAAa;;gBAIL,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQhD,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAkBhC,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAM5D"}
@@ -0,0 +1,46 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ManifestStore_creatorDirectory, _ManifestStore_manifestPath;
13
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
14
+ import path from "node:path";
15
+ import { createCreatorDirectoryName } from "./path.js";
16
+ export class ManifestStore {
17
+ constructor(outputDirectory, creatorId) {
18
+ _ManifestStore_creatorDirectory.set(this, void 0);
19
+ _ManifestStore_manifestPath.set(this, void 0);
20
+ __classPrivateFieldSet(this, _ManifestStore_creatorDirectory, path.join(outputDirectory, createCreatorDirectoryName(creatorId, outputDirectory)), "f");
21
+ __classPrivateFieldSet(this, _ManifestStore_manifestPath, path.join(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f"), "manifest.json"), "f");
22
+ }
23
+ async load() {
24
+ try {
25
+ return JSON.parse(await readFile(__classPrivateFieldGet(this, _ManifestStore_manifestPath, "f"), "utf8"));
26
+ }
27
+ catch (error) {
28
+ if (error.code !== "ENOENT") {
29
+ throw error;
30
+ }
31
+ return {
32
+ creatorId: path.basename(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f")),
33
+ posts: {},
34
+ schemaVersion: 1,
35
+ };
36
+ }
37
+ }
38
+ async save(manifest) {
39
+ await mkdir(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f"), { recursive: true });
40
+ const temporaryPath = `${__classPrivateFieldGet(this, _ManifestStore_manifestPath, "f")}.tmp`;
41
+ await writeFile(temporaryPath, `${JSON.stringify(manifest, null, 2)}\n`);
42
+ await rename(temporaryPath, __classPrivateFieldGet(this, _ManifestStore_manifestPath, "f"));
43
+ }
44
+ }
45
+ _ManifestStore_creatorDirectory = new WeakMap(), _ManifestStore_manifestPath = new WeakMap();
46
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/downloader/manifest.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAmCvD,MAAM,OAAO,aAAa;IAIxB,YAAmB,eAAuB,EAAE,SAAiB;QAHpD,kDAA0B;QAC1B,8CAAsB;QAG7B,uBAAA,IAAI,mCAAqB,IAAI,CAAC,IAAI,CAChC,eAAe,EACf,0BAA0B,CAAC,SAAS,EAAE,eAAe,CAAC,CACvD,MAAA,CAAC;QACF,uBAAA,IAAI,+BAAiB,IAAI,CAAC,IAAI,CAAC,uBAAA,IAAI,uCAAkB,EAAE,eAAe,CAAC,MAAA,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,QAAQ,CAAC,uBAAA,IAAI,mCAAc,EAAE,MAAM,CAAC,CACxB,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAA,IAAI,uCAAkB,CAAC;gBAChD,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,QAAyB;QACzC,MAAM,KAAK,CAAC,uBAAA,IAAI,uCAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,GAAG,uBAAA,IAAI,mCAAc,MAAM,CAAC;QAClD,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,MAAM,CAAC,aAAa,EAAE,uBAAA,IAAI,mCAAc,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Post } from "../types.js";
2
+ export type AssetPathMap = ReadonlyMap<string, string>;
3
+ export declare function renderPostMarkdown(post: Post, paths: AssetPathMap): string;
4
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/downloader/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,IAAI,EAGL,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAwC1E"}
@@ -0,0 +1,59 @@
1
+ export function renderPostMarkdown(post, paths) {
2
+ let content;
3
+ switch (post.type) {
4
+ case "article":
5
+ content = renderArticle(post, paths);
6
+ break;
7
+ case "file": {
8
+ const filePost = post;
9
+ content = [
10
+ filePost.body.text,
11
+ ...filePost.body.files.map((file) => `[${file.name}](${assetLink(paths, `file:${file.id}`)})`),
12
+ ].join("\n\n");
13
+ break;
14
+ }
15
+ case "image": {
16
+ const imagePost = post;
17
+ content = [
18
+ imagePost.body.text,
19
+ ...imagePost.body.images.map((image) => `![${image.id}](./${assetLink(paths, `image:${image.id}`)})`),
20
+ ].join("\n\n");
21
+ break;
22
+ }
23
+ case "text":
24
+ content = post.body.text;
25
+ break;
26
+ case "video": {
27
+ const videoPost = post;
28
+ content = `${videoPost.body.text}\n\n${videoPost.body.video.serviceProvider}: ${videoPost.body.video.videoId}`;
29
+ break;
30
+ }
31
+ default:
32
+ content = `[unsupported post type: ${post.type}]`;
33
+ }
34
+ return `# ${post.title}\n\n${content.trim()}\n`;
35
+ }
36
+ function assetLink(paths, key) {
37
+ return paths.get(key) ?? `[missing asset: ${key}]`;
38
+ }
39
+ function renderArticle(post, paths) {
40
+ return post.body.blocks
41
+ .map((block) => {
42
+ switch (block.type) {
43
+ case "file":
44
+ return `[${String(block.fileId)}](${assetLink(paths, `file:${String(block.fileId)}`)})`;
45
+ case "header":
46
+ return `# ${String(block.text)}`;
47
+ case "image":
48
+ return `![${String(block.imageId)}](${assetLink(paths, `image:${String(block.imageId)}`)})`;
49
+ case "p":
50
+ return String(block.text);
51
+ case "url_embed":
52
+ return String(post.body.urlEmbedMap[String(block.urlEmbedId)] ?? block.urlEmbedId);
53
+ default:
54
+ return `[unsupported block: ${block.type}]`;
55
+ }
56
+ })
57
+ .join("\n\n");
58
+ }
59
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/downloader/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { LogLevel } from "./logger.js";
2
+ export interface DownloadOptions {
3
+ concurrency: number;
4
+ cookie?: string;
5
+ creatorIds: string[];
6
+ dryRun: boolean;
7
+ flatPosts: boolean;
8
+ following: boolean;
9
+ ignoreCreatorIds: string[];
10
+ logFormat: "json" | "pretty";
11
+ logLevel: LogLevel;
12
+ maxRetries: number;
13
+ output: string;
14
+ rateLimitPauseMs: number;
15
+ requestIntervalMs: number;
16
+ supporting: boolean;
17
+ userAgent?: string;
18
+ verifyAssets: boolean;
19
+ }
20
+ export declare class CliUsageError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ export declare function parseDownloadOptions(args: string[], env?: NodeJS.ProcessEnv): DownloadOptions;
24
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/downloader/options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,aAAc,SAAQ,KAAK;gBACnB,OAAO,EAAE,MAAM;CAInC;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CA8CjB"}
@@ -0,0 +1,130 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parseArgs } from "node:util";
3
+ export class CliUsageError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "CliUsageError";
7
+ }
8
+ }
9
+ export function parseDownloadOptions(args, env = process.env) {
10
+ const { values } = parseDownloadArgs(args);
11
+ const creatorIds = values.creator ?? [];
12
+ if (creatorIds.length === 0 && !values.following && !values.supporting) {
13
+ throw new CliUsageError("at least one creator selector is required");
14
+ }
15
+ if (values["log-format"] !== "json" && values["log-format"] !== "pretty") {
16
+ throw new CliUsageError("log-format must be json or pretty");
17
+ }
18
+ if (!isLogLevel(values["log-level"])) {
19
+ throw new CliUsageError("log-level must be debug, info, warn, or error");
20
+ }
21
+ const cookieFile = values["cookie-file"];
22
+ const cookie = normalizeCookie(values.cookie ??
23
+ (cookieFile === undefined
24
+ ? undefined
25
+ : readFileSync(cookieFile, "utf8")) ??
26
+ env.FANBOX_SESSION_ID);
27
+ return {
28
+ concurrency: parsePositiveInteger("concurrency", values.concurrency),
29
+ cookie,
30
+ creatorIds,
31
+ dryRun: values["dry-run"],
32
+ flatPosts: values["flat-posts"],
33
+ following: values.following,
34
+ ignoreCreatorIds: values["ignore-creator"] ?? [],
35
+ logFormat: values["log-format"],
36
+ logLevel: values["log-level"],
37
+ maxRetries: parseNonNegativeInteger("max-retries", values["max-retries"]),
38
+ output: values.output,
39
+ rateLimitPauseMs: parseNonNegativeInteger("rate-limit-pause-ms", values["rate-limit-pause-ms"]),
40
+ requestIntervalMs: parseNonNegativeInteger("request-interval-ms", values["request-interval-ms"]),
41
+ supporting: values.supporting,
42
+ userAgent: values["user-agent"],
43
+ verifyAssets: values["verify-assets"],
44
+ };
45
+ }
46
+ function isFanboxCookieDomain(domain) {
47
+ const normalized = domain.replace(/^\./, "").toLowerCase();
48
+ return normalized === "fanbox.cc" || normalized.endsWith(".fanbox.cc");
49
+ }
50
+ function isLogLevel(value) {
51
+ return (value === "debug" ||
52
+ value === "info" ||
53
+ value === "warn" ||
54
+ value === "error");
55
+ }
56
+ function normalizeCookie(cookie) {
57
+ const value = cookie?.trim();
58
+ if (!value) {
59
+ return undefined;
60
+ }
61
+ const cookies = parseNetscapeCookies(value);
62
+ if (cookies.length > 0) {
63
+ return cookies.map(({ name, value }) => `${name}=${value}`).join("; ");
64
+ }
65
+ return value.includes("=") ? value : `FANBOXSESSID=${value}`;
66
+ }
67
+ function parseDownloadArgs(args) {
68
+ try {
69
+ return parseArgs({
70
+ allowPositionals: false,
71
+ args: args.slice(1),
72
+ options: {
73
+ concurrency: { default: "3", type: "string" },
74
+ cookie: { type: "string" },
75
+ "cookie-file": { type: "string" },
76
+ creator: { multiple: true, type: "string" },
77
+ "dry-run": { default: false, type: "boolean" },
78
+ "flat-posts": { default: false, type: "boolean" },
79
+ following: { default: false, type: "boolean" },
80
+ "ignore-creator": { multiple: true, type: "string" },
81
+ "log-format": { default: "json", type: "string" },
82
+ "log-level": { default: "info", type: "string" },
83
+ "max-retries": { default: "5", type: "string" },
84
+ output: { default: "fanbox-downloads", type: "string" },
85
+ "rate-limit-pause-ms": { default: "60000", type: "string" },
86
+ "request-interval-ms": { default: "0", type: "string" },
87
+ supporting: { default: false, type: "boolean" },
88
+ "user-agent": { type: "string" },
89
+ "verify-assets": { default: false, type: "boolean" },
90
+ },
91
+ strict: true,
92
+ });
93
+ }
94
+ catch (error) {
95
+ throw new CliUsageError(error.message);
96
+ }
97
+ }
98
+ function parseNetscapeCookies(value) {
99
+ const cookies = [];
100
+ for (const line of value.split(/\r?\n/)) {
101
+ if (!line || line.startsWith("#")) {
102
+ continue;
103
+ }
104
+ const columns = line.split("\t");
105
+ if (columns.length < 7) {
106
+ continue;
107
+ }
108
+ const [domain, , , , , name, cookieValue] = columns;
109
+ if (!isFanboxCookieDomain(domain)) {
110
+ continue;
111
+ }
112
+ cookies.push({ name, value: cookieValue });
113
+ }
114
+ return cookies;
115
+ }
116
+ function parseNonNegativeInteger(name, value) {
117
+ const number = Number(value);
118
+ if (!Number.isSafeInteger(number) || number < 0) {
119
+ throw new CliUsageError(`${name} must be a non-negative integer`);
120
+ }
121
+ return number;
122
+ }
123
+ function parsePositiveInteger(name, value) {
124
+ const number = parseNonNegativeInteger(name, value);
125
+ if (number === 0) {
126
+ throw new CliUsageError(`${name} must be a positive integer`);
127
+ }
128
+ return number;
129
+ }
130
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/downloader/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface SanitizePathComponentOptions {
2
+ maxBytes?: number;
3
+ reserveBytes?: number;
4
+ suffix?: string;
5
+ }
6
+ export declare function assertPathBudget(absolutePath: string, maxBytes?: number): void;
7
+ export declare function createCreatorDirectoryName(creatorId: string, outputDirectory: string): string;
8
+ export declare function createPostDirectoryName(post: {
9
+ id: string;
10
+ publishedDatetime: string;
11
+ title: string;
12
+ }, parentDirectory?: string): string;
13
+ export declare function sanitizePathComponent(value: string, options?: SanitizePathComponentOptions): string;
14
+ export declare function sanitizePathComponentForDirectory(value: string, directory: string, options?: SanitizePathComponentOptions): string;
15
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/downloader/path.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,SAAqB,GAC5B,IAAI,CAMN;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,MAAM,CAIR;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,EACD,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAWR;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR"}
@@ -0,0 +1,69 @@
1
+ import path from "node:path";
2
+ const DEFAULT_COMPONENT_BYTES = 120;
3
+ const DEFAULT_PATH_BYTES = 240;
4
+ const RESERVED_NAMES = /^(?:AUX|CON|NUL|PRN|COM[1-9]|LPT[1-9])(?:\..*)?$/i;
5
+ const RESERVED_PREFIX = /^(?:AUX|CON|NUL|PRN|COM[1-9]|LPT[1-9])(?=$|[. <>:"/\\|?*])/i;
6
+ const SEGMENTER = new Intl.Segmenter(undefined, { granularity: "grapheme" });
7
+ export function assertPathBudget(absolutePath, maxBytes = DEFAULT_PATH_BYTES) {
8
+ if (Buffer.byteLength(path.resolve(absolutePath)) > maxBytes) {
9
+ throw new Error(`Path exceeds ${maxBytes} byte path budget: ${absolutePath}`);
10
+ }
11
+ }
12
+ export function createCreatorDirectoryName(creatorId, outputDirectory) {
13
+ return sanitizePathComponentForDirectory(creatorId, outputDirectory, {
14
+ reserveBytes: Buffer.byteLength(`${path.sep}manifest.json`),
15
+ });
16
+ }
17
+ export function createPostDirectoryName(post, parentDirectory) {
18
+ const date = post.publishedDatetime.slice(0, 10);
19
+ const prefix = `${date}_${post.id}_`;
20
+ const options = {
21
+ maxBytes: DEFAULT_COMPONENT_BYTES - Buffer.byteLength(prefix),
22
+ reserveBytes: Buffer.byteLength(`${prefix}${path.sep}metadata.json`),
23
+ };
24
+ const title = parentDirectory
25
+ ? sanitizePathComponentForDirectory(post.title, parentDirectory, options)
26
+ : sanitizePathComponent(post.title, options);
27
+ return `${prefix}${title}`;
28
+ }
29
+ export function sanitizePathComponent(value, options = {}) {
30
+ const maxBytes = options.maxBytes ?? DEFAULT_COMPONENT_BYTES;
31
+ const suffix = options.suffix ?? "";
32
+ let sanitized = Array.from(SEGMENTER.segment(value), ({ segment }) => segment)
33
+ .map((character) => (character.charCodeAt(0) <= 31 ? "_" : character))
34
+ .join("")
35
+ .replaceAll(/[<>:"/\\|?*]/g, "_")
36
+ .replaceAll(/[. ]+$/g, "");
37
+ if (RESERVED_NAMES.test(sanitized) || RESERVED_PREFIX.test(value)) {
38
+ sanitized = `_${sanitized}`;
39
+ }
40
+ if (!sanitized) {
41
+ sanitized = "_";
42
+ }
43
+ const suffixBytes = Buffer.byteLength(suffix);
44
+ return `${truncateUtf8(sanitized, Math.max(0, maxBytes - suffixBytes))}${suffix}`;
45
+ }
46
+ export function sanitizePathComponentForDirectory(value, directory, options = {}) {
47
+ const availableBytes = DEFAULT_PATH_BYTES -
48
+ Buffer.byteLength(path.resolve(directory)) -
49
+ Buffer.byteLength(path.sep) -
50
+ (options.reserveBytes ?? 0);
51
+ if (availableBytes <= Buffer.byteLength(options.suffix ?? "")) {
52
+ throw new Error(`Directory leaves no room in path budget: ${directory}`);
53
+ }
54
+ return sanitizePathComponent(value, {
55
+ ...options,
56
+ maxBytes: Math.min(options.maxBytes ?? DEFAULT_COMPONENT_BYTES, availableBytes),
57
+ });
58
+ }
59
+ function truncateUtf8(value, maxBytes) {
60
+ let result = "";
61
+ for (const { segment: character } of SEGMENTER.segment(value)) {
62
+ if (Buffer.byteLength(result + character) > maxBytes) {
63
+ break;
64
+ }
65
+ result += character;
66
+ }
67
+ return result;
68
+ }
69
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/downloader/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface CreatorResolverClient {
2
+ listFollowingCreators(): Promise<{
3
+ creatorId: string;
4
+ }[]>;
5
+ listSupportingPlans(): Promise<{
6
+ creatorId: string;
7
+ }[]>;
8
+ }
9
+ export interface ResolveCreatorIdsOptions {
10
+ creatorIds: string[];
11
+ following: boolean;
12
+ ignoreCreatorIds: string[];
13
+ supporting: boolean;
14
+ }
15
+ export declare function resolveCreatorIds(client: CreatorResolverClient, options: ResolveCreatorIdsOptions): Promise<string[]>;
16
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC1D,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
@@ -0,0 +1,18 @@
1
+ export async function resolveCreatorIds(client, options) {
2
+ const creatorIds = new Set(options.creatorIds);
3
+ if (options.following) {
4
+ for (const creator of await client.listFollowingCreators()) {
5
+ creatorIds.add(creator.creatorId);
6
+ }
7
+ }
8
+ if (options.supporting) {
9
+ for (const plan of await client.listSupportingPlans()) {
10
+ creatorIds.add(plan.creatorId);
11
+ }
12
+ }
13
+ for (const ignored of options.ignoreCreatorIds) {
14
+ creatorIds.delete(ignored);
15
+ }
16
+ return [...creatorIds];
17
+ }
18
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,MAAM,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { HttpResponse } from "../http.js";
2
+ import type { Logger } from "./logger.js";
3
+ export interface RequestSchedulerOptions {
4
+ concurrency: number;
5
+ logger?: Logger;
6
+ maxRetries?: number;
7
+ now?: () => number;
8
+ rateLimitPauseMs?: number;
9
+ requestIntervalMs?: number;
10
+ sleep?: (milliseconds: number) => Promise<void>;
11
+ }
12
+ export declare class RequestScheduler {
13
+ #private;
14
+ constructor(options: RequestSchedulerOptions);
15
+ pause(milliseconds: number): void;
16
+ request(operation: () => Promise<HttpResponse>): Promise<HttpResponse>;
17
+ run<T>(operation: () => Promise<T>): Promise<T>;
18
+ }
19
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/downloader/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,qBAAa,gBAAgB;;gBAaR,OAAO,EAAE,uBAAuB;IAa5C,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAClB,SAAS,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC;IAoCX,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAiC7D"}