@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,99 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ 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");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ 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");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _AssetDownloader_headers, _AssetDownloader_scheduler, _AssetDownloader_transport;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.AssetDownloadError = exports.AssetDownloader = void 0;
19
+ const node_crypto_1 = require("node:crypto");
20
+ const node_fs_1 = require("node:fs");
21
+ const promises_1 = require("node:fs/promises");
22
+ const node_path_1 = __importDefault(require("node:path"));
23
+ const promises_2 = require("node:stream/promises");
24
+ const http_js_1 = require("../http.js");
25
+ const path_js_1 = require("./path.js");
26
+ class AssetDownloader {
27
+ constructor(options) {
28
+ _AssetDownloader_headers.set(this, void 0);
29
+ _AssetDownloader_scheduler.set(this, void 0);
30
+ _AssetDownloader_transport.set(this, void 0);
31
+ __classPrivateFieldSet(this, _AssetDownloader_headers, options.headers ?? {}, "f");
32
+ __classPrivateFieldSet(this, _AssetDownloader_scheduler, options.scheduler, "f");
33
+ __classPrivateFieldSet(this, _AssetDownloader_transport, options.transport ?? new http_js_1.Http2Transport(), "f");
34
+ }
35
+ async download(options) {
36
+ const destination = node_path_1.default.join(options.rootDirectory, options.relativePath);
37
+ const temporaryPath = `${destination}.part`;
38
+ (0, path_js_1.assertPathBudget)(temporaryPath);
39
+ await (0, promises_1.mkdir)(node_path_1.default.dirname(destination), { recursive: true });
40
+ const partialBytes = await (0, promises_1.stat)(temporaryPath)
41
+ .then((result) => result.size)
42
+ .catch(() => 0);
43
+ const headers = { ...__classPrivateFieldGet(this, _AssetDownloader_headers, "f") };
44
+ if (partialBytes > 0) {
45
+ headers.Range = `bytes=${partialBytes}-`;
46
+ }
47
+ const response = await __classPrivateFieldGet(this, _AssetDownloader_scheduler, "f").request(() => __classPrivateFieldGet(this, _AssetDownloader_transport, "f").request({
48
+ headers,
49
+ method: "GET",
50
+ url: options.url,
51
+ }));
52
+ if (!response.ok) {
53
+ throw new AssetDownloadError(response, options.url, await readResponseBody(response));
54
+ }
55
+ await (0, promises_2.pipeline)(response.body, (0, node_fs_1.createWriteStream)(temporaryPath, {
56
+ flags: response.status === 206 && partialBytes > 0 ? "a" : "w",
57
+ }));
58
+ await (0, promises_1.rename)(temporaryPath, destination);
59
+ const modified = response.headers.get("Last-Modified");
60
+ const timestamp = modified
61
+ ? new Date(modified)
62
+ : new Date(options.publishedDatetime);
63
+ await (0, promises_1.utimes)(destination, timestamp, timestamp);
64
+ return {
65
+ bytes: (await (0, promises_1.stat)(destination)).size,
66
+ sha256: await hashFile(destination),
67
+ };
68
+ }
69
+ }
70
+ exports.AssetDownloader = AssetDownloader;
71
+ _AssetDownloader_headers = new WeakMap(), _AssetDownloader_scheduler = new WeakMap(), _AssetDownloader_transport = new WeakMap();
72
+ class AssetDownloadError extends Error {
73
+ constructor(response, url, body) {
74
+ super(`Asset download failed: ${response.status} ${url}`);
75
+ this.name = "AssetDownloadError";
76
+ this.body = body;
77
+ this.status = response.status;
78
+ this.statusText = response.statusText;
79
+ this.url = url;
80
+ }
81
+ }
82
+ exports.AssetDownloadError = AssetDownloadError;
83
+ async function hashFile(filePath) {
84
+ const hash = (0, node_crypto_1.createHash)("sha256");
85
+ for await (const chunk of (0, node_fs_1.createReadStream)(filePath)) {
86
+ hash.update(chunk);
87
+ }
88
+ return hash.digest("hex");
89
+ }
90
+ async function readResponseBody(response) {
91
+ const text = await response.text();
92
+ try {
93
+ return JSON.parse(text);
94
+ }
95
+ catch {
96
+ return text;
97
+ }
98
+ }
99
+ //# sourceMappingURL=asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.js","sourceRoot":"","sources":["../../../src/downloader/asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type HttpTransport } from "../http.js";
2
+ export interface RunCliDependencies {
3
+ transport?: HttpTransport;
4
+ write?: (line: string) => void;
5
+ }
6
+ export declare const DOWNLOAD_HELP = "Usage: fanbox-dl download [options]\n\nDownload FANBOX posts for selected creators.\n\nSelectors:\n --creator <id> Add a creator ID. Can be repeated.\n --following Add all followed creators.\n --supporting Add all supporting creators.\n --ignore-creator <id> Exclude a creator ID. Can be repeated.\n\nAuth:\n --cookie <value> Raw session ID or FANBOXSESSID=... cookie.\n --cookie-file <path> Read raw cookie or Netscape cookies.txt.\n --user-agent <value> Send the User-Agent from your logged-in browser.\n FANBOX_SESSION_ID Environment fallback.\n FANBOX_USER_AGENT User-Agent environment fallback.\n\nDownload:\n --output <path> Output directory. Default: fanbox-downloads.\n --dry-run List creators/posts without downloading or writing.\n --flat-posts Store post files directly under each creator.\n --verify-assets Verify existing asset size and SHA-256 locally.\n\nRequests:\n --concurrency <n> Concurrent requests. Default: 3.\n --request-interval-ms <n> Delay between request starts. Default: 0.\n --rate-limit-pause-ms <n> Pause after 429 without Retry-After. Default: 60000.\n --max-retries <n> Retry attempts. Default: 5.\n\nOutput:\n --log-format json|pretty Default: json.\n --log-level <level> debug|info|warn|error. Default: info.\n --help Show this help.\n";
7
+ export declare function runCli(args: string[], env?: NodeJS.ProcessEnv, dependencies?: RunCliDependencies): Promise<number>;
8
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/downloader/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhE,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,aAAa,w7CAiCzB,CAAC;AAEF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,YAAY,GAAE,kBAAuB,GACpC,OAAO,CAAC,MAAM,CAAC,CAqHjB"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DOWNLOAD_HELP = void 0;
4
+ exports.runCli = runCli;
5
+ const client_js_1 = require("../client.js");
6
+ const fanbox_headers_js_1 = require("../fanbox-headers.js");
7
+ const http_js_1 = require("../http.js");
8
+ const asset_js_1 = require("./asset.js");
9
+ const discovery_js_1 = require("./discovery.js");
10
+ const errors_js_1 = require("./errors.js");
11
+ const logger_js_1 = require("./logger.js");
12
+ const options_js_1 = require("./options.js");
13
+ const path_js_1 = require("./path.js");
14
+ const resolver_js_1 = require("./resolver.js");
15
+ const scheduler_js_1 = require("./scheduler.js");
16
+ const sync_js_1 = require("./sync.js");
17
+ exports.DOWNLOAD_HELP = `Usage: fanbox-dl download [options]
18
+
19
+ Download FANBOX posts for selected creators.
20
+
21
+ Selectors:
22
+ --creator <id> Add a creator ID. Can be repeated.
23
+ --following Add all followed creators.
24
+ --supporting Add all supporting creators.
25
+ --ignore-creator <id> Exclude a creator ID. Can be repeated.
26
+
27
+ Auth:
28
+ --cookie <value> Raw session ID or FANBOXSESSID=... cookie.
29
+ --cookie-file <path> Read raw cookie or Netscape cookies.txt.
30
+ --user-agent <value> Send the User-Agent from your logged-in browser.
31
+ FANBOX_SESSION_ID Environment fallback.
32
+ FANBOX_USER_AGENT User-Agent environment fallback.
33
+
34
+ Download:
35
+ --output <path> Output directory. Default: fanbox-downloads.
36
+ --dry-run List creators/posts without downloading or writing.
37
+ --flat-posts Store post files directly under each creator.
38
+ --verify-assets Verify existing asset size and SHA-256 locally.
39
+
40
+ Requests:
41
+ --concurrency <n> Concurrent requests. Default: 3.
42
+ --request-interval-ms <n> Delay between request starts. Default: 0.
43
+ --rate-limit-pause-ms <n> Pause after 429 without Retry-After. Default: 60000.
44
+ --max-retries <n> Retry attempts. Default: 5.
45
+
46
+ Output:
47
+ --log-format json|pretty Default: json.
48
+ --log-level <level> debug|info|warn|error. Default: info.
49
+ --help Show this help.
50
+ `;
51
+ async function runCli(args, env = process.env, dependencies = {}) {
52
+ const write = dependencies.write ?? ((line) => process.stderr.write(`${line}\n`));
53
+ if (args.includes("--help") || args.includes("-h")) {
54
+ write(exports.DOWNLOAD_HELP);
55
+ return 0;
56
+ }
57
+ let logger;
58
+ let transportToClose;
59
+ try {
60
+ const options = (0, options_js_1.parseDownloadOptions)(args, env);
61
+ (0, path_js_1.assertPathBudget)(options.output);
62
+ logger = (0, logger_js_1.createLogger)({
63
+ format: options.logFormat,
64
+ level: options.logLevel,
65
+ write: dependencies.write,
66
+ });
67
+ const transport = dependencies.transport ?? new http_js_1.Http2Transport();
68
+ transportToClose = dependencies.transport ? undefined : transport;
69
+ const requestHeaders = (0, fanbox_headers_js_1.createFanboxRequestHeaders)({
70
+ cookie: options.cookie,
71
+ userAgent: options.userAgent,
72
+ });
73
+ const scheduler = new scheduler_js_1.RequestScheduler({
74
+ concurrency: options.concurrency,
75
+ logger,
76
+ maxRetries: options.maxRetries,
77
+ rateLimitPauseMs: options.rateLimitPauseMs,
78
+ requestIntervalMs: options.requestIntervalMs,
79
+ });
80
+ const client = new client_js_1.FanboxClient({
81
+ cookie: requestHeaders.Cookie,
82
+ transport: {
83
+ close: () => transport.close(),
84
+ request: (request) => scheduler.request(() => transport.request(request)),
85
+ },
86
+ userAgent: requestHeaders["User-Agent"],
87
+ });
88
+ const creatorIds = await (0, resolver_js_1.resolveCreatorIds)(client, options);
89
+ if (options.dryRun) {
90
+ for (const creatorId of creatorIds) {
91
+ logger.info("dry-run.creator", "Dry-run creator selected", {
92
+ creatorId,
93
+ });
94
+ for (const post of await (0, discovery_js_1.discoverCreatorPosts)(client, creatorId, {
95
+ logger,
96
+ })) {
97
+ logger.info("dry-run.post", "Dry-run post discovered", {
98
+ creatorId,
99
+ postId: post.id,
100
+ restricted: post.isRestricted,
101
+ title: post.title,
102
+ updatedDatetime: post.updatedDatetime,
103
+ });
104
+ }
105
+ }
106
+ return 0;
107
+ }
108
+ const assetDownloader = new asset_js_1.AssetDownloader({
109
+ headers: requestHeaders,
110
+ scheduler,
111
+ transport,
112
+ });
113
+ let failed = false;
114
+ for (const creatorId of creatorIds) {
115
+ logger.info("creator.sync.start", "Creator sync started", { creatorId });
116
+ try {
117
+ const manifest = await (0, sync_js_1.syncCreator)({
118
+ assetDownloader,
119
+ client,
120
+ creatorId,
121
+ flatPosts: options.flatPosts,
122
+ logger,
123
+ outputDirectory: options.output,
124
+ verifyAssets: options.verifyAssets,
125
+ });
126
+ failed || (failed = hasFailures(manifest));
127
+ logger.info("creator.sync.complete", "Creator sync completed", {
128
+ creatorId,
129
+ });
130
+ }
131
+ catch (error) {
132
+ failed = true;
133
+ (0, errors_js_1.logDebugErrorResponse)(logger, error);
134
+ logger.error("creator.sync.failed", "Creator sync failed", {
135
+ creatorId,
136
+ error: String(error),
137
+ });
138
+ }
139
+ }
140
+ return failed ? 1 : 0;
141
+ }
142
+ catch (error) {
143
+ const usage = error instanceof options_js_1.CliUsageError;
144
+ const message = String(error);
145
+ if (usage) {
146
+ write(`${message}\n\n${exports.DOWNLOAD_HELP}`);
147
+ }
148
+ else {
149
+ if (logger) {
150
+ (0, errors_js_1.logDebugErrorResponse)(logger, error);
151
+ }
152
+ write(JSON.stringify({
153
+ event: "cli.failed",
154
+ level: "error",
155
+ msg: message,
156
+ time: new Date().toISOString(),
157
+ }));
158
+ }
159
+ return usage ? 2 : 1;
160
+ }
161
+ finally {
162
+ await transportToClose?.close();
163
+ }
164
+ }
165
+ function hasFailures(manifest) {
166
+ return Object.values(manifest.posts).some((post) => post?.status === "failed");
167
+ }
168
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/downloader/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ListCreatorPostsParams, PaginateCreatorPostsParams, PostSummary } from "../types.js";
2
+ import type { Logger } from "./logger.js";
3
+ export interface CreatorPostClient {
4
+ listCreatorPosts(params: ListCreatorPostsParams): Promise<PostSummary[]>;
5
+ paginateCreatorPosts(params: PaginateCreatorPostsParams): Promise<string[]>;
6
+ }
7
+ export interface DiscoverCreatorPostsOptions {
8
+ logger?: Logger;
9
+ pageSize?: number;
10
+ }
11
+ export declare function discoverCreatorPosts(client: CreatorPostClient, creatorId: string, options?: DiscoverCreatorPostsOptions): Promise<PostSummary[]>;
12
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/downloader/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzE,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,WAAW,EAAE,CAAC,CAqDxB"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.discoverCreatorPosts = discoverCreatorPosts;
4
+ const errors_js_1 = require("./errors.js");
5
+ const logger_js_1 = require("./logger.js");
6
+ const DEFAULT_PAGE_SIZE = 300;
7
+ async function discoverCreatorPosts(client, creatorId, options = {}) {
8
+ const logger = options.logger ?? logger_js_1.silentLogger;
9
+ const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;
10
+ const found = new Map();
11
+ let cursor = {
12
+ creatorId,
13
+ limit: pageSize,
14
+ sort: "newest",
15
+ };
16
+ for (;;) {
17
+ let page;
18
+ try {
19
+ page = await client.listCreatorPosts(cursor);
20
+ }
21
+ catch (error) {
22
+ (0, errors_js_1.logDebugErrorResponse)(logger, error, { creatorId });
23
+ logger.warn("post.discovery.fallback", "Direct cursor failed; using paginateCreator", {
24
+ creatorId,
25
+ error: String(error),
26
+ });
27
+ await fallbackPaginate(client, creatorId, found);
28
+ break;
29
+ }
30
+ const added = addPosts(page, found);
31
+ if (page.length < pageSize) {
32
+ break;
33
+ }
34
+ if (added === 0) {
35
+ logger.warn("post.discovery.fallback", "Direct cursor made no progress; using paginateCreator", {
36
+ creatorId,
37
+ });
38
+ await fallbackPaginate(client, creatorId, found);
39
+ break;
40
+ }
41
+ const last = page.at(-1);
42
+ cursor = {
43
+ creatorId,
44
+ firstId: last.id,
45
+ firstPublishedDatetime: last.publishedDatetime,
46
+ limit: pageSize,
47
+ sort: "newest",
48
+ };
49
+ }
50
+ return [...found.values()];
51
+ }
52
+ function addPosts(posts, found) {
53
+ let added = 0;
54
+ for (const post of posts) {
55
+ if (!found.has(post.id)) {
56
+ added += 1;
57
+ found.set(post.id, post);
58
+ }
59
+ }
60
+ return added;
61
+ }
62
+ function cursorFromUrl(url) {
63
+ const parsed = new URL(url);
64
+ const creatorId = parsed.searchParams.get("creatorId");
65
+ if (!creatorId) {
66
+ return undefined;
67
+ }
68
+ return {
69
+ creatorId,
70
+ firstId: parsed.searchParams.get("firstId") ?? undefined,
71
+ firstPublishedDatetime: parsed.searchParams.get("firstPublishedDatetime") ?? undefined,
72
+ limit: Number(parsed.searchParams.get("limit") ?? DEFAULT_PAGE_SIZE),
73
+ sort: "newest",
74
+ };
75
+ }
76
+ async function fallbackPaginate(client, creatorId, found) {
77
+ for (const url of await client.paginateCreatorPosts({
78
+ creatorId,
79
+ sort: "newest",
80
+ })) {
81
+ const cursor = cursorFromUrl(url);
82
+ if (cursor) {
83
+ addPosts(await client.listCreatorPosts(cursor), found);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/downloader/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { HttpResponse } from "../http.js";
2
+ import type { LogFields, Logger } from "./logger.js";
3
+ export declare function logDebugErrorResponse(logger: Logger, error: unknown, fields?: LogFields): void;
4
+ export declare function logDebugResponse(logger: Logger, response: HttpResponse, fields?: LogFields): Promise<void>;
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/downloader/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,SAAc,GACrB,IAAI,CAWN;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EACtB,MAAM,GAAE,SAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logDebugErrorResponse = logDebugErrorResponse;
4
+ exports.logDebugResponse = logDebugResponse;
5
+ function logDebugErrorResponse(logger, error, fields = {}) {
6
+ if (!isResponseLikeError(error)) {
7
+ return;
8
+ }
9
+ logger.debug("api.response.error", "HTTP error response", {
10
+ ...fields,
11
+ body: error.body,
12
+ status: error.status,
13
+ statusText: error.statusText,
14
+ });
15
+ }
16
+ async function logDebugResponse(logger, response, fields = {}) {
17
+ logger.debug("api.response.error", "HTTP error response", {
18
+ ...fields,
19
+ body: await readResponseBody(response),
20
+ status: response.status,
21
+ statusText: response.statusText,
22
+ });
23
+ }
24
+ function isResponseLikeError(error) {
25
+ return (typeof error === "object" &&
26
+ error !== null &&
27
+ "body" in error &&
28
+ "status" in error &&
29
+ typeof error.status === "number");
30
+ }
31
+ async function readResponseBody(response) {
32
+ const text = await response.text();
33
+ try {
34
+ return JSON.parse(text);
35
+ }
36
+ catch {
37
+ return text;
38
+ }
39
+ }
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/downloader/errors.ts"],"names":[],"mappings":";;AASA,sDAeC;AAED,4CAWC;AA5BD,SAAgB,qBAAqB,CACnC,MAAc,EACd,KAAc,EACd,SAAoB,EAAE;IAEtB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,qBAAqB,EAAE;QACxD,GAAG,MAAM;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,QAAsB,EACtB,SAAoB,EAAE;IAEtB,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,qBAAqB,EAAE;QACxD,GAAG,MAAM;QACT,IAAI,EAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC;QACtC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAsB;IACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/downloader/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const cli_js_1 = require("./cli.js");
5
+ void (0, cli_js_1.runCli)(process.argv.slice(2)).then((exitCode) => {
6
+ process.exitCode = exitCode;
7
+ });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/downloader/index.ts"],"names":[],"mappings":";;;AAEA,qCAAkC;AAElC,KAAK,IAAA,eAAM,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;IACnD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface CreateLoggerOptions {
2
+ format?: "json" | "pretty";
3
+ level?: LogLevel;
4
+ write?: (line: string) => void;
5
+ }
6
+ export type LogFields = Record<string, unknown>;
7
+ export interface Logger {
8
+ debug(event: string, message: string, fields?: LogFields): void;
9
+ error(event: string, message: string, fields?: LogFields): void;
10
+ info(event: string, message: string, fields?: LogFields): void;
11
+ warn(event: string, message: string, fields?: LogFields): void;
12
+ }
13
+ export type LogLevel = "debug" | "error" | "info" | "warn";
14
+ export declare function createLogger(options?: CreateLoggerOptions): Logger;
15
+ export declare const silentLogger: Logger;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/downloader/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAChE;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAS3D,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CA0CtE;AAED,eAAO,MAAM,YAAY,EAAE,MAK1B,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.silentLogger = void 0;
4
+ exports.createLogger = createLogger;
5
+ const LEVEL_WEIGHTS = {
6
+ debug: 10,
7
+ error: 40,
8
+ info: 20,
9
+ warn: 30,
10
+ };
11
+ function createLogger(options = {}) {
12
+ const format = options.format ?? "json";
13
+ const minimumLevel = options.level ?? "info";
14
+ const write = options.write ?? ((line) => process.stdout.write(`${line}\n`));
15
+ const log = (level, event, message, fields = {}) => {
16
+ if (LEVEL_WEIGHTS[level] < LEVEL_WEIGHTS[minimumLevel]) {
17
+ return;
18
+ }
19
+ const entry = {
20
+ event,
21
+ level,
22
+ msg: message,
23
+ time: new Date().toISOString(),
24
+ ...fields,
25
+ };
26
+ write(format === "json"
27
+ ? JSON.stringify(entry)
28
+ : `${entry.time} ${level.toUpperCase()} ${event} ${message} ${JSON.stringify(fields)}`);
29
+ };
30
+ return {
31
+ debug: (event, message, fields) => {
32
+ log("debug", event, message, fields);
33
+ },
34
+ error: (event, message, fields) => {
35
+ log("error", event, message, fields);
36
+ },
37
+ info: (event, message, fields) => {
38
+ log("info", event, message, fields);
39
+ },
40
+ warn: (event, message, fields) => {
41
+ log("warn", event, message, fields);
42
+ },
43
+ };
44
+ }
45
+ exports.silentLogger = {
46
+ debug: () => undefined,
47
+ error: () => undefined,
48
+ info: () => undefined,
49
+ warn: () => undefined,
50
+ };
51
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/downloader/logger.ts"],"names":[],"mappings":";;;AAwBA,oCA0CC;AAjDD,MAAM,aAAa,GAA6B;IAC9C,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,SAAgB,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;AAEY,QAAA,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"}