patreon-dl 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +11 -0
  2. package/dist/cli/CLIOptions.d.ts.map +1 -1
  3. package/dist/cli/CLIOptions.js +1 -0
  4. package/dist/cli/CLIOptions.js.map +1 -1
  5. package/dist/cli/CommandLineParser.d.ts.map +1 -1
  6. package/dist/cli/CommandLineParser.js +13 -2
  7. package/dist/cli/CommandLineParser.js.map +1 -1
  8. package/dist/cli/ConfigFileParser.d.ts.map +1 -1
  9. package/dist/cli/ConfigFileParser.js +2 -0
  10. package/dist/cli/ConfigFileParser.js.map +1 -1
  11. package/dist/cli/helper/YouTubeConfigurator.js +2 -2
  12. package/dist/cli/helper/YouTubeConfigurator.js.map +1 -1
  13. package/dist/downloaders/Downloader.d.ts +2 -1
  14. package/dist/downloaders/Downloader.d.ts.map +1 -1
  15. package/dist/downloaders/Downloader.js +10 -12
  16. package/dist/downloaders/Downloader.js.map +1 -1
  17. package/dist/downloaders/DownloaderOptions.d.ts +2 -1
  18. package/dist/downloaders/DownloaderOptions.d.ts.map +1 -1
  19. package/dist/downloaders/DownloaderOptions.js +4 -2
  20. package/dist/downloaders/DownloaderOptions.js.map +1 -1
  21. package/dist/downloaders/PostDownloader.d.ts.map +1 -1
  22. package/dist/downloaders/PostDownloader.js +72 -167
  23. package/dist/downloaders/PostDownloader.js.map +1 -1
  24. package/dist/downloaders/PostsFetcher.d.ts +59 -0
  25. package/dist/downloaders/PostsFetcher.d.ts.map +1 -0
  26. package/dist/downloaders/PostsFetcher.js +348 -0
  27. package/dist/downloaders/PostsFetcher.js.map +1 -0
  28. package/dist/downloaders/ProductDownloader.d.ts.map +1 -1
  29. package/dist/downloaders/ProductDownloader.js +6 -7
  30. package/dist/downloaders/ProductDownloader.js.map +1 -1
  31. package/dist/downloaders/cache/StatusCache.d.ts +2 -2
  32. package/dist/downloaders/cache/StatusCache.d.ts.map +1 -1
  33. package/dist/downloaders/cache/StatusCache.js +11 -7
  34. package/dist/downloaders/cache/StatusCache.js.map +1 -1
  35. package/dist/downloaders/task/DownloadTask.d.ts +6 -1
  36. package/dist/downloaders/task/DownloadTask.d.ts.map +1 -1
  37. package/dist/downloaders/task/DownloadTask.js +19 -7
  38. package/dist/downloaders/task/DownloadTask.js.map +1 -1
  39. package/dist/downloaders/task/DownloadTaskFactory.d.ts +2 -4
  40. package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -1
  41. package/dist/downloaders/task/DownloadTaskFactory.js +15 -8
  42. package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -1
  43. package/dist/downloaders/task/ExternalDownloaderTask.d.ts +2 -1
  44. package/dist/downloaders/task/ExternalDownloaderTask.d.ts.map +1 -1
  45. package/dist/downloaders/task/ExternalDownloaderTask.js +10 -3
  46. package/dist/downloaders/task/ExternalDownloaderTask.js.map +1 -1
  47. package/dist/downloaders/task/FFmpegDownloadTaskBase.d.ts.map +1 -1
  48. package/dist/downloaders/task/FFmpegDownloadTaskBase.js +15 -7
  49. package/dist/downloaders/task/FFmpegDownloadTaskBase.js.map +1 -1
  50. package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -1
  51. package/dist/downloaders/task/FetcherDownloadTask.js +5 -6
  52. package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -1
  53. package/dist/parsers/PostParser.d.ts +1 -0
  54. package/dist/parsers/PostParser.d.ts.map +1 -1
  55. package/dist/parsers/PostParser.js +15 -12
  56. package/dist/parsers/PostParser.js.map +1 -1
  57. package/dist/utils/FSHelper.d.ts +23 -7
  58. package/dist/utils/FSHelper.d.ts.map +1 -1
  59. package/dist/utils/FSHelper.js +99 -30
  60. package/dist/utils/FSHelper.js.map +1 -1
  61. package/dist/utils/Fetcher.d.ts +2 -1
  62. package/dist/utils/Fetcher.d.ts.map +1 -1
  63. package/dist/utils/Fetcher.js +29 -11
  64. package/dist/utils/Fetcher.js.map +1 -1
  65. package/dist/utils/Sleeper.d.ts +9 -0
  66. package/dist/utils/Sleeper.d.ts.map +1 -0
  67. package/dist/utils/Sleeper.js +68 -0
  68. package/dist/utils/Sleeper.js.map +1 -0
  69. package/dist/utils/URLHelper.d.ts +1 -1
  70. package/dist/utils/URLHelper.d.ts.map +1 -1
  71. package/dist/utils/URLHelper.js +9 -0
  72. package/dist/utils/URLHelper.js.map +1 -1
  73. package/dist/utils/logging/ConsoleLogger.d.ts +1 -0
  74. package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -1
  75. package/dist/utils/logging/ConsoleLogger.js +21 -9
  76. package/dist/utils/logging/ConsoleLogger.js.map +1 -1
  77. package/package.json +1 -1
package/README.md CHANGED
@@ -80,6 +80,7 @@ $ patreon-dl [OPTION]... URL
80
80
  | `--out-dir <path>` |`-o` | Directory to save content |
81
81
  | `--log-level <level>` | `-l` | Log level of the console logger: `info`, `debug`, `warn` or `error`; set to `none` to disable the logger. |
82
82
  | `--no-prompt` | `-y` | Do not prompt for confirmation to proceed |
83
+ | `--dry-run` | | Run without writing files to disk (except logs, if any). Intended for testing / debugging. |
83
84
  | <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). |
84
85
  | <code><nobr>--list-tiers-uid &lt;user ID&gt;</nobr></code> | | Same as `--list-tiers`, but takes user ID instead of vanity. |
85
86
  | `--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. |
@@ -97,6 +98,7 @@ https://www.patreon.com/<creator>/posts
97
98
  https://www.patreon.com/user/posts?u=<user_id>
98
99
 
99
100
  // Dowload a single post
101
+ https://www.patreon.com/posts/<post_id>
100
102
  https://www.patreon.com/posts/<slug>-<post_id>
101
103
 
102
104
  // Download posts in a collection
@@ -249,6 +251,7 @@ An object with the following properties (all *optional*):
249
251
  | `fileExistsAction` | What to do when a target file already exists: (object)<ul><li>`info`: in the context of saving info (such as campaign or post info), the action to take when a file belonging to the info already exists. Default: `saveAsCopyIfNewer`</li><li>`infoAPI`: API data is saved as part of info. Because it changes frequently, and usually used for debugging purpose only, you can set a different action when saving an API data file that already exists. Default: `overwrite`</li><li>`content`: in the context of downloading content, the action to take when a file belonging to the content already exists. Default: `skip`</li></ul><p>Supported actions:<ul><li>`overwrite`: overwrite existing file.</li><li>`skip`: skip saving the file.</li><li>`saveAsCopy`: save the file under incremented filename (e.g. "abc.jpg" becomes "abc (1).jpg").</li><li>`saveAsCopyIfNewer`: like `saveAsCopy`, but only do so if the contents have actually changed.</li></ul></p> |
250
252
  | `embedDownloaders` | External downloader for embedded videos. See [External downloaders](#external-downloaders).|
251
253
  |`logger` | See [Logger](#logger) |
254
+ | `dryRun` | Run without writing files to disk (except logs, if any). Default: `false` |
252
255
 
253
256
  #### Campaign directory name format
254
257
 
@@ -641,6 +644,14 @@ Each event emitted by a download task batch has a payload, which is an object wi
641
644
 
642
645
  ## Changelog
643
646
 
647
+ v1.7.0
648
+ - Download next batch of posts before expiry of 'next' URL (fixes [#22](https://github.com/patrickkfkan/patreon-dl/issues/22))
649
+ - Add `--dry-run` / `dryRun` option
650
+ - Support URL format `https://www.patreon.com/posts/<post_id>`
651
+
652
+ v1.6.2
653
+ - Fix 'campaign ID not found' error due to Patreon changes
654
+
644
655
  v1.6.1
