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.
- package/README.md +11 -0
- package/dist/cli/CLIOptions.d.ts.map +1 -1
- package/dist/cli/CLIOptions.js +1 -0
- package/dist/cli/CLIOptions.js.map +1 -1
- package/dist/cli/CommandLineParser.d.ts.map +1 -1
- package/dist/cli/CommandLineParser.js +13 -2
- package/dist/cli/CommandLineParser.js.map +1 -1
- package/dist/cli/ConfigFileParser.d.ts.map +1 -1
- package/dist/cli/ConfigFileParser.js +2 -0
- package/dist/cli/ConfigFileParser.js.map +1 -1
- package/dist/cli/helper/YouTubeConfigurator.js +2 -2
- package/dist/cli/helper/YouTubeConfigurator.js.map +1 -1
- package/dist/downloaders/Downloader.d.ts +2 -1
- package/dist/downloaders/Downloader.d.ts.map +1 -1
- package/dist/downloaders/Downloader.js +10 -12
- package/dist/downloaders/Downloader.js.map +1 -1
- package/dist/downloaders/DownloaderOptions.d.ts +2 -1
- package/dist/downloaders/DownloaderOptions.d.ts.map +1 -1
- package/dist/downloaders/DownloaderOptions.js +4 -2
- package/dist/downloaders/DownloaderOptions.js.map +1 -1
- package/dist/downloaders/PostDownloader.d.ts.map +1 -1
- package/dist/downloaders/PostDownloader.js +72 -167
- package/dist/downloaders/PostDownloader.js.map +1 -1
- package/dist/downloaders/PostsFetcher.d.ts +59 -0
- package/dist/downloaders/PostsFetcher.d.ts.map +1 -0
- package/dist/downloaders/PostsFetcher.js +348 -0
- package/dist/downloaders/PostsFetcher.js.map +1 -0
- package/dist/downloaders/ProductDownloader.d.ts.map +1 -1
- package/dist/downloaders/ProductDownloader.js +6 -7
- package/dist/downloaders/ProductDownloader.js.map +1 -1
- package/dist/downloaders/cache/StatusCache.d.ts +2 -2
- package/dist/downloaders/cache/StatusCache.d.ts.map +1 -1
- package/dist/downloaders/cache/StatusCache.js +11 -7
- package/dist/downloaders/cache/StatusCache.js.map +1 -1
- package/dist/downloaders/task/DownloadTask.d.ts +6 -1
- package/dist/downloaders/task/DownloadTask.d.ts.map +1 -1
- package/dist/downloaders/task/DownloadTask.js +19 -7
- package/dist/downloaders/task/DownloadTask.js.map +1 -1
- package/dist/downloaders/task/DownloadTaskFactory.d.ts +2 -4
- package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -1
- package/dist/downloaders/task/DownloadTaskFactory.js +15 -8
- package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -1
- package/dist/downloaders/task/ExternalDownloaderTask.d.ts +2 -1
- package/dist/downloaders/task/ExternalDownloaderTask.d.ts.map +1 -1
- package/dist/downloaders/task/ExternalDownloaderTask.js +10 -3
- package/dist/downloaders/task/ExternalDownloaderTask.js.map +1 -1
- package/dist/downloaders/task/FFmpegDownloadTaskBase.d.ts.map +1 -1
- package/dist/downloaders/task/FFmpegDownloadTaskBase.js +15 -7
- package/dist/downloaders/task/FFmpegDownloadTaskBase.js.map +1 -1
- package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -1
- package/dist/downloaders/task/FetcherDownloadTask.js +5 -6
- package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -1
- package/dist/parsers/PostParser.d.ts +1 -0
- package/dist/parsers/PostParser.d.ts.map +1 -1
- package/dist/parsers/PostParser.js +15 -12
- package/dist/parsers/PostParser.js.map +1 -1
- package/dist/utils/FSHelper.d.ts +23 -7
- package/dist/utils/FSHelper.d.ts.map +1 -1
- package/dist/utils/FSHelper.js +99 -30
- package/dist/utils/FSHelper.js.map +1 -1
- package/dist/utils/Fetcher.d.ts +2 -1
- package/dist/utils/Fetcher.d.ts.map +1 -1
- package/dist/utils/Fetcher.js +29 -11
- package/dist/utils/Fetcher.js.map +1 -1
- package/dist/utils/Sleeper.d.ts +9 -0
- package/dist/utils/Sleeper.d.ts.map +1 -0
- package/dist/utils/Sleeper.js +68 -0
- package/dist/utils/Sleeper.js.map +1 -0
- package/dist/utils/URLHelper.d.ts +1 -1
- package/dist/utils/URLHelper.d.ts.map +1 -1
- package/dist/utils/URLHelper.js +9 -0
- package/dist/utils/URLHelper.js.map +1 -1
- package/dist/utils/logging/ConsoleLogger.d.ts +1 -0
- package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -1
- package/dist/utils/logging/ConsoleLogger.js +21 -9
- package/dist/utils/logging/ConsoleLogger.js.map +1 -1
- 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 <creator></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 <user ID></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,
|
|
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"}
|
package/dist/cli/CLIOptions.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AACzD,OAAO,iBAA6C,MAAM,wBAAwB,CAAC;AACnF,OAAO,gBAA2C,MAAM,uBAAuB,CAAC;AAChF,OAAO,IAAI,MAAM,MAAM,CAAC;AA4BxB,MAAM,UAAU,aAAa;IAC3B,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAErD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpI,IAAI,UAA+B,CAAC;IACpC,MAAM,cAAc,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,yBAAyB,CAAC,CAAC;IACjK,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAC9B,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;KAC3C;SACI;QACH,UAAU,GAAG,kBAAkB;aAC5B,kBAAkB,CAAC,cAAc,CAAC;aAClC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;KAC5B;IAED,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAElG,MAAM,OAAO,GAAe;QAC1B,UAAU;QACV,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC5G,cAAc,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC;QACrI,YAAY,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAC9H,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC5G,aAAa,EAAE;YACb,QAAQ,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;YAChJ,OAAO,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;SAC9I;QACD,cAAc,EAAE;YACd,KAAK,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;SAC1I;QACD,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;QACpE,OAAO,EAAE;YACP,UAAU,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3I,aAAa,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YACpJ,OAAO,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACnI;QACD,gBAAgB,EAAE;YAChB,OAAO,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,CAAC;YAC3M,IAAI,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,CAAC;YAClM,OAAO,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,CAAC;SAC5M;QACD,gBAAgB,EAAE,yBAAyB,CAAC,iBAAiB,CAAC;QAC9D,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,IAAI,KAAK;QAC5H,MAAM,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK;QACtH,aAAa;QACb,WAAW;KACZ,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,kBAA2C,EAAE,iBAAuE;IACtJ,IAAI,CAAC,kBAAkB,EAAE;QACvB,kBAAkB,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC;KAChD;IACD,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAC9I,QAAQ,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;QAClL,OAAO,EAAE;YACP,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnK,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1J,UAAU,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YACzK,UAAU,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;SAC1K;QACD,cAAc,EAAE,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QAClK,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;KACzI,CAAC;IACF,IAAI,WAAW,CAAC;IAChB,IAAI,iBAAiB,EAAE,WAAW,EAAE;QAClC,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAqB,EAAE,CAAC,CAAC;YAC9E,OAAO,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3D,MAAM,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;YACxD,WAAW,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC;YAClE,gBAAgB,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC;YACnG,QAAQ,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;YAC9F,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACtE,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;gBAChE,UAAU,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;gBAC1E,UAAU,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;aAC3E;YACD,cAAc,EAAE,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC;YACxE,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;SACxD,CAAC,CAAC,CAAC;KACL;IACD,OAAO;QACL,aAAa;QACb,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,kBAA0C,EAAE,iBAAgD;IACxH,IAAI,CAAC,kBAAkB,EAAE;QACvB,kBAAkB,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC;KAChD;IACD,OAAO;QACL,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QACpJ,kBAAkB,EAAE,kBAAkB,CAAC,mCAAmC,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACvL,WAAW,EAAE,kBAAkB,CAAC,4BAA4B,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3J,YAAY,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QACjJ,WAAW,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC9I,YAAY,EAAE,kBAAkB,CAAC,2BAA2B,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7J,YAAY,EAAE,kBAAkB,CAAC,2BAA2B,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7J,gBAAgB,EAAE,kBAAkB,CAAC,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;KAC9J,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,iBAAgD;IACjF,IAAI,iBAAiB,EAAE,gBAAgB,EAAE;QACvC,OAAO,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtD,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC;YAC1D,IAAI,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC;SACnD,CAAC,CAAC,CAAC;KACL;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,WAAW,GAAmD;QAClE,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,CAAC;IAEF,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;SAChC,QAAQ,CAAC,OAAO,CAAC;QAClB,4DAA4D;SAC3D,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;SAClC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9B,MAAM,cAAc,GAAwG,EAAE,CAAC;IAC/H,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvC,SAAS;SACV;QACD,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,IAAI,KAAK,EAAE;gBACT,MAAM,CAAE,OAAO,EAAE,QAAQ,CAAE,GAAG,KAAK,CAAC;gBACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/E,IAAI,SAAS,EAAE;oBACb,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,MAAM,EAAE;wBACV,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;4BACnB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;yBACrB;wBACD,MAAM,CAAC,OAAO,CAAC,OAAyC,CAAC,GAAG;4BAC1D,GAAG,EAAE,QAAQ;4BACb,IAAI,EAAE,EAAE;4BACR,GAAG,EAAE,KAAK;4BACV,KAAK,EAAE,SAAS;yBACjB,CAAC;qBACH;iBACF;aACF;iBACI;gBACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACvD,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aAC9B;SACF;QACD,OAAO,KAAK,EAAE;YACZ,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAC9D,MAAM,KAAK,CAAC,oCAAoC,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACtF;KACF;IAED,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE;QACnC,MAAM,CAAC,GAAsB,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,CAAC,CAAC,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;SAC1C;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAChB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","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;
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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":"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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 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
|
-
|
|
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
|
-
|
|
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":";;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,0BAA0B,MAAM,2CAA2C,CAAC;AAEnF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAEtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAmB;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;GASb,WAAW;;;;;;;;CAQb,CAAC,CAAC;QAEC,MAAM,eAAe,GAAG,uBAAA,IAAI,4CAAa,MAAjB,IAAI,EAC1B,MAAM,EACN,2BAA2B,EAC3B,CAAE,GAAG,EAAE,GAAG,CAAE,EACZ,CAAE,SAAS,EAAE,QAAQ,CAAE,CAAC,CAAC;QAE3B,IAAI,eAAe,KAAK,SAAS,EAAE;YACjC,OAAO,MAAM,uBAAA,IAAI,6CAAc,MAAlB,IAAI,EAAe,WAAW,EAAE,MAAM,CAAC,CAAC;SACtD;QAED,OAAO,uBAAA,IAAI,kDAAmB,MAAvB,IAAI,EAAoB,WAAW,CAAC,CAAC;IAC9C,CAAC;CAuFF;8DArFQ,KAAK,4CAAe,WAAmB,EAAE,MAAyB;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,MAAM,eAAe,GAAG,uBAAA,IAAI,4CAAa,MAAjB,IAAI,EAC1B,MAAM,EACN,iBAAiB,EACjB,CAAE,GAAG,EAAE,GAAG,CAAE,EACZ,CAAE,WAAW,EAAE,MAAM,CAAE,EACvB,MAAM,CACP,CAAC;QACF,IAAI,eAAe,KAAK,MAAM,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC;SACV;KACF;IACD,MAAM,IAAI,GAAG,MAAM,uBAAA,IAAI,4DAA6B,MAAjC,IAAI,EAA8B,WAAW,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,CAAC,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;KACnE;SACI;QACH,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;KAC7D;IACD,OAAO,IAAI,CAAC;AACd,CAAC,+GAEmC,WAAmB;IACrD,OAAO,IAAI,OAAO,CAAS,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAClD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC;;sBAEE,IAAI,CAAC,eAAe;UAChC,IAAI,CAAC,IAAI;;;CAGlB,CAAC,CAAC;QACG,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE;YACrC,IAAI;gBACF,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChD,
|
|
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":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,OAAO,MAAM,qBAAqB,CAAC;AAC1C,OAAkB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAqB,MAAM,wBAAwB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,
|
|
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
|
-
|
|
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 =
|
|
204
|
+
const campaignDirs = this.fsHelper.getCampaignDirs(campaign);
|
|
207
205
|
this.log('debug', 'Campaign directories: ', campaignDirs);
|
|
208
|
-
|
|
209
|
-
|
|
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
|
|
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
|
|
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
|
|
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' });
|