patreon-dl 3.7.1 → 3.8.1
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/README.md +15 -0
- package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
- package/dist/browse/api/ContentAPIMixin.d.ts +3 -3
- package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
- package/dist/browse/api/index.d.ts +10 -10
- package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
- package/dist/browse/db/ContentDBMixin.d.ts +13 -13
- package/dist/browse/db/ContentDBMixin.js +1 -1
- package/dist/browse/db/ContentDBMixin.js.map +1 -1
- package/dist/browse/db/MediaDBMixin.js +1 -1
- package/dist/browse/db/MediaDBMixin.js.map +1 -1
- package/dist/browse/db/index.d.ts +16 -16
- package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
- package/dist/browse/web/index.html +1 -1
- package/dist/cli/CommandLineParser.d.ts +4 -0
- package/dist/cli/CommandLineParser.js +65 -32
- package/dist/cli/CommandLineParser.js.map +1 -1
- package/dist/cli/helper/PostList.d.ts +6 -0
- package/dist/cli/helper/PostList.js +106 -0
- package/dist/cli/helper/PostList.js.map +1 -0
- package/dist/cli/index.js +73 -53
- package/dist/cli/index.js.map +1 -1
- package/dist/downloaders/Bootstrap.d.ts +5 -0
- package/dist/downloaders/Bootstrap.js +10 -0
- package/dist/downloaders/Bootstrap.js.map +1 -1
- package/dist/downloaders/Downloader.d.ts +4 -4
- package/dist/downloaders/Downloader.js +6 -59
- package/dist/downloaders/Downloader.js.map +1 -1
- package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
- package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
- package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
- package/dist/downloaders/InitialData.js +20 -6
- package/dist/downloaders/InitialData.js.map +1 -1
- package/dist/downloaders/PostDownloader.js +67 -103
- package/dist/downloaders/PostDownloader.js.map +1 -1
- package/dist/downloaders/PostsFetcher.js +7 -5
- package/dist/downloaders/PostsFetcher.js.map +1 -1
- package/dist/downloaders/ProductDownloader.js +31 -21
- package/dist/downloaders/ProductDownloader.js.map +1 -1
- package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
- package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
- package/dist/parsers/PageParser.js +7 -2
- package/dist/parsers/PageParser.js.map +1 -1
- package/dist/parsers/PostParser.d.ts +4 -1
- package/dist/parsers/PostParser.js +54 -5
- package/dist/parsers/PostParser.js.map +1 -1
- package/dist/utils/Fetcher.d.ts +1 -0
- package/dist/utils/Fetcher.js +5 -0
- package/dist/utils/Fetcher.js.map +1 -1
- package/dist/utils/URLHelper.d.ts +4 -0
- package/dist/utils/URLHelper.js +17 -0
- package/dist/utils/URLHelper.js.map +1 -1
- package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
- package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
- package/dist/utils/logging/ConsoleLogger.js +5 -0
- package/dist/utils/logging/ConsoleLogger.js.map +1 -1
- package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
- package/dist/utils/yt/InnertubeLoader.js +14 -14
- package/dist/utils/yt/InnertubeLoader.js.map +1 -1
- package/dist/utils/yt/PoToken.js +53 -27
- package/dist/utils/yt/PoToken.js.map +1 -1
- package/package.json +12 -8
- package/dist/browse/web/assets/index-B1h15ViZ.js +0 -218
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link id="theme-stylesheet-0" rel="stylesheet" href="/themes/bootstrap/default/css/bootstrap.min.css">
|
|
7
7
|
<title>patreon-dl</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CtZbx-Du.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-CQnQD2xz.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
3
3
|
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");
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
|
-
var _a, _CommandLineParser_parseArgs;
|
|
6
|
+
var _a, _CommandLineParser_listX, _CommandLineParser_parseArgs;
|
|
7
7
|
import commandLineArgs from 'command-line-args';
|
|
8
8
|
import commandLineUsage from 'command-line-usage';
|
|
9
9
|
import { EOL } from 'os';
|
|
@@ -22,6 +22,8 @@ const COMMAND_LINE_ARGS = {
|
|
|
22
22
|
dryRun: 'dry-run',
|
|
23
23
|
listTiers: 'list-tiers',
|
|
24
24
|
listTiersByUserId: 'list-tiers-uid',
|
|
25
|
+
listPosts: 'list-posts',
|
|
26
|
+
listPostsByUserId: 'list-posts-uid',
|
|
25
27
|
debugAPI: 'debug-api'
|
|
26
28
|
};
|
|
27
29
|
const OPT_DEFS = [
|
|
@@ -102,6 +104,18 @@ const OPT_DEFS = [
|
|
|
102
104
|
type: String,
|
|
103
105
|
typeLabel: '<user ID>'
|
|
104
106
|
},
|
|
107
|
+
{
|
|
108
|
+
name: COMMAND_LINE_ARGS.listPosts,
|
|
109
|
+
description: 'List posts by the given creator(s). Separate multiple creators with a comma.',
|
|
110
|
+
type: String,
|
|
111
|
+
typeLabel: '<creator>'
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: COMMAND_LINE_ARGS.listPostsByUserId,
|
|
115
|
+
description: 'Same as \'--list-posts\', but takes user ID instead of vanity.',
|
|
116
|
+
type: String,
|
|
117
|
+
typeLabel: '<user ID>'
|
|
118
|
+
},
|
|
105
119
|
{
|
|
106
120
|
name: COMMAND_LINE_ARGS.configureYouTube,
|
|
107
121
|
description: 'Configure YouTube connection',
|
|
@@ -263,43 +277,62 @@ class CommandLineParser {
|
|
|
263
277
|
return opts['configure-youtube'];
|
|
264
278
|
}
|
|
265
279
|
static listTiers() {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
280
|
+
return __classPrivateFieldGet(this, _a, "m", _CommandLineParser_listX).call(this, 'tiers');
|
|
281
|
+
}
|
|
282
|
+
static listPosts() {
|
|
283
|
+
return __classPrivateFieldGet(this, _a, "m", _CommandLineParser_listX).call(this, 'posts');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
_a = CommandLineParser, _CommandLineParser_listX = function _CommandLineParser_listX(x) {
|
|
287
|
+
let opts;
|
|
288
|
+
try {
|
|
289
|
+
opts = __classPrivateFieldGet(this, _a, "m", _CommandLineParser_parseArgs).call(this);
|
|
290
|
+
}
|
|
291
|
+
catch (_error) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
const __getTargets = (opt) => {
|
|
295
|
+
let listX;
|
|
296
|
+
switch (opt) {
|
|
297
|
+
case '--list-tiers':
|
|
298
|
+
listX = opts[COMMAND_LINE_ARGS.listTiers];
|
|
299
|
+
break;
|
|
300
|
+
case '--list-tiers-uid':
|
|
301
|
+
listX = opts[COMMAND_LINE_ARGS.listTiersByUserId];
|
|
302
|
+
break;
|
|
303
|
+
case '--list-posts':
|
|
304
|
+
listX = opts[COMMAND_LINE_ARGS.listPosts];
|
|
305
|
+
break;
|
|
306
|
+
case '--list-posts-uid':
|
|
307
|
+
listX = opts[COMMAND_LINE_ARGS.listPostsByUserId];
|
|
308
|
+
break;
|
|
269
309
|
}
|
|
270
|
-
|
|
310
|
+
if (listX === null) { // Option provided but has empty value
|
|
271
311
|
return null;
|
|
272
312
|
}
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
if (
|
|
276
|
-
|
|
313
|
+
else if (typeof listX === 'string') {
|
|
314
|
+
const targets = listX.split(',').map((v) => v.trim()).filter((v) => v);
|
|
315
|
+
if (targets.length === 0) {
|
|
316
|
+
throw Error(`'${opt}' has invalid value`);
|
|
277
317
|
}
|
|
278
|
-
|
|
279
|
-
const targets = listTiers.split(',').map((v) => v.trim()).filter((v) => v);
|
|
280
|
-
if (targets.length === 0) {
|
|
281
|
-
throw Error(`'${opt}' has invalid value`);
|
|
282
|
-
}
|
|
283
|
-
return targets;
|
|
284
|
-
}
|
|
285
|
-
return false;
|
|
286
|
-
};
|
|
287
|
-
const vanities = __getTargets('--list-tiers');
|
|
288
|
-
const userIds = __getTargets('--list-tiers-uid');
|
|
289
|
-
if (vanities === null || userIds === null) {
|
|
290
|
-
const opt = vanities === null ? '--list-tiers' : '--list-tiers-uid';
|
|
291
|
-
throw Error(`'${opt}' missing value`);
|
|
318
|
+
return targets;
|
|
292
319
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
};
|
|
320
|
+
return false;
|
|
321
|
+
};
|
|
322
|
+
const vanities = __getTargets(`--list-${x}`);
|
|
323
|
+
const userIds = __getTargets(`--list-${x}-uid`);
|
|
324
|
+
if (vanities === null || userIds === null) {
|
|
325
|
+
const opt = vanities === null ? `--list-${x}` : `--list-${x}-uid`;
|
|
326
|
+
throw Error(`'${opt}' missing value`);
|
|
300
327
|
}
|
|
301
|
-
|
|
302
|
-
|
|
328
|
+
if (vanities === false && userIds === false) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
byVanity: vanities || [],
|
|
333
|
+
byUserId: userIds || []
|
|
334
|
+
};
|
|
335
|
+
}, _CommandLineParser_parseArgs = function _CommandLineParser_parseArgs() {
|
|
303
336
|
const opts = commandLineArgs(OPT_DEFS, { stopAtFirstUnknown: true });
|
|
304
337
|
if (opts['_unknown']) {
|
|
305
338
|
const unknownOpt = Object.keys(opts['_unknown'])[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandLineParser.js","sourceRoot":"","sources":["../../src/cli/CommandLineParser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQzD,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,MAAM;IACZ,gBAAgB,EAAE,mBAAmB;IACrC,UAAU,EAAE,aAAa;IACzB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,YAAY;IACvB,iBAAiB,EAAE,gBAAgB;IACnC,QAAQ,EAAE,WAAW;CACb,CAAC;AAEX,MAAM,QAAQ,GAAG;IACf;QACE,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,WAAW,EAAE,0BAA0B;QACvC,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;KACd;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,UAAU;QAClC,WAAW,EAAE,kDAAkD;QAC/D,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,QAAQ;KACpB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,SAAS;QACjC,WAAW,EAAE,4BAA4B;QACzC,IAAI,EAAE,MAAM;QACZ,aAAa,EAAE,IAAI;KACpB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,MAAM;QAC9B,WAAW,EAAE,0CAA0C;QACvD,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,UAAU;KACtB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,MAAM;QAC9B,WAAW,EAAE,2BAA2B;QACxC,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,UAAU;KACtB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,WAAW,EAAE,yBAAyB;QACtC,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,UAAU;KACtB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,MAAM;QAC9B,WAAW,EAAE,0CAA0C;QACvD,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,OAAO;KACnB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,QAAQ;QAChC,WAAW,EAAE,qHAAqH;QAClI,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,QAAQ;QAChC,WAAW,EAAE,2CAA2C;QACxD,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;KACd;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,MAAM;QAC9B,WAAW,EAAE,mFAAmF;QAChG,IAAI,EAAE,OAAO;KACd;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,SAAS;QACjC,WAAW,EAAE,+EAA+E;QAC5F,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;KACvB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,iBAAiB;QACzC,WAAW,EAAE,gEAAgE;QAC7E,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;KACvB;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,gBAAgB;QACxC,WAAW,EAAE,8BAA8B;QAC3C,IAAI,EAAE,OAAO;KACd;IACD;QACE,IAAI,EAAE,iBAAiB,CAAC,QAAQ;QAChC,WAAW,EAAE,gFAAgF;QAC7F,IAAI,EAAE,OAAO;KACd;CACF,CAAC;AAEF,MAAqB,iBAAiB;IAEpC,MAAM,CAAC,KAAK;QACV,MAAM,IAAI,GAAG,uBAAA,IAAI,wCAAW,MAAf,IAAI,CAAa,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,GAA6D,EAAoC,EAAE;YACrH,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,eAAe,GAAG;gBACtB,iBAAiB,CAAC,QAAQ;gBAC1B,iBAAiB,CAAC,MAAM;gBACxB,iBAAiB,CAAC,QAAQ;aAC3B,CAAC;YACF,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAU,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChE,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;YAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,KAAK,CAAC,+CAA+C,GAAG,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO;oBACL,GAAG,EAAE,KAAK;oBACV,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC;oBAC1B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;iBACpB,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAEF,2BAA2B;QAC3B,IAAI,kBAAkB,GAAG,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,oBAAsD,CAAC;QAC3D,IAAI,kBAAkB,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;YACzC,oBAAoB,GAAG;gBACrB,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,GAAG;aACX,CAAC;YACF,kBAAkB,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,OAAO;YACL,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC;YACpD,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC;YACnD,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAChD,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC5C,cAAc,EAAE,SAAS;YACzB,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAClD,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC9C,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC5C,aAAa,EAAE;gBACb,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,SAAS;aACnB;YACD,cAAc,EAAE;gBACd,KAAK,EAAE,SAAS;aACjB;YACD,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS;gBACxB,kBAAkB,EAAE,SAAS;gBAC7B,YAAY,EAAE,SAAS;gBACvB,WAAW,EAAE,SAAS;gBACtB,YAAY,EAAE,SAAS;gBACvB,YAAY,EAAE,SAAS;gBACvB,gBAAgB,EAAE,SAAS;gBAC3B,eAAe,EAAE,SAAS;aAC3B;YACD,OAAO,EAAE;gBACP,UAAU,EAAE,SAAS;gBACrB,aAAa,EAAE,SAAS;gBACxB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,SAAS;aACrB;YACD,gBAAgB,EAAE;gBAChB,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,SAAS;aACnB;YACD,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAChD,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC5C,aAAa,EAAE;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,kBAAkB;gBAC5B,OAAO,EAAE;oBACP,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,SAAS;iBACtB;gBACD,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,SAAS;aACjB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,SAAS;QACd,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,uBAAA,IAAI,wCAAW,MAAf,IAAI,CAAa,CAAC;QAC3B,CAAC;QACD,OAAO,MAAe,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,OAAO,GAAG;gBACd,kGAAkG;gBAClG,GAAG;gBACH,sEAAsE;aACvE,CAAC;YACF,MAAM,QAAQ,GAA+B;gBAC3C;oBACE,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,4BAA4B;iBACtC;gBACD;oBACE,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC,QAAQ,CAAC;iBACjD;gBACD;oBACE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC3B;aACF,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,uBAAA,IAAI,wCAAW,MAAf,IAAI,CAAa,CAAC;QAC3B,CAAC;QACD,OAAO,MAAe,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,SAAS;QACd,IAAI,IAAwC,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,GAAG,uBAAA,IAAI,wCAAW,MAAf,IAAI,CAAa,CAAC;QAC3B,CAAC;QACD,OAAO,MAAe,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,GAAwC,EAAE,EAAE;YAChE,MAAM,SAAS,GAAG,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YACzH,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC,sCAAsC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;iBACI,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,KAAK,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC;gBAC5C,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACpE,MAAM,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,QAAQ,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,QAAQ,EAAE,OAAO,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;CAUF;;IAPG,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;eAjNkB,iBAAiB","sourcesContent":["import commandLineArgs from 'command-line-args';\nimport commandLineUsage from 'command-line-usage';\nimport { type CLIOptionParserEntry, type CLIOptions } from './CLIOptions.js';\nimport { EOL } from 'os';\nimport { type DeepPartial, type RecursivePropsTo } from '../utils/Misc.js';\nimport { getPackageInfo } from '../utils/PackageInfo.js';\n\nexport interface CommandLineParseResult extends RecursivePropsTo<DeepPartial<Omit<CLIOptions, 'targetURLs'>>, CLIOptionParserEntry> {\n targetURLs?: CLIOptionParserEntry;\n configFile?: CLIOptionParserEntry;\n debugAPI?: CLIOptionParserEntry;\n}\n\nconst COMMAND_LINE_ARGS = {\n help: 'help',\n configureYouTube: 'configure-youtube',\n configFile: 'config-file',\n targetURL: 'target-url',\n cookie: 'cookie',\n ffmpeg: 'ffmpeg',\n deno: 'deno',\n outDir: 'out-dir',\n logLevel: 'log-level',\n noPrompt: 'no-prompt',\n dryRun: 'dry-run',\n listTiers: 'list-tiers',\n listTiersByUserId: 'list-tiers-uid',\n debugAPI: 'debug-api'\n} as const;\n\nconst OPT_DEFS = [\n {\n name: COMMAND_LINE_ARGS.help,\n description: 'Display this usage guide',\n alias: 'h',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.configFile,\n description: 'Load configuration file for setting full options',\n alias: 'C',\n type: String,\n typeLabel: '<file>'\n },\n {\n name: COMMAND_LINE_ARGS.targetURL,\n description: 'URL of content to download',\n type: String,\n defaultOption: true\n },\n {\n name: COMMAND_LINE_ARGS.cookie,\n description: 'Cookie for accessing patron-only content',\n alias: 'c',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.ffmpeg,\n description: 'Path to FFmpeg executable',\n alias: 'f',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.deno,\n description: 'Path to Deno executable',\n alias: 'd',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.outDir,\n description: 'Path to directory where content is saved',\n alias: 'o',\n type: String,\n typeLabel: '<dir>'\n },\n {\n name: COMMAND_LINE_ARGS.logLevel,\n description: 'Log level of the console logger: \\'info\\', \\'debug\\', \\'warn\\' or \\'error\\'; set to \\'none\\' to disable the logger.',\n alias: 'l',\n type: String,\n typeLabel: '<level>'\n },\n {\n name: COMMAND_LINE_ARGS.noPrompt,\n description: 'Do not prompt for confirmation to proceed',\n alias: 'y',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.dryRun,\n description: 'Run without writing files to disk (except logs, if any). For testing / debugging.',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.listTiers,\n description: 'List tiers for the given creator(s). Separate multiple creators with a comma.',\n type: String,\n typeLabel: '<creator>'\n },\n {\n name: COMMAND_LINE_ARGS.listTiersByUserId,\n description: 'Same as \\'--list-tiers\\', but takes user ID instead of vanity.',\n type: String,\n typeLabel: '<user ID>'\n },\n {\n name: COMMAND_LINE_ARGS.configureYouTube,\n description: 'Configure YouTube connection',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.debugAPI,\n description: 'Process target URL as local API data file ; internal - for debugging purposes.',\n type: Boolean\n }\n];\n\nexport default class CommandLineParser {\n\n static parse(): CommandLineParseResult {\n const opts = this.#parseArgs();\n const argv = process.argv;\n\n const __getOptNameUsed = (key: string) => {\n const name = `--${key}`;\n if (argv.includes(name)) {\n return name;\n }\n const alias = OPT_DEFS.find((def) => def.name === key)?.alias;\n if (alias) {\n return `-${alias}`;\n }\n return name;\n };\n\n const __getValue = (key: typeof COMMAND_LINE_ARGS[keyof typeof COMMAND_LINE_ARGS]): CLIOptionParserEntry | undefined => {\n let value = opts[key];\n\n const booleanTypeArgs = [\n COMMAND_LINE_ARGS.noPrompt,\n COMMAND_LINE_ARGS.dryRun,\n COMMAND_LINE_ARGS.debugAPI\n ];\n if (booleanTypeArgs.includes(key as any) && value !== undefined) {\n value = '1';\n }\n\n if (value === null) {\n throw Error(`Command-line option requires a value for '--${key}'`);\n }\n if (value && typeof value === 'string') {\n return {\n src: 'cli',\n key: __getOptNameUsed(key),\n value: value.trim()\n };\n }\n return undefined;\n };\n\n // Handle --log-level: none\n let consoleLoggerLevel = __getValue(COMMAND_LINE_ARGS.logLevel);\n let consoleLoggerEnabled: CLIOptionParserEntry | undefined;\n if (consoleLoggerLevel?.value === 'none') {\n consoleLoggerEnabled = {\n src: 'cli',\n key: '',\n value: '0'\n };\n consoleLoggerLevel = undefined;\n }\n\n return {\n configFile: __getValue(COMMAND_LINE_ARGS.configFile),\n targetURLs: __getValue(COMMAND_LINE_ARGS.targetURL),\n debugAPI: __getValue(COMMAND_LINE_ARGS.debugAPI),\n cookie: __getValue(COMMAND_LINE_ARGS.cookie),\n useStatusCache: undefined,\n pathToFFmpeg: __getValue(COMMAND_LINE_ARGS.ffmpeg),\n pathToDeno: __getValue(COMMAND_LINE_ARGS.deno),\n outDir: __getValue(COMMAND_LINE_ARGS.outDir),\n dirNameFormat: {\n campaign: undefined,\n content: undefined\n },\n filenameFormat: {\n media: undefined\n },\n include: {\n lockedContent: undefined,\n postsWithMediaType: undefined,\n campaignInfo: undefined,\n contentInfo: undefined,\n previewMedia: undefined,\n contentMedia: undefined,\n allMediaVariants: undefined,\n mediaThumbnails: undefined\n },\n request: {\n maxRetries: undefined,\n maxConcurrent: undefined,\n minTime: undefined,\n userAgent: undefined\n },\n fileExistsAction: {\n content: undefined,\n info: undefined,\n infoAPI: undefined\n },\n noPrompt: __getValue(COMMAND_LINE_ARGS.noPrompt),\n dryRun: __getValue(COMMAND_LINE_ARGS.dryRun),\n consoleLogger: {\n enabled: consoleLoggerEnabled,\n logLevel: consoleLoggerLevel,\n include: {\n dateTime: undefined,\n level: undefined,\n originator: undefined,\n errorStack: undefined\n },\n dateTimeFormat: undefined,\n color: undefined\n }\n };\n }\n\n static showUsage() {\n let opts;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return false;\n }\n if (opts.help) {\n const content = [\n 'Command-line options override corresponding options in configuration file loaded through \\'-C\\'.',\n EOL,\n 'Project home: {underline https://github.com/patrickkfkan/patreon-dl}'\n ];\n const sections: commandLineUsage.Section[] = [\n {\n header: 'Usage',\n content: 'patreon-dl [OPTION]... URL'\n },\n {\n header: 'Options',\n optionList: OPT_DEFS,\n hide: ['target-url', COMMAND_LINE_ARGS.debugAPI]\n },\n {\n content: content.join(EOL)\n }\n ];\n const banner = getPackageInfo().banner;\n if (banner) {\n sections.unshift({ header: banner, raw: true });\n }\n const usage = commandLineUsage(sections);\n console.log(usage);\n\n return true;\n }\n\n return false;\n }\n\n static configureYouTube() {\n let opts;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return false;\n }\n return opts['configure-youtube'];\n }\n\n static listTiers() {\n let opts: commandLineArgs.CommandLineOptions;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return null;\n }\n\n const __getTargets = (opt: '--list-tiers' | '--list-tiers-uid') => {\n const listTiers = opt === '--list-tiers' ? opts[COMMAND_LINE_ARGS.listTiers] : opts[COMMAND_LINE_ARGS.listTiersByUserId];\n if (listTiers === null) { // Option provided but has empty value\n return null;\n }\n else if (typeof listTiers === 'string') {\n const targets = listTiers.split(',').map((v) => v.trim()).filter((v) => v);\n if (targets.length === 0) {\n throw Error(`'${opt}' has invalid value`);\n }\n return targets;\n }\n return false;\n };\n\n const vanities = __getTargets('--list-tiers');\n const userIds = __getTargets('--list-tiers-uid');\n if (vanities === null || userIds === null) {\n const opt = vanities === null ? '--list-tiers' : '--list-tiers-uid';\n throw Error(`'${opt}' missing value`);\n }\n\n if (vanities === false && userIds === false) {\n return null;\n }\n\n return {\n byVanity: vanities || [],\n byUserId: userIds || []\n };\n }\n\n static #parseArgs() {\n const opts = commandLineArgs(OPT_DEFS, { stopAtFirstUnknown: true });\n if (opts['_unknown']) {\n const unknownOpt = Object.keys(opts['_unknown'])[0];\n throw Error(`Unknown command-line option '${unknownOpt}'`);\n }\n return opts;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CommandLineParser.js","sourceRoot":"","sources":["../../src/cli/CommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args';\nimport commandLineUsage from 'command-line-usage';\nimport { type CLIOptionParserEntry, type CLIOptions } from './CLIOptions.js';\nimport { EOL } from 'os';\nimport { type DeepPartial, type RecursivePropsTo } from '../utils/Misc.js';\nimport { getPackageInfo } from '../utils/PackageInfo.js';\n\nexport interface CommandLineParseResult extends RecursivePropsTo<DeepPartial<Omit<CLIOptions, 'targetURLs'>>, CLIOptionParserEntry> {\n targetURLs?: CLIOptionParserEntry;\n configFile?: CLIOptionParserEntry;\n debugAPI?: CLIOptionParserEntry;\n}\n\nconst COMMAND_LINE_ARGS = {\n help: 'help',\n configureYouTube: 'configure-youtube',\n configFile: 'config-file',\n targetURL: 'target-url',\n cookie: 'cookie',\n ffmpeg: 'ffmpeg',\n deno: 'deno',\n outDir: 'out-dir',\n logLevel: 'log-level',\n noPrompt: 'no-prompt',\n dryRun: 'dry-run',\n listTiers: 'list-tiers',\n listTiersByUserId: 'list-tiers-uid',\n listPosts: 'list-posts',\n listPostsByUserId: 'list-posts-uid',\n debugAPI: 'debug-api'\n} as const;\n\nconst OPT_DEFS = [\n {\n name: COMMAND_LINE_ARGS.help,\n description: 'Display this usage guide',\n alias: 'h',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.configFile,\n description: 'Load configuration file for setting full options',\n alias: 'C',\n type: String,\n typeLabel: '<file>'\n },\n {\n name: COMMAND_LINE_ARGS.targetURL,\n description: 'URL of content to download',\n type: String,\n defaultOption: true\n },\n {\n name: COMMAND_LINE_ARGS.cookie,\n description: 'Cookie for accessing patron-only content',\n alias: 'c',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.ffmpeg,\n description: 'Path to FFmpeg executable',\n alias: 'f',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.deno,\n description: 'Path to Deno executable',\n alias: 'd',\n type: String,\n typeLabel: '<string>'\n },\n {\n name: COMMAND_LINE_ARGS.outDir,\n description: 'Path to directory where content is saved',\n alias: 'o',\n type: String,\n typeLabel: '<dir>'\n },\n {\n name: COMMAND_LINE_ARGS.logLevel,\n description: 'Log level of the console logger: \\'info\\', \\'debug\\', \\'warn\\' or \\'error\\'; set to \\'none\\' to disable the logger.',\n alias: 'l',\n type: String,\n typeLabel: '<level>'\n },\n {\n name: COMMAND_LINE_ARGS.noPrompt,\n description: 'Do not prompt for confirmation to proceed',\n alias: 'y',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.dryRun,\n description: 'Run without writing files to disk (except logs, if any). For testing / debugging.',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.listTiers,\n description: 'List tiers for the given creator(s). Separate multiple creators with a comma.',\n type: String,\n typeLabel: '<creator>'\n },\n {\n name: COMMAND_LINE_ARGS.listTiersByUserId,\n description: 'Same as \\'--list-tiers\\', but takes user ID instead of vanity.',\n type: String,\n typeLabel: '<user ID>'\n },\n {\n name: COMMAND_LINE_ARGS.listPosts,\n description: 'List posts by the given creator(s). Separate multiple creators with a comma.',\n type: String,\n typeLabel: '<creator>'\n },\n {\n name: COMMAND_LINE_ARGS.listPostsByUserId,\n description: 'Same as \\'--list-posts\\', but takes user ID instead of vanity.',\n type: String,\n typeLabel: '<user ID>'\n },\n {\n name: COMMAND_LINE_ARGS.configureYouTube,\n description: 'Configure YouTube connection',\n type: Boolean\n },\n {\n name: COMMAND_LINE_ARGS.debugAPI,\n description: 'Process target URL as local API data file ; internal - for debugging purposes.',\n type: Boolean\n }\n];\n\nexport default class CommandLineParser {\n\n static parse(): CommandLineParseResult {\n const opts = this.#parseArgs();\n const argv = process.argv;\n\n const __getOptNameUsed = (key: string) => {\n const name = `--${key}`;\n if (argv.includes(name)) {\n return name;\n }\n const alias = OPT_DEFS.find((def) => def.name === key)?.alias;\n if (alias) {\n return `-${alias}`;\n }\n return name;\n };\n\n const __getValue = (key: typeof COMMAND_LINE_ARGS[keyof typeof COMMAND_LINE_ARGS]): CLIOptionParserEntry | undefined => {\n let value = opts[key];\n\n const booleanTypeArgs = [\n COMMAND_LINE_ARGS.noPrompt,\n COMMAND_LINE_ARGS.dryRun,\n COMMAND_LINE_ARGS.debugAPI\n ];\n if (booleanTypeArgs.includes(key as any) && value !== undefined) {\n value = '1';\n }\n\n if (value === null) {\n throw Error(`Command-line option requires a value for '--${key}'`);\n }\n if (value && typeof value === 'string') {\n return {\n src: 'cli',\n key: __getOptNameUsed(key),\n value: value.trim()\n };\n }\n return undefined;\n };\n\n // Handle --log-level: none\n let consoleLoggerLevel = __getValue(COMMAND_LINE_ARGS.logLevel);\n let consoleLoggerEnabled: CLIOptionParserEntry | undefined;\n if (consoleLoggerLevel?.value === 'none') {\n consoleLoggerEnabled = {\n src: 'cli',\n key: '',\n value: '0'\n };\n consoleLoggerLevel = undefined;\n }\n\n return {\n configFile: __getValue(COMMAND_LINE_ARGS.configFile),\n targetURLs: __getValue(COMMAND_LINE_ARGS.targetURL),\n debugAPI: __getValue(COMMAND_LINE_ARGS.debugAPI),\n cookie: __getValue(COMMAND_LINE_ARGS.cookie),\n useStatusCache: undefined,\n pathToFFmpeg: __getValue(COMMAND_LINE_ARGS.ffmpeg),\n pathToDeno: __getValue(COMMAND_LINE_ARGS.deno),\n outDir: __getValue(COMMAND_LINE_ARGS.outDir),\n dirNameFormat: {\n campaign: undefined,\n content: undefined\n },\n filenameFormat: {\n media: undefined\n },\n include: {\n lockedContent: undefined,\n postsWithMediaType: undefined,\n campaignInfo: undefined,\n contentInfo: undefined,\n previewMedia: undefined,\n contentMedia: undefined,\n allMediaVariants: undefined,\n mediaThumbnails: undefined\n },\n request: {\n maxRetries: undefined,\n maxConcurrent: undefined,\n minTime: undefined,\n userAgent: undefined\n },\n fileExistsAction: {\n content: undefined,\n info: undefined,\n infoAPI: undefined\n },\n noPrompt: __getValue(COMMAND_LINE_ARGS.noPrompt),\n dryRun: __getValue(COMMAND_LINE_ARGS.dryRun),\n consoleLogger: {\n enabled: consoleLoggerEnabled,\n logLevel: consoleLoggerLevel,\n include: {\n dateTime: undefined,\n level: undefined,\n originator: undefined,\n errorStack: undefined\n },\n dateTimeFormat: undefined,\n color: undefined\n }\n };\n }\n\n static showUsage() {\n let opts;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return false;\n }\n if (opts.help) {\n const content = [\n 'Command-line options override corresponding options in configuration file loaded through \\'-C\\'.',\n EOL,\n 'Project home: {underline https://github.com/patrickkfkan/patreon-dl}'\n ];\n const sections: commandLineUsage.Section[] = [\n {\n header: 'Usage',\n content: 'patreon-dl [OPTION]... URL'\n },\n {\n header: 'Options',\n optionList: OPT_DEFS,\n hide: ['target-url', COMMAND_LINE_ARGS.debugAPI]\n },\n {\n content: content.join(EOL)\n }\n ];\n const banner = getPackageInfo().banner;\n if (banner) {\n sections.unshift({ header: banner, raw: true });\n }\n const usage = commandLineUsage(sections);\n console.log(usage);\n\n return true;\n }\n\n return false;\n }\n\n static configureYouTube() {\n let opts;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return false;\n }\n return opts['configure-youtube'];\n }\n\n static #listX(x: 'tiers' | 'posts') {\n let opts: commandLineArgs.CommandLineOptions;\n try {\n opts = this.#parseArgs();\n }\n catch (_error: unknown) {\n return null;\n }\n\n const __getTargets = (opt: `--list-${typeof x}` | `--list-${typeof x}-uid`) => {\n let listX;\n switch (opt) {\n case '--list-tiers':\n listX = opts[COMMAND_LINE_ARGS.listTiers];\n break;\n case '--list-tiers-uid':\n listX = opts[COMMAND_LINE_ARGS.listTiersByUserId];\n break;\n case '--list-posts':\n listX = opts[COMMAND_LINE_ARGS.listPosts];\n break;\n case '--list-posts-uid':\n listX = opts[COMMAND_LINE_ARGS.listPostsByUserId];\n break;\n }\n if (listX === null) { // Option provided but has empty value\n return null;\n }\n else if (typeof listX === 'string') {\n const targets = listX.split(',').map((v) => v.trim()).filter((v) => v);\n if (targets.length === 0) {\n throw Error(`'${opt}' has invalid value`);\n }\n return targets;\n }\n return false;\n };\n\n const vanities = __getTargets(`--list-${x}`);\n const userIds = __getTargets(`--list-${x}-uid`);\n if (vanities === null || userIds === null) {\n const opt = vanities === null ? `--list-${x}` : `--list-${x}-uid`;\n throw Error(`'${opt}' missing value`);\n }\n\n if (vanities === false && userIds === false) {\n return null;\n }\n\n return {\n byVanity: vanities || [],\n byUserId: userIds || []\n };\n }\n\n static listTiers() {\n return this.#listX('tiers');\n }\n\n static listPosts() {\n return this.#listX('posts');\n }\n\n static #parseArgs() {\n const opts = commandLineArgs(OPT_DEFS, { stopAtFirstUnknown: true });\n if (opts['_unknown']) {\n const unknownOpt = Object.keys(opts['_unknown'])[0];\n throw Error(`Unknown command-line option '${unknownOpt}'`);\n }\n return opts;\n }\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { EOL } from 'os';
|
|
2
|
+
import Downloader from '../../downloaders/Downloader.js';
|
|
3
|
+
import PostsFetcher from '../../downloaders/PostsFetcher.js';
|
|
4
|
+
import { commonLog } from '../../utils/logging/Logger.js';
|
|
5
|
+
import { getCLIOptions } from '../CLIOptions.js';
|
|
6
|
+
import CommandLineParser from '../CommandLineParser.js';
|
|
7
|
+
import ConsoleLogger from '../../utils/logging/ConsoleLogger.js';
|
|
8
|
+
import URLHelper from '../../utils/URLHelper.js';
|
|
9
|
+
import { IncludeCriteriaHelper } from '../../downloaders/IncludeCriteriaHelper.js';
|
|
10
|
+
export async function listPosts(options) {
|
|
11
|
+
let listPostsTargets;
|
|
12
|
+
try {
|
|
13
|
+
listPostsTargets = CommandLineParser.listPosts();
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
await options.onOptionError(error);
|
|
17
|
+
return { hasError: true };
|
|
18
|
+
}
|
|
19
|
+
if (listPostsTargets) {
|
|
20
|
+
const { byVanity: vanities, byUserId: userIds } = listPostsTargets;
|
|
21
|
+
let hasError = false;
|
|
22
|
+
const options = getCLIOptions(true);
|
|
23
|
+
const consoleLogger = new ConsoleLogger(options.consoleLogger);
|
|
24
|
+
const warnLogger = new ConsoleLogger({
|
|
25
|
+
logLevel: 'warn'
|
|
26
|
+
});
|
|
27
|
+
const abortController = new AbortController();
|
|
28
|
+
const abortHandler = () => {
|
|
29
|
+
console.log('Abort');
|
|
30
|
+
abortController.abort();
|
|
31
|
+
};
|
|
32
|
+
process.on('SIGINT', abortHandler);
|
|
33
|
+
const __doList = async (targets, targetType) => {
|
|
34
|
+
for (const target of targets) {
|
|
35
|
+
try {
|
|
36
|
+
const url = URLHelper.constructUserPostsURL(targetType === 'vanity' ? { vanity: target } : { userId: target });
|
|
37
|
+
const downloader = await Downloader.getInstance(url, options);
|
|
38
|
+
const PostDownloader = (await import('../../downloaders/PostDownloader.js')).default;
|
|
39
|
+
if (!(downloader instanceof PostDownloader)) {
|
|
40
|
+
throw Error('Type mismatch: PostDownloader expected');
|
|
41
|
+
}
|
|
42
|
+
const config = downloader.getConfig(false);
|
|
43
|
+
const postsFetcher = new PostsFetcher({
|
|
44
|
+
config,
|
|
45
|
+
fetcher: downloader.getFetcher(),
|
|
46
|
+
logger: warnLogger,
|
|
47
|
+
signal: abortController.signal
|
|
48
|
+
});
|
|
49
|
+
console.log(`*** Posts by ${target} ***${EOL}`);
|
|
50
|
+
postsFetcher.begin();
|
|
51
|
+
let breakWhile = false;
|
|
52
|
+
while (postsFetcher.hasNext()) {
|
|
53
|
+
const { list, aborted, error } = await postsFetcher.next();
|
|
54
|
+
if (!list || aborted) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
if (!list && error) {
|
|
58
|
+
commonLog(consoleLogger, 'error', null, 'Error fetching posts:', error);
|
|
59
|
+
hasError = true;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const post of list.items) {
|
|
63
|
+
if (abortController.signal.aborted) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const criteriaHelper = new IncludeCriteriaHelper(warnLogger);
|
|
67
|
+
const criteriaCheck = criteriaHelper.checkPost(post, config);
|
|
68
|
+
if (criteriaCheck.ok) {
|
|
69
|
+
console.log(post.title);
|
|
70
|
+
console.log(post.publishedAt);
|
|
71
|
+
console.log(post.url);
|
|
72
|
+
console.log('');
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (criteriaCheck.reason === 'publishDateOutOfRange') {
|
|
76
|
+
const publishedAt = post.publishedAt ? new Date(post.publishedAt).getTime() : null;
|
|
77
|
+
const after = config.include.postsPublished.after?.valueOf().getTime();
|
|
78
|
+
if (publishedAt && after && publishedAt < after) {
|
|
79
|
+
// All subsequent posts will be out of date range, so we can return right away.
|
|
80
|
+
breakWhile = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (breakWhile) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
commonLog(consoleLogger, 'error', null, `Error listing posts for ${target}:`, error);
|
|
92
|
+
hasError = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
await __doList(vanities, 'vanity');
|
|
97
|
+
if (abortController.signal.aborted || hasError) {
|
|
98
|
+
return { hasError };
|
|
99
|
+
}
|
|
100
|
+
await __doList(userIds, 'userId');
|
|
101
|
+
process.off('SIGINT', abortHandler);
|
|
102
|
+
return { hasError };
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=PostList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostList.js","sourceRoot":"","sources":["../../../src/cli/helper/PostList.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport Downloader from '../../downloaders/Downloader.js';\nimport PostsFetcher from '../../downloaders/PostsFetcher.js';\nimport { commonLog } from '../../utils/logging/Logger.js';\nimport { getCLIOptions } from '../CLIOptions.js';\nimport CommandLineParser from '../CommandLineParser.js';\nimport ConsoleLogger from '../../utils/logging/ConsoleLogger.js';\nimport URLHelper from '../../utils/URLHelper.js';\nimport { IncludeCriteriaHelper } from '../../downloaders/IncludeCriteriaHelper.js';\n\nexport type ListPostsResult = false | {\n hasError: boolean;\n};\n\nexport async function listPosts(options: {\n onOptionError: (error: unknown) => Promise<void>;\n}): Promise<ListPostsResult> {\n let listPostsTargets;\n try {\n listPostsTargets = CommandLineParser.listPosts();\n }\n catch (error) {\n await options.onOptionError(error);\n return { hasError: true };\n }\n if (listPostsTargets) {\n const { byVanity: vanities, byUserId: userIds } = listPostsTargets;\n let hasError = false;\n const options = getCLIOptions(true);\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n const warnLogger = new ConsoleLogger({\n logLevel: 'warn'\n });\n\n const abortController = new AbortController();\n const abortHandler = () => {\n console.log('Abort');\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n\n const __doList = async (targets: string[], targetType: 'vanity' | 'userId') => {\n for (const target of targets) {\n try {\n const url = URLHelper.constructUserPostsURL(\n targetType === 'vanity' ?{ vanity: target } : { userId: target }\n );\n const downloader = await Downloader.getInstance(\n url,\n options\n );\n const PostDownloader = (await import('../../downloaders/PostDownloader.js')).default;\n if (!(downloader instanceof PostDownloader)) {\n throw Error('Type mismatch: PostDownloader expected');\n }\n\n const config = downloader.getConfig(false);\n const postsFetcher = new PostsFetcher({\n config,\n fetcher: downloader.getFetcher(),\n logger: warnLogger,\n signal: abortController.signal\n });\n \n console.log(`*** Posts by ${target} ***${EOL}`);\n \n postsFetcher.begin();\n let breakWhile = false;\n while (postsFetcher.hasNext()) {\n const { list, aborted, error } = await postsFetcher.next();\n if (!list || aborted) {\n break;\n }\n if (!list && error) {\n commonLog(consoleLogger, 'error', null, 'Error fetching posts:', error);\n hasError = true;\n return;\n }\n for (const post of list.items) {\n if (abortController.signal.aborted) {\n return;\n }\n const criteriaHelper = new IncludeCriteriaHelper(warnLogger);\n const criteriaCheck = criteriaHelper.checkPost(post, config);\n if (criteriaCheck.ok) {\n console.log(post.title);\n console.log(post.publishedAt);\n console.log(post.url);\n console.log('');\n continue;\n }\n if (criteriaCheck.reason === 'publishDateOutOfRange') {\n const publishedAt = post.publishedAt ? new Date(post.publishedAt).getTime() : null;\n const after = config.include.postsPublished.after?.valueOf().getTime();\n if (publishedAt && after && publishedAt < after) {\n // All subsequent posts will be out of date range, so we can return right away.\n breakWhile = true;\n break;\n }\n }\n }\n if (breakWhile) {\n break;\n }\n }\n }\n catch (error) {\n commonLog(consoleLogger, 'error', null, `Error listing posts for ${target}:`, error);\n hasError = true;\n }\n }\n };\n\n await __doList(vanities, 'vanity');\n if (abortController.signal.aborted || hasError) {\n return { hasError }; \n }\n await __doList(userIds, 'userId');\n process.off('SIGINT', abortHandler);\n return { hasError };\n }\n\n return false;\n}"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _PatreonDownloaderCLI_instances, _PatreonDownloaderCLI_logger, _PatreonDownloaderCLI_packageInfo, _PatreonDownloaderCLI_globalConfPath, _PatreonDownloaderCLI_fileLoggers, _PatreonDownloaderCLI_getYouTubeCredentialsPath, _PatreonDownloaderCLI_getApplicableIncludeOptions, _PatreonDownloaderCLI_getDisplayConfig, _PatreonDownloaderCLI_createAndStartDownloader, _PatreonDownloaderCLI_confirmProceed, _PatreonDownloaderCLI_createLoggers;
|
|
12
|
+
var _PatreonDownloaderCLI_instances, _PatreonDownloaderCLI_logger, _PatreonDownloaderCLI_packageInfo, _PatreonDownloaderCLI_globalConfPath, _PatreonDownloaderCLI_fileLoggers, _PatreonDownloaderCLI_printOptionError, _PatreonDownloaderCLI_listTiers, _PatreonDownloaderCLI_listPosts, _PatreonDownloaderCLI_getYouTubeCredentialsPath, _PatreonDownloaderCLI_getApplicableIncludeOptions, _PatreonDownloaderCLI_getDisplayConfig, _PatreonDownloaderCLI_createAndStartDownloader, _PatreonDownloaderCLI_confirmProceed, _PatreonDownloaderCLI_createLoggers;
|
|
13
13
|
import { EOL } from 'os';
|
|
14
14
|
import PromptSync from 'prompt-sync';
|
|
15
15
|
import path from 'path';
|
|
@@ -29,6 +29,7 @@ import copy from 'fast-copy';
|
|
|
29
29
|
import cliTruncate from 'cli-truncate';
|
|
30
30
|
import { isDenoInstalled } from '../utils/Misc.js';
|
|
31
31
|
import { createProxyAgent } from '../utils/Proxy.js';
|
|
32
|
+
import { listPosts } from './helper/PostList.js';
|
|
32
33
|
const YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';
|
|
33
34
|
class PatreonDownloaderCLI {
|
|
34
35
|
constructor() {
|
|
@@ -44,6 +45,7 @@ class PatreonDownloaderCLI {
|
|
|
44
45
|
__classPrivateFieldSet(this, _PatreonDownloaderCLI_packageInfo, getPackageInfo(), "f");
|
|
45
46
|
__classPrivateFieldSet(this, _PatreonDownloaderCLI_globalConfPath, envPaths(__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").name || 'patreon-dl', { suffix: '' }).config, "f");
|
|
46
47
|
}
|
|
48
|
+
;
|
|
47
49
|
async start() {
|
|
48
50
|
if (CommandLineParser.showUsage()) {
|
|
49
51
|
return this.exit(0);
|
|
@@ -51,68 +53,22 @@ class PatreonDownloaderCLI {
|
|
|
51
53
|
if (__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner) {
|
|
52
54
|
console.log(`${EOL}${__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner}${EOL}`);
|
|
53
55
|
}
|
|
54
|
-
const __printOptionError = (error) => {
|
|
55
|
-
console.error('Error processing options: ', error instanceof Error ? error.message : error, EOL, 'See usage with \'-h\' option.');
|
|
56
|
-
return this.exit(1);
|
|
57
|
-
};
|
|
58
56
|
const ytCredsPath = __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_getYouTubeCredentialsPath).call(this);
|
|
59
57
|
if (CommandLineParser.configureYouTube()) {
|
|
60
58
|
return this.exit(await YouTubeConfigurator.start(ytCredsPath));
|
|
61
59
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
listTiersTargets = CommandLineParser.listTiers();
|
|
60
|
+
if (await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_listTiers).call(this)) {
|
|
61
|
+
return;
|
|
65
62
|
}
|
|
66
|
-
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
if (listTiersTargets) {
|
|
70
|
-
const { byVanity: vanities, byUserId: userIds } = listTiersTargets;
|
|
71
|
-
let hasError = false;
|
|
72
|
-
const options = getCLIOptions(true);
|
|
73
|
-
const consoleLogger = new ConsoleLogger(options.consoleLogger);
|
|
74
|
-
const __doList = async (targets, targetType) => {
|
|
75
|
-
for (const target of targets) {
|
|
76
|
-
try {
|
|
77
|
-
const campaign = await Downloader.getCampaign(targetType === 'vanity' ? target : { userId: target }, undefined, {
|
|
78
|
-
...options,
|
|
79
|
-
logger: consoleLogger
|
|
80
|
-
});
|
|
81
|
-
if (campaign) {
|
|
82
|
-
const p = targetType === 'userId' ? 'user #' : '';
|
|
83
|
-
console.log(`*** Tiers for ${p}${target} ***${EOL}`);
|
|
84
|
-
const idColWidth = campaign.rewards.reduce((len, reward) => {
|
|
85
|
-
return Math.max(len, reward.id.length);
|
|
86
|
-
}, 0);
|
|
87
|
-
const gap = ' ';
|
|
88
|
-
console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
|
|
89
|
-
console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
|
|
90
|
-
campaign.rewards.forEach((reward) => {
|
|
91
|
-
console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
|
|
92
|
-
});
|
|
93
|
-
console.log(EOL);
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
|
|
97
|
-
throw Error();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch (_error) {
|
|
101
|
-
console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
|
|
102
|
-
hasError = true;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
await __doList(vanities, 'vanity');
|
|
107
|
-
await __doList(userIds, 'userId');
|
|
108
|
-
return this.exit(hasError ? 1 : 0);
|
|
63
|
+
if (await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_listPosts).call(this)) {
|
|
64
|
+
return;
|
|
109
65
|
}
|
|
110
66
|
let options;
|
|
111
67
|
try {
|
|
112
68
|
options = getCLIOptions();
|
|
113
69
|
}
|
|
114
70
|
catch (error) {
|
|
115
|
-
return
|
|
71
|
+
return __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error);
|
|
116
72
|
}
|
|
117
73
|
const targetsWithError = [];
|
|
118
74
|
const targetEndMessages = [];
|
|
@@ -156,7 +112,71 @@ class PatreonDownloaderCLI {
|
|
|
156
112
|
process.exit(code);
|
|
157
113
|
}
|
|
158
114
|
}
|
|
159
|
-
_PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo = new WeakMap(), _PatreonDownloaderCLI_globalConfPath = new WeakMap(), _PatreonDownloaderCLI_fileLoggers = new WeakMap(), _PatreonDownloaderCLI_instances = new WeakSet(),
|
|
115
|
+
_PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo = new WeakMap(), _PatreonDownloaderCLI_globalConfPath = new WeakMap(), _PatreonDownloaderCLI_fileLoggers = new WeakMap(), _PatreonDownloaderCLI_instances = new WeakSet(), _PatreonDownloaderCLI_printOptionError = function _PatreonDownloaderCLI_printOptionError(error) {
|
|
116
|
+
console.error('Error processing options: ', error instanceof Error ? error.message : error, EOL, 'See usage with \'-h\' option.');
|
|
117
|
+
return this.exit(1);
|
|
118
|
+
}, _PatreonDownloaderCLI_listTiers = async function _PatreonDownloaderCLI_listTiers() {
|
|
119
|
+
let listTiersTargets;
|
|
120
|
+
try {
|
|
121
|
+
listTiersTargets = CommandLineParser.listTiers();
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
if (listTiersTargets) {
|
|
128
|
+
const { byVanity: vanities, byUserId: userIds } = listTiersTargets;
|
|
129
|
+
let hasError = false;
|
|
130
|
+
const options = getCLIOptions(true);
|
|
131
|
+
const consoleLogger = new ConsoleLogger(options.consoleLogger);
|
|
132
|
+
const __doList = async (targets, targetType) => {
|
|
133
|
+
for (const target of targets) {
|
|
134
|
+
try {
|
|
135
|
+
const campaign = await Downloader.getCampaign(targetType === 'vanity' ? target : { userId: target }, undefined, {
|
|
136
|
+
...options,
|
|
137
|
+
logger: consoleLogger
|
|
138
|
+
});
|
|
139
|
+
if (campaign) {
|
|
140
|
+
const p = targetType === 'userId' ? 'user #' : '';
|
|
141
|
+
console.log(`*** Tiers for ${p}${target} ***${EOL}`);
|
|
142
|
+
const idColWidth = campaign.rewards.reduce((len, reward) => {
|
|
143
|
+
return Math.max(len, reward.id.length);
|
|
144
|
+
}, 0);
|
|
145
|
+
const gap = ' ';
|
|
146
|
+
console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
|
|
147
|
+
console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
|
|
148
|
+
campaign.rewards.forEach((reward) => {
|
|
149
|
+
console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
|
|
150
|
+
});
|
|
151
|
+
console.log(EOL);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
|
|
155
|
+
throw Error();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (_error) {
|
|
159
|
+
console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
|
|
160
|
+
hasError = true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
await __doList(vanities, 'vanity');
|
|
165
|
+
await __doList(userIds, 'userId');
|
|
166
|
+
await this.exit(hasError ? 1 : 0);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}, _PatreonDownloaderCLI_listPosts = async function _PatreonDownloaderCLI_listPosts() {
|
|
171
|
+
const result = await listPosts({
|
|
172
|
+
onOptionError: (error) => __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error)
|
|
173
|
+
});
|
|
174
|
+
if (!result) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
await this.exit(result.hasError ? 1 : 0);
|
|
178
|
+
return true;
|
|
179
|
+
}, _PatreonDownloaderCLI_getYouTubeCredentialsPath = function _PatreonDownloaderCLI_getYouTubeCredentialsPath() {
|
|
160
180
|
return path.resolve(__classPrivateFieldGet(this, _PatreonDownloaderCLI_globalConfPath, "f"), YT_CREDENTIALS_FILENAME);
|
|
161
181
|
}, _PatreonDownloaderCLI_getApplicableIncludeOptions = function _PatreonDownloaderCLI_getApplicableIncludeOptions(local, global) {
|
|
162
182
|
if (!local) {
|