645
656
  - Fix file extension sometimes missing ([#20](https://github.com/patrickkfkan/patreon-dl/issues/20))
646
657
 
@@ -1 +1 @@
1
- {"version":3,"file":"CLIOptions.d.ts","sourceRoot":"","sources":["../../src/cli/CLIOptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAA0B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,gBAA2C,MAAM,uBAAuB,CAAC;AAGhF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAED,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACnE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC;IAClC,GAAG,EAAE,KAAK,CAAA;CACX,GAAG;IACF,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,MAAM,CAAA;CAChB,GAAG;IACF,GAAG,EAAE,KAAK,CAAC;IACX,IAAI,EAAE,MAAM,CAAA;CACb,CAAC,GAAG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,wBAAgB,aAAa,IAAI,UAAU,CAkD1C;AAED,wBAAgB,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;;;;;;;;;;;;;;EAsCvJ"}
1
+ {"version":3,"file":"CLIOptions.d.ts","sourceRoot":"","sources":["../../src/cli/CLIOptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAA0B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,gBAA2C,MAAM,uBAAuB,CAAC;AAGhF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAED,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACnE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC;IAClC,GAAG,EAAE,KAAK,CAAA;CACX,GAAG;IACF,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,MAAM,CAAA;CAChB,GAAG;IACF,GAAG,EAAE,KAAK,CAAC;IACX,IAAI,EAAE,MAAM,CAAA;CACb,CAAC,GAAG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,wBAAgB,aAAa,IAAI,UAAU,CAmD1C;AAED,wBAAgB,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;;;;;;;;;;;;;;EAsCvJ"}
@@ -45,6 +45,7 @@ export function getCLIOptions() {
45
45
  },
46
46
  embedDownloaders: getEmbedDownloaderOptions(configFileOptions),
47
47
  noPrompt: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.noPrompt, configFileOptions?.noPrompt)) || false,
48
+ dryRun: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.dryRun, configFileOptions?.dryRun)) || false,
48
49
  consoleLogger,
49
50
  fileLoggers
50
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CLIOptions.js","sourceRoot":"","sources":["../../src/cli/CLIOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { DownloaderIncludeOptions, DownloaderOptions } from '../downloaders/DownloaderOptions.js';\nimport { pickDefined } from '../utils/Misc.js';\nimport { ConsoleLoggerOptions } from '../utils/logging/ConsoleLogger.js';\nimport { FileLoggerOptions } from '../utils/logging/FileLogger.js';\nimport CLIOptionValidator from './CLIOptionValidator.js';\nimport CommandLineParser, { CommandLineParseResult } from './CommandLineParser.js';\nimport ConfigFileParser, { ConfigFileParseResult } from './ConfigFileParser.js';\nimport path from 'path';\n\nexport interface CLITargetURLEntry {\n url: string;\n // Target-specific 'include' options\n include?: DownloaderIncludeOptions;\n}\n\nexport interface CLIOptions extends Omit<DownloaderOptions, 'logger'> {\n targetURLs: CLITargetURLEntry[];\n noPrompt: boolean;\n consoleLogger: ConsoleLoggerOptions;\n fileLoggers?: FileLoggerOptions[];\n}\n\nexport type CLIOptionParserEntry = ({\n src: 'cli'\n} | {\n src: 'cfg',\n section: string\n} | {\n src: 'tgt',\n line: number\n}) & {\n key: string;\n value?: string;\n}\n\nexport function getCLIOptions(): CLIOptions {\n const commandLineOptions = CommandLineParser.parse();\n\n const configFileOptions = commandLineOptions.configFile?.value ? ConfigFileParser.parse(commandLineOptions.configFile.value) : null;\n\n let targetURLs: CLITargetURLEntry[];\n const targetURLValue = CLIOptionValidator.validateRequired(pickDefined(commandLineOptions.targetURLs, configFileOptions?.targetURLs), 'No target URL specified');\n const targetsFile = path.resolve(targetURLValue);\n if (fs.existsSync(targetsFile)) {\n targetURLs = readTargetsFile(targetsFile);\n }\n else {\n targetURLs = CLIOptionValidator\n .validateTargetURLs(targetURLValue)\n .map((url) => ({ url }));\n }\n\n const { consoleLogger, fileLoggers } = getCLILoggerOptions(commandLineOptions, configFileOptions);\n\n const options: CLIOptions = {\n targetURLs,\n cookie: CLIOptionValidator.validateString(pickDefined(commandLineOptions.cookie, configFileOptions?.cookie)),\n useStatusCache: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.useStatusCache, configFileOptions?.useStatusCache)),\n pathToFFmpeg: CLIOptionValidator.validateString(pickDefined(commandLineOptions.pathToFFmpeg, configFileOptions?.pathToFFmpeg)),\n outDir: CLIOptionValidator.validateString(pickDefined(commandLineOptions.outDir, configFileOptions?.outDir)),\n dirNameFormat: {\n campaign: CLIOptionValidator.validateString(pickDefined(commandLineOptions.dirNameFormat?.campaign, configFileOptions?.dirNameFormat?.campaign)),\n content: CLIOptionValidator.validateString(pickDefined(commandLineOptions.dirNameFormat?.content, configFileOptions?.dirNameFormat?.content))\n },\n filenameFormat: {\n media: CLIOptionValidator.validateString(pickDefined(commandLineOptions.filenameFormat?.media, configFileOptions?.filenameFormat?.media))\n },\n include: getCLIIncludeOptions(commandLineOptions, configFileOptions),\n request: {\n maxRetries: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.maxRetries, configFileOptions?.request?.maxRetries)),\n maxConcurrent: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.maxConcurrent, configFileOptions?.request?.maxConcurrent)),\n minTime: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.minTime, configFileOptions?.request?.minTime))\n },\n fileExistsAction: {\n content: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.content, configFileOptions?.fileExistsAction?.content), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer'),\n info: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.info, configFileOptions?.fileExistsAction?.info), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer'),\n infoAPI: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.infoAPI, configFileOptions?.fileExistsAction?.infoAPI), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer')\n },\n embedDownloaders: getEmbedDownloaderOptions(configFileOptions),\n noPrompt: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.noPrompt, configFileOptions?.noPrompt)) || false,\n consoleLogger,\n fileLoggers\n };\n\n return options;\n}\n\nexport function getCLILoggerOptions(commandLineOptions?: CommandLineParseResult, configFileOptions?: ReturnType<typeof ConfigFileParser['parse']> | null) {\n if (!commandLineOptions) {\n commandLineOptions = CommandLineParser.parse();\n }\n const consoleLogger = {\n enabled: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.enabled, configFileOptions?.consoleLogger?.enabled)),\n logLevel: CLIOptionValidator.validateString(pickDefined(commandLineOptions.consoleLogger?.logLevel, configFileOptions?.consoleLogger?.logLevel), 'info', 'debug', 'warn', 'error'),\n include: {\n dateTime: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.dateTime, configFileOptions?.consoleLogger?.include?.dateTime)),\n level: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.level, configFileOptions?.consoleLogger?.include?.level)),\n originator: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.originator, configFileOptions?.consoleLogger?.include?.originator)),\n errorStack: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.errorStack, configFileOptions?.consoleLogger?.include?.errorStack))\n },\n dateTimeFormat: CLIOptionValidator.validateString(pickDefined(commandLineOptions.consoleLogger?.dateTimeFormat, configFileOptions?.consoleLogger?.dateTimeFormat)),\n color: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.color, configFileOptions?.consoleLogger?.color))\n };\n let fileLoggers;\n if (configFileOptions?.fileLoggers) {\n fileLoggers = configFileOptions.fileLoggers.map((logger): FileLoggerOptions => ({\n enabled: CLIOptionValidator.validateBoolean(logger.enabled),\n logDir: CLIOptionValidator.validateString(logger.logDir),\n logFilename: CLIOptionValidator.validateString(logger.logFilename),\n fileExistsAction: CLIOptionValidator.validateString(logger.fileExistsAction, 'append', 'overwrite'),\n logLevel: CLIOptionValidator.validateString(logger.logLevel, 'info', 'debug', 'warn', 'error'),\n include: {\n dateTime: CLIOptionValidator.validateBoolean(logger.include?.dateTime),\n level: CLIOptionValidator.validateBoolean(logger.include?.level),\n originator: CLIOptionValidator.validateBoolean(logger.include?.originator),\n errorStack: CLIOptionValidator.validateBoolean(logger.include?.errorStack)\n },\n dateTimeFormat: CLIOptionValidator.validateString(logger.dateTimeFormat),\n color: CLIOptionValidator.validateBoolean(logger.color)\n }));\n }\n return {\n consoleLogger,\n fileLoggers\n };\n}\n\nfunction getCLIIncludeOptions(commandLineOptions: CommandLineParseResult, configFileOptions?: ConfigFileParseResult | null) {\n if (!commandLineOptions) {\n commandLineOptions = CommandLineParser.parse();\n }\n return {\n lockedContent: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.lockedContent, configFileOptions?.include?.lockedContent)),\n postsWithMediaType: CLIOptionValidator.validateIncludeContentWithMediaType(pickDefined(commandLineOptions.include?.postsWithMediaType, configFileOptions?.include?.postsWithMediaType)),\n postsInTier: CLIOptionValidator.validateIncludeContentInTier(pickDefined(commandLineOptions.include?.postsInTier, configFileOptions?.include?.postsInTier)),\n campaignInfo: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.campaignInfo, configFileOptions?.include?.campaignInfo)),\n contentInfo: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.contentInfo, configFileOptions?.include?.contentInfo)),\n previewMedia: CLIOptionValidator.validateIncludePreviewMedia(pickDefined(commandLineOptions.include?.previewMedia, configFileOptions?.include?.previewMedia)),\n contentMedia: CLIOptionValidator.validateIncludeContentMedia(pickDefined(commandLineOptions.include?.contentMedia, configFileOptions?.include?.contentMedia)),\n allMediaVariants: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.allMediaVariants, configFileOptions?.include?.allMediaVariants))\n };\n}\n\nfunction getEmbedDownloaderOptions(configFileOptions?: ConfigFileParseResult | null) {\n if (configFileOptions?.embedDownloaders) {\n return configFileOptions?.embedDownloaders.map((dl) => ({\n provider: CLIOptionValidator.validateRequired(dl.provider),\n exec: CLIOptionValidator.validateRequired(dl.exec)\n }));\n }\n return undefined;\n}\n\nfunction readTargetsFile(file: string) {\n const includeKeys: Record<keyof DownloaderIncludeOptions, string> = {\n lockedContent: 'include.locked.content',\n postsWithMediaType: 'include.posts.with.media.type',\n postsInTier: 'include.posts.in.tier',\n campaignInfo: 'include.campaign.info',\n contentInfo: 'include.content.info',\n previewMedia: 'include.preview.media',\n contentMedia: 'include.content.media',\n allMediaVariants: 'include.all.media.variants'\n };\n\n const lines = fs.readFileSync(file)\n .toString('utf-8')\n // Replace Windows line breaks with Unix ones and then split\n .replace(/\\r\\n/g, '\\n').split('\\n')\n .map((line) => line.trim());\n\n const currentTargets: { url: string; include?: Partial<Record<keyof DownloaderIncludeOptions, CLIOptionParserEntry>>; }[] = [];\n for (let ln = 0; ln < lines.length; ln++) {\n const line = lines[ln];\n if (line === '' || line.startsWith('#')) {\n continue;\n }\n try {\n const match = Object.entries(includeKeys).find((e) => line.startsWith(e[1]));\n if (match) {\n const [ optName, matchKey ] = match;\n const eq = line.indexOf('=');\n const propValue = (eq >= matchKey.length ? line.substring(eq + 1) : '').trim();\n if (propValue) {\n const target = currentTargets.at(-1);\n if (target) {\n if (!target.include) {\n target.include = {};\n }\n target.include[optName as keyof DownloaderIncludeOptions] = {\n key: matchKey,\n line: ln,\n src: 'tgt',\n value: propValue\n };\n }\n }\n }\n else {\n const url = CLIOptionValidator.validateTargetURL(line);\n currentTargets.push({ url });\n }\n }\n catch (error) {\n const errMsg = error instanceof Error ? error.message : error;\n throw Error(`Error parsing targets file (line ${ln})${errMsg ? `: ${errMsg}` : ''}`);\n }\n }\n\n const result: CLITargetURLEntry[] = [];\n for (const target of currentTargets) {\n const v: CLITargetURLEntry = { url: target.url };\n if (target.include) {\n v.include = getCLIIncludeOptions(target);\n }\n result.push(v);\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"CLIOptions.js","sourceRoot":"","sources":["../../src/cli/CLIOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { DownloaderIncludeOptions, DownloaderOptions } from '../downloaders/DownloaderOptions.js';\nimport { pickDefined } from '../utils/Misc.js';\nimport { ConsoleLoggerOptions } from '../utils/logging/ConsoleLogger.js';\nimport { FileLoggerOptions } from '../utils/logging/FileLogger.js';\nimport CLIOptionValidator from './CLIOptionValidator.js';\nimport CommandLineParser, { CommandLineParseResult } from './CommandLineParser.js';\nimport ConfigFileParser, { ConfigFileParseResult } from './ConfigFileParser.js';\nimport path from 'path';\n\nexport interface CLITargetURLEntry {\n url: string;\n // Target-specific 'include' options\n include?: DownloaderIncludeOptions;\n}\n\nexport interface CLIOptions extends Omit<DownloaderOptions, 'logger'> {\n targetURLs: CLITargetURLEntry[];\n noPrompt: boolean;\n consoleLogger: ConsoleLoggerOptions;\n fileLoggers?: FileLoggerOptions[];\n}\n\nexport type CLIOptionParserEntry = ({\n src: 'cli'\n} | {\n src: 'cfg',\n section: string\n} | {\n src: 'tgt',\n line: number\n}) & {\n key: string;\n value?: string;\n}\n\nexport function getCLIOptions(): CLIOptions {\n const commandLineOptions = CommandLineParser.parse();\n\n const configFileOptions = commandLineOptions.configFile?.value ? ConfigFileParser.parse(commandLineOptions.configFile.value) : null;\n\n let targetURLs: CLITargetURLEntry[];\n const targetURLValue = CLIOptionValidator.validateRequired(pickDefined(commandLineOptions.targetURLs, configFileOptions?.targetURLs), 'No target URL specified');\n const targetsFile = path.resolve(targetURLValue);\n if (fs.existsSync(targetsFile)) {\n targetURLs = readTargetsFile(targetsFile);\n }\n else {\n targetURLs = CLIOptionValidator\n .validateTargetURLs(targetURLValue)\n .map((url) => ({ url }));\n }\n\n const { consoleLogger, fileLoggers } = getCLILoggerOptions(commandLineOptions, configFileOptions);\n\n const options: CLIOptions = {\n targetURLs,\n cookie: CLIOptionValidator.validateString(pickDefined(commandLineOptions.cookie, configFileOptions?.cookie)),\n useStatusCache: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.useStatusCache, configFileOptions?.useStatusCache)),\n pathToFFmpeg: CLIOptionValidator.validateString(pickDefined(commandLineOptions.pathToFFmpeg, configFileOptions?.pathToFFmpeg)),\n outDir: CLIOptionValidator.validateString(pickDefined(commandLineOptions.outDir, configFileOptions?.outDir)),\n dirNameFormat: {\n campaign: CLIOptionValidator.validateString(pickDefined(commandLineOptions.dirNameFormat?.campaign, configFileOptions?.dirNameFormat?.campaign)),\n content: CLIOptionValidator.validateString(pickDefined(commandLineOptions.dirNameFormat?.content, configFileOptions?.dirNameFormat?.content))\n },\n filenameFormat: {\n media: CLIOptionValidator.validateString(pickDefined(commandLineOptions.filenameFormat?.media, configFileOptions?.filenameFormat?.media))\n },\n include: getCLIIncludeOptions(commandLineOptions, configFileOptions),\n request: {\n maxRetries: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.maxRetries, configFileOptions?.request?.maxRetries)),\n maxConcurrent: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.maxConcurrent, configFileOptions?.request?.maxConcurrent)),\n minTime: CLIOptionValidator.validateNumber(pickDefined(commandLineOptions?.request?.minTime, configFileOptions?.request?.minTime))\n },\n fileExistsAction: {\n content: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.content, configFileOptions?.fileExistsAction?.content), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer'),\n info: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.info, configFileOptions?.fileExistsAction?.info), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer'),\n infoAPI: CLIOptionValidator.validateString(pickDefined(commandLineOptions.fileExistsAction?.infoAPI, configFileOptions?.fileExistsAction?.infoAPI), 'overwrite', 'skip', 'saveAsCopy', 'saveAsCopyIfNewer')\n },\n embedDownloaders: getEmbedDownloaderOptions(configFileOptions),\n noPrompt: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.noPrompt, configFileOptions?.noPrompt)) || false,\n dryRun: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.dryRun, configFileOptions?.dryRun)) || false,\n consoleLogger,\n fileLoggers\n };\n\n return options;\n}\n\nexport function getCLILoggerOptions(commandLineOptions?: CommandLineParseResult, configFileOptions?: ReturnType<typeof ConfigFileParser['parse']> | null) {\n if (!commandLineOptions) {\n commandLineOptions = CommandLineParser.parse();\n }\n const consoleLogger = {\n enabled: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.enabled, configFileOptions?.consoleLogger?.enabled)),\n logLevel: CLIOptionValidator.validateString(pickDefined(commandLineOptions.consoleLogger?.logLevel, configFileOptions?.consoleLogger?.logLevel), 'info', 'debug', 'warn', 'error'),\n include: {\n dateTime: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.dateTime, configFileOptions?.consoleLogger?.include?.dateTime)),\n level: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.level, configFileOptions?.consoleLogger?.include?.level)),\n originator: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.originator, configFileOptions?.consoleLogger?.include?.originator)),\n errorStack: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.include?.errorStack, configFileOptions?.consoleLogger?.include?.errorStack))\n },\n dateTimeFormat: CLIOptionValidator.validateString(pickDefined(commandLineOptions.consoleLogger?.dateTimeFormat, configFileOptions?.consoleLogger?.dateTimeFormat)),\n color: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.consoleLogger?.color, configFileOptions?.consoleLogger?.color))\n };\n let fileLoggers;\n if (configFileOptions?.fileLoggers) {\n fileLoggers = configFileOptions.fileLoggers.map((logger): FileLoggerOptions => ({\n enabled: CLIOptionValidator.validateBoolean(logger.enabled),\n logDir: CLIOptionValidator.validateString(logger.logDir),\n logFilename: CLIOptionValidator.validateString(logger.logFilename),\n fileExistsAction: CLIOptionValidator.validateString(logger.fileExistsAction, 'append', 'overwrite'),\n logLevel: CLIOptionValidator.validateString(logger.logLevel, 'info', 'debug', 'warn', 'error'),\n include: {\n dateTime: CLIOptionValidator.validateBoolean(logger.include?.dateTime),\n level: CLIOptionValidator.validateBoolean(logger.include?.level),\n originator: CLIOptionValidator.validateBoolean(logger.include?.originator),\n errorStack: CLIOptionValidator.validateBoolean(logger.include?.errorStack)\n },\n dateTimeFormat: CLIOptionValidator.validateString(logger.dateTimeFormat),\n color: CLIOptionValidator.validateBoolean(logger.color)\n }));\n }\n return {\n consoleLogger,\n fileLoggers\n };\n}\n\nfunction getCLIIncludeOptions(commandLineOptions: CommandLineParseResult, configFileOptions?: ConfigFileParseResult | null) {\n if (!commandLineOptions) {\n commandLineOptions = CommandLineParser.parse();\n }\n return {\n lockedContent: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.lockedContent, configFileOptions?.include?.lockedContent)),\n postsWithMediaType: CLIOptionValidator.validateIncludeContentWithMediaType(pickDefined(commandLineOptions.include?.postsWithMediaType, configFileOptions?.include?.postsWithMediaType)),\n postsInTier: CLIOptionValidator.validateIncludeContentInTier(pickDefined(commandLineOptions.include?.postsInTier, configFileOptions?.include?.postsInTier)),\n campaignInfo: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.campaignInfo, configFileOptions?.include?.campaignInfo)),\n contentInfo: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.contentInfo, configFileOptions?.include?.contentInfo)),\n previewMedia: CLIOptionValidator.validateIncludePreviewMedia(pickDefined(commandLineOptions.include?.previewMedia, configFileOptions?.include?.previewMedia)),\n contentMedia: CLIOptionValidator.validateIncludeContentMedia(pickDefined(commandLineOptions.include?.contentMedia, configFileOptions?.include?.contentMedia)),\n allMediaVariants: CLIOptionValidator.validateBoolean(pickDefined(commandLineOptions.include?.allMediaVariants, configFileOptions?.include?.allMediaVariants))\n };\n}\n\nfunction getEmbedDownloaderOptions(configFileOptions?: ConfigFileParseResult | null) {\n if (configFileOptions?.embedDownloaders) {\n return configFileOptions?.embedDownloaders.map((dl) => ({\n provider: CLIOptionValidator.validateRequired(dl.provider),\n exec: CLIOptionValidator.validateRequired(dl.exec)\n }));\n }\n return undefined;\n}\n\nfunction readTargetsFile(file: string) {\n const includeKeys: Record<keyof DownloaderIncludeOptions, string> = {\n lockedContent: 'include.locked.content',\n postsWithMediaType: 'include.posts.with.media.type',\n postsInTier: 'include.posts.in.tier',\n campaignInfo: 'include.campaign.info',\n contentInfo: 'include.content.info',\n previewMedia: 'include.preview.media',\n contentMedia: 'include.content.media',\n allMediaVariants: 'include.all.media.variants'\n };\n\n const lines = fs.readFileSync(file)\n .toString('utf-8')\n // Replace Windows line breaks with Unix ones and then split\n .replace(/\\r\\n/g, '\\n').split('\\n')\n .map((line) => line.trim());\n\n const currentTargets: { url: string; include?: Partial<Record<keyof DownloaderIncludeOptions, CLIOptionParserEntry>>; }[] = [];\n for (let ln = 0; ln < lines.length; ln++) {\n const line = lines[ln];\n if (line === '' || line.startsWith('#')) {\n continue;\n }\n try {\n const match = Object.entries(includeKeys).find((e) => line.startsWith(e[1]));\n if (match) {\n const [ optName, matchKey ] = match;\n const eq = line.indexOf('=');\n const propValue = (eq >= matchKey.length ? line.substring(eq + 1) : '').trim();\n if (propValue) {\n const target = currentTargets.at(-1);\n if (target) {\n if (!target.include) {\n target.include = {};\n }\n target.include[optName as keyof DownloaderIncludeOptions] = {\n key: matchKey,\n line: ln,\n src: 'tgt',\n value: propValue\n };\n }\n }\n }\n else {\n const url = CLIOptionValidator.validateTargetURL(line);\n currentTargets.push({ url });\n }\n }\n catch (error) {\n const errMsg = error instanceof Error ? error.message : error;\n throw Error(`Error parsing targets file (line ${ln})${errMsg ? `: ${errMsg}` : ''}`);\n }\n }\n\n const result: CLITargetURLEntry[] = [];\n for (const target of currentTargets) {\n const v: CLITargetURLEntry = { url: target.url };\n if (target.include) {\n v.include = getCLIIncludeOptions(target);\n }\n result.push(v);\n }\n\n return result;\n}\n"]}
@@ -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;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"}
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;AA+FD,MAAM,CAAC,OAAO,OAAO,iBAAiB;;IAEpC,MAAM,CAAC,KAAK,IAAI,sBAAsB;IAsGtC,MAAM,CAAC,SAAS;IAyChB,MAAM,CAAC,gBAAgB;IAWvB,MAAM,CAAC,SAAS;;;;CAiDjB"}
@@ -18,6 +18,7 @@ const COMMAND_LINE_ARGS = {
18
18
  outDir: 'out-dir',
19
19
  logLevel: 'log-level',
20
20
  noPrompt: 'no-prompt',
21
+ dryRun: 'dry-run',
21
22
  listTiers: 'list-tiers',
22
23
  listTiersByUserId: 'list-tiers-uid'
23
24
  };
@@ -75,6 +76,11 @@ const OPT_DEFS = [
75
76
  alias: 'y',
76
77
  type: Boolean
77
78
  },
79
+ {
80
+ name: COMMAND_LINE_ARGS.dryRun,
81
+ description: 'Run without writing files to disk (except logs, if any). For testing / debugging.',
82
+ type: Boolean
83
+ },
78
84
  {
79
85
  name: COMMAND_LINE_ARGS.listTiers,
80
86
  description: 'List tiers for the given creator(s). Separate multiple creators with a comma.',
@@ -110,10 +116,14 @@ export default class CommandLineParser {
110
116
  };
111
117
  const __getValue = (key) => {
112
118
  let value = opts[key];
113
- if (key === COMMAND_LINE_ARGS.noPrompt && value !== undefined) {
119
+ const booleanTypeArgs = [
120
+ COMMAND_LINE_ARGS.noPrompt,
121
+ COMMAND_LINE_ARGS.dryRun
122
+ ];
123
+ if (booleanTypeArgs.includes(key) && value !== undefined) {
114
124
  value = '1';
115
125
  }
116
- else if (value === null) {
126
+ if (value === null) {
117
127
  throw Error(`Command-line option requires a value for '--${key}'`);
118
128
  }
119
129
  if (value && typeof value === 'string') {
@@ -170,6 +180,7 @@ export default class CommandLineParser {
170
180
  infoAPI: undefined
171
181
  },
172
182
  noPrompt: __getValue(COMMAND_LINE_ARGS.noPrompt),
183
+ dryRun: __getValue(COMMAND_LINE_ARGS.dryRun),
173
184
  consoleLogger: {
174
185
  enabled: consoleLoggerEnabled,
175
186
  logLevel: consoleLoggerLevel,
@@ -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 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
+ {"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 dryRun: 'dry-run',\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.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\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 ];\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 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 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) {\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":"ConfigFileParser.d.ts","sourceRoot":"","sources":["../../src/cli/ConfigFileParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAoEjE,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,oBAAoB,CAAC,GAAG;IACxH,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,gBAAgB;;IAEnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB;CAkIlD"}
1
+ {"version":3,"file":"ConfigFileParser.d.ts","sourceRoot":"","sources":["../../src/cli/ConfigFileParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAqEjE,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,oBAAoB,CAAC,GAAG;IACxH,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,gBAAgB;;IAEnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB;CAmIlD"}
@@ -11,6 +11,7 @@ const CONFIG_FILE_PROPS = {
11
11
  useStatusCache: 'downloader:use.status.cache',
12
12
  noPrompt: 'downloader:no.prompt',
13
13
  pathToFFmpeg: 'downloader:path.to.ffmpeg',
14
+ dryRun: 'downloader:dry.run',
14
15
  outDir: 'output:out.dir',
15
16
  dirNameFormat: {
16
17
  campaign: 'output:campaign.dir.name.format',
@@ -111,6 +112,7 @@ export default class ConfigFileParser {
111
112
  infoAPI: __getValue(CONFIG_FILE_PROPS.fileExistsAction.infoAPI)
112
113
  },
113
114
  noPrompt: __getValue(CONFIG_FILE_PROPS.noPrompt),
115
+ dryRun: __getValue(CONFIG_FILE_PROPS.dryRun),
114
116
  consoleLogger: {
115
117
  enabled: __getValue(CONFIG_FILE_PROPS.consoleLogger.enabled),
116
118
  logLevel: __getValue(CONFIG_FILE_PROPS.consoleLogger.logLevel),
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigFileParser.js","sourceRoot":"","sources":["../../src/cli/ConfigFileParser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,YAAY,MAAM,cAAc,CAAC;AAIxC,MAAM,iBAAiB,GAAG;IACxB,SAAS,EAAE,uBAAuB;IAClC,MAAM,EAAE,mBAAmB;IAC3B,cAAc,EAAE,6BAA6B;IAC7C,QAAQ,EAAE,sBAAsB;IAChC,YAAY,EAAE,2BAA2B;IACzC,MAAM,EAAE,gBAAgB;IACxB,aAAa,EAAE;QACb,QAAQ,EAAE,iCAAiC;QAC3C,OAAO,EAAE,gCAAgC;KAC1C;IACD,cAAc,EAAE;QACd,KAAK,EAAE,8BAA8B;KACtC;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,oCAAoC;KAC9C;IACD,OAAO,EAAE;QACP,aAAa,EAAE,wBAAwB;QACvC,kBAAkB,EAAE,+BAA+B;QACnD,WAAW,EAAE,uBAAuB;QACpC,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,uBAAuB;QACrC,YAAY,EAAE,uBAAuB;QACrC,gBAAgB,EAAE,4BAA4B;KAC/C;IACD,OAAO,EAAE;QACP,UAAU,EAAE,qBAAqB;QACjC,aAAa,EAAE,wBAAwB;QACvC,OAAO,EAAE,kBAAkB;KAC5B;IACD,aAAa,EAAE;QACb,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,0BAA0B;QACpC,OAAO,EAAE;YACP,QAAQ,EAAE,kCAAkC;YAC5C,KAAK,EAAE,8BAA8B;YACrC,UAAU,EAAE,mCAAmC;YAC/C,UAAU,EAAE,oCAAoC;SACjD;QACD,cAAc,EAAE,iCAAiC;QACjD,KAAK,EAAE,sBAAsB;KAC9B;IACD,UAAU,EAAE;QACV,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,eAAe;QAC5B,gBAAgB,EAAE,qBAAqB;QACvC,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE,oBAAoB;YAC9B,KAAK,EAAE,gBAAgB;YACvB,UAAU,EAAE,qBAAqB;YACjC,UAAU,EAAE,sBAAsB;SACnC;QACD,cAAc,EAAE,mBAAmB;QACnC,KAAK,EAAE,QAAQ;KAChB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,OAAO;KACd;CACF,CAAC;AAMF,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAEnC,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElB,MAAM,UAAU,GAAG,CAAC,IAAY,EAAoC,EAAE;YACpE,OAAO,uBAAA,IAAI,sDAA0B,MAA9B,IAAI,EAA2B,MAAM,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,OAAO;YACL,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC;YACnD,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC5C,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC,cAAc,CAAC;YAC5D,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACxD,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAC5C,aAAa,EAAE;gBACb,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAC9D,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC;aAC7D;YACD,cAAc,EAAE;gBACd,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC;aAC1D;YACD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC;gBAClE,kBAAkB,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBAC5E,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC9D,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC;gBAChE,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC9D,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC;gBAChE,YAAY,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC;gBAChE,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,CAAC;aACzE;YACD,OAAO,EAAE;gBACP,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC;gBAC5D,aAAa,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC;gBAClE,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;aACvD;YACD,gBAAgB,EAAE;gBAChB,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC;gBAC/D,IAAI,EAAE,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzD,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC;aAChE;YACD,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAChD,aAAa,EAAE;gBACb,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC;gBAC5D,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAC9D,OAAO,EAAE;oBACP,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACtE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;oBAChE,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC;oBAC1E,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC;iBAC3E;gBACD,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,cAAc,CAAC;gBAC1E,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC;aACzD;YACD,WAAW,EAAE,uBAAA,IAAI,oDAAwB,MAA5B,IAAI,EAAyB,MAAM,CAAC;YACjD,gBAAgB,EAAE,uBAAA,IAAI,yDAA6B,MAAjC,IAAI,EAA8B,MAAM,CAAC;SAC5D,CAAC;IACJ,CAAC;CAwEF;wHAtEkC,MAAoB,EAAE,IAAY;IACjE,MAAM,CAAE,OAAO,EAAE,GAAG,CAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACzD,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;KAC9C;IACD,IAAI,KAAK,EAAE;QACT,OAAO;YACL,GAAG,EAAE,KAAK;YACV,OAAO;YACP,GAAG;YACH,KAAK;SACN,CAAC;KACH;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,+FAE8B,MAAoB;IACjD,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,IAAY,EAAoC,EAAE;QACrF,OAAO,uBAAA,IAAI,sDAA0B,MAA9B,IAAI,EAA2B,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3F,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAoD,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACrG,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC;YAClE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC;YAChE,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC;YAC1E,gBAAgB,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,gBAAgB,CAAC;YACpF,QAAQ,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC;YACpE,OAAO,EAAE;gBACP,QAAQ,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC5E,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtE,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;gBAChF,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;aACjF;YACD,cAAc,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,cAAc,CAAC;YAChF,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC,yGAEmC,MAAoB;IACtD,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,IAAY,EAAoC,EAAE;QACrF,OAAO,uBAAA,IAAI,sDAA0B,MAA9B,IAAI,EAA2B,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;IAChD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAyD,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACnH,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtE,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,KAAK,CAAC,kFAAkF,CAAC,CAAC;SACjG;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,QAAQ,CAAC,EAAE;YACxD,MAAM,KAAK,CAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAC;SAC5E;QACD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;YACnG,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC;SAClE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC","sourcesContent":["import ConfigParser from 'configparser';\nimport { CLIOptionParserEntry, CLIOptions } from './CLIOptions.js';\nimport { DeepPartial, RecursivePropsTo } from '../utils/Misc.js';\n\nconst CONFIG_FILE_PROPS = {\n targetURL: 'downloader:target.url',\n cookie: 'downloader:cookie',\n useStatusCache: 'downloader:use.status.cache',\n noPrompt: 'downloader:no.prompt',\n pathToFFmpeg: 'downloader:path.to.ffmpeg',\n outDir: 'output:out.dir',\n dirNameFormat: {\n campaign: 'output:campaign.dir.name.format',\n content: 'output:content.dir.name.format'\n },\n filenameFormat: {\n media: 'output:media.filename.format'\n },\n fileExistsAction: {\n content: 'output:content.file.exists.action',\n info: 'output:info.file.exists.action',\n infoAPI: 'output:info.api.file.exists.action'\n },\n include: {\n lockedContent: 'include:locked.content',\n postsWithMediaType: 'include:posts.with.media.type',\n postsInTier: 'include:posts.in.tier',\n campaignInfo: 'include:campaign.info',\n contentInfo: 'include:content.info',\n previewMedia: 'include:preview.media',\n contentMedia: 'include:content.media',\n allMediaVariants: 'include:all.media.variants'\n },\n request: {\n maxRetries: 'request:max.retries',\n maxConcurrent: 'request:max.concurrent',\n minTime: 'request:min.time'\n },\n consoleLogger: {\n enabled: 'logger.console:enabled',\n logLevel: 'logger.console:log.level',\n include: {\n dateTime: 'logger.console:include.date.time',\n level: 'logger.console:include.level',\n originator: 'logger.console:include.originator',\n errorStack: 'logger.console:include.error.stack'\n },\n dateTimeFormat: 'logger.console:date.time.format',\n color: 'logger.console:color'\n },\n fileLogger: {\n enabled: ':enabled',\n logDir: ':log.dir',\n logFilename: ':log.filename',\n fileExistsAction: ':file.exists.action',\n logLevel: ':log.level',\n include: {\n dateTime: ':include.date.time',\n level: ':include.level',\n originator: ':include.originator',\n errorStack: ':include.error.stack'\n },\n dateTimeFormat: ':date.time.format',\n color: ':color'\n },\n embedDownloader: {\n exec: ':exec'\n }\n};\n\nexport type ConfigFileParseResult = RecursivePropsTo<DeepPartial<Omit<CLIOptions, 'targetURLs'>>, CLIOptionParserEntry> & {\n targetURLs?: CLIOptionParserEntry;\n};\n\nexport default class ConfigFileParser {\n\n static parse(file: string): ConfigFileParseResult {\n const parser = new ConfigParser();\n\n parser.read(file);\n\n const __getValue = (prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, prop);\n };\n\n return {\n targetURLs: __getValue(CONFIG_FILE_PROPS.targetURL),\n cookie: __getValue(CONFIG_FILE_PROPS.cookie),\n useStatusCache: __getValue(CONFIG_FILE_PROPS.useStatusCache),\n pathToFFmpeg: __getValue(CONFIG_FILE_PROPS.pathToFFmpeg),\n outDir: __getValue(CONFIG_FILE_PROPS.outDir),\n dirNameFormat: {\n campaign: __getValue(CONFIG_FILE_PROPS.dirNameFormat.campaign),\n content: __getValue(CONFIG_FILE_PROPS.dirNameFormat.content)\n },\n filenameFormat: {\n media: __getValue(CONFIG_FILE_PROPS.filenameFormat.media)\n },\n include: {\n lockedContent: __getValue(CONFIG_FILE_PROPS.include.lockedContent),\n postsWithMediaType: __getValue(CONFIG_FILE_PROPS.include.postsWithMediaType),\n postsInTier: __getValue(CONFIG_FILE_PROPS.include.postsInTier),\n campaignInfo: __getValue(CONFIG_FILE_PROPS.include.campaignInfo),\n contentInfo: __getValue(CONFIG_FILE_PROPS.include.contentInfo),\n previewMedia: __getValue(CONFIG_FILE_PROPS.include.previewMedia),\n contentMedia: __getValue(CONFIG_FILE_PROPS.include.contentMedia),\n allMediaVariants: __getValue(CONFIG_FILE_PROPS.include.allMediaVariants)\n },\n request: {\n maxRetries: __getValue(CONFIG_FILE_PROPS.request.maxRetries),\n maxConcurrent: __getValue(CONFIG_FILE_PROPS.request.maxConcurrent),\n minTime: __getValue(CONFIG_FILE_PROPS.request.minTime)\n },\n fileExistsAction: {\n content: __getValue(CONFIG_FILE_PROPS.fileExistsAction.content),\n info: __getValue(CONFIG_FILE_PROPS.fileExistsAction.info),\n infoAPI: __getValue(CONFIG_FILE_PROPS.fileExistsAction.infoAPI)\n },\n noPrompt: __getValue(CONFIG_FILE_PROPS.noPrompt),\n consoleLogger: {\n enabled: __getValue(CONFIG_FILE_PROPS.consoleLogger.enabled),\n logLevel: __getValue(CONFIG_FILE_PROPS.consoleLogger.logLevel),\n include: {\n dateTime: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.dateTime),\n level: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.level),\n originator: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.originator),\n errorStack: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.errorStack)\n },\n dateTimeFormat: __getValue(CONFIG_FILE_PROPS.consoleLogger.dateTimeFormat),\n color: __getValue(CONFIG_FILE_PROPS.consoleLogger.color)\n },\n fileLoggers: this.#parseFileLoggerOptions(parser),\n embedDownloaders: this.#parseEmbedDownloaderOptions(parser)\n };\n }\n\n static #getValueFromConfigParser(parser: ConfigParser, prop: string): CLIOptionParserEntry | undefined {\n const [ section, key ] = prop.split(':');\n let value = parser.get(section, key, true)?.trim();\n if (value && value.startsWith('\"') && value.endsWith('\"')) {\n value = value.substring(1, value.length - 1);\n }\n if (value) {\n return {\n src: 'cfg',\n section,\n key,\n value\n };\n }\n return undefined;\n }\n\n static #parseFileLoggerOptions(parser: ConfigParser) {\n const __getValue = (section: string, prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, `${section}${prop}`);\n };\n\n const sections = parser.sections().filter((section) => section.startsWith('logger.file.'));\n\n const loggers = sections.reduce<NonNullable<ConfigFileParseResult['fileLoggers']>>((result, section) => {\n result.push({\n enabled: __getValue(section, CONFIG_FILE_PROPS.fileLogger.enabled),\n logDir: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logDir),\n logFilename: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logFilename),\n fileExistsAction: __getValue(section, CONFIG_FILE_PROPS.fileLogger.fileExistsAction),\n logLevel: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logLevel),\n include: {\n dateTime: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.dateTime),\n level: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.level),\n originator: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.originator),\n errorStack: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.errorStack)\n },\n dateTimeFormat: __getValue(section, CONFIG_FILE_PROPS.fileLogger.dateTimeFormat),\n color: __getValue(section, CONFIG_FILE_PROPS.fileLogger.color)\n });\n return result;\n }, []);\n\n return loggers.length > 0 ? loggers : undefined;\n }\n\n static #parseEmbedDownloaderOptions(parser: ConfigParser) {\n const __getValue = (section: string, prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, `${section}${prop}`);\n };\n\n const sections = parser.sections().filter((section) => section.startsWith('embed.downloader.'));\n const prefixLength = 'embed.downloader.'.length;\n const embedDownloaders = sections.reduce<NonNullable<ConfigFileParseResult['embedDownloaders']>>((result, section) => {\n const provider = section.substring(prefixLength).trim().toLowerCase();\n if (!provider) {\n throw Error('Config file section \\'embed.downloader.<provider>\\' is missing the provider name');\n }\n if (result.find((dl) => dl.provider?.value === provider)) {\n throw Error(`Duplicate config file section 'embed.downloader.${provider}`);\n }\n result.push({\n provider: { src: 'cfg', section: `embed.downloader.${provider}`, key: 'provider', value: provider },\n exec: __getValue(section, CONFIG_FILE_PROPS.embedDownloader.exec)\n });\n return result;\n }, []);\n\n return embedDownloaders.length > 0 ? embedDownloaders : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"ConfigFileParser.js","sourceRoot":"","sources":["../../src/cli/ConfigFileParser.ts"],"names":[],"mappings":"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","sourcesContent":["import ConfigParser from 'configparser';\nimport { CLIOptionParserEntry, CLIOptions } from './CLIOptions.js';\nimport { DeepPartial, RecursivePropsTo } from '../utils/Misc.js';\n\nconst CONFIG_FILE_PROPS = {\n targetURL: 'downloader:target.url',\n cookie: 'downloader:cookie',\n useStatusCache: 'downloader:use.status.cache',\n noPrompt: 'downloader:no.prompt',\n pathToFFmpeg: 'downloader:path.to.ffmpeg',\n dryRun: 'downloader:dry.run',\n outDir: 'output:out.dir',\n dirNameFormat: {\n campaign: 'output:campaign.dir.name.format',\n content: 'output:content.dir.name.format'\n },\n filenameFormat: {\n media: 'output:media.filename.format'\n },\n fileExistsAction: {\n content: 'output:content.file.exists.action',\n info: 'output:info.file.exists.action',\n infoAPI: 'output:info.api.file.exists.action'\n },\n include: {\n lockedContent: 'include:locked.content',\n postsWithMediaType: 'include:posts.with.media.type',\n postsInTier: 'include:posts.in.tier',\n campaignInfo: 'include:campaign.info',\n contentInfo: 'include:content.info',\n previewMedia: 'include:preview.media',\n contentMedia: 'include:content.media',\n allMediaVariants: 'include:all.media.variants'\n },\n request: {\n maxRetries: 'request:max.retries',\n maxConcurrent: 'request:max.concurrent',\n minTime: 'request:min.time'\n },\n consoleLogger: {\n enabled: 'logger.console:enabled',\n logLevel: 'logger.console:log.level',\n include: {\n dateTime: 'logger.console:include.date.time',\n level: 'logger.console:include.level',\n originator: 'logger.console:include.originator',\n errorStack: 'logger.console:include.error.stack'\n },\n dateTimeFormat: 'logger.console:date.time.format',\n color: 'logger.console:color'\n },\n fileLogger: {\n enabled: ':enabled',\n logDir: ':log.dir',\n logFilename: ':log.filename',\n fileExistsAction: ':file.exists.action',\n logLevel: ':log.level',\n include: {\n dateTime: ':include.date.time',\n level: ':include.level',\n originator: ':include.originator',\n errorStack: ':include.error.stack'\n },\n dateTimeFormat: ':date.time.format',\n color: ':color'\n },\n embedDownloader: {\n exec: ':exec'\n }\n};\n\nexport type ConfigFileParseResult = RecursivePropsTo<DeepPartial<Omit<CLIOptions, 'targetURLs'>>, CLIOptionParserEntry> & {\n targetURLs?: CLIOptionParserEntry;\n};\n\nexport default class ConfigFileParser {\n\n static parse(file: string): ConfigFileParseResult {\n const parser = new ConfigParser();\n\n parser.read(file);\n\n const __getValue = (prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, prop);\n };\n\n return {\n targetURLs: __getValue(CONFIG_FILE_PROPS.targetURL),\n cookie: __getValue(CONFIG_FILE_PROPS.cookie),\n useStatusCache: __getValue(CONFIG_FILE_PROPS.useStatusCache),\n pathToFFmpeg: __getValue(CONFIG_FILE_PROPS.pathToFFmpeg),\n outDir: __getValue(CONFIG_FILE_PROPS.outDir),\n dirNameFormat: {\n campaign: __getValue(CONFIG_FILE_PROPS.dirNameFormat.campaign),\n content: __getValue(CONFIG_FILE_PROPS.dirNameFormat.content)\n },\n filenameFormat: {\n media: __getValue(CONFIG_FILE_PROPS.filenameFormat.media)\n },\n include: {\n lockedContent: __getValue(CONFIG_FILE_PROPS.include.lockedContent),\n postsWithMediaType: __getValue(CONFIG_FILE_PROPS.include.postsWithMediaType),\n postsInTier: __getValue(CONFIG_FILE_PROPS.include.postsInTier),\n campaignInfo: __getValue(CONFIG_FILE_PROPS.include.campaignInfo),\n contentInfo: __getValue(CONFIG_FILE_PROPS.include.contentInfo),\n previewMedia: __getValue(CONFIG_FILE_PROPS.include.previewMedia),\n contentMedia: __getValue(CONFIG_FILE_PROPS.include.contentMedia),\n allMediaVariants: __getValue(CONFIG_FILE_PROPS.include.allMediaVariants)\n },\n request: {\n maxRetries: __getValue(CONFIG_FILE_PROPS.request.maxRetries),\n maxConcurrent: __getValue(CONFIG_FILE_PROPS.request.maxConcurrent),\n minTime: __getValue(CONFIG_FILE_PROPS.request.minTime)\n },\n fileExistsAction: {\n content: __getValue(CONFIG_FILE_PROPS.fileExistsAction.content),\n info: __getValue(CONFIG_FILE_PROPS.fileExistsAction.info),\n infoAPI: __getValue(CONFIG_FILE_PROPS.fileExistsAction.infoAPI)\n },\n noPrompt: __getValue(CONFIG_FILE_PROPS.noPrompt),\n dryRun: __getValue(CONFIG_FILE_PROPS.dryRun),\n consoleLogger: {\n enabled: __getValue(CONFIG_FILE_PROPS.consoleLogger.enabled),\n logLevel: __getValue(CONFIG_FILE_PROPS.consoleLogger.logLevel),\n include: {\n dateTime: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.dateTime),\n level: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.level),\n originator: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.originator),\n errorStack: __getValue(CONFIG_FILE_PROPS.consoleLogger.include.errorStack)\n },\n dateTimeFormat: __getValue(CONFIG_FILE_PROPS.consoleLogger.dateTimeFormat),\n color: __getValue(CONFIG_FILE_PROPS.consoleLogger.color)\n },\n fileLoggers: this.#parseFileLoggerOptions(parser),\n embedDownloaders: this.#parseEmbedDownloaderOptions(parser)\n };\n }\n\n static #getValueFromConfigParser(parser: ConfigParser, prop: string): CLIOptionParserEntry | undefined {\n const [ section, key ] = prop.split(':');\n let value = parser.get(section, key, true)?.trim();\n if (value && value.startsWith('\"') && value.endsWith('\"')) {\n value = value.substring(1, value.length - 1);\n }\n if (value) {\n return {\n src: 'cfg',\n section,\n key,\n value\n };\n }\n return undefined;\n }\n\n static #parseFileLoggerOptions(parser: ConfigParser) {\n const __getValue = (section: string, prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, `${section}${prop}`);\n };\n\n const sections = parser.sections().filter((section) => section.startsWith('logger.file.'));\n\n const loggers = sections.reduce<NonNullable<ConfigFileParseResult['fileLoggers']>>((result, section) => {\n result.push({\n enabled: __getValue(section, CONFIG_FILE_PROPS.fileLogger.enabled),\n logDir: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logDir),\n logFilename: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logFilename),\n fileExistsAction: __getValue(section, CONFIG_FILE_PROPS.fileLogger.fileExistsAction),\n logLevel: __getValue(section, CONFIG_FILE_PROPS.fileLogger.logLevel),\n include: {\n dateTime: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.dateTime),\n level: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.level),\n originator: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.originator),\n errorStack: __getValue(section, CONFIG_FILE_PROPS.fileLogger.include.errorStack)\n },\n dateTimeFormat: __getValue(section, CONFIG_FILE_PROPS.fileLogger.dateTimeFormat),\n color: __getValue(section, CONFIG_FILE_PROPS.fileLogger.color)\n });\n return result;\n }, []);\n\n return loggers.length > 0 ? loggers : undefined;\n }\n\n static #parseEmbedDownloaderOptions(parser: ConfigParser) {\n const __getValue = (section: string, prop: string): CLIOptionParserEntry | undefined => {\n return this.#getValueFromConfigParser(parser, `${section}${prop}`);\n };\n\n const sections = parser.sections().filter((section) => section.startsWith('embed.downloader.'));\n const prefixLength = 'embed.downloader.'.length;\n const embedDownloaders = sections.reduce<NonNullable<ConfigFileParseResult['embedDownloaders']>>((result, section) => {\n const provider = section.substring(prefixLength).trim().toLowerCase();\n if (!provider) {\n throw Error('Config file section \\'embed.downloader.<provider>\\' is missing the provider name');\n }\n if (result.find((dl) => dl.provider?.value === provider)) {\n throw Error(`Duplicate config file section 'embed.downloader.${provider}`);\n }\n result.push({\n provider: { src: 'cfg', section: `embed.downloader.${provider}`, key: 'provider', value: provider },\n exec: __getValue(section, CONFIG_FILE_PROPS.embedDownloader.exec)\n });\n return result;\n }, []);\n\n return embedDownloaders.length > 0 ? embedDownloaders : undefined;\n }\n}\n"]}
@@ -70,7 +70,7 @@ Then wait for this script to complete.
70
70
  capturer.on('capture', (credentials) => {
71
71
  try {
72
72
  FSHelper.createDir(path.parse(ytCredsPath).dir);
73
- fs.writeFileSync(ytCredsPath, JSON.stringify(credentials));
73
+ FSHelper.writeFile(ytCredsPath, JSON.stringify(credentials));
74
74
  console.log(`YouTube connected; credentials saved to "${ytCredsPath}"`, EOL);
75
75
  resolve(0);
76
76
  }
@@ -84,7 +84,7 @@ Then wait for this script to complete.
84
84
  }, _YouTubeConfigurator_revokeCredentials = function _YouTubeConfigurator_revokeCredentials(ytCredsPath) {
85
85
  if (fs.existsSync(ytCredsPath)) {
86
86
  try {
87
- fs.unlinkSync(ytCredsPath);
87
+ FSHelper.unlink(ytCredsPath);
88
88
  console.log(`Deleted "${ytCredsPath}"`);
89
89
  return 0;
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"YouTubeConfigurator.js","sourceRoot":"","sources":["../../../src/cli/helper/YouTubeConfigurator.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport PromptSync from 'prompt-sync';\nimport FSHelper from '../../utils/FSHelper.js';\nimport YouTubeCredentialsCapturer from '../../utils/YouTubeCredentialsCapturer.js';\n\nexport default class YouTubeConfigurator {\n\n static async start(ytCredsPath: string) {\n const prompt = PromptSync({ sigint: true });\n\n console.log(`Welcome to patreon-dl YouTube Configurator!\n\nIf you have a YouTube Premium subscription, connecting patreon-dl to your\nYouTube account will allow it to download embedded YouTube videos at\nqualities available only to Premium subscribers, such as '1080p Premium'.\n\nThis script begins the YouTube connection process. During this process,\nYouTube credentials are captured and saved to:\n\n\"${ytCredsPath}\".\n\nWhen patreon-dl starts, the credentials will be loaded and used for\nauthenticating access to Premium-quality YouTube streams.\n\nWhat would you like to do?\n1. Connect to YouTube\n2. Revoke existing YouTube credentials\n`);\n\n const connectOrRevoke = this.#promptInput<'connect' | 'revoke'>(\n prompt,\n 'Enter your choice (1-2): ',\n [ '1', '2' ],\n [ 'connect', 'revoke' ]);\n\n if (connectOrRevoke === 'connect') {\n return await this.#startConnect(ytCredsPath, prompt);\n }\n\n return this.#revokeCredentials(ytCredsPath);\n }\n\n static async #startConnect(ytCredsPath: string, prompt: PromptSync.Prompt) {\n if (fs.existsSync(ytCredsPath)) {\n console.log('YouTube credentials file already exists. Proceeding will overwrite it.');\n const overwriteOrExit = this.#promptInput<'overwrite' | 'exit'>(\n prompt,\n 'Proceed (y/N)? ',\n [ 'y', 'n' ],\n [ 'overwrite', 'exit' ],\n 'exit'\n );\n if (overwriteOrExit === 'exit') {\n console.log('Bye!');\n return 0;\n }\n }\n const code = await this.#doConnectAndSaveCredentials(ytCredsPath);\n if (code === 0) {\n console.log('YouTube connection process completed successfully.');\n }\n else {\n console.log('YouTube connection process ended with error.');\n }\n return code;\n }\n\n static #doConnectAndSaveCredentials(ytCredsPath: string) {\n return new Promise<number>(async (resolve) => {\n const capturer = new YouTubeCredentialsCapturer();\n capturer.on('pending', (data) => {\n console.log(`In a browser, go to the following Verification URL and enter Code:\n\n- Verification URL: ${data.verificationURL}\n- Code: ${data.code}\n\nThen wait for this script to complete.\n`);\n });\n\n capturer.on('capture', (credentials) => {\n try {\n FSHelper.createDir(path.parse(ytCredsPath).dir);\n fs.writeFileSync(ytCredsPath, JSON.stringify(credentials));\n console.log(`YouTube connected; credentials saved to \"${ytCredsPath}\"`, EOL);\n resolve(0);\n }\n catch (error) {\n console.error(`Error saving credentials to \"${ytCredsPath}\": `, error instanceof Error ? error.message : error, EOL);\n resolve(1);\n }\n });\n\n await capturer.begin();\n });\n }\n\n static #revokeCredentials(ytCredsPath: string) {\n if (fs.existsSync(ytCredsPath)) {\n try {\n fs.unlinkSync(ytCredsPath);\n console.log(`Deleted \"${ytCredsPath}\"`);\n return 0;\n }\n catch (error) {\n console.error(`Error deleting \"${ytCredsPath}\": `, error instanceof Error ? error.message : error);\n return 1;\n }\n }\n console.log(`No credentials found: \"${ytCredsPath}\" does not exist.`);\n return 0;\n }\n\n\n static #promptInput<T>(prompt: PromptSync.Prompt, message: string, acceptValues: string[], retValues: T[], defaultValue?: T): T {\n const input = prompt(message).trim().toLowerCase();\n if (!input && defaultValue !== undefined) {\n console.log('');\n return defaultValue;\n }\n const acceptIndex = acceptValues.indexOf(input);\n if (acceptIndex >= 0) {\n console.log('');\n return retValues[acceptIndex];\n }\n return this.#promptInput(prompt, message, acceptValues, retValues);\n }\n}"]}
1
+ {"version":3,"file":"YouTubeConfigurator.js","sourceRoot":"","sources":["../../../src/cli/helper/YouTubeConfigurator.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport path from 'path';\nimport fs from 'fs';\nimport PromptSync from 'prompt-sync';\nimport FSHelper from '../../utils/FSHelper.js';\nimport YouTubeCredentialsCapturer from '../../utils/YouTubeCredentialsCapturer.js';\n\nexport default class YouTubeConfigurator {\n\n static async start(ytCredsPath: string) {\n const prompt = PromptSync({ sigint: true });\n\n console.log(`Welcome to patreon-dl YouTube Configurator!\n\nIf you have a YouTube Premium subscription, connecting patreon-dl to your\nYouTube account will allow it to download embedded YouTube videos at\nqualities available only to Premium subscribers, such as '1080p Premium'.\n\nThis script begins the YouTube connection process. During this process,\nYouTube credentials are captured and saved to:\n\n\"${ytCredsPath}\".\n\nWhen patreon-dl starts, the credentials will be loaded and used for\nauthenticating access to Premium-quality YouTube streams.\n\nWhat would you like to do?\n1. Connect to YouTube\n2. Revoke existing YouTube credentials\n`);\n\n const connectOrRevoke = this.#promptInput<'connect' | 'revoke'>(\n prompt,\n 'Enter your choice (1-2): ',\n [ '1', '2' ],\n [ 'connect', 'revoke' ]);\n\n if (connectOrRevoke === 'connect') {\n return await this.#startConnect(ytCredsPath, prompt);\n }\n\n return this.#revokeCredentials(ytCredsPath);\n }\n\n static async #startConnect(ytCredsPath: string, prompt: PromptSync.Prompt) {\n if (fs.existsSync(ytCredsPath)) {\n console.log('YouTube credentials file already exists. Proceeding will overwrite it.');\n const overwriteOrExit = this.#promptInput<'overwrite' | 'exit'>(\n prompt,\n 'Proceed (y/N)? ',\n [ 'y', 'n' ],\n [ 'overwrite', 'exit' ],\n 'exit'\n );\n if (overwriteOrExit === 'exit') {\n console.log('Bye!');\n return 0;\n }\n }\n const code = await this.#doConnectAndSaveCredentials(ytCredsPath);\n if (code === 0) {\n console.log('YouTube connection process completed successfully.');\n }\n else {\n console.log('YouTube connection process ended with error.');\n }\n return code;\n }\n\n static #doConnectAndSaveCredentials(ytCredsPath: string) {\n return new Promise<number>(async (resolve) => {\n const capturer = new YouTubeCredentialsCapturer();\n capturer.on('pending', (data) => {\n console.log(`In a browser, go to the following Verification URL and enter Code:\n\n- Verification URL: ${data.verificationURL}\n- Code: ${data.code}\n\nThen wait for this script to complete.\n`);\n });\n\n capturer.on('capture', (credentials) => {\n try {\n FSHelper.createDir(path.parse(ytCredsPath).dir);\n FSHelper.writeFile(ytCredsPath, JSON.stringify(credentials));\n console.log(`YouTube connected; credentials saved to \"${ytCredsPath}\"`, EOL);\n resolve(0);\n }\n catch (error) {\n console.error(`Error saving credentials to \"${ytCredsPath}\": `, error instanceof Error ? error.message : error, EOL);\n resolve(1);\n }\n });\n\n await capturer.begin();\n });\n }\n\n static #revokeCredentials(ytCredsPath: string) {\n if (fs.existsSync(ytCredsPath)) {\n try {\n FSHelper.unlink(ytCredsPath);\n console.log(`Deleted \"${ytCredsPath}\"`);\n return 0;\n }\n catch (error) {\n console.error(`Error deleting \"${ytCredsPath}\": `, error instanceof Error ? error.message : error);\n return 1;\n }\n }\n console.log(`No credentials found: \"${ytCredsPath}\" does not exist.`);\n return 0;\n }\n\n\n static #promptInput<T>(prompt: PromptSync.Prompt, message: string, acceptValues: string[], retValues: T[], defaultValue?: T): T {\n const input = prompt(message).trim().toLowerCase();\n if (!input && defaultValue !== undefined) {\n console.log('');\n return defaultValue;\n }\n const acceptIndex = acceptValues.indexOf(input);\n if (acceptIndex >= 0) {\n console.log('');\n return retValues[acceptIndex];\n }\n return this.#promptInput(prompt, message, acceptValues, retValues);\n }\n}"]}
@@ -7,7 +7,7 @@ import { DownloaderInit, DownloaderOptions, FileExistsAction } from './Downloade
7
7
  import { DownloaderEvent, DownloaderEventPayloadOf } from './DownloaderEvent.js';
8
8
  import Logger, { LogLevel } from '../utils/logging/Logger.js';
9
9
  import { Campaign } from '../entities/Campaign.js';
10
- import { WriteTextFileResult } from '../utils/FSHelper.js';
10
+ import FSHelper, { WriteTextFileResult } from '../utils/FSHelper.js';
11
11
  import DownloadTaskBatch from './task/DownloadTaskBatch.js';
12
12
  import { Downloadable } from '../entities/Downloadable.js';
13
13
  import { UserIdOrVanityParam } from '../entities/User.js';
@@ -25,6 +25,7 @@ export default abstract class Downloader<T extends DownloaderType> extends Event
25
25
  #private;
26
26
  abstract name: string;
27
27
  protected fetcher: Fetcher;
28
+ protected fsHelper: FSHelper;
28
29
  protected config: DownloaderConfig<T>;
29
30
  protected logger?: Logger | null;
30
31
  constructor(bootstrap: DownloaderBootstrapData<T>, options?: DownloaderOptions);
@@ -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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"}
@@ -39,7 +39,8 @@ export default class Downloader extends EventEmitter {
39
39
  ...bootstrap,
40
40
  ...getDownloaderInit(options)
41
41
  };
42
- this.fetcher = new Fetcher(options?.cookie, options?.logger);
42
+ this.fetcher = new Fetcher(this.config, options?.cookie, options?.logger);
43
+ this.fsHelper = new FSHelper(this.config, this.logger);
43
44
  this.logger = options?.logger;
44
45
  if (this.config.pathToFFmpeg) {
45
46
  ffmpeg.setFfmpegPath(this.config.pathToFFmpeg);
@@ -125,14 +126,11 @@ export default class Downloader extends EventEmitter {
125
126
  for (const tt of target) {
126
127
  try {
127
128
  const tasks = DownloadTaskFactory.createFromDownloadable({
129
+ config: this.config,
128
130
  item: tt,
129
131
  destDir,
130
132
  fetcher: this.fetcher,
131
- embedDownloaders: this.config.embedDownloaders,
132
- destFilenameFormat: this.config.filenameFormat.media,
133
133
  fileExistsAction: task.fileExistsAction,
134
- maxRetries: this.config.request.maxRetries,
135
- downloadAllVariants: this.config.include.allMediaVariants,
136
134
  logger: this.logger
137
135
  });
138
136
  batch.addTasks(tasks);
@@ -144,7 +142,7 @@ export default class Downloader extends EventEmitter {
144
142
  }
145
143
  }
146
144
  if (createdCount > 0) {
147
- FSHelper.createDir(destDir);
145
+ this.fsHelper.createDir(destDir);
148
146
  }
149
147
  }
150
148
  if (failedCreateTaskCount > 0) {
@@ -203,14 +201,14 @@ export default class Downloader extends EventEmitter {
203
201
  this.emit('targetBegin', { target: campaign });
204
202
  this.emit('phaseBegin', { target: campaign, phase: 'saveInfo' });
205
203
  // Step 1: create campaign directories
206
- const campaignDirs = FSHelper.getCampaignDirs(campaign, this.config);
204
+ const campaignDirs = this.fsHelper.getCampaignDirs(campaign);
207
205
  this.log('debug', 'Campaign directories: ', campaignDirs);
208
- FSHelper.createDir(campaignDirs.root);
209
- FSHelper.createDir(campaignDirs.info);
206
+ this.fsHelper.createDir(campaignDirs.root);
207
+ this.fsHelper.createDir(campaignDirs.info);
210
208
  // Step 2: save summary and raw json
211
209
  const summary = generateCampaignSummary(campaign);
212
210
  const summaryFile = path.resolve(campaignDirs.info, 'info.txt');
213
- const saveSummaryResult = await FSHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);
211
+ const saveSummaryResult = await this.fsHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);
214
212
  this.logWriteTextFileResult(saveSummaryResult, campaign, 'campaign summary');
215
213
  // Campaign / creator raw data might not be complete. Fetch directly from API.
216
214
  // Strictly speaking, we should check for 'error' in results, but since it's not going to be fatal we'll just skip it.
@@ -220,11 +218,11 @@ export default class Downloader extends EventEmitter {
220
218
  return;
221
219
  }
222
220
  const campaignRawFile = path.resolve(campaignDirs.info, 'campaign-api.json');
223
- const saveCampaignRawResult = await FSHelper.writeTextFile(campaignRawFile, fetchedCampaignAPIData || campaign.raw, this.config.fileExistsAction.infoAPI);
221
+ const saveCampaignRawResult = await this.fsHelper.writeTextFile(campaignRawFile, fetchedCampaignAPIData || campaign.raw, this.config.fileExistsAction.infoAPI);
224
222
  this.logWriteTextFileResult(saveCampaignRawResult, campaign, 'campaign API data');
225
223
  if (campaign.creator) {
226
224
  const creatorRawFile = path.resolve(campaignDirs.info, 'creator-api.json');
227
- const saveCreatorRawResult = await FSHelper.writeTextFile(creatorRawFile, fetchedCreatorAPIData || campaign.creator.raw, this.config.fileExistsAction.infoAPI);
225
+ const saveCreatorRawResult = await this.fsHelper.writeTextFile(creatorRawFile, fetchedCreatorAPIData || campaign.creator.raw, this.config.fileExistsAction.infoAPI);
228
226
  this.logWriteTextFileResult(saveCreatorRawResult, campaign.creator, 'creator API data');
229
227
  }
230
228
  this.emit('phaseEnd', { target: campaign, phase: 'saveInfo' });