@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.
- package/LICENSE +21 -0
- package/README.md +148 -0
- package/dist/bundle/index.cjs +2 -0
- package/dist/bundle/index.cjs.map +1 -0
- package/dist/bundle/index.d.cts +296 -0
- package/dist/bundle/index.d.ts +296 -0
- package/dist/bundle/index.js +2 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/cjs/client-options.d.ts +8 -0
- package/dist/cjs/client-options.d.ts.map +1 -0
- package/dist/cjs/client-options.js +3 -0
- package/dist/cjs/client-options.js.map +1 -0
- package/dist/cjs/client.d.ts +31 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +107 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/downloader/asset.d.ts +30 -0
- package/dist/cjs/downloader/asset.d.ts.map +1 -0
- package/dist/cjs/downloader/asset.js +99 -0
- package/dist/cjs/downloader/asset.js.map +1 -0
- package/dist/cjs/downloader/cli.d.ts +8 -0
- package/dist/cjs/downloader/cli.d.ts.map +1 -0
- package/dist/cjs/downloader/cli.js +168 -0
- package/dist/cjs/downloader/cli.js.map +1 -0
- package/dist/cjs/downloader/discovery.d.ts +12 -0
- package/dist/cjs/downloader/discovery.d.ts.map +1 -0
- package/dist/cjs/downloader/discovery.js +87 -0
- package/dist/cjs/downloader/discovery.js.map +1 -0
- package/dist/cjs/downloader/errors.d.ts +5 -0
- package/dist/cjs/downloader/errors.d.ts.map +1 -0
- package/dist/cjs/downloader/errors.js +40 -0
- package/dist/cjs/downloader/errors.js.map +1 -0
- package/dist/cjs/downloader/index.d.ts +3 -0
- package/dist/cjs/downloader/index.d.ts.map +1 -0
- package/dist/cjs/downloader/index.js +8 -0
- package/dist/cjs/downloader/index.js.map +1 -0
- package/dist/cjs/downloader/logger.d.ts +16 -0
- package/dist/cjs/downloader/logger.d.ts.map +1 -0
- package/dist/cjs/downloader/logger.js +51 -0
- package/dist/cjs/downloader/logger.js.map +1 -0
- package/dist/cjs/downloader/manifest.d.ts +31 -0
- package/dist/cjs/downloader/manifest.d.ts.map +1 -0
- package/dist/cjs/downloader/manifest.js +53 -0
- package/dist/cjs/downloader/manifest.js.map +1 -0
- package/dist/cjs/downloader/markdown.d.ts +4 -0
- package/dist/cjs/downloader/markdown.d.ts.map +1 -0
- package/dist/cjs/downloader/markdown.js +62 -0
- package/dist/cjs/downloader/markdown.js.map +1 -0
- package/dist/cjs/downloader/options.d.ts +24 -0
- package/dist/cjs/downloader/options.d.ts.map +1 -0
- package/dist/cjs/downloader/options.js +135 -0
- package/dist/cjs/downloader/options.js.map +1 -0
- package/dist/cjs/downloader/path.d.ts +15 -0
- package/dist/cjs/downloader/path.d.ts.map +1 -0
- package/dist/cjs/downloader/path.js +79 -0
- package/dist/cjs/downloader/path.js.map +1 -0
- package/dist/cjs/downloader/resolver.d.ts +16 -0
- package/dist/cjs/downloader/resolver.d.ts.map +1 -0
- package/dist/cjs/downloader/resolver.js +21 -0
- package/dist/cjs/downloader/resolver.js.map +1 -0
- package/dist/cjs/downloader/scheduler.d.ts +19 -0
- package/dist/cjs/downloader/scheduler.d.ts.map +1 -0
- package/dist/cjs/downloader/scheduler.js +124 -0
- package/dist/cjs/downloader/scheduler.js.map +1 -0
- package/dist/cjs/downloader/sync.d.ts +21 -0
- package/dist/cjs/downloader/sync.d.ts.map +1 -0
- package/dist/cjs/downloader/sync.js +317 -0
- package/dist/cjs/downloader/sync.js.map +1 -0
- package/dist/cjs/endpoints/creator-get.d.ts +7 -0
- package/dist/cjs/endpoints/creator-get.d.ts.map +1 -0
- package/dist/cjs/endpoints/creator-get.js +5 -0
- package/dist/cjs/endpoints/creator-get.js.map +1 -0
- package/dist/cjs/endpoints/creator-list-following.d.ts +4 -0
- package/dist/cjs/endpoints/creator-list-following.d.ts.map +1 -0
- package/dist/cjs/endpoints/creator-list-following.js +5 -0
- package/dist/cjs/endpoints/creator-list-following.js.map +1 -0
- package/dist/cjs/endpoints/fanbox-envelope.d.ts +4 -0
- package/dist/cjs/endpoints/fanbox-envelope.d.ts.map +1 -0
- package/dist/cjs/endpoints/fanbox-envelope.js +3 -0
- package/dist/cjs/endpoints/fanbox-envelope.js.map +1 -0
- package/dist/cjs/endpoints/models/creator.d.ts +40 -0
- package/dist/cjs/endpoints/models/creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/creator.js +3 -0
- package/dist/cjs/endpoints/models/creator.js.map +1 -0
- package/dist/cjs/endpoints/models/plan.d.ts +17 -0
- package/dist/cjs/endpoints/models/plan.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/plan.js +3 -0
- package/dist/cjs/endpoints/models/plan.js.map +1 -0
- package/dist/cjs/endpoints/models/post.d.ts +134 -0
- package/dist/cjs/endpoints/models/post.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/post.js +3 -0
- package/dist/cjs/endpoints/models/post.js.map +1 -0
- package/dist/cjs/endpoints/models/user.d.ts +6 -0
- package/dist/cjs/endpoints/models/user.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/user.js +3 -0
- package/dist/cjs/endpoints/models/user.js.map +1 -0
- package/dist/cjs/endpoints/plan-list-creator.d.ts +7 -0
- package/dist/cjs/endpoints/plan-list-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/plan-list-creator.js +5 -0
- package/dist/cjs/endpoints/plan-list-creator.js.map +1 -0
- package/dist/cjs/endpoints/plan-list-supporting.d.ts +4 -0
- package/dist/cjs/endpoints/plan-list-supporting.d.ts.map +1 -0
- package/dist/cjs/endpoints/plan-list-supporting.js +5 -0
- package/dist/cjs/endpoints/plan-list-supporting.js.map +1 -0
- package/dist/cjs/endpoints/post-info.d.ts +7 -0
- package/dist/cjs/endpoints/post-info.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-info.js +5 -0
- package/dist/cjs/endpoints/post-info.js.map +1 -0
- package/dist/cjs/endpoints/post-list-creator.d.ts +10 -0
- package/dist/cjs/endpoints/post-list-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-creator.js +5 -0
- package/dist/cjs/endpoints/post-list-creator.js.map +1 -0
- package/dist/cjs/endpoints/post-list-home.d.ts +5 -0
- package/dist/cjs/endpoints/post-list-home.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-home.js +5 -0
- package/dist/cjs/endpoints/post-list-home.js.map +1 -0
- package/dist/cjs/endpoints/post-list-supporting.d.ts +5 -0
- package/dist/cjs/endpoints/post-list-supporting.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-supporting.js +5 -0
- package/dist/cjs/endpoints/post-list-supporting.js.map +1 -0
- package/dist/cjs/endpoints/post-paginate-creator.d.ts +8 -0
- package/dist/cjs/endpoints/post-paginate-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-paginate-creator.js +5 -0
- package/dist/cjs/endpoints/post-paginate-creator.js.map +1 -0
- package/dist/cjs/fanbox-headers.d.ts +7 -0
- package/dist/cjs/fanbox-headers.d.ts.map +1 -0
- package/dist/cjs/fanbox-headers.js +23 -0
- package/dist/cjs/fanbox-headers.js.map +1 -0
- package/dist/cjs/http.d.ts +31 -0
- package/dist/cjs/http.d.ts.map +1 -0
- package/dist/cjs/http.js +200 -0
- package/dist/cjs/http.js.map +1 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.d.ts +16 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/client-options.d.ts +8 -0
- package/dist/esm/client-options.d.ts.map +1 -0
- package/dist/esm/client-options.js +2 -0
- package/dist/esm/client-options.js.map +1 -0
- package/dist/esm/client.d.ts +31 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +102 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/downloader/asset.d.ts +30 -0
- package/dist/esm/downloader/asset.d.ts.map +1 -0
- package/dist/esm/downloader/asset.js +91 -0
- package/dist/esm/downloader/asset.js.map +1 -0
- package/dist/esm/downloader/cli.d.ts +8 -0
- package/dist/esm/downloader/cli.d.ts.map +1 -0
- package/dist/esm/downloader/cli.js +164 -0
- package/dist/esm/downloader/cli.js.map +1 -0
- package/dist/esm/downloader/discovery.d.ts +12 -0
- package/dist/esm/downloader/discovery.d.ts.map +1 -0
- package/dist/esm/downloader/discovery.js +84 -0
- package/dist/esm/downloader/discovery.js.map +1 -0
- package/dist/esm/downloader/errors.d.ts +5 -0
- package/dist/esm/downloader/errors.d.ts.map +1 -0
- package/dist/esm/downloader/errors.js +36 -0
- package/dist/esm/downloader/errors.js.map +1 -0
- package/dist/esm/downloader/index.d.ts +3 -0
- package/dist/esm/downloader/index.d.ts.map +1 -0
- package/dist/esm/downloader/index.js +6 -0
- package/dist/esm/downloader/index.js.map +1 -0
- package/dist/esm/downloader/logger.d.ts +16 -0
- package/dist/esm/downloader/logger.d.ts.map +1 -0
- package/dist/esm/downloader/logger.js +47 -0
- package/dist/esm/downloader/logger.js.map +1 -0
- package/dist/esm/downloader/manifest.d.ts +31 -0
- package/dist/esm/downloader/manifest.d.ts.map +1 -0
- package/dist/esm/downloader/manifest.js +46 -0
- package/dist/esm/downloader/manifest.js.map +1 -0
- package/dist/esm/downloader/markdown.d.ts +4 -0
- package/dist/esm/downloader/markdown.d.ts.map +1 -0
- package/dist/esm/downloader/markdown.js +59 -0
- package/dist/esm/downloader/markdown.js.map +1 -0
- package/dist/esm/downloader/options.d.ts +24 -0
- package/dist/esm/downloader/options.d.ts.map +1 -0
- package/dist/esm/downloader/options.js +130 -0
- package/dist/esm/downloader/options.js.map +1 -0
- package/dist/esm/downloader/path.d.ts +15 -0
- package/dist/esm/downloader/path.d.ts.map +1 -0
- package/dist/esm/downloader/path.js +69 -0
- package/dist/esm/downloader/path.js.map +1 -0
- package/dist/esm/downloader/resolver.d.ts +16 -0
- package/dist/esm/downloader/resolver.d.ts.map +1 -0
- package/dist/esm/downloader/resolver.js +18 -0
- package/dist/esm/downloader/resolver.js.map +1 -0
- package/dist/esm/downloader/scheduler.d.ts +19 -0
- package/dist/esm/downloader/scheduler.d.ts.map +1 -0
- package/dist/esm/downloader/scheduler.js +120 -0
- package/dist/esm/downloader/scheduler.js.map +1 -0
- package/dist/esm/downloader/sync.d.ts +21 -0
- package/dist/esm/downloader/sync.d.ts.map +1 -0
- package/dist/esm/downloader/sync.js +311 -0
- package/dist/esm/downloader/sync.js.map +1 -0
- package/dist/esm/endpoints/creator-get.d.ts +7 -0
- package/dist/esm/endpoints/creator-get.d.ts.map +1 -0
- package/dist/esm/endpoints/creator-get.js +2 -0
- package/dist/esm/endpoints/creator-get.js.map +1 -0
- package/dist/esm/endpoints/creator-list-following.d.ts +4 -0
- package/dist/esm/endpoints/creator-list-following.d.ts.map +1 -0
- package/dist/esm/endpoints/creator-list-following.js +2 -0
- package/dist/esm/endpoints/creator-list-following.js.map +1 -0
- package/dist/esm/endpoints/fanbox-envelope.d.ts +4 -0
- package/dist/esm/endpoints/fanbox-envelope.d.ts.map +1 -0
- package/dist/esm/endpoints/fanbox-envelope.js +2 -0
- package/dist/esm/endpoints/fanbox-envelope.js.map +1 -0
- package/dist/esm/endpoints/models/creator.d.ts +40 -0
- package/dist/esm/endpoints/models/creator.d.ts.map +1 -0
- package/dist/esm/endpoints/models/creator.js +2 -0
- package/dist/esm/endpoints/models/creator.js.map +1 -0
- package/dist/esm/endpoints/models/plan.d.ts +17 -0
- package/dist/esm/endpoints/models/plan.d.ts.map +1 -0
- package/dist/esm/endpoints/models/plan.js +2 -0
- package/dist/esm/endpoints/models/plan.js.map +1 -0
- package/dist/esm/endpoints/models/post.d.ts +134 -0
- package/dist/esm/endpoints/models/post.d.ts.map +1 -0
- package/dist/esm/endpoints/models/post.js +2 -0
- package/dist/esm/endpoints/models/post.js.map +1 -0
- package/dist/esm/endpoints/models/user.d.ts +6 -0
- package/dist/esm/endpoints/models/user.d.ts.map +1 -0
- package/dist/esm/endpoints/models/user.js +2 -0
- package/dist/esm/endpoints/models/user.js.map +1 -0
- package/dist/esm/endpoints/plan-list-creator.d.ts +7 -0
- package/dist/esm/endpoints/plan-list-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/plan-list-creator.js +2 -0
- package/dist/esm/endpoints/plan-list-creator.js.map +1 -0
- package/dist/esm/endpoints/plan-list-supporting.d.ts +4 -0
- package/dist/esm/endpoints/plan-list-supporting.d.ts.map +1 -0
- package/dist/esm/endpoints/plan-list-supporting.js +2 -0
- package/dist/esm/endpoints/plan-list-supporting.js.map +1 -0
- package/dist/esm/endpoints/post-info.d.ts +7 -0
- package/dist/esm/endpoints/post-info.d.ts.map +1 -0
- package/dist/esm/endpoints/post-info.js +2 -0
- package/dist/esm/endpoints/post-info.js.map +1 -0
- package/dist/esm/endpoints/post-list-creator.d.ts +10 -0
- package/dist/esm/endpoints/post-list-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-creator.js +2 -0
- package/dist/esm/endpoints/post-list-creator.js.map +1 -0
- package/dist/esm/endpoints/post-list-home.d.ts +5 -0
- package/dist/esm/endpoints/post-list-home.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-home.js +2 -0
- package/dist/esm/endpoints/post-list-home.js.map +1 -0
- package/dist/esm/endpoints/post-list-supporting.d.ts +5 -0
- package/dist/esm/endpoints/post-list-supporting.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-supporting.js +2 -0
- package/dist/esm/endpoints/post-list-supporting.js.map +1 -0
- package/dist/esm/endpoints/post-paginate-creator.d.ts +8 -0
- package/dist/esm/endpoints/post-paginate-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/post-paginate-creator.js +2 -0
- package/dist/esm/endpoints/post-paginate-creator.js.map +1 -0
- package/dist/esm/fanbox-headers.d.ts +7 -0
- package/dist/esm/fanbox-headers.d.ts.map +1 -0
- package/dist/esm/fanbox-headers.js +19 -0
- package/dist/esm/fanbox-headers.js.map +1 -0
- package/dist/esm/http.d.ts +31 -0
- package/dist/esm/http.d.ts.map +1 -0
- package/dist/esm/http.js +195 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +16 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- 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 @@
|
|
|
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"}
|