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.
Files changed (63) hide show
  1. package/README.md +15 -0
  2. package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
  3. package/dist/browse/api/ContentAPIMixin.d.ts +3 -3
  4. package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
  5. package/dist/browse/api/index.d.ts +10 -10
  6. package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
  7. package/dist/browse/db/ContentDBMixin.d.ts +13 -13
  8. package/dist/browse/db/ContentDBMixin.js +1 -1
  9. package/dist/browse/db/ContentDBMixin.js.map +1 -1
  10. package/dist/browse/db/MediaDBMixin.js +1 -1
  11. package/dist/browse/db/MediaDBMixin.js.map +1 -1
  12. package/dist/browse/db/index.d.ts +16 -16
  13. package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
  14. package/dist/browse/web/index.html +1 -1
  15. package/dist/cli/CommandLineParser.d.ts +4 -0
  16. package/dist/cli/CommandLineParser.js +65 -32
  17. package/dist/cli/CommandLineParser.js.map +1 -1
  18. package/dist/cli/helper/PostList.d.ts +6 -0
  19. package/dist/cli/helper/PostList.js +106 -0
  20. package/dist/cli/helper/PostList.js.map +1 -0
  21. package/dist/cli/index.js +73 -53
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/downloaders/Bootstrap.d.ts +5 -0
  24. package/dist/downloaders/Bootstrap.js +10 -0
  25. package/dist/downloaders/Bootstrap.js.map +1 -1
  26. package/dist/downloaders/Downloader.d.ts +4 -4
  27. package/dist/downloaders/Downloader.js +6 -59
  28. package/dist/downloaders/Downloader.js.map +1 -1
  29. package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
  30. package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
  31. package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
  32. package/dist/downloaders/InitialData.js +20 -6
  33. package/dist/downloaders/InitialData.js.map +1 -1
  34. package/dist/downloaders/PostDownloader.js +67 -103
  35. package/dist/downloaders/PostDownloader.js.map +1 -1
  36. package/dist/downloaders/PostsFetcher.js +7 -5
  37. package/dist/downloaders/PostsFetcher.js.map +1 -1
  38. package/dist/downloaders/ProductDownloader.js +31 -21
  39. package/dist/downloaders/ProductDownloader.js.map +1 -1
  40. package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
  41. package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
  42. package/dist/parsers/PageParser.js +7 -2
  43. package/dist/parsers/PageParser.js.map +1 -1
  44. package/dist/parsers/PostParser.d.ts +4 -1
  45. package/dist/parsers/PostParser.js +54 -5
  46. package/dist/parsers/PostParser.js.map +1 -1
  47. package/dist/utils/Fetcher.d.ts +1 -0
  48. package/dist/utils/Fetcher.js +5 -0
  49. package/dist/utils/Fetcher.js.map +1 -1
  50. package/dist/utils/URLHelper.d.ts +4 -0
  51. package/dist/utils/URLHelper.js +17 -0
  52. package/dist/utils/URLHelper.js.map +1 -1
  53. package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
  54. package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
  55. package/dist/utils/logging/ConsoleLogger.js +5 -0
  56. package/dist/utils/logging/ConsoleLogger.js.map +1 -1
  57. package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
  58. package/dist/utils/yt/InnertubeLoader.js +14 -14
  59. package/dist/utils/yt/InnertubeLoader.js.map +1 -1
  60. package/dist/utils/yt/PoToken.js +53 -27
  61. package/dist/utils/yt/PoToken.js.map +1 -1
  62. package/package.json +12 -8
  63. 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-B1h15ViZ.js"></script>
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>
@@ -14,4 +14,8 @@ export default class CommandLineParser {
14
14
  byVanity: string[];
15
15
  byUserId: string[];
16
16
  } | null;
17
+ static listPosts(): {
18
+ byVanity: string[];
19
+ byUserId: string[];
20
+ } | null;
17
21
  }
@@ -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
- let opts;
267
- try {
268
- opts = __classPrivateFieldGet(this, _a, "m", _CommandLineParser_parseArgs).call(this);
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
- catch (_error) {
310
+ if (listX === null) { // Option provided but has empty value
271
311
  return null;
272
312
  }
273
- const __getTargets = (opt) => {
274
- const listTiers = opt === '--list-tiers' ? opts[COMMAND_LINE_ARGS.listTiers] : opts[COMMAND_LINE_ARGS.listTiersByUserId];
275
- if (listTiers === null) { // Option provided but has empty value
276
- return null;
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
- else if (typeof listTiers === 'string') {
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
- if (vanities === false && userIds === false) {
294
- return null;
295
- }
296
- return {
297
- byVanity: vanities || [],
298
- byUserId: userIds || []
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
- _a = CommandLineParser, _CommandLineParser_parseArgs = function _CommandLineParser_parseArgs() {
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":"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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 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,6 @@
1
+ export type ListPostsResult = false | {
2
+ hasError: boolean;
3
+ };
4
+ export declare function listPosts(options: {
5
+ onOptionError: (error: unknown) => Promise<void>;
6
+ }): Promise<ListPostsResult>;
@@ -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
- let listTiersTargets;
63
- try {
64
- listTiersTargets = CommandLineParser.listTiers();
60
+ if (await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_listTiers).call(this)) {
61
+ return;
65
62
  }
66
- catch (error) {
67
- return __printOptionError(error);
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 __printOptionError(error);
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(), _PatreonDownloaderCLI_getYouTubeCredentialsPath = function _PatreonDownloaderCLI_getYouTubeCredentialsPath() {
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) {