patreon-dl 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,7 @@ $ patreon-dl [OPTION]... URL
71
71
  | `--log-level <level>` | `-l` | Log level of the console logger: `info`, `debug`, `warn` or `error`; set to `none` to disable the logger. |
72
72
  | `--no-prompt` | `-y` | Do not prompt for confirmation to proceed |
73
73
  | <code><nobr>--list-tiers &lt;creator&gt;</nobr></code> | | <p>List tiers for the given creator(s). Separate multiple creators with a comma.</p>The purpose of this is to let you find out what tier IDs to set for `posts.in.tier` filtering option under `include` section of [configuration file](#configuration-file). |
74
+ | <code><nobr>--list-tiers-uid &lt;user ID&gt;</nobr></code> | | Same as `--list-tiers`, but takes user ID instead of vanity. |
74
75
  | `--configure-youtube` | | <p>Configure YouTube connection.</p>`patreon-dl` supports downloading embedded YouTube videos. If you have a YouTube Premium account, you can connect `patreon-dl` to it for downloading Premium-quality streams. |
75
76
 
76
77
  ### URL
@@ -83,6 +84,7 @@ https://www.patreon.com/<creator>/shop/<slug>-<product_id>
83
84
 
84
85
  // Download posts by creator
85
86
  https://www.patreon.com/<creator>/posts
87
+ https://www.patreon.com/user/posts?u=<user_id>
86
88
 
87
89
  // Dowload a single post
88
90
  https://www.patreon.com/posts/<slug>-<post_id>
@@ -317,6 +319,10 @@ To obtain the IDs of tiers for a particular creator, first get the campaign thro
317
319
  const signal = new AbortSignal(); // optional
318
320
  const logger = new MyLogger(); // optional - see Logger section
319
321
  const campaign = await PatreonDownloader.getCampaign('johndoe', signal, logger);
322
+
323
+ // Sometimes a creator is identified only by user ID, in which case you would do this:
324
+ // const campaign = await PatreonDownloader.getCampaign({ userId: '80821958' }, signal, logger);
325
+
320
326
  const tiers = campaign.rewards;
321
327
  tiers.forEach((tier) => {
322
328
  console.log(`${tier.id} - ${tier.title}`);
@@ -599,6 +605,12 @@ Each event emitted by a download task batch has a payload, which is an object wi
599
605
 
600
606
  ## Changelog
601
607
 
608
+ v1.5.0
609
+ - Add support for fetching by user ID instead of creator vanity ([#18](https://github.com/patrickkfkan/patreon-dl/issues/18)):
610
+ - Support URL format `https://www.patreon.com/user/posts?u=<user_id>`
611
+ - Overload `PatreonDownloader.getCampaign()` to take `userId` arg
612
+ - CLI: add `--list-tiers-uid`
613
+
602
614
  v1.4.0
603
615
  - Add ability to filter posts by tier ([#8](https://github.com/patrickkfkan/patreon-dl/issues/8))
604
616
  - CLI:
@@ -9,6 +9,9 @@ export default class CommandLineParser {
9
9
  static parse(): CommandLineParseResult;
10
10
  static showUsage(): boolean;
11
11
  static configureYouTube(): any;
12
- static listTiers(): false | string[];
12
+ static listTiers(): {
13
+ byVanity: string[];
14
+ byUserId: string[];
15
+ } | null;
13
16
  }
14
17
  //# sourceMappingURL=CommandLineParser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandLineParser.d.ts","sourceRoot":"","sources":["../../src/cli/CommandLineParser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,oBAAoB,CAAC;IACjI,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAkFD,MAAM,CAAC,OAAO,OAAO,iBAAiB;;IAEpC,MAAM,CAAC,KAAK,IAAI,sBAAsB;IA+FtC,MAAM,CAAC,SAAS;IAyChB,MAAM,CAAC,gBAAgB;IAWvB,MAAM,CAAC,SAAS;CA8BjB"}
1
+ {"version":3,"file":"CommandLineParser.d.ts","sourceRoot":"","sources":["../../src/cli/CommandLineParser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,oBAAoB,CAAC;IACjI,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAyFD,MAAM,CAAC,OAAO,OAAO,iBAAiB;;IAEpC,MAAM,CAAC,KAAK,IAAI,sBAAsB;IA+FtC,MAAM,CAAC,SAAS;IAyChB,MAAM,CAAC,gBAAgB;IAWvB,MAAM,CAAC,SAAS;;;;CAiDjB"}
@@ -18,7 +18,8 @@ const COMMAND_LINE_ARGS = {
18
18
  outDir: 'out-dir',
19
19
  logLevel: 'log-level',
20
20
  noPrompt: 'no-prompt',
21
- listTiers: 'list-tiers'
21
+ listTiers: 'list-tiers',
22
+ listTiersByUserId: 'list-tiers-uid'
22
23
  };
23
24
  const OPT_DEFS = [
24
25
  {
@@ -80,6 +81,12 @@ const OPT_DEFS = [
80
81
  type: String,
81
82
  typeLabel: '<creator>'
82
83
  },
84
+ {
85
+ name: COMMAND_LINE_ARGS.listTiersByUserId,
86
+ description: 'Same as \'--list-tiers\', but takes user ID instead of vanity.',
87
+ type: String,
88
+ typeLabel: '<user ID>'
89
+ },
83
90
  {
84
91
  name: COMMAND_LINE_ARGS.configureYouTube,
85
92
  description: 'Configure YouTube connection',
@@ -231,20 +238,35 @@ export default class CommandLineParser {
231
238
  opts = __classPrivateFieldGet(this, _a, "m", _CommandLineParser_parseArgs).call(this);
232
239
  }
233
240
  catch (error) {
234
- return false;
241
+ return null;
235
242
  }
236
- const listTiers = opts[COMMAND_LINE_ARGS.listTiers];
237
- if (listTiers === null) {
238
- throw Error('\'--list-tiers\' missing value');
239
- }
240
- else if (typeof listTiers === 'string') {
241
- const targets = listTiers.split(',').map((v) => v.trim()).filter((v) => v);
242
- if (targets.length === 0) {
243
- throw Error('\'--list-tiers\' has invalid value');
243
+ const __getTargets = (opt) => {
244
+ const listTiers = opt === '--list-tiers' ? opts[COMMAND_LINE_ARGS.listTiers] : opts[COMMAND_LINE_ARGS.listTiersByUserId];
245
+ if (listTiers === null) { // Option provided but has empty value
246
+ return null;
247
+ }
248
+ else if (typeof listTiers === 'string') {
249
+ const targets = listTiers.split(',').map((v) => v.trim()).filter((v) => v);
250
+ if (targets.length === 0) {
251
+ throw Error(`'${opt}' has invalid value`);
252
+ }
253
+ return targets;
244
254
  }
245
- return targets;
255
+ return false;
256
+ };
257
+ const vanities = __getTargets('--list-tiers');
258
+ const userIds = __getTargets('--list-tiers-uid');
259
+ if (vanities === null || userIds === null) {
260
+ const opt = vanities === null ? '--list-tiers' : '--list-tiers-uid';
261
+ throw Error(`'${opt}' missing value`);
246
262
  }
247
- return false;
263
+ if (vanities === false && userIds === false) {
264
+ return null;
265
+ }
266
+ return {
267
+ byVanity: vanities || [],
268
+ byUserId: userIds || []
269
+ };
248
270
  }
249
271
  }
250
272
  _a = CommandLineParser, _CommandLineParser_parseArgs = function _CommandLineParser_parseArgs() {
@@ -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 { CLIOptionParserEntry, CLIOptions } from './CLIOptions.js';\nimport { EOL } from 'os';\nimport { DeepPartial, 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}\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 outDir: 'out-dir',\n logLevel: 'log-level',\n noPrompt: 'no-prompt',\n listTiers: 'list-tiers'\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.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.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.configureYouTube,\n description: 'Configure YouTube connection',\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 if (key === COMMAND_LINE_ARGS.noPrompt && value !== undefined) {\n value = '1';\n }\n else 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 cookie: __getValue(COMMAND_LINE_ARGS.cookie),\n useStatusCache: undefined,\n pathToFFmpeg: __getValue(COMMAND_LINE_ARGS.ffmpeg),\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 },\n request: {\n maxRetries: undefined,\n maxConcurrent: undefined,\n minTime: undefined\n },\n fileExistsAction: {\n content: undefined,\n info: undefined,\n infoAPI: undefined\n },\n noPrompt: __getValue(COMMAND_LINE_ARGS.noPrompt),\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) {\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'\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) {\n return false;\n }\n return opts['configure-youtube'];\n }\n\n static listTiers() {\n let opts;\n try {\n opts = this.#parseArgs();\n }\n catch (error) {\n return false;\n }\n const listTiers = opts[COMMAND_LINE_ARGS.listTiers];\n if (listTiers === null) {\n throw Error('\\'--list-tiers\\' missing value');\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('\\'--list-tiers\\' has invalid value');\n }\n return targets;\n }\n return false;\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 { CLIOptionParserEntry, CLIOptions } from './CLIOptions.js';\nimport { EOL } from 'os';\nimport { DeepPartial, 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}\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 outDir: 'out-dir',\n logLevel: 'log-level',\n noPrompt: 'no-prompt',\n listTiers: 'list-tiers',\n listTiersByUserId: 'list-tiers-uid'\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.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.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\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 if (key === COMMAND_LINE_ARGS.noPrompt && value !== undefined) {\n value = '1';\n }\n else 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 cookie: __getValue(COMMAND_LINE_ARGS.cookie),\n useStatusCache: undefined,\n pathToFFmpeg: __getValue(COMMAND_LINE_ARGS.ffmpeg),\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 },\n request: {\n maxRetries: undefined,\n maxConcurrent: undefined,\n minTime: undefined\n },\n fileExistsAction: {\n content: undefined,\n info: undefined,\n infoAPI: undefined\n },\n noPrompt: __getValue(COMMAND_LINE_ARGS.noPrompt),\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) {\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'\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) {\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) {\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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,OAAO,OAAO,oBAAoB;;;IAiBjC,KAAK;IA4UL,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;CAMzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,OAAO,OAAO,oBAAoB;;;IAiBjC,KAAK;IAyVL,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;CAMzB"}
package/dist/cli/index.js CHANGED
@@ -62,36 +62,42 @@ export default class PatreonDownloaderCLI {
62
62
  catch (error) {
63
63
  return __printOptionError(error);
64
64
  }
65
- if (Array.isArray(listTiersTargets)) {
65
+ if (listTiersTargets) {
66
+ const { byVanity: vanities, byUserId: userIds } = listTiersTargets;
66
67
  let hasError = false;
67
68
  const { consoleLogger: consoleLoggerOptions } = getCLILoggerOptions();
68
69
  const consoleLogger = new ConsoleLogger(consoleLoggerOptions);
69
- for (const target of listTiersTargets) {
70
- try {
71
- const campaign = await Downloader.getCampaign(target, undefined, consoleLogger);
72
- if (campaign) {
73
- console.log(`*** Tiers for ${target} ***${EOL}`);
74
- const idColWidth = campaign.rewards.reduce((len, reward) => {
75
- return Math.max(len, reward.id.length);
76
- }, 0);
77
- const gap = ' ';
78
- console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
79
- console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
80
- campaign.rewards.forEach((reward) => {
81
- console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
82
- });
83
- console.log(EOL);
70
+ const __doList = async (targets, targetType) => {
71
+ for (const target of targets) {
72
+ try {
73
+ const campaign = await Downloader.getCampaign(targetType === 'vanity' ? target : { userId: target }, undefined, consoleLogger);
74
+ if (campaign) {
75
+ const p = targetType === 'userId' ? 'user #' : '';
76
+ console.log(`*** Tiers for ${p}${target} ***${EOL}`);
77
+ const idColWidth = campaign.rewards.reduce((len, reward) => {
78
+ return Math.max(len, reward.id.length);
79
+ }, 0);
80
+ const gap = ' ';
81
+ console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
82
+ console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
83
+ campaign.rewards.forEach((reward) => {
84
+ console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
85
+ });
86
+ console.log(EOL);
87
+ }
88
+ else {
89
+ commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
90
+ throw Error();
91
+ }
84
92
  }
85
- else {
86
- commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
87
- throw Error();
93
+ catch (error) {
94
+ console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
95
+ hasError = true;
88
96
  }
89
97
  }
90
- catch (error) {
91
- console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
92
- hasError = true;
93
- }
94
- }
98
+ };
99
+ await __doList(vanities, 'vanity');
100
+ await __doList(userIds, 'userId');
95
101
  return this.exit(hasError ? 1 : 0);
96
102
  }
97
103
  let options;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport PromptSync from 'prompt-sync';\nimport path from 'path';\nimport fs from 'fs';\nimport Downloader from '../downloaders/Downloader.js';\nimport ConsoleLogger from '../utils/logging/ConsoleLogger.js';\nimport { CLIOptions, CLITargetURLEntry, getCLILoggerOptions, getCLIOptions } from './CLIOptions.js';\nimport CommandLineParser from './CommandLineParser.js';\nimport Logger, { commonLog } from '../utils/logging/Logger.js';\nimport FileLogger, { FileLoggerInit } from '../utils/logging/FileLogger.js';\nimport ChainLogger from '../utils/logging/ChainLogger.js';\nimport { PackageInfo, getPackageInfo } from '../utils/PackageInfo.js';\nimport envPaths from 'env-paths';\nimport YouTubeConfigurator from './helper/YouTubeConfigurator.js';\nimport { DownloaderIncludeOptions } from '../downloaders/DownloaderOptions.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\n\nconst YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';\n\nexport default class PatreonDownloaderCLI {\n\n #logger: Logger | null;\n #packageInfo: PackageInfo;\n #globalConfPath: string;\n // Keep track of file loggers created, so that we force 'append' mode if\n // Multiple target URLs share the same log file.\n #fileLoggers: FileLogger[];\n\n constructor() {\n this.#logger = null;\n this.#fileLoggers = [];\n this.#packageInfo = getPackageInfo();\n this.#globalConfPath = envPaths(\n this.#packageInfo.name || 'patreon-dl', { suffix: '' }).config;\n }\n\n async start() {\n if (CommandLineParser.showUsage()) {\n return this.exit(0);\n }\n\n if (this.#packageInfo.banner) {\n console.log(`${EOL}${this.#packageInfo.banner}${EOL}`);\n }\n\n const __printOptionError = (error: any) => {\n console.error(\n 'Error processing options: ',\n error instanceof Error ? error.message : error,\n EOL,\n 'See usage with \\'-h\\' option.');\n return this.exit(1);\n };\n\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n if (CommandLineParser.configureYouTube()) {\n return this.exit(await YouTubeConfigurator.start(ytCredsPath));\n }\n\n let listTiersTargets;\n try {\n listTiersTargets = CommandLineParser.listTiers();\n }\n catch (error) {\n return __printOptionError(error);\n }\n if (Array.isArray(listTiersTargets)) {\n let hasError = false;\n const { consoleLogger: consoleLoggerOptions } = getCLILoggerOptions();\n const consoleLogger = new ConsoleLogger(consoleLoggerOptions);\n for (const target of listTiersTargets) {\n try {\n const campaign = await Downloader.getCampaign(target, undefined, consoleLogger);\n if (campaign) {\n console.log(`*** Tiers for ${target} ***${EOL}`);\n const idColWidth = campaign.rewards.reduce<number>((len, reward) => {\n return Math.max(len, reward.id.length);\n }, 0);\n const gap = ' ';\n console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);\n console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));\n campaign.rewards.forEach((reward) => {\n console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);\n });\n console.log(EOL);\n }\n else {\n commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');\n throw Error();\n }\n }\n catch (error) {\n console.error(`${EOL}Error fetching tier data for \"${target}\"${EOL}${EOL}`);\n hasError = true;\n }\n }\n return this.exit(hasError ? 1 : 0);\n }\n\n let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\n return __printOptionError(error);\n }\n\n const targetsWithError: string[] = [];\n const targetEndMessages: { url: string; message: string; }[] = [];\n for (let i = 0; i < options.targetURLs.length; i++) {\n const { hasError, aborted, endMessage } = await this.#createAndStartDownloader(options.targetURLs, i, options);\n if (aborted) {\n return this.exit(1);\n }\n const targetURL = options.targetURLs[i].url;\n if (hasError) {\n targetsWithError.push(targetURL);\n }\n targetEndMessages[i] = { url: targetURL, message: endMessage };\n }\n if (options.targetURLs.length > 0) {\n // Print summary\n console.log('');\n const heading = `Total ${options.targetURLs.length} targets processed`;\n console.log(heading);\n console.log('-'.repeat(heading.length));\n console.log('');\n targetEndMessages.forEach(({ url, message }, i) => {\n const s = `${i}: ${url}`;\n console.log(s);\n console.log(message);\n console.log('');\n });\n }\n if (targetsWithError.length > 0) {\n if (options.targetURLs.length > 0) {\n console.warn('There were errors processing the following URLs:', JSON.stringify(targetsWithError, null, 2));\n }\n return this.exit(1);\n }\n return this.exit(0);\n }\n\n #getYouTubeCredentialsPath() {\n return path.resolve(this.#globalConfPath, YT_CREDENTIALS_FILENAME);\n }\n\n #getApplicableIncludeOptions(local?: DownloaderIncludeOptions, global?: DownloaderIncludeOptions) {\n if (!local) {\n return global;\n }\n if (!global) {\n return local;\n }\n const result: DownloaderIncludeOptions = { ...global };\n for (const [ k, v ] of Object.entries(local)) {\n if (v !== undefined) {\n result[k as keyof DownloaderIncludeOptions] = v;\n }\n }\n return result;\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n if (!options.noPrompt) {\n\n const __printLoggerConfigs = () => {\n if (!consoleLogger.getConfig().enabled) {\n console.log('Console logging disabled', EOL);\n }\n\n if (fileLoggers.length > 0) {\n console.log('Log files');\n console.log('---------');\n for (const fl of fileLoggers) {\n const flConf = fl.getConfig();\n console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);\n }\n console.log(EOL);\n }\n };\n\n const __printDownloaderCreated = () => {\n commonLog(logger, 'info', `Created ${downloaderName} instance with config: `, downloader.getConfig(), EOL);\n };\n\n let promptConfirm = true;\n let postConfirm: (() => void) | null = null;\n\n if (targetURLs.length === 1) {\n __printLoggerConfigs();\n __printDownloaderCreated();\n }\n else if (index === 0) {\n postConfirm = () => {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n };\n const conf = {\n ...downloader.getConfig()\n } as any;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productId;\n delete conf.outDir;\n const heading = 'Target URLs';\n console.log(`${EOL}${heading}`);\n console.log('-'.repeat(heading.length), EOL);\n const hasTargetSpecificSettings = !!targetURLs.find((target) => target.include);\n targetURLs.forEach((target, i) => {\n console.log(`${i}: ${target.url}`);\n if (hasTargetSpecificSettings) {\n console.log('');\n }\n if (target.include) {\n console.log('include:', ObjectHelper.clean(target.include));\n console.log('');\n }\n });\n const heading2 = 'Common settings';\n console.log(`${EOL}${heading2}`);\n console.log('-'.repeat(heading2.length));\n console.log(conf, EOL);\n if (targetURLs.find((target) => target.include)) {\n console.log('Target-specific settings may override common settings', EOL);\n }\n }\n else {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n promptConfirm = false;\n }\n if (promptConfirm && !this.#confirmProceed()) {\n console.log('Abort');\n return { aborted: true, endMessage: 'Aborted' };\n }\n if (postConfirm) {\n postConfirm();\n }\n }\n else {\n __logBegin();\n commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());\n }\n\n let hasDownloaderError = false;\n let endMessage = '';\n downloader.on('end', ({ aborted, error, message }) => {\n if (aborted) {\n commonLog(logger, 'info', null, `${downloaderName} aborted`);\n }\n else if (!error) {\n commonLog(logger, 'info', null, `${downloaderName} end`);\n }\n else {\n commonLog(logger, 'warn', null, `${downloaderName} end with error`);\n hasDownloaderError = true;\n }\n endMessage = message;\n });\n\n try {\n const abortController = new AbortController();\n const abortHandler = () => {\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n await downloader.start({ signal: abortController.signal });\n await logger.end();\n process.off('SIGINT', abortHandler);\n return { hasError: hasDownloaderError, endMessage };\n }\n catch (error) {\n commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);\n return { hasError: true, endMessage: 'Uncaught error' };\n }\n }\n\n #confirmProceed(prompt?: PromptSync.Prompt): boolean {\n if (!prompt) {\n prompt = PromptSync({ sigint: true });\n }\n const confirmProceed = prompt('Proceed (Y/n)? ');\n if (!confirmProceed.trim() || confirmProceed.trim().toLowerCase() === 'y') {\n return true;\n }\n else if (confirmProceed.trim().toLowerCase() === 'n') {\n return false;\n }\n\n return this.#confirmProceed(prompt);\n }\n\n #createLoggers(targetURL: string, options: CLIOptions) {\n // Create file loggers\n const fileLoggerInit: FileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const { filePath } = FileLogger.getPathInfo({\n ...fileLoggerInit,\n ...fileLoggerOptions\n });\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fileLoggerInit, fileLoggerOptions);\n result.push(fl);\n }\n catch (error) {\n console.warn('Failed to create file logger: ', error instanceof Error ? error.message : error);\n }\n return result;\n }, []) || [];\n\n // Create console logger\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n\n // Chain logger\n const chainLogger = new ChainLogger([\n consoleLogger,\n ...fileLoggers\n ]);\n\n return {\n chainLogger,\n consoleLogger,\n fileLoggers\n };\n }\n\n async exit(code?: number) {\n if (this.#logger) {\n await this.#logger.end();\n }\n process.exit(code);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport PromptSync from 'prompt-sync';\nimport path from 'path';\nimport fs from 'fs';\nimport Downloader from '../downloaders/Downloader.js';\nimport ConsoleLogger from '../utils/logging/ConsoleLogger.js';\nimport { CLIOptions, CLITargetURLEntry, getCLILoggerOptions, getCLIOptions } from './CLIOptions.js';\nimport CommandLineParser from './CommandLineParser.js';\nimport Logger, { commonLog } from '../utils/logging/Logger.js';\nimport FileLogger, { FileLoggerInit } from '../utils/logging/FileLogger.js';\nimport ChainLogger from '../utils/logging/ChainLogger.js';\nimport { PackageInfo, getPackageInfo } from '../utils/PackageInfo.js';\nimport envPaths from 'env-paths';\nimport YouTubeConfigurator from './helper/YouTubeConfigurator.js';\nimport { DownloaderIncludeOptions } from '../downloaders/DownloaderOptions.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\n\nconst YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';\n\nexport default class PatreonDownloaderCLI {\n\n #logger: Logger | null;\n #packageInfo: PackageInfo;\n #globalConfPath: string;\n // Keep track of file loggers created, so that we force 'append' mode if\n // Multiple target URLs share the same log file.\n #fileLoggers: FileLogger[];\n\n constructor() {\n this.#logger = null;\n this.#fileLoggers = [];\n this.#packageInfo = getPackageInfo();\n this.#globalConfPath = envPaths(\n this.#packageInfo.name || 'patreon-dl', { suffix: '' }).config;\n }\n\n async start() {\n if (CommandLineParser.showUsage()) {\n return this.exit(0);\n }\n\n if (this.#packageInfo.banner) {\n console.log(`${EOL}${this.#packageInfo.banner}${EOL}`);\n }\n\n const __printOptionError = (error: any) => {\n console.error(\n 'Error processing options: ',\n error instanceof Error ? error.message : error,\n EOL,\n 'See usage with \\'-h\\' option.');\n return this.exit(1);\n };\n\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n if (CommandLineParser.configureYouTube()) {\n return this.exit(await YouTubeConfigurator.start(ytCredsPath));\n }\n\n let listTiersTargets;\n try {\n listTiersTargets = CommandLineParser.listTiers();\n }\n catch (error) {\n return __printOptionError(error);\n }\n if (listTiersTargets) {\n const { byVanity: vanities, byUserId: userIds } = listTiersTargets;\n let hasError = false;\n const { consoleLogger: consoleLoggerOptions } = getCLILoggerOptions();\n const consoleLogger = new ConsoleLogger(consoleLoggerOptions);\n\n const __doList = async (targets: string[], targetType: 'vanity' | 'userId') => {\n for (const target of targets) {\n try {\n const campaign = await Downloader.getCampaign(\n targetType === 'vanity' ? target : { userId: target },\n undefined,\n consoleLogger\n );\n if (campaign) {\n const p = targetType === 'userId' ? 'user #' : '';\n console.log(`*** Tiers for ${p}${target} ***${EOL}`);\n const idColWidth = campaign.rewards.reduce<number>((len, reward) => {\n return Math.max(len, reward.id.length);\n }, 0);\n const gap = ' ';\n console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);\n console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));\n campaign.rewards.forEach((reward) => {\n console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);\n });\n console.log(EOL);\n }\n else {\n commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');\n throw Error();\n }\n }\n catch (error) {\n console.error(`${EOL}Error fetching tier data for \"${target}\"${EOL}${EOL}`);\n hasError = true;\n }\n }\n };\n\n await __doList(vanities, 'vanity');\n await __doList(userIds, 'userId');\n\n return this.exit(hasError ? 1 : 0);\n }\n\n let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\n return __printOptionError(error);\n }\n\n const targetsWithError: string[] = [];\n const targetEndMessages: { url: string; message: string; }[] = [];\n for (let i = 0; i < options.targetURLs.length; i++) {\n const { hasError, aborted, endMessage } = await this.#createAndStartDownloader(options.targetURLs, i, options);\n if (aborted) {\n return this.exit(1);\n }\n const targetURL = options.targetURLs[i].url;\n if (hasError) {\n targetsWithError.push(targetURL);\n }\n targetEndMessages[i] = { url: targetURL, message: endMessage };\n }\n if (options.targetURLs.length > 0) {\n // Print summary\n console.log('');\n const heading = `Total ${options.targetURLs.length} targets processed`;\n console.log(heading);\n console.log('-'.repeat(heading.length));\n console.log('');\n targetEndMessages.forEach(({ url, message }, i) => {\n const s = `${i}: ${url}`;\n console.log(s);\n console.log(message);\n console.log('');\n });\n }\n if (targetsWithError.length > 0) {\n if (options.targetURLs.length > 0) {\n console.warn('There were errors processing the following URLs:', JSON.stringify(targetsWithError, null, 2));\n }\n return this.exit(1);\n }\n return this.exit(0);\n }\n\n #getYouTubeCredentialsPath() {\n return path.resolve(this.#globalConfPath, YT_CREDENTIALS_FILENAME);\n }\n\n #getApplicableIncludeOptions(local?: DownloaderIncludeOptions, global?: DownloaderIncludeOptions) {\n if (!local) {\n return global;\n }\n if (!global) {\n return local;\n }\n const result: DownloaderIncludeOptions = { ...global };\n for (const [ k, v ] of Object.entries(local)) {\n if (v !== undefined) {\n result[k as keyof DownloaderIncludeOptions] = v;\n }\n }\n return result;\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n if (!options.noPrompt) {\n\n const __printLoggerConfigs = () => {\n if (!consoleLogger.getConfig().enabled) {\n console.log('Console logging disabled', EOL);\n }\n\n if (fileLoggers.length > 0) {\n console.log('Log files');\n console.log('---------');\n for (const fl of fileLoggers) {\n const flConf = fl.getConfig();\n console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);\n }\n console.log(EOL);\n }\n };\n\n const __printDownloaderCreated = () => {\n commonLog(logger, 'info', `Created ${downloaderName} instance with config: `, downloader.getConfig(), EOL);\n };\n\n let promptConfirm = true;\n let postConfirm: (() => void) | null = null;\n\n if (targetURLs.length === 1) {\n __printLoggerConfigs();\n __printDownloaderCreated();\n }\n else if (index === 0) {\n postConfirm = () => {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n };\n const conf = {\n ...downloader.getConfig()\n } as any;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productId;\n delete conf.outDir;\n const heading = 'Target URLs';\n console.log(`${EOL}${heading}`);\n console.log('-'.repeat(heading.length), EOL);\n const hasTargetSpecificSettings = !!targetURLs.find((target) => target.include);\n targetURLs.forEach((target, i) => {\n console.log(`${i}: ${target.url}`);\n if (hasTargetSpecificSettings) {\n console.log('');\n }\n if (target.include) {\n console.log('include:', ObjectHelper.clean(target.include));\n console.log('');\n }\n });\n const heading2 = 'Common settings';\n console.log(`${EOL}${heading2}`);\n console.log('-'.repeat(heading2.length));\n console.log(conf, EOL);\n if (targetURLs.find((target) => target.include)) {\n console.log('Target-specific settings may override common settings', EOL);\n }\n }\n else {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n promptConfirm = false;\n }\n if (promptConfirm && !this.#confirmProceed()) {\n console.log('Abort');\n return { aborted: true, endMessage: 'Aborted' };\n }\n if (postConfirm) {\n postConfirm();\n }\n }\n else {\n __logBegin();\n commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());\n }\n\n let hasDownloaderError = false;\n let endMessage = '';\n downloader.on('end', ({ aborted, error, message }) => {\n if (aborted) {\n commonLog(logger, 'info', null, `${downloaderName} aborted`);\n }\n else if (!error) {\n commonLog(logger, 'info', null, `${downloaderName} end`);\n }\n else {\n commonLog(logger, 'warn', null, `${downloaderName} end with error`);\n hasDownloaderError = true;\n }\n endMessage = message;\n });\n\n try {\n const abortController = new AbortController();\n const abortHandler = () => {\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n await downloader.start({ signal: abortController.signal });\n await logger.end();\n process.off('SIGINT', abortHandler);\n return { hasError: hasDownloaderError, endMessage };\n }\n catch (error) {\n commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);\n return { hasError: true, endMessage: 'Uncaught error' };\n }\n }\n\n #confirmProceed(prompt?: PromptSync.Prompt): boolean {\n if (!prompt) {\n prompt = PromptSync({ sigint: true });\n }\n const confirmProceed = prompt('Proceed (Y/n)? ');\n if (!confirmProceed.trim() || confirmProceed.trim().toLowerCase() === 'y') {\n return true;\n }\n else if (confirmProceed.trim().toLowerCase() === 'n') {\n return false;\n }\n\n return this.#confirmProceed(prompt);\n }\n\n #createLoggers(targetURL: string, options: CLIOptions) {\n // Create file loggers\n const fileLoggerInit: FileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const { filePath } = FileLogger.getPathInfo({\n ...fileLoggerInit,\n ...fileLoggerOptions\n });\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fileLoggerInit, fileLoggerOptions);\n result.push(fl);\n }\n catch (error) {\n console.warn('Failed to create file logger: ', error instanceof Error ? error.message : error);\n }\n return result;\n }, []) || [];\n\n // Create console logger\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n\n // Chain logger\n const chainLogger = new ChainLogger([\n consoleLogger,\n ...fileLoggers\n ]);\n\n return {\n chainLogger,\n consoleLogger,\n fileLoggers\n };\n }\n\n async exit(code?: number) {\n if (this.#logger) {\n await this.#logger.end();\n }\n process.exit(code);\n }\n}\n"]}
@@ -18,6 +18,10 @@ export interface PostDownloaderBootstrapData extends BootstrapData {
18
18
  type: 'byUser';
19
19
  vanity: string;
20
20
  filters?: Record<string, any>;
21
+ } | {
22
+ type: 'byUserId';
23
+ userId: string;
24
+ filters?: Record<string, any>;
21
25
  } | {
22
26
  type: 'byCollection';
23
27
  collectionId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Bootstrap.d.ts","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,8BAA+B,SAAQ,aAAa;IACnE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG;QACF,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,GAAG;QACF,IAAI,EAAE,cAAc,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,IAC1D,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAAG,8BAA8B,GAC5D,CAAC,CAAC,MAAM,CAAC,SAAS,MAAM,GAAG,2BAA2B,GACtD,KAAK,CAAC;AAER,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAG,EAAE,MAAM;CAoDnD"}
1
+ {"version":3,"file":"Bootstrap.d.ts","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,8BAA+B,SAAQ,aAAa;IACnE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG;QACF,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,GAAG;QACF,IAAI,EAAE,UAAU,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,GAAG;QACF,IAAI,EAAE,cAAc,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,IAC1D,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAAG,8BAA8B,GAC5D,CAAC,CAAC,MAAM,CAAC,SAAS,MAAM,GAAG,2BAA2B,GACtD,KAAK,CAAC;AAER,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAG,EAAE,MAAM;CAgEnD"}
@@ -23,6 +23,17 @@ export default class Bootstrap {
23
23
  }
24
24
  };
25
25
  }
26
+ if (analysis.type === 'postsByUserId') {
27
+ return {
28
+ type: 'post',
29
+ targetURL: url,
30
+ postFetch: {
31
+ type: 'byUserId',
32
+ userId: analysis.userId,
33
+ filters: analysis.filters
34
+ }
35
+ };
36
+ }
26
37
  if (analysis.type === 'postsByCollection') {
27
38
  return {
28
39
  type: 'post',
@@ -1 +1 @@
1
- {"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAmC9C,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAW;QAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,QAAQ,CAAC,SAAS;aACI,CAAC;SACrC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE;YACnC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACzC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,cAAc;oBACpB,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB;aAC6B,CAAC;SAClC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { Post } from '../entities/Post.js';\nimport { Product } from '../entities/Product.js';\nimport URLHelper from '../utils/URLHelper.js';\n\nexport type DownloaderType = Product | Post;\n\nexport interface BootstrapData {\n type: string;\n targetURL: string;\n}\n\nexport interface ProductDownloaderBootstrapData extends BootstrapData {\n type: 'product';\n productId: string;\n}\n\nexport interface PostDownloaderBootstrapData extends BootstrapData {\n type: 'post';\n postFetch: {\n type: 'single';\n postId: string;\n } | {\n type: 'byUser';\n vanity: string;\n filters?: Record<string, any>;\n } | {\n type: 'byCollection';\n collectionId: string;\n filters?: Record<string, any>;\n };\n}\n\nexport type DownloaderBootstrapData<T extends DownloaderType> =\n T['type'] extends 'product' ? ProductDownloaderBootstrapData :\n T['type'] extends 'post' ? PostDownloaderBootstrapData :\n never;\n\nexport default class Bootstrap {\n\n static getDownloaderBootstrapDataByURL(url: string) {\n const analysis = URLHelper.analyzeURL(url);\n if (!analysis) {\n return null;\n }\n\n if (analysis.type === 'product') {\n return {\n type: 'product',\n targetURL: url,\n productId: analysis.productId\n } as ProductDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByUser') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUser',\n vanity: analysis.vanity,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByCollection') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byCollection',\n collectionId: analysis.collectionId,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'post') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'single',\n postId: analysis.postId,\n slug: analysis.slug\n }\n } as PostDownloaderBootstrapData;\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAuC9C,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAW;QAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,QAAQ,CAAC,SAAS;aACI,CAAC;SACrC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE;YACnC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE;YACrC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACzC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,cAAc;oBACpB,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB;aAC6B,CAAC;SAClC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { Post } from '../entities/Post.js';\nimport { Product } from '../entities/Product.js';\nimport URLHelper from '../utils/URLHelper.js';\n\nexport type DownloaderType = Product | Post;\n\nexport interface BootstrapData {\n type: string;\n targetURL: string;\n}\n\nexport interface ProductDownloaderBootstrapData extends BootstrapData {\n type: 'product';\n productId: string;\n}\n\nexport interface PostDownloaderBootstrapData extends BootstrapData {\n type: 'post';\n postFetch: {\n type: 'single';\n postId: string;\n } | {\n type: 'byUser';\n vanity: string;\n filters?: Record<string, any>;\n } | {\n type: 'byUserId';\n userId: string;\n filters?: Record<string, any>;\n } | {\n type: 'byCollection';\n collectionId: string;\n filters?: Record<string, any>;\n };\n}\n\nexport type DownloaderBootstrapData<T extends DownloaderType> =\n T['type'] extends 'product' ? ProductDownloaderBootstrapData :\n T['type'] extends 'post' ? PostDownloaderBootstrapData :\n never;\n\nexport default class Bootstrap {\n\n static getDownloaderBootstrapDataByURL(url: string) {\n const analysis = URLHelper.analyzeURL(url);\n if (!analysis) {\n return null;\n }\n\n if (analysis.type === 'product') {\n return {\n type: 'product',\n targetURL: url,\n productId: analysis.productId\n } as ProductDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByUser') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUser',\n vanity: analysis.vanity,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByUserId') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUserId',\n userId: analysis.userId,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByCollection') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byCollection',\n collectionId: analysis.collectionId,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'post') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'single',\n postId: analysis.postId,\n slug: analysis.slug\n }\n } as PostDownloaderBootstrapData;\n }\n\n return null;\n }\n}\n"]}
@@ -10,6 +10,7 @@ import { Campaign } from '../entities/Campaign.js';
10
10
  import { WriteTextFileResult } from '../utils/FSHelper.js';
11
11
  import DownloadTaskBatch from './task/DownloadTaskBatch.js';
12
12
  import { Downloadable } from '../entities/Downloadable.js';
13
+ import { UserIdOrVanityParam } from '../entities/User.js';
13
14
  export type DownloaderConfig<T extends DownloaderType> = DownloaderInit & Omit<DownloaderBootstrapData<T>, 'type'>;
14
15
  export interface DownloaderStartParams {
15
16
  signal?: AbortSignal;
@@ -31,7 +32,7 @@ export default abstract class Downloader<T extends DownloaderType> extends Event
31
32
  protected addToDownloadTaskBatch(batch: DownloadTaskBatch, ...createTasks: Array<CreateDownloadTaskParams | null>): DownloadTaskBatch;
32
33
  abstract start(params: DownloaderStartParams): Promise<void>;
33
34
  static getInstance(url: string, options?: DownloaderOptions): Promise<import("./PostDownloader.js").default | import("./ProductDownloader.js").default>;
34
- static getCampaign(vanity: string, signal?: AbortSignal, logger?: Logger | null): Promise<Campaign | null>;
35
+ static getCampaign(creator: string | UserIdOrVanityParam, signal?: AbortSignal, logger?: Logger | null): Promise<Campaign | null>;
35
36
  protected saveCampaignInfo(campaign: Campaign | null, signal?: AbortSignal): Promise<void>;
36
37
  protected log(level: LogLevel, ...msg: any[]): void;
37
38
  getConfig(): deepFreeze.DeepReadonly<DownloaderConfig<T>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Downloader.d.ts","sourceRoot":"","sources":["../../src/downloaders/Downloader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Downloader.d.ts","sourceRoot":"","sources":["../../src/downloaders/Downloader.ts"],"names":[],"mappings":"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"}
@@ -160,8 +160,9 @@ export default class Downloader extends EventEmitter {
160
160
  return new PostDownloader(bootstrap, options);
161
161
  }
162
162
  }
163
- static async getCampaign(vanity, signal, logger) {
164
- const url = URLHelper.constructUserPostsURL(vanity);
163
+ static async getCampaign(creator, signal, logger) {
164
+ // Backwards compatibility - if 'creator' is string type, then it is vanity
165
+ const url = URLHelper.constructUserPostsURL(typeof creator === 'object' ? creator : { vanity: creator });
165
166
  const downloader = await this.getInstance(url, { logger });
166
167
  const PostDownloader = (await import('./PostDownloader.js')).default;
167
168
  if (downloader instanceof PostDownloader) {