patreon-dl 2.4.1 → 2.4.2
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 +7 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/downloaders/Downloader.js +1 -1
- package/dist/downloaders/Downloader.js.map +1 -1
- package/dist/downloaders/task/DownloadTask.d.ts +2 -0
- package/dist/downloaders/task/DownloadTask.d.ts.map +1 -1
- package/dist/downloaders/task/DownloadTask.js.map +1 -1
- package/dist/downloaders/task/DownloadTaskBatch.js +1 -1
- package/dist/downloaders/task/DownloadTaskBatch.js.map +1 -1
- package/dist/downloaders/task/FFmpegDownloadTaskBase.d.ts +1 -0
- package/dist/downloaders/task/FFmpegDownloadTaskBase.d.ts.map +1 -1
- package/dist/downloaders/task/FFmpegDownloadTaskBase.js +2 -2
- package/dist/downloaders/task/FFmpegDownloadTaskBase.js.map +1 -1
- package/dist/downloaders/task/YouTubeDownloadTask.d.ts +17 -1
- package/dist/downloaders/task/YouTubeDownloadTask.d.ts.map +1 -1
- package/dist/downloaders/task/YouTubeDownloadTask.js +252 -48
- package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
- package/dist/downloaders/task/YouTubeStreamDownloadTask.d.ts +30 -0
- package/dist/downloaders/task/YouTubeStreamDownloadTask.d.ts.map +1 -0
- package/dist/downloaders/task/YouTubeStreamDownloadTask.js +243 -0
- package/dist/downloaders/task/YouTubeStreamDownloadTask.js.map +1 -0
- package/dist/utils/logging/FileLogger.d.ts +16 -1
- package/dist/utils/logging/FileLogger.d.ts.map +1 -1
- package/dist/utils/logging/FileLogger.js +5 -1
- package/dist/utils/logging/FileLogger.js.map +1 -1
- package/dist/utils/yt/InnertubeLoader.d.ts +6 -1
- package/dist/utils/yt/InnertubeLoader.d.ts.map +1 -1
- package/dist/utils/yt/InnertubeLoader.js +45 -20
- package/dist/utils/yt/InnertubeLoader.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
A Patreon downloader written in [Node.js](https://nodejs.org).
|
|
6
6
|
|
|
7
|
+
This repo contains the `patreon-dl` library and its command-line tool. For GUI application, check out [patreon-dl-gui](https://github.com/patrickkfkan/patreon-dl-gui).
|
|
8
|
+
|
|
7
9
|
### Features
|
|
8
10
|
- Access to patron-only content through cookie. This refers to content you have access to under your account. It does not include locked content that you don't have a subscription for.
|
|
9
11
|
- Download posts by user, in a collection or single post
|
|
@@ -223,6 +225,11 @@ Note that you can override an option from a configuration file with one provided
|
|
|
223
225
|
|
|
224
226
|
## Changelog
|
|
225
227
|
|
|
228
|
+
v2.4.2
|
|
229
|
+
- Fix YouTube embeds failing to download due to YT changes
|
|
230
|
+
- Fix slow YouTube downloads ([#66](https://github.com/patrickkfkan/patreon-dl/issues/66))
|
|
231
|
+
- Other minor fixes
|
|
232
|
+
|
|
226
233
|
v2.4.1
|
|
227
234
|
- Fix Vimeo download script obtaining and downloading from player URL in embed HTML ([#65](https://github.com/patrickkfkan/patreon-dl/issues/65))
|
|
228
235
|
- Add `post-url` and `cookie` to available external downloader exec params
|
package/dist/cli/index.js
CHANGED
|
@@ -215,7 +215,7 @@ _PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo
|
|
|
215
215
|
const proxyAgentInfo = createProxyAgent(options);
|
|
216
216
|
if (proxyAgentInfo) {
|
|
217
217
|
if (proxyAgentInfo.protocol !== 'http') {
|
|
218
|
-
commonLog(logger, 'warn', null, `${proxyAgentInfo.protocol.toUpperCase()} proxy
|
|
218
|
+
commonLog(logger, 'warn', null, `${proxyAgentInfo.protocol.toUpperCase()} proxy specified in config. Note that some operations use FFmpeg to download video streams. Since FFmpeg only supports HTTP proxy, these operations will ignore the specified proxy options.`, EOL);
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
};
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport PromptSync from 'prompt-sync';\nimport path from 'path';\nimport fs from 'fs';\nimport Downloader, { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport ConsoleLogger from '../utils/logging/ConsoleLogger.js';\nimport { type CLIOptions, type CLITargetURLEntry, getCLILoggerOptions, getCLIOptions } from './CLIOptions.js';\nimport CommandLineParser from './CommandLineParser.js';\nimport type Logger from '../utils/logging/Logger.js';\nimport { commonLog } from '../utils/logging/Logger.js';\nimport FileLogger, { type FileLoggerInit } from '../utils/logging/FileLogger.js';\nimport ChainLogger from '../utils/logging/ChainLogger.js';\nimport { type PackageInfo, getPackageInfo } from '../utils/PackageInfo.js';\nimport envPaths from 'env-paths';\nimport YouTubeConfigurator from './helper/YouTubeConfigurator.js';\nimport { type DownloaderIncludeOptions } from '../downloaders/DownloaderOptions.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport copy from 'fast-copy';\nimport cliTruncate from 'cli-truncate';\nimport type deepFreeze from 'deep-freeze';\nimport { type DeepPartial } from '../utils/Misc.js';\nimport { createProxyAgent } from '../utils/Proxy.js';\n\nconst YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';\n\nexport default class PatreonDownloaderCLI {\n\n #logger: Logger | null;\n #packageInfo: PackageInfo;\n #globalConfPath: string;\n // Keep track of file loggers created, so that we force 'append' mode if\n // Multiple target URLs share the same log file.\n #fileLoggers: FileLogger[];\n\n constructor() {\n this.#logger = null;\n this.#fileLoggers = [];\n this.#packageInfo = getPackageInfo();\n this.#globalConfPath = envPaths(\n this.#packageInfo.name || 'patreon-dl', { suffix: '' }).config;\n }\n\n async start() {\n if (CommandLineParser.showUsage()) {\n return this.exit(0);\n }\n\n if (this.#packageInfo.banner) {\n console.log(`${EOL}${this.#packageInfo.banner}${EOL}`);\n }\n\n const __printOptionError = (error: any) => {\n console.error(\n 'Error processing options: ',\n error instanceof Error ? error.message : error,\n EOL,\n 'See usage with \\'-h\\' option.');\n return this.exit(1);\n };\n\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n if (CommandLineParser.configureYouTube()) {\n return this.exit(await YouTubeConfigurator.start(ytCredsPath));\n }\n\n let listTiersTargets;\n try {\n listTiersTargets = CommandLineParser.listTiers();\n }\n catch (error) {\n return __printOptionError(error);\n }\n if (listTiersTargets) {\n const { byVanity: vanities, byUserId: userIds } = listTiersTargets;\n let hasError = false;\n const { consoleLogger: consoleLoggerOptions } = getCLILoggerOptions();\n const consoleLogger = new ConsoleLogger(consoleLoggerOptions);\n\n const __doList = async (targets: string[], targetType: 'vanity' | 'userId') => {\n for (const target of targets) {\n try {\n const campaign = await Downloader.getCampaign(\n targetType === 'vanity' ? target : { userId: target },\n undefined,\n consoleLogger\n );\n if (campaign) {\n const p = targetType === 'userId' ? 'user #' : '';\n console.log(`*** Tiers for ${p}${target} ***${EOL}`);\n const idColWidth = campaign.rewards.reduce<number>((len, reward) => {\n return Math.max(len, reward.id.length);\n }, 0);\n const gap = ' ';\n console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);\n console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));\n campaign.rewards.forEach((reward) => {\n console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);\n });\n console.log(EOL);\n }\n else {\n commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');\n throw Error();\n }\n }\n catch (_error: unknown) {\n console.error(`${EOL}Error fetching tier data for \"${target}\"${EOL}${EOL}`);\n hasError = true;\n }\n }\n };\n\n await __doList(vanities, 'vanity');\n await __doList(userIds, 'userId');\n\n return this.exit(hasError ? 1 : 0);\n }\n\n let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\n return __printOptionError(error);\n }\n\n const targetsWithError: string[] = [];\n const targetEndMessages: { url: string; message: string; }[] = [];\n for (let i = 0; i < options.targetURLs.length; i++) {\n const { hasError, aborted, endMessage } = await this.#createAndStartDownloader(options.targetURLs, i, options);\n if (aborted) {\n return this.exit(1);\n }\n const targetURL = options.targetURLs[i].url;\n if (hasError) {\n targetsWithError.push(targetURL);\n }\n targetEndMessages[i] = { url: targetURL, message: endMessage };\n }\n if (options.targetURLs.length > 0) {\n // Print summary\n console.log('');\n const heading = `Total ${options.targetURLs.length} targets processed`;\n console.log(heading);\n console.log('-'.repeat(heading.length));\n console.log('');\n targetEndMessages.forEach(({ url, message }, i) => {\n const s = `${i}: ${url}`;\n console.log(s);\n console.log(message);\n console.log('');\n });\n }\n if (targetsWithError.length > 0) {\n if (options.targetURLs.length > 0) {\n console.warn('There were errors processing the following URLs:', JSON.stringify(targetsWithError, null, 2));\n }\n return this.exit(1);\n }\n return this.exit(0);\n }\n\n #getYouTubeCredentialsPath() {\n return path.resolve(this.#globalConfPath, YT_CREDENTIALS_FILENAME);\n }\n\n #getApplicableIncludeOptions(local?: DownloaderIncludeOptions, global?: DownloaderIncludeOptions) {\n if (!local) {\n return global;\n }\n if (!global) {\n return local;\n }\n const result: DownloaderIncludeOptions = { ...global };\n for (const [ k, v ] of Object.entries(local)) {\n if (v !== undefined) {\n result[k as keyof DownloaderIncludeOptions] = v;\n }\n }\n return result;\n }\n\n #getDisplayConfig(config: DeepPartial<DownloaderConfig<any>> | deepFreeze.DeepReadonly<DownloaderConfig<any>>) {\n const displayConfig = copy(config) as any;\n if (config.include?.postsPublished?.after) {\n displayConfig.include.postsPublished.after = config.include.postsPublished.after.toString();\n }\n if (config.include?.postsPublished?.before) {\n displayConfig.include.postsPublished.before = config.include.postsPublished.before.toString();\n }\n if (config.cookie) {\n displayConfig.cookie = cliTruncate(displayConfig.cookie, 20, { position: 'middle', space: true });\n }\n return ObjectHelper.clean(displayConfig, {\n deep: true, cleanNulls: true, cleanEmptyObjects: true\n });\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n const __checkProxy = () => {\n const proxyAgentInfo = createProxyAgent(options);\n if (proxyAgentInfo) {\n if (proxyAgentInfo.protocol !== 'http') {\n commonLog(logger, 'warn', null,\n `${proxyAgentInfo.protocol.toUpperCase()} proxy option found. However, FFmpeg which is required for downloading videos in streaming format only supports HTTP proxy. For such downloads, the specified proxy option will be ignored.`, EOL);\n }\n }\n }\n\n if (!options.noPrompt) {\n\n const __printLoggerConfigs = () => {\n if (!consoleLogger.getConfig().enabled) {\n console.log('Console logging disabled', EOL);\n }\n\n const enabledFileLoggers = fileLoggers.filter((logger) => logger.getConfig().enabled);\n if (enabledFileLoggers.length > 0) {\n console.log('Log files');\n console.log('---------');\n for (const fl of enabledFileLoggers) {\n const flConf = fl.getConfig();\n console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);\n }\n console.log(EOL);\n }\n };\n\n const __printDownloaderCreated = () => {\n commonLog(logger, 'info', null, `Created ${downloaderName} instance with config: `, this.#getDisplayConfig(downloader.getConfig()), EOL);\n };\n\n let promptConfirm = true;\n let postConfirm: (() => void) | null = null;\n\n if (targetURLs.length === 1) {\n __printLoggerConfigs();\n __printDownloaderCreated();\n __checkProxy();\n }\n else if (index === 0) {\n postConfirm = () => {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n };\n const displayConfSrc = await Downloader.getInstance(targetURL, {\n ...options,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null\n });\n const conf = {...displayConfSrc.getConfig()} as any;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productId;\n delete conf.outDir;\n const heading = 'Target URLs';\n console.log(`${EOL}${heading}`);\n console.log('-'.repeat(heading.length), EOL);\n const hasTargetSpecificSettings = !!targetURLs.find((target) => target.include);\n targetURLs.forEach((target, i) => {\n console.log(`${i}: ${target.url}`);\n if (hasTargetSpecificSettings) {\n console.log('');\n }\n if (target.include) {\n console.log('include:', this.#getDisplayConfig({include: target.include}).include);\n console.log('');\n }\n });\n const heading2 = 'Common settings';\n console.log(`${EOL}${heading2}`);\n console.log('-'.repeat(heading2.length));\n console.log(this.#getDisplayConfig(conf), EOL);\n if (targetURLs.find((target) => target.include)) {\n console.log('Target-specific settings may override common settings', EOL);\n }\n __checkProxy();\n }\n else {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n promptConfirm = false;\n }\n if (promptConfirm && !this.#confirmProceed()) {\n console.log('Abort');\n return { aborted: true, endMessage: 'Aborted' };\n }\n if (postConfirm) {\n postConfirm();\n }\n }\n else {\n __logBegin();\n commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());\n if (index === 0) {\n __checkProxy();\n }\n }\n\n let hasDownloaderError = false;\n let isAborted = false;\n let endMessage = '';\n downloader.on('end', ({ aborted, error, message }) => {\n if (aborted) {\n commonLog(logger, 'info', null, `${downloaderName} aborted`);\n isAborted = true;\n }\n else if (!error) {\n commonLog(logger, 'info', null, `${downloaderName} end`);\n }\n else {\n commonLog(logger, 'warn', null, `${downloaderName} end with error`);\n hasDownloaderError = true;\n }\n endMessage = message;\n });\n\n try {\n const abortController = new AbortController();\n const abortHandler = () => {\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n await downloader.start({ signal: abortController.signal });\n await logger.end();\n process.off('SIGINT', abortHandler);\n return { hasError: hasDownloaderError, aborted: isAborted, endMessage };\n }\n catch (error) {\n commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);\n return { hasError: true, aborted: isAborted, endMessage: 'Uncaught error' };\n }\n }\n\n #confirmProceed(prompt?: PromptSync.Prompt): boolean {\n if (!prompt) {\n prompt = PromptSync({ sigint: true });\n }\n const confirmProceed = prompt('Proceed (Y/n)? ');\n if (!confirmProceed.trim() || confirmProceed.trim().toLowerCase() === 'y') {\n return true;\n }\n else if (confirmProceed.trim().toLowerCase() === 'n') {\n return false;\n }\n\n return this.#confirmProceed(prompt);\n }\n\n #createLoggers(targetURL: string, options: CLIOptions) {\n // Create file loggers\n const fileLoggerInit: FileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const { filePath } = FileLogger.getPathInfo({\n ...fileLoggerInit,\n ...fileLoggerOptions\n });\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fileLoggerInit, fileLoggerOptions);\n result.push(fl);\n }\n catch (error) {\n console.warn('Failed to create file logger: ', error instanceof Error ? error.message : error);\n }\n return result;\n }, []) || [];\n\n // Create console logger\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n\n // Chain logger\n const chainLogger = new ChainLogger([\n consoleLogger,\n ...fileLoggers\n ]);\n\n return {\n chainLogger,\n consoleLogger,\n fileLoggers\n };\n }\n\n async exit(code?: number) {\n if (this.#logger) {\n await this.#logger.end();\n }\n process.exit(code);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport PromptSync from 'prompt-sync';\nimport path from 'path';\nimport fs from 'fs';\nimport Downloader, { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport ConsoleLogger from '../utils/logging/ConsoleLogger.js';\nimport { type CLIOptions, type CLITargetURLEntry, getCLILoggerOptions, getCLIOptions } from './CLIOptions.js';\nimport CommandLineParser from './CommandLineParser.js';\nimport type Logger from '../utils/logging/Logger.js';\nimport { commonLog } from '../utils/logging/Logger.js';\nimport FileLogger, { type FileLoggerInit } from '../utils/logging/FileLogger.js';\nimport ChainLogger from '../utils/logging/ChainLogger.js';\nimport { type PackageInfo, getPackageInfo } from '../utils/PackageInfo.js';\nimport envPaths from 'env-paths';\nimport YouTubeConfigurator from './helper/YouTubeConfigurator.js';\nimport { type DownloaderIncludeOptions } from '../downloaders/DownloaderOptions.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport copy from 'fast-copy';\nimport cliTruncate from 'cli-truncate';\nimport type deepFreeze from 'deep-freeze';\nimport { type DeepPartial } from '../utils/Misc.js';\nimport { createProxyAgent } from '../utils/Proxy.js';\n\nconst YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';\n\nexport default class PatreonDownloaderCLI {\n\n #logger: Logger | null;\n #packageInfo: PackageInfo;\n #globalConfPath: string;\n // Keep track of file loggers created, so that we force 'append' mode if\n // Multiple target URLs share the same log file.\n #fileLoggers: FileLogger[];\n\n constructor() {\n this.#logger = null;\n this.#fileLoggers = [];\n this.#packageInfo = getPackageInfo();\n this.#globalConfPath = envPaths(\n this.#packageInfo.name || 'patreon-dl', { suffix: '' }).config;\n }\n\n async start() {\n if (CommandLineParser.showUsage()) {\n return this.exit(0);\n }\n\n if (this.#packageInfo.banner) {\n console.log(`${EOL}${this.#packageInfo.banner}${EOL}`);\n }\n\n const __printOptionError = (error: any) => {\n console.error(\n 'Error processing options: ',\n error instanceof Error ? error.message : error,\n EOL,\n 'See usage with \\'-h\\' option.');\n return this.exit(1);\n };\n\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n if (CommandLineParser.configureYouTube()) {\n return this.exit(await YouTubeConfigurator.start(ytCredsPath));\n }\n\n let listTiersTargets;\n try {\n listTiersTargets = CommandLineParser.listTiers();\n }\n catch (error) {\n return __printOptionError(error);\n }\n if (listTiersTargets) {\n const { byVanity: vanities, byUserId: userIds } = listTiersTargets;\n let hasError = false;\n const { consoleLogger: consoleLoggerOptions } = getCLILoggerOptions();\n const consoleLogger = new ConsoleLogger(consoleLoggerOptions);\n\n const __doList = async (targets: string[], targetType: 'vanity' | 'userId') => {\n for (const target of targets) {\n try {\n const campaign = await Downloader.getCampaign(\n targetType === 'vanity' ? target : { userId: target },\n undefined,\n consoleLogger\n );\n if (campaign) {\n const p = targetType === 'userId' ? 'user #' : '';\n console.log(`*** Tiers for ${p}${target} ***${EOL}`);\n const idColWidth = campaign.rewards.reduce<number>((len, reward) => {\n return Math.max(len, reward.id.length);\n }, 0);\n const gap = ' ';\n console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);\n console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));\n campaign.rewards.forEach((reward) => {\n console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);\n });\n console.log(EOL);\n }\n else {\n commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');\n throw Error();\n }\n }\n catch (_error: unknown) {\n console.error(`${EOL}Error fetching tier data for \"${target}\"${EOL}${EOL}`);\n hasError = true;\n }\n }\n };\n\n await __doList(vanities, 'vanity');\n await __doList(userIds, 'userId');\n\n return this.exit(hasError ? 1 : 0);\n }\n\n let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\n return __printOptionError(error);\n }\n\n const targetsWithError: string[] = [];\n const targetEndMessages: { url: string; message: string; }[] = [];\n for (let i = 0; i < options.targetURLs.length; i++) {\n const { hasError, aborted, endMessage } = await this.#createAndStartDownloader(options.targetURLs, i, options);\n if (aborted) {\n return this.exit(1);\n }\n const targetURL = options.targetURLs[i].url;\n if (hasError) {\n targetsWithError.push(targetURL);\n }\n targetEndMessages[i] = { url: targetURL, message: endMessage };\n }\n if (options.targetURLs.length > 0) {\n // Print summary\n console.log('');\n const heading = `Total ${options.targetURLs.length} targets processed`;\n console.log(heading);\n console.log('-'.repeat(heading.length));\n console.log('');\n targetEndMessages.forEach(({ url, message }, i) => {\n const s = `${i}: ${url}`;\n console.log(s);\n console.log(message);\n console.log('');\n });\n }\n if (targetsWithError.length > 0) {\n if (options.targetURLs.length > 0) {\n console.warn('There were errors processing the following URLs:', JSON.stringify(targetsWithError, null, 2));\n }\n return this.exit(1);\n }\n return this.exit(0);\n }\n\n #getYouTubeCredentialsPath() {\n return path.resolve(this.#globalConfPath, YT_CREDENTIALS_FILENAME);\n }\n\n #getApplicableIncludeOptions(local?: DownloaderIncludeOptions, global?: DownloaderIncludeOptions) {\n if (!local) {\n return global;\n }\n if (!global) {\n return local;\n }\n const result: DownloaderIncludeOptions = { ...global };\n for (const [ k, v ] of Object.entries(local)) {\n if (v !== undefined) {\n result[k as keyof DownloaderIncludeOptions] = v;\n }\n }\n return result;\n }\n\n #getDisplayConfig(config: DeepPartial<DownloaderConfig<any>> | deepFreeze.DeepReadonly<DownloaderConfig<any>>) {\n const displayConfig = copy(config) as any;\n if (config.include?.postsPublished?.after) {\n displayConfig.include.postsPublished.after = config.include.postsPublished.after.toString();\n }\n if (config.include?.postsPublished?.before) {\n displayConfig.include.postsPublished.before = config.include.postsPublished.before.toString();\n }\n if (config.cookie) {\n displayConfig.cookie = cliTruncate(displayConfig.cookie, 20, { position: 'middle', space: true });\n }\n return ObjectHelper.clean(displayConfig, {\n deep: true, cleanNulls: true, cleanEmptyObjects: true\n });\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n const __checkProxy = () => {\n const proxyAgentInfo = createProxyAgent(options);\n if (proxyAgentInfo) {\n if (proxyAgentInfo.protocol !== 'http') {\n commonLog(logger, 'warn', null,\n `${proxyAgentInfo.protocol.toUpperCase()} proxy specified in config. Note that some operations use FFmpeg to download video streams. Since FFmpeg only supports HTTP proxy, these operations will ignore the specified proxy options.`, EOL);\n }\n }\n }\n\n if (!options.noPrompt) {\n\n const __printLoggerConfigs = () => {\n if (!consoleLogger.getConfig().enabled) {\n console.log('Console logging disabled', EOL);\n }\n\n const enabledFileLoggers = fileLoggers.filter((logger) => logger.getConfig().enabled);\n if (enabledFileLoggers.length > 0) {\n console.log('Log files');\n console.log('---------');\n for (const fl of enabledFileLoggers) {\n const flConf = fl.getConfig();\n console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);\n }\n console.log(EOL);\n }\n };\n\n const __printDownloaderCreated = () => {\n commonLog(logger, 'info', null, `Created ${downloaderName} instance with config: `, this.#getDisplayConfig(downloader.getConfig()), EOL);\n };\n\n let promptConfirm = true;\n let postConfirm: (() => void) | null = null;\n\n if (targetURLs.length === 1) {\n __printLoggerConfigs();\n __printDownloaderCreated();\n __checkProxy();\n }\n else if (index === 0) {\n postConfirm = () => {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n };\n const displayConfSrc = await Downloader.getInstance(targetURL, {\n ...options,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null\n });\n const conf = {...displayConfSrc.getConfig()} as any;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productId;\n delete conf.outDir;\n const heading = 'Target URLs';\n console.log(`${EOL}${heading}`);\n console.log('-'.repeat(heading.length), EOL);\n const hasTargetSpecificSettings = !!targetURLs.find((target) => target.include);\n targetURLs.forEach((target, i) => {\n console.log(`${i}: ${target.url}`);\n if (hasTargetSpecificSettings) {\n console.log('');\n }\n if (target.include) {\n console.log('include:', this.#getDisplayConfig({include: target.include}).include);\n console.log('');\n }\n });\n const heading2 = 'Common settings';\n console.log(`${EOL}${heading2}`);\n console.log('-'.repeat(heading2.length));\n console.log(this.#getDisplayConfig(conf), EOL);\n if (targetURLs.find((target) => target.include)) {\n console.log('Target-specific settings may override common settings', EOL);\n }\n __checkProxy();\n }\n else {\n __logBegin();\n __printLoggerConfigs();\n __printDownloaderCreated();\n promptConfirm = false;\n }\n if (promptConfirm && !this.#confirmProceed()) {\n console.log('Abort');\n return { aborted: true, endMessage: 'Aborted' };\n }\n if (postConfirm) {\n postConfirm();\n }\n }\n else {\n __logBegin();\n commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());\n if (index === 0) {\n __checkProxy();\n }\n }\n\n let hasDownloaderError = false;\n let isAborted = false;\n let endMessage = '';\n downloader.on('end', ({ aborted, error, message }) => {\n if (aborted) {\n commonLog(logger, 'info', null, `${downloaderName} aborted`);\n isAborted = true;\n }\n else if (!error) {\n commonLog(logger, 'info', null, `${downloaderName} end`);\n }\n else {\n commonLog(logger, 'warn', null, `${downloaderName} end with error`);\n hasDownloaderError = true;\n }\n endMessage = message;\n });\n\n try {\n const abortController = new AbortController();\n const abortHandler = () => {\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n await downloader.start({ signal: abortController.signal });\n await logger.end();\n process.off('SIGINT', abortHandler);\n return { hasError: hasDownloaderError, aborted: isAborted, endMessage };\n }\n catch (error) {\n commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);\n return { hasError: true, aborted: isAborted, endMessage: 'Uncaught error' };\n }\n }\n\n #confirmProceed(prompt?: PromptSync.Prompt): boolean {\n if (!prompt) {\n prompt = PromptSync({ sigint: true });\n }\n const confirmProceed = prompt('Proceed (Y/n)? ');\n if (!confirmProceed.trim() || confirmProceed.trim().toLowerCase() === 'y') {\n return true;\n }\n else if (confirmProceed.trim().toLowerCase() === 'n') {\n return false;\n }\n\n return this.#confirmProceed(prompt);\n }\n\n #createLoggers(targetURL: string, options: CLIOptions) {\n // Create file loggers\n const fileLoggerInit: FileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const { filePath } = FileLogger.getPathInfo({\n ...fileLoggerInit,\n ...fileLoggerOptions\n });\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fileLoggerInit, fileLoggerOptions);\n result.push(fl);\n }\n catch (error) {\n console.warn('Failed to create file logger: ', error instanceof Error ? error.message : error);\n }\n return result;\n }, []) || [];\n\n // Create console logger\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n\n // Chain logger\n const chainLogger = new ChainLogger([\n consoleLogger,\n ...fileLoggers\n ]);\n\n return {\n chainLogger,\n consoleLogger,\n fileLoggers\n };\n }\n\n async exit(code?: number) {\n if (this.#logger) {\n await this.#logger.end();\n }\n process.exit(code);\n }\n}\n"]}
|
|
@@ -71,7 +71,7 @@ class Downloader extends EventEmitter {
|
|
|
71
71
|
this.log('info', `Download ${retryOrBeginStr} (${__getDownloadIdString(task, batch)}): [type: ${task.srcEntity.type}; ID: #${task.srcEntity.id}]${destStr}`);
|
|
72
72
|
if (task instanceof FFmpegDownloadTaskBase) {
|
|
73
73
|
const retryOrBeginStr = task.retryCount > 0 ? 'Retry' : 'Begin';
|
|
74
|
-
this.log('info', `${retryOrBeginStr}
|
|
74
|
+
this.log('info', `${retryOrBeginStr} FFmpeg task (${__getDownloadIdString(task, batch)}): ${task.commandLine}`);
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
batch.on('taskComplete', ({ task }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Downloader.js","sourceRoot":"","sources":["../../src/downloaders/Downloader.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { EventEmitter } from 'events';\nimport deepFreeze from 'deep-freeze';\nimport Fetcher from '../utils/Fetcher.js';\nimport Bootstrap, { type DownloaderBootstrapData, type DownloaderType } from './Bootstrap.js';\nimport { type DownloaderInit, type DownloaderOptions, type FileExistsAction, getDownloaderInit } from './DownloaderOptions.js';\nimport { type DownloaderEvent, type DownloaderEventPayloadOf } from './DownloaderEvent.js';\nimport {type LogLevel} from '../utils/logging/Logger.js';\nimport type Logger from '../utils/logging/Logger.js';\nimport { commonLog } from '../utils/logging/Logger.js';\nimport { type Campaign } from '../entities/Campaign.js';\nimport FSHelper, { type WriteTextFileResult } from '../utils/FSHelper.js';\nimport DownloadTaskBatch from './task/DownloadTaskBatch.js';\nimport { type IDownloadTask } from './task/DownloadTask.js';\nimport DownloadTaskFactory from './task/DownloadTaskFactory.js';\nimport FilenameFormatHelper from '../utils/FilenameFormatHelper.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport { generateCampaignSummary } from './templates/CampaignInfo.js';\nimport path from 'path';\nimport URLHelper from '../utils/URLHelper.js';\nimport ffmpeg from 'fluent-ffmpeg';\nimport InnertubeLoader from '../utils/yt/InnertubeLoader.js';\nimport FFmpegDownloadTaskBase from './task/FFmpegDownloadTaskBase.js';\nimport { type UserIdOrVanityParam } from '../entities/User.js';\nimport ExternalDownloaderTask from './task/ExternalDownloaderTask.js';\n\nexport type DownloaderConfig<T extends DownloaderType> =\n DownloaderInit &\n Omit<DownloaderBootstrapData<T>, 'type'>;\n\nexport interface DownloaderStartParams {\n signal?: AbortSignal;\n}\n\ninterface CreateDownloadTaskParams {\n target: Downloadable[];\n targetName: string;\n destDir: string;\n fileExistsAction: FileExistsAction;\n}\n\nexport default abstract class Downloader<T extends DownloaderType> extends EventEmitter {\n\n abstract name: string;\n\n protected fetcher: Fetcher;\n protected fsHelper: FSHelper;\n protected config: DownloaderConfig<T>;\n protected logger?: Logger | null;\n\n #hasEmittedEndEventOnAbort: boolean;\n\n constructor(bootstrap: DownloaderBootstrapData<T>, options?: DownloaderOptions) {\n super();\n this.#validateOptions(options);\n\n this.config = {\n ...bootstrap,\n ...getDownloaderInit(options)\n };\n\n this.fetcher = new Fetcher(this.config, options?.logger);\n this.fsHelper = new FSHelper(this.config, this.logger);\n this.logger = options?.logger;\n\n if (this.config.pathToFFmpeg) {\n ffmpeg.setFfmpegPath(this.config.pathToFFmpeg);\n }\n\n InnertubeLoader.setLogger(this.logger);\n if (this.config.pathToYouTubeCredentials) {\n InnertubeLoader.setCredentialsFile(this.config.pathToYouTubeCredentials);\n }\n\n this.#hasEmittedEndEventOnAbort = false;\n }\n\n protected createDownloadTaskBatch(name: string, signal?: AbortSignal, ...createTasks: Array<CreateDownloadTaskParams | null>): Promise<{ batch: DownloadTaskBatch; errorCount: number; }> {\n\n const __getDownloadIdString = (task: IDownloadTask, batch: DownloadTaskBatch) => {\n let result = `#${batch.id}.${task.id}`;\n if (task.retryCount > 0) {\n result += `-r${task.retryCount}`;\n }\n return result;\n };\n\n const batch = new DownloadTaskBatch({\n name,\n fetcher: this.fetcher,\n limiter: this.config.request,\n logger: this.logger\n });\n\n batch.on('taskStart', ({task}) => {\n const retryOrBeginStr = task.retryCount > 0 ? 'retry' : 'begin';\n const isExternal = task instanceof ExternalDownloaderTask;\n const destStr = isExternal ? ' -> Unknown destination (external process)' : task.resolvedDestFilename ? ` -> ${task.resolvedDestFilename}` : '';\n this.log('info', `Download ${retryOrBeginStr} (${__getDownloadIdString(task, batch)}): [type: ${task.srcEntity.type}; ID: #${task.srcEntity.id}]${destStr}`);\n if (task instanceof FFmpegDownloadTaskBase) {\n const retryOrBeginStr = task.retryCount > 0 ? 'Retry' : 'Begin';\n this.log('info', `${retryOrBeginStr} downloading through FFmpeg (${__getDownloadIdString(task, batch)}): ${task.commandLine}`);\n }\n });\n\n batch.on('taskComplete', ({task}) => {\n const isExternal = task instanceof ExternalDownloaderTask;\n const destStr = isExternal ? ': Unknown destination (external process)' : task.resolvedDestPath ? `: \"${task.resolvedDestPath}\"` : '';\n this.log('info', `Download complete (${__getDownloadIdString(task, batch)})${destStr}`);\n });\n\n batch.on('taskError', ({error, willRetry}) => {\n const { task, cause, message } = error;\n const retryStr = willRetry ? '- will retry' : '';\n this.log('error', `Download error (${__getDownloadIdString(task, batch)}):`, cause || message, `(${task.src})`, retryStr);\n });\n\n batch.on('taskAbort', ({task}) => {\n this.log('warn', `Download aborted (${__getDownloadIdString(task, batch)})`);\n });\n\n batch.on('taskSkip', ({task, reason}) => {\n this.log('warn', `Download skipped (${__getDownloadIdString(task, batch)}): ${reason.message}`);\n });\n\n batch.on('taskSpawn', ({origin, spawn}) => {\n this.log('info', `Download spawned: #${batch.id}.${origin.id} -> #${batch.id}.${spawn.id}`);\n });\n\n /**\n * Uncomment this block to log download progress\n\n batch.on('taskProgress', ({task, progress}) => {\n if (progress) {\n if (progress.length) {\n this.log('info', `Download progress (${__getDownloadIdString(task, batch)}): ${progress.lengthDownloaded} / ${progress.length} ${progress.lengthUnit}s / ${progress.percent}% (${progress.speed} kB/s)`,);\n }\n else {\n this.log('info', `Download progress (${__getDownloadIdString(task, batch)}): ${progress.lengthDownloaded} / ? ${progress.lengthUnit}s (${progress.speed} kB/s)`,);\n }\n }\n else {\n this.log('warn', `Download progress not available (${__getDownloadIdString(task, batch)})`);\n }\n });\n\n */\n\n batch.on('complete', () => {\n const total = batch.getTasks().length;\n const completed = batch.getTasks('completed').length;\n const error = batch.getTasks('error').length;\n const aborted = batch.getTasks('aborted').length;\n const skipped = batch.getTasks('skipped').length;\n const counts = [\n `${total} downloads`,\n `${completed} completed`,\n `${error} errors`,\n `${skipped} skipped`,\n `${aborted} aborted`\n ].join('; ');\n this.log('info', `Download batch complete (#${batch.id}): ${counts}`);\n });\n\n return this.addToDownloadTaskBatch(batch, signal, ...createTasks);\n }\n\n protected async addToDownloadTaskBatch(batch: DownloadTaskBatch, signal?: AbortSignal, ...createTasks: Array<CreateDownloadTaskParams | null>) {\n let failedCreateTaskCount = 0;\n for (const task of createTasks) {\n if (!task) {\n continue;\n }\n const { target, targetName, destDir } = task;\n this.log('info', `Create download tasks for ${targetName}`);\n if (task.target.length === 0) {\n this.log('warn', `No items in ${targetName}`);\n continue;\n }\n let createdCount = 0;\n for (const tt of target) {\n try {\n const tasks = await DownloadTaskFactory.createFromDownloadable({\n config: this.config,\n item: tt,\n destDir,\n fetcher: this.fetcher,\n fileExistsAction: task.fileExistsAction,\n limiter: batch.limiter,\n signal,\n logger: this.logger\n });\n\n if (signal?.aborted) {\n return { batch, errorCount: failedCreateTaskCount };\n }\n\n // Filter out tasks that are DOA (errors that occurred in DownloadTask.create())\n for (const task of tasks) {\n if (task.doa) {\n this.log('error', `Failed to create download task for item #${tt.id} in ${targetName}:`, task.doa.msg, task.doa.cause);\n failedCreateTaskCount++;\n }\n }\n batch.addTasks(tasks.filter((task) => !task.doa));\n createdCount += tasks.length;\n }\n catch (error) {\n if (signal?.aborted) {\n this.log('warn', 'Operation aborted');\n return { batch, errorCount: failedCreateTaskCount };\n }\n this.log('error', `Failed to create download task(s) for item #${tt.id} in ${targetName}:`, error);\n failedCreateTaskCount++;\n }\n }\n if (createdCount > 0) {\n this.fsHelper.createDir(destDir);\n }\n }\n if (failedCreateTaskCount > 0) {\n this.log('warn', `${failedCreateTaskCount} items could not be processed for downloading`);\n }\n return { batch, errorCount: failedCreateTaskCount };\n }\n\n abstract start(params: DownloaderStartParams): Promise<void>;\n\n static async getInstance(url: string, options?: DownloaderOptions) {\n const bootstrap = Bootstrap.getDownloaderBootstrapDataByURL(url);\n if (!bootstrap) {\n throw Error('Could not determine downloader type from URL');\n }\n switch (bootstrap.type) {\n case 'product': {\n const ProductDownloader = (await import('./ProductDownloader.js')).default;\n return new ProductDownloader(bootstrap, options);\n }\n case 'post': {\n const PostDownloader = (await import('./PostDownloader.js')).default;\n return new PostDownloader(bootstrap, options);\n }\n }\n }\n\n static async getCampaign(\n creator: string | UserIdOrVanityParam,\n signal?: AbortSignal,\n logger?: Logger | null\n ) {\n // Backwards compatibility - if 'creator' is string type, then it is vanity\n const url = URLHelper.constructUserPostsURL(typeof creator === 'object' ? creator : { vanity: creator });\n const downloader = await this.getInstance(url, { logger });\n const PostDownloader = (await import('./PostDownloader.js')).default;\n if (downloader instanceof PostDownloader) {\n return downloader.__getCampaign(signal);\n }\n throw Error('Type mismatch: PostDownloader expected');\n }\n\n #validateOptions(options?: DownloaderOptions) {\n if (!options) {\n return true;\n }\n\n // Check FFmpeg path exists\n if (options.pathToFFmpeg) {\n if (!fs.existsSync(options.pathToFFmpeg)) {\n throw Error(`Path to FFmpeg executable \"${options.pathToFFmpeg}\" does not exist`);\n }\n else if (!fs.lstatSync(options.pathToFFmpeg).isFile()) {\n throw Error(`Path to FFmpeg executable \"${options.pathToFFmpeg}\" does not point to a file`);\n }\n }\n\n // Check outDir is a directory\n if (options.outDir) {\n if (fs.existsSync(options.outDir) && !fs.lstatSync(options.outDir).isDirectory()) {\n throw Error(`\"${options.outDir}\" is not a directory`);\n }\n }\n\n // Check formats are valid\n const campaignDirNameFormat = options.dirNameFormat?.campaign;\n if (campaignDirNameFormat) {\n const validate = FilenameFormatHelper.validateCampaignDirNameFormat(campaignDirNameFormat);\n if (!validate.validateOK) {\n throw Error(`Campaign directory name format '${campaignDirNameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n const contentDirNameFormat = options.dirNameFormat?.content;\n if (contentDirNameFormat) {\n const validate = FilenameFormatHelper.validateContentDirNameFormat(contentDirNameFormat);\n if (!validate.validateOK) {\n throw Error(`Content directory name format '${contentDirNameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n const mediaFilenameFormat = options.filenameFormat?.media;\n if (mediaFilenameFormat) {\n const validate = FilenameFormatHelper.validateMediaFilenameFormat(mediaFilenameFormat);\n if (!validate.validateOK) {\n throw Error(`Media filename format '${mediaFilenameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n\n return true;\n }\n\n protected saveCampaignInfo(campaign: Campaign | null, signal?: AbortSignal) {\n\n return new Promise<void>((resolve) => {\n void (async () => {\n if (!this.config.include.campaignInfo) {\n resolve();\n return;\n }\n \n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n let batch: DownloadTaskBatch | null = null;\n const abortHandler = () => {\n void (async () => {\n if (batch) {\n await batch.abort();\n }\n })();\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n \n if (!campaign) {\n this.log('warn', 'Skipped saving campaign info: target unavailable');\n resolve();\n return;\n }\n \n this.log('info', `Save campaign info #${campaign.id}`);\n this.emit('targetBegin', { target: campaign });\n this.emit('phaseBegin', { target: campaign, phase: 'saveInfo' });\n \n // Step 1: create campaign directories\n const campaignDirs = this.fsHelper.getCampaignDirs(campaign);\n this.log('debug', 'Campaign directories: ', campaignDirs);\n this.fsHelper.createDir(campaignDirs.root);\n this.fsHelper.createDir(campaignDirs.info);\n \n // Step 2: save summary and raw json\n const summary = generateCampaignSummary(campaign);\n const summaryFile = path.resolve(campaignDirs.info, 'info.txt');\n const saveSummaryResult = await this.fsHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, campaign, 'campaign summary');\n \n // Campaign / creator raw data might not be complete. Fetch directly from API.\n // Strictly speaking, we should check for 'error' in results, but since it's not going to be fatal we'll just skip it.\n const { json: fetchedCampaignAPIData } = await this.fetchCampaign(campaign.id, signal);\n const { json: fetchedCreatorAPIData } = campaign.creator ? await this.fetchUser(campaign.creator.id, signal) : { json: null };\n \n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n const campaignRawFile = path.resolve(campaignDirs.info, 'campaign-api.json');\n const saveCampaignRawResult = await this.fsHelper.writeTextFile(\n campaignRawFile, fetchedCampaignAPIData || campaign.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveCampaignRawResult, campaign, 'campaign API data');\n \n if (campaign.creator) {\n const creatorRawFile = path.resolve(campaignDirs.info, 'creator-api.json');\n const saveCreatorRawResult = await this.fsHelper.writeTextFile(\n creatorRawFile, fetchedCreatorAPIData || campaign.creator.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveCreatorRawResult, campaign.creator, 'creator API data');\n }\n \n this.emit('phaseEnd', { target: campaign, phase: 'saveInfo' });\n \n // Step 3: download campaign media items\n this.emit('phaseBegin', { target: campaign, phase: 'saveMedia' });\n const campaignMedia: Downloadable[] = [\n campaign.avatarImage,\n campaign.coverPhoto\n ];\n if (campaign.creator) {\n campaignMedia.push(\n campaign.creator.image,\n campaign.creator.thumbnail\n );\n }\n for (const reward of campaign.rewards) {\n if (reward.image) {\n campaignMedia.push(reward.image);\n }\n }\n batch = (await this.createDownloadTaskBatch(\n `Campaign #${campaign.id} (${campaign.name})`,\n signal,\n {\n target: campaignMedia,\n targetName: `campaign #${campaign.id} -> images`,\n destDir: campaignDirs.info,\n fileExistsAction: this.config.fileExistsAction.info\n }\n )).batch;\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n batch.prestart();\n this.emit('phaseBegin', { target: campaign, phase: 'batchDownload', batch });\n await batch.start();\n await batch.destroy();\n this.emit('phaseEnd', { target: campaign, phase: 'batchDownload' });\n this.emit('phaseEnd', { target: campaign, phase: 'saveMedia' });\n \n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n // Done\n this.log('info', 'Done saving campaign info');\n this.emit('targetEnd', { target: campaign, isSkipped: false });\n \n resolve();\n })();\n });\n\n }\n\n protected log(level: LogLevel, ...msg: any[]) {\n commonLog(this.logger, level, this.name, ...msg);\n }\n\n getConfig() {\n return deepFreeze(this.config);\n }\n\n protected checkAbortSignal(signal: AbortSignal | undefined, resolve: () => void) {\n if (signal && signal.aborted) {\n if (!this.#hasEmittedEndEventOnAbort) {\n this.emit('end', { aborted: true, message: 'Download aborted' });\n this.#hasEmittedEndEventOnAbort = true;\n }\n resolve();\n return true;\n }\n return false;\n }\n\n protected logWriteTextFileResult(result: WriteTextFileResult, target: {id: string}, targetName: string) {\n switch (result.status) {\n case 'completed':\n this.log('info', `Saved ${targetName} to \"${result.filePath}\"`);\n break;\n case 'skipped':\n this.log('warn', `Skipped saving ${targetName} #${target.id}: ${result.message}`);\n break;\n case 'error':\n this.log('error', `Error saving ${targetName} #${target.id} to \"${result.filePath}\":`, result.error);\n }\n }\n\n protected async commonFetchAPI(url: string, signal?: AbortSignal) {\n let json, requestAPIError: any;\n try {\n json = await this.fetcher.get({ url, type: 'json', maxRetries: this.config.request.maxRetries, signal });\n }\n catch (error) {\n if (signal?.aborted) {\n this.log('warn', 'API request aborted');\n }\n else {\n this.log('error', `Error requesting API URL \"${url}\": `, error);\n requestAPIError = error;\n }\n json = null;\n }\n return { json, error: requestAPIError };\n }\n\n protected fetchCampaign(campaignId: string, signal?: AbortSignal) {\n const url = URLHelper.constructCampaignAPIURL(campaignId);\n this.log('debug', `Fetch campaign data from API URL \"${url}\"`);\n return this.commonFetchAPI(url, signal);\n }\n\n protected fetchUser(userId: string, signal?: AbortSignal) {\n const url = URLHelper.constructUserAPIURL(userId);\n this.log('debug', `Fetch user data from API URL \"${url}\"`);\n return this.commonFetchAPI(url, signal);\n }\n\n on<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.on(event, listener);\n }\n\n once<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n once(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.once(event, listener);\n }\n\n off<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n off(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.off(event, listener);\n }\n\n emit<T extends DownloaderEvent>(event: T, args: DownloaderEventPayloadOf<T>): boolean;\n emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Downloader.js","sourceRoot":"","sources":["../../src/downloaders/Downloader.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { EventEmitter } from 'events';\nimport deepFreeze from 'deep-freeze';\nimport Fetcher from '../utils/Fetcher.js';\nimport Bootstrap, { type DownloaderBootstrapData, type DownloaderType } from './Bootstrap.js';\nimport { type DownloaderInit, type DownloaderOptions, type FileExistsAction, getDownloaderInit } from './DownloaderOptions.js';\nimport { type DownloaderEvent, type DownloaderEventPayloadOf } from './DownloaderEvent.js';\nimport {type LogLevel} from '../utils/logging/Logger.js';\nimport type Logger from '../utils/logging/Logger.js';\nimport { commonLog } from '../utils/logging/Logger.js';\nimport { type Campaign } from '../entities/Campaign.js';\nimport FSHelper, { type WriteTextFileResult } from '../utils/FSHelper.js';\nimport DownloadTaskBatch from './task/DownloadTaskBatch.js';\nimport { type IDownloadTask } from './task/DownloadTask.js';\nimport DownloadTaskFactory from './task/DownloadTaskFactory.js';\nimport FilenameFormatHelper from '../utils/FilenameFormatHelper.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport { generateCampaignSummary } from './templates/CampaignInfo.js';\nimport path from 'path';\nimport URLHelper from '../utils/URLHelper.js';\nimport ffmpeg from 'fluent-ffmpeg';\nimport InnertubeLoader from '../utils/yt/InnertubeLoader.js';\nimport FFmpegDownloadTaskBase from './task/FFmpegDownloadTaskBase.js';\nimport { type UserIdOrVanityParam } from '../entities/User.js';\nimport ExternalDownloaderTask from './task/ExternalDownloaderTask.js';\n\nexport type DownloaderConfig<T extends DownloaderType> =\n DownloaderInit &\n Omit<DownloaderBootstrapData<T>, 'type'>;\n\nexport interface DownloaderStartParams {\n signal?: AbortSignal;\n}\n\ninterface CreateDownloadTaskParams {\n target: Downloadable[];\n targetName: string;\n destDir: string;\n fileExistsAction: FileExistsAction;\n}\n\nexport default abstract class Downloader<T extends DownloaderType> extends EventEmitter {\n\n abstract name: string;\n\n protected fetcher: Fetcher;\n protected fsHelper: FSHelper;\n protected config: DownloaderConfig<T>;\n protected logger?: Logger | null;\n\n #hasEmittedEndEventOnAbort: boolean;\n\n constructor(bootstrap: DownloaderBootstrapData<T>, options?: DownloaderOptions) {\n super();\n this.#validateOptions(options);\n\n this.config = {\n ...bootstrap,\n ...getDownloaderInit(options)\n };\n\n this.fetcher = new Fetcher(this.config, options?.logger);\n this.fsHelper = new FSHelper(this.config, this.logger);\n this.logger = options?.logger;\n\n if (this.config.pathToFFmpeg) {\n ffmpeg.setFfmpegPath(this.config.pathToFFmpeg);\n }\n\n InnertubeLoader.setLogger(this.logger);\n if (this.config.pathToYouTubeCredentials) {\n InnertubeLoader.setCredentialsFile(this.config.pathToYouTubeCredentials);\n }\n\n this.#hasEmittedEndEventOnAbort = false;\n }\n\n protected createDownloadTaskBatch(name: string, signal?: AbortSignal, ...createTasks: Array<CreateDownloadTaskParams | null>): Promise<{ batch: DownloadTaskBatch; errorCount: number; }> {\n\n const __getDownloadIdString = (task: IDownloadTask, batch: DownloadTaskBatch) => {\n let result = `#${batch.id}.${task.id}`;\n if (task.retryCount > 0) {\n result += `-r${task.retryCount}`;\n }\n return result;\n };\n\n const batch = new DownloadTaskBatch({\n name,\n fetcher: this.fetcher,\n limiter: this.config.request,\n logger: this.logger\n });\n\n batch.on('taskStart', ({task}) => {\n const retryOrBeginStr = task.retryCount > 0 ? 'retry' : 'begin';\n const isExternal = task instanceof ExternalDownloaderTask;\n const destStr = isExternal ? ' -> Unknown destination (external process)' : task.resolvedDestFilename ? ` -> ${task.resolvedDestFilename}` : '';\n this.log('info', `Download ${retryOrBeginStr} (${__getDownloadIdString(task, batch)}): [type: ${task.srcEntity.type}; ID: #${task.srcEntity.id}]${destStr}`);\n if (task instanceof FFmpegDownloadTaskBase) {\n const retryOrBeginStr = task.retryCount > 0 ? 'Retry' : 'Begin';\n this.log('info', `${retryOrBeginStr} FFmpeg task (${__getDownloadIdString(task, batch)}): ${task.commandLine}`);\n }\n });\n\n batch.on('taskComplete', ({task}) => {\n const isExternal = task instanceof ExternalDownloaderTask;\n const destStr = isExternal ? ': Unknown destination (external process)' : task.resolvedDestPath ? `: \"${task.resolvedDestPath}\"` : '';\n this.log('info', `Download complete (${__getDownloadIdString(task, batch)})${destStr}`);\n });\n\n batch.on('taskError', ({error, willRetry}) => {\n const { task, cause, message } = error;\n const retryStr = willRetry ? '- will retry' : '';\n this.log('error', `Download error (${__getDownloadIdString(task, batch)}):`, cause || message, `(${task.src})`, retryStr);\n });\n\n batch.on('taskAbort', ({task}) => {\n this.log('warn', `Download aborted (${__getDownloadIdString(task, batch)})`);\n });\n\n batch.on('taskSkip', ({task, reason}) => {\n this.log('warn', `Download skipped (${__getDownloadIdString(task, batch)}): ${reason.message}`);\n });\n\n batch.on('taskSpawn', ({origin, spawn}) => {\n this.log('info', `Download spawned: #${batch.id}.${origin.id} -> #${batch.id}.${spawn.id}`);\n });\n\n /**\n * Uncomment this block to log download progress\n\n batch.on('taskProgress', ({task, progress}) => {\n if (progress) {\n if (progress.length) {\n this.log('info', `Download progress (${__getDownloadIdString(task, batch)}): ${progress.lengthDownloaded} / ${progress.length} ${progress.lengthUnit}s / ${progress.percent}% (${progress.speed} kB/s)`,);\n }\n else {\n this.log('info', `Download progress (${__getDownloadIdString(task, batch)}): ${progress.lengthDownloaded} / ? ${progress.lengthUnit}s (${progress.speed} kB/s)`,);\n }\n }\n else {\n this.log('warn', `Download progress not available (${__getDownloadIdString(task, batch)})`);\n }\n });\n\n */\n\n batch.on('complete', () => {\n const total = batch.getTasks().length;\n const completed = batch.getTasks('completed').length;\n const error = batch.getTasks('error').length;\n const aborted = batch.getTasks('aborted').length;\n const skipped = batch.getTasks('skipped').length;\n const counts = [\n `${total} downloads`,\n `${completed} completed`,\n `${error} errors`,\n `${skipped} skipped`,\n `${aborted} aborted`\n ].join('; ');\n this.log('info', `Download batch complete (#${batch.id}): ${counts}`);\n });\n\n return this.addToDownloadTaskBatch(batch, signal, ...createTasks);\n }\n\n protected async addToDownloadTaskBatch(batch: DownloadTaskBatch, signal?: AbortSignal, ...createTasks: Array<CreateDownloadTaskParams | null>) {\n let failedCreateTaskCount = 0;\n for (const task of createTasks) {\n if (!task) {\n continue;\n }\n const { target, targetName, destDir } = task;\n this.log('info', `Create download tasks for ${targetName}`);\n if (task.target.length === 0) {\n this.log('warn', `No items in ${targetName}`);\n continue;\n }\n let createdCount = 0;\n for (const tt of target) {\n try {\n const tasks = await DownloadTaskFactory.createFromDownloadable({\n config: this.config,\n item: tt,\n destDir,\n fetcher: this.fetcher,\n fileExistsAction: task.fileExistsAction,\n limiter: batch.limiter,\n signal,\n logger: this.logger\n });\n\n if (signal?.aborted) {\n return { batch, errorCount: failedCreateTaskCount };\n }\n\n // Filter out tasks that are DOA (errors that occurred in DownloadTask.create())\n for (const task of tasks) {\n if (task.doa) {\n this.log('error', `Failed to create download task for item #${tt.id} in ${targetName}:`, task.doa.msg, task.doa.cause);\n failedCreateTaskCount++;\n }\n }\n batch.addTasks(tasks.filter((task) => !task.doa));\n createdCount += tasks.length;\n }\n catch (error) {\n if (signal?.aborted) {\n this.log('warn', 'Operation aborted');\n return { batch, errorCount: failedCreateTaskCount };\n }\n this.log('error', `Failed to create download task(s) for item #${tt.id} in ${targetName}:`, error);\n failedCreateTaskCount++;\n }\n }\n if (createdCount > 0) {\n this.fsHelper.createDir(destDir);\n }\n }\n if (failedCreateTaskCount > 0) {\n this.log('warn', `${failedCreateTaskCount} items could not be processed for downloading`);\n }\n return { batch, errorCount: failedCreateTaskCount };\n }\n\n abstract start(params: DownloaderStartParams): Promise<void>;\n\n static async getInstance(url: string, options?: DownloaderOptions) {\n const bootstrap = Bootstrap.getDownloaderBootstrapDataByURL(url);\n if (!bootstrap) {\n throw Error('Could not determine downloader type from URL');\n }\n switch (bootstrap.type) {\n case 'product': {\n const ProductDownloader = (await import('./ProductDownloader.js')).default;\n return new ProductDownloader(bootstrap, options);\n }\n case 'post': {\n const PostDownloader = (await import('./PostDownloader.js')).default;\n return new PostDownloader(bootstrap, options);\n }\n }\n }\n\n static async getCampaign(\n creator: string | UserIdOrVanityParam,\n signal?: AbortSignal,\n logger?: Logger | null\n ) {\n // Backwards compatibility - if 'creator' is string type, then it is vanity\n const url = URLHelper.constructUserPostsURL(typeof creator === 'object' ? creator : { vanity: creator });\n const downloader = await this.getInstance(url, { logger });\n const PostDownloader = (await import('./PostDownloader.js')).default;\n if (downloader instanceof PostDownloader) {\n return downloader.__getCampaign(signal);\n }\n throw Error('Type mismatch: PostDownloader expected');\n }\n\n #validateOptions(options?: DownloaderOptions) {\n if (!options) {\n return true;\n }\n\n // Check FFmpeg path exists\n if (options.pathToFFmpeg) {\n if (!fs.existsSync(options.pathToFFmpeg)) {\n throw Error(`Path to FFmpeg executable \"${options.pathToFFmpeg}\" does not exist`);\n }\n else if (!fs.lstatSync(options.pathToFFmpeg).isFile()) {\n throw Error(`Path to FFmpeg executable \"${options.pathToFFmpeg}\" does not point to a file`);\n }\n }\n\n // Check outDir is a directory\n if (options.outDir) {\n if (fs.existsSync(options.outDir) && !fs.lstatSync(options.outDir).isDirectory()) {\n throw Error(`\"${options.outDir}\" is not a directory`);\n }\n }\n\n // Check formats are valid\n const campaignDirNameFormat = options.dirNameFormat?.campaign;\n if (campaignDirNameFormat) {\n const validate = FilenameFormatHelper.validateCampaignDirNameFormat(campaignDirNameFormat);\n if (!validate.validateOK) {\n throw Error(`Campaign directory name format '${campaignDirNameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n const contentDirNameFormat = options.dirNameFormat?.content;\n if (contentDirNameFormat) {\n const validate = FilenameFormatHelper.validateContentDirNameFormat(contentDirNameFormat);\n if (!validate.validateOK) {\n throw Error(`Content directory name format '${contentDirNameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n const mediaFilenameFormat = options.filenameFormat?.media;\n if (mediaFilenameFormat) {\n const validate = FilenameFormatHelper.validateMediaFilenameFormat(mediaFilenameFormat);\n if (!validate.validateOK) {\n throw Error(`Media filename format '${mediaFilenameFormat}' is invalid (matched against ${validate.regex})`);\n }\n }\n\n return true;\n }\n\n protected saveCampaignInfo(campaign: Campaign | null, signal?: AbortSignal) {\n\n return new Promise<void>((resolve) => {\n void (async () => {\n if (!this.config.include.campaignInfo) {\n resolve();\n return;\n }\n \n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n let batch: DownloadTaskBatch | null = null;\n const abortHandler = () => {\n void (async () => {\n if (batch) {\n await batch.abort();\n }\n })();\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n \n if (!campaign) {\n this.log('warn', 'Skipped saving campaign info: target unavailable');\n resolve();\n return;\n }\n \n this.log('info', `Save campaign info #${campaign.id}`);\n this.emit('targetBegin', { target: campaign });\n this.emit('phaseBegin', { target: campaign, phase: 'saveInfo' });\n \n // Step 1: create campaign directories\n const campaignDirs = this.fsHelper.getCampaignDirs(campaign);\n this.log('debug', 'Campaign directories: ', campaignDirs);\n this.fsHelper.createDir(campaignDirs.root);\n this.fsHelper.createDir(campaignDirs.info);\n \n // Step 2: save summary and raw json\n const summary = generateCampaignSummary(campaign);\n const summaryFile = path.resolve(campaignDirs.info, 'info.txt');\n const saveSummaryResult = await this.fsHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, campaign, 'campaign summary');\n \n // Campaign / creator raw data might not be complete. Fetch directly from API.\n // Strictly speaking, we should check for 'error' in results, but since it's not going to be fatal we'll just skip it.\n const { json: fetchedCampaignAPIData } = await this.fetchCampaign(campaign.id, signal);\n const { json: fetchedCreatorAPIData } = campaign.creator ? await this.fetchUser(campaign.creator.id, signal) : { json: null };\n \n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n const campaignRawFile = path.resolve(campaignDirs.info, 'campaign-api.json');\n const saveCampaignRawResult = await this.fsHelper.writeTextFile(\n campaignRawFile, fetchedCampaignAPIData || campaign.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveCampaignRawResult, campaign, 'campaign API data');\n \n if (campaign.creator) {\n const creatorRawFile = path.resolve(campaignDirs.info, 'creator-api.json');\n const saveCreatorRawResult = await this.fsHelper.writeTextFile(\n creatorRawFile, fetchedCreatorAPIData || campaign.creator.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveCreatorRawResult, campaign.creator, 'creator API data');\n }\n \n this.emit('phaseEnd', { target: campaign, phase: 'saveInfo' });\n \n // Step 3: download campaign media items\n this.emit('phaseBegin', { target: campaign, phase: 'saveMedia' });\n const campaignMedia: Downloadable[] = [\n campaign.avatarImage,\n campaign.coverPhoto\n ];\n if (campaign.creator) {\n campaignMedia.push(\n campaign.creator.image,\n campaign.creator.thumbnail\n );\n }\n for (const reward of campaign.rewards) {\n if (reward.image) {\n campaignMedia.push(reward.image);\n }\n }\n batch = (await this.createDownloadTaskBatch(\n `Campaign #${campaign.id} (${campaign.name})`,\n signal,\n {\n target: campaignMedia,\n targetName: `campaign #${campaign.id} -> images`,\n destDir: campaignDirs.info,\n fileExistsAction: this.config.fileExistsAction.info\n }\n )).batch;\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n batch.prestart();\n this.emit('phaseBegin', { target: campaign, phase: 'batchDownload', batch });\n await batch.start();\n await batch.destroy();\n this.emit('phaseEnd', { target: campaign, phase: 'batchDownload' });\n this.emit('phaseEnd', { target: campaign, phase: 'saveMedia' });\n \n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n \n // Done\n this.log('info', 'Done saving campaign info');\n this.emit('targetEnd', { target: campaign, isSkipped: false });\n \n resolve();\n })();\n });\n\n }\n\n protected log(level: LogLevel, ...msg: any[]) {\n commonLog(this.logger, level, this.name, ...msg);\n }\n\n getConfig() {\n return deepFreeze(this.config);\n }\n\n protected checkAbortSignal(signal: AbortSignal | undefined, resolve: () => void) {\n if (signal && signal.aborted) {\n if (!this.#hasEmittedEndEventOnAbort) {\n this.emit('end', { aborted: true, message: 'Download aborted' });\n this.#hasEmittedEndEventOnAbort = true;\n }\n resolve();\n return true;\n }\n return false;\n }\n\n protected logWriteTextFileResult(result: WriteTextFileResult, target: {id: string}, targetName: string) {\n switch (result.status) {\n case 'completed':\n this.log('info', `Saved ${targetName} to \"${result.filePath}\"`);\n break;\n case 'skipped':\n this.log('warn', `Skipped saving ${targetName} #${target.id}: ${result.message}`);\n break;\n case 'error':\n this.log('error', `Error saving ${targetName} #${target.id} to \"${result.filePath}\":`, result.error);\n }\n }\n\n protected async commonFetchAPI(url: string, signal?: AbortSignal) {\n let json, requestAPIError: any;\n try {\n json = await this.fetcher.get({ url, type: 'json', maxRetries: this.config.request.maxRetries, signal });\n }\n catch (error) {\n if (signal?.aborted) {\n this.log('warn', 'API request aborted');\n }\n else {\n this.log('error', `Error requesting API URL \"${url}\": `, error);\n requestAPIError = error;\n }\n json = null;\n }\n return { json, error: requestAPIError };\n }\n\n protected fetchCampaign(campaignId: string, signal?: AbortSignal) {\n const url = URLHelper.constructCampaignAPIURL(campaignId);\n this.log('debug', `Fetch campaign data from API URL \"${url}\"`);\n return this.commonFetchAPI(url, signal);\n }\n\n protected fetchUser(userId: string, signal?: AbortSignal) {\n const url = URLHelper.constructUserAPIURL(userId);\n this.log('debug', `Fetch user data from API URL \"${url}\"`);\n return this.commonFetchAPI(url, signal);\n }\n\n on<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.on(event, listener);\n }\n\n once<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n once(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.once(event, listener);\n }\n\n off<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;\n off(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.off(event, listener);\n }\n\n emit<T extends DownloaderEvent>(event: T, args: DownloaderEventPayloadOf<T>): boolean;\n emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadTask.d.ts","sourceRoot":"","sources":["../../../src/downloaders/task/DownloadTask.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DownloadTask.d.ts","sourceRoot":"","sources":["../../../src/downloaders/task/DownloadTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/DownloadTask.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport { type Downloadable } from '../../entities/Downloadable.js';\nimport {type LogLevel} from '../../utils/logging/Logger.js';\nimport type Logger from '../../utils/logging/Logger.js';\nimport { commonLog } from '../../utils/logging/Logger.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport { type DownloaderConfig } from '../Downloader.js';\nimport type Bottleneck from 'bottleneck';\n\nexport class DownloadTaskError extends Error {\n task: IDownloadTask;\n cause?: Error;\n\n constructor(message: string, task: IDownloadTask, cause?: Error) {\n super(message);\n this.name = 'DownloadTaskError';\n this.task = task;\n this.cause = cause;\n }\n}\n\nexport type DownloadTaskSkipReason = {\n message: string;\n} & ({\n name: 'destFileExists';\n existingDestFilePath: string;\n} | {\n name: 'includeMediaByFilenameUnfulfilled';\n itemType: 'image' | 'audio' | 'attachment';\n pattern: string;\n destFilename: string;\n} | {\n name: 'other';\n})\n\nexport interface DownloadProgress {\n destFilename: string;\n destFilePath: string;\n lengthUnit: string;\n length?: number; // Measured in `lengthUnit`\n lengthDownloaded: number; // Measured in `lengthUnit`\n percent?: number;\n sizeDownloaded: number; // Kb\n speed: number; // Kb/s\n}\n\nexport interface DownloadTaskParams<T extends Downloadable = Downloadable> {\n src: string;\n srcEntity: T,\n config: DownloaderConfig<any>;\n callbacks: DownloadTaskCallbacks | null;\n logger?: Logger | null;\n}\n\nexport interface DownloadTaskCallbacks {\n onStart: (task: DownloadTask) => void;\n onProgress: (task: DownloadTask, progress: DownloadProgress | null) => void;\n onComplete: (task: DownloadTask) => void;\n onAbort: (task: DownloadTask) => void;\n onSkip: (task: DownloadTask, reason: DownloadTaskSkipReason) => void;\n onError: (error: DownloadTaskError, willRetry: boolean) => void;\n onSpawn: (origin: DownloadTask, spawn: DownloadTask) => void;\n}\n\nexport type DownloadTaskStatus =\n 'pending' |\n 'pending-retry' | // Pending retry on error\n 'downloading' |\n 'error' |\n 'completed' |\n 'aborted' |\n 'skipped';\n\nconst ENDED_STATUSES: DownloadTaskStatus[] = [\n 'error',\n 'completed',\n 'aborted',\n 'skipped'\n];\n\nexport interface IDownloadTask {\n id: number;\n src: string;\n srcEntity: Downloadable;\n retryCount: number;\n resolvedDestFilename: string | null;\n resolvedDestPath: string | null;\n getProgress: () => DownloadProgress | null;\n}\n\nexport default abstract class DownloadTask<T extends Downloadable = Downloadable> implements IDownloadTask {\n\n protected abstract name: string;\n\n static #idCounter = 0;\n\n #id: number;\n #config: DownloaderConfig<any>;\n #src: string;\n #retryCount: number;\n #resolvedDestPath: string | null;\n #srcEntity: T;\n #callbacks: DownloadTaskCallbacks | null;\n #logger?: Logger | null;\n #lastProgress: DownloadProgress | null;\n #status: DownloadTaskStatus;\n #fsHelper: FSHelper;\n #doa: {\n msg: string;\n cause: unknown;\n } | null;\n\n #startPromise: Promise<void> | null;\n #startingCallback: (() => void) | null;\n #abortPromise: Promise<void> | null;\n\n constructor(params: DownloadTaskParams<T>) {\n this.#id = DownloadTask.#idCounter;\n this.#config = params.config;\n this.#src = params.src;\n this.#retryCount = 0;\n this.#resolvedDestPath = null;\n this.#srcEntity = params.srcEntity;\n this.#callbacks = params.callbacks;\n this.#logger = params.logger;\n this.#lastProgress = null;\n this.#status = 'pending';\n this.#doa = null;\n this.#startPromise = null;\n this.#startingCallback = null;\n this.#abortPromise = null;\n\n this.#fsHelper = new FSHelper(params.config, params.logger);\n\n DownloadTask.#idCounter++;\n }\n\n protected abstract resolveDestPath(signal?: AbortSignal): Promise<string>;\n protected abstract doStart(): Promise<void>;\n protected abstract doAbort(): Promise<void>;\n protected abstract doDestroy(): Promise<void>;\n protected abstract doGetProgress(): DownloadProgress | null | undefined;\n\n static async create<A extends DownloadTask<B>, B extends Downloadable, C extends DownloadTaskParams<B>>(\n classname: new (p: C) => A,\n params: C,\n limiter?: Bottleneck,\n signal?: AbortSignal\n ): Promise<A> {\n const task = new classname(params);\n const maxRetries = params.config.request.maxRetries;\n const __doResolveDestPath = async () => {\n let t = 0;\n let err: unknown;\n while (t < maxRetries + 1) {\n try {\n const p = await task.resolveDestPath(signal);\n task.resolvedDestPath = p;\n task.log('debug', `(Task create #${task.srcEntity.id}) Resolved dest path: \"${p}\"`);\n return {\n hasError: false,\n destPath: p\n };\n }\n catch (error: unknown) {\n if (signal?.aborted) {\n throw error;\n }\n const willRetry = t < maxRetries ? 'will retry' : 'max reached';\n const retryStr = t > 0 ? `retried ${t} times - ${willRetry}`: willRetry;\n task.log('error', `(Task create #${task.srcEntity.id}) Error resolving dest path (${retryStr}):`, error);\n err = error;\n t++;\n }\n }\n return {\n hasError: true,\n msg: 'Could not resolve destination path',\n error: err\n };\n };\n const result = limiter ? await limiter.schedule(() => __doResolveDestPath()) : await __doResolveDestPath();\n if (result.hasError) {\n task.#doa = {\n msg: result.msg as string,\n cause: result.error\n };\n }\n return task;\n }\n\n addSuffixToDestPath(suffix: string) {\n if (!this.resolvedDestPath) {\n throw Error('Destination file path not resolved');\n }\n const parts = path.parse(this.resolvedDestPath);\n const newFilename = FSHelper.createFilename({\n name: parts.name,\n suffix,\n ext: parts.ext\n });\n this.resolvedDestPath = path.resolve(parts.dir, newFilename);\n }\n\n start() {\n if (this.#startPromise) {\n return this.#startPromise;\n }\n\n if (this.hasEnded()) {\n // Cannot start an ended task\n return Promise.resolve();\n }\n\n if (this.#doa) {\n this.notifyError(Error(this.#doa.msg, { cause: this.#doa.cause }), false);\n return Promise.resolve();\n }\n\n this.#startPromise = new Promise<void>((resolve) => {\n void (async () => {\n this.#startingCallback = () => {\n this.#startPromise = null;\n this.#startingCallback = null;\n resolve();\n };\n \n await this.doStart();\n \n // Retry on error, up to `maxRetries`\n while (this.#status === 'pending-retry' && this.#retryCount < this.maxRetries) {\n this.#retryCount++;\n await this.doStart();\n }\n })();\n });\n\n return this.#startPromise;\n }\n\n abort() {\n if (this.#abortPromise) {\n return this.#abortPromise;\n }\n\n this.#abortPromise = new Promise<void>((resolve) => {\n void (async () => {\n if (this.isRunning()) {\n await this.doAbort();\n }\n else if (this.#status === 'pending' || this.#status === 'pending-retry') {\n this.notifyAbort();\n }\n resolve();\n })();\n })\n .finally(() => {\n this.#abortPromise = null;\n });\n\n return this.#abortPromise;\n }\n\n getProgress() {\n const progress = this.doGetProgress();\n if (progress === undefined) {\n return this.#lastProgress;\n }\n this.#lastProgress = progress;\n return progress;\n }\n\n protected notifyStart() {\n this.#status = 'downloading';\n this.#lastProgress = this.getProgress();\n if (this.callbacks?.onStart) {\n this.callbacks.onStart(this);\n }\n }\n\n protected notifyProgress(progress: DownloadProgress | null) {\n this.#lastProgress = progress;\n if (this.callbacks?.onProgress) {\n this.callbacks.onProgress(this, progress);\n }\n }\n\n protected notifyComplete() {\n this.#notifyEnd('completed');\n }\n\n protected notifyAbort() {\n this.#notifyEnd('aborted');\n }\n\n protected notifySkip(reason: DownloadTaskSkipReason) {\n this.#notifyEnd('skipped', reason);\n }\n\n protected notifyError(error: any, allowRetry = true) {\n const msg = error instanceof Error ? error.message : error;\n const err = new DownloadTaskError(msg, this);\n if (error instanceof Error) {\n err.cause = error;\n }\n const willRetry = allowRetry && this.#retryCount < this.maxRetries;\n this.#notifyEnd('error', err, willRetry);\n }\n\n #notifyEnd(status: 'error', err: DownloadTaskError, willRetry: boolean): void;\n #notifyEnd(status: 'skipped', reason: DownloadTaskSkipReason): void;\n #notifyEnd(status: 'aborted'): void;\n #notifyEnd(status: 'completed'): void;\n #notifyEnd(status: 'completed' | 'aborted' | 'skipped' | 'error', ...cbPayload: any[]) {\n this.#status = status;\n let clearCallbacks = true;\n let callStartingCallback = true;\n switch (status) {\n case 'completed':\n if (this.callbacks?.onComplete) {\n this.callbacks.onComplete(this);\n }\n break;\n case 'aborted':\n if (this.callbacks?.onAbort) {\n this.callbacks.onAbort(this);\n }\n break;\n case 'skipped':\n if (this.callbacks?.onSkip) {\n const [ reason ] = cbPayload;\n this.callbacks.onSkip(this, reason);\n }\n break;\n case 'error': {\n const [ err, willRetry ] = cbPayload;\n if (willRetry) {\n this.#status = 'pending-retry';\n clearCallbacks = false;\n callStartingCallback = false;\n }\n if (this.callbacks?.onError) {\n this.callbacks.onError(err, willRetry);\n }\n }\n }\n\n if (this.#startingCallback && callStartingCallback) {\n this.#startingCallback();\n }\n\n if (clearCallbacks) {\n this.#callbacks = null;\n }\n }\n\n isRunning() {\n return this.status === 'downloading';\n }\n\n isAborting() {\n return !!this.#abortPromise;\n }\n\n hasEnded() {\n return ENDED_STATUSES.includes(this.#status);\n }\n\n get id() {\n return this.#id;\n }\n\n set id(value: number) {\n this.#id = value;\n }\n\n get src() {\n return this.#src;\n }\n\n get resolvedDestFilename() {\n return this.#resolvedDestPath ? path.basename(this.#resolvedDestPath) : null;\n }\n\n get resolvedDestPath() {\n return this.#resolvedDestPath;\n }\n\n get doa() {\n return this.#doa;\n }\n\n protected set resolvedDestPath(value: string | null) {\n this.#resolvedDestPath = value;\n }\n\n get srcEntity() {\n return this.#srcEntity;\n }\n\n protected get config() {\n return this.#config;\n }\n\n protected get maxRetries() {\n return this.#config.request.maxRetries;\n }\n\n protected get dryRun() {\n return this.#config.dryRun;\n }\n\n get retryCount() {\n return this.#retryCount;\n }\n\n get status() {\n return this.#status;\n }\n\n protected set status(value: DownloadTaskStatus) {\n this.#status = value;\n }\n\n protected get callbacks() {\n return this.#callbacks;\n }\n\n protected get fsHelper() {\n return this.#fsHelper;\n }\n\n setCallbacks(value: DownloadTaskCallbacks | null) {\n if (this.status !== 'pending') {\n throw Error('You can only set callbacks of a pending task');\n }\n this.#callbacks = value;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n\n protected get logger() {\n return this.#logger;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/DownloadTask.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAI/C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAI1C,YAAY,OAAe,EAAE,IAAmB,EAAE,KAAa;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAwDD,MAAM,cAAc,GAAyB;IAC3C,OAAO;IACP,WAAW;IACX,SAAS;IACT,SAAS;CACV,CAAC;AAYF,MAA8B,YAAY;IA0BxC,YAAY,MAA6B;;;QApBzC,mCAAY;QACZ,uCAA+B;QAC/B,oCAAa;QACb,2CAAoB;QACpB,iDAAiC;QACjC,0CAAc;QACd,0CAAyC;QACzC,uCAAwB;QACxB,6CAAuC;QACvC,uCAA4B;QAC5B,yCAAoB;QACpB,oCAGS;QAET,6CAAoC;QACpC,iDAAuC;QACvC,6CAAoC;QAGlC,uBAAA,IAAI,oBAAO,uBAAA,EAAY,mCAAW,MAAA,CAAC;QACnC,uBAAA,IAAI,wBAAW,MAAM,CAAC,MAAM,MAAA,CAAC;QAC7B,uBAAA,IAAI,qBAAQ,MAAM,CAAC,GAAG,MAAA,CAAC;QACvB,uBAAA,IAAI,4BAAe,CAAC,MAAA,CAAC;QACrB,uBAAA,IAAI,kCAAqB,IAAI,MAAA,CAAC;QAC9B,uBAAA,IAAI,2BAAc,MAAM,CAAC,SAAS,MAAA,CAAC;QACnC,uBAAA,IAAI,2BAAc,MAAM,CAAC,SAAS,MAAA,CAAC;QACnC,uBAAA,IAAI,wBAAW,MAAM,CAAC,MAAM,MAAA,CAAC;QAC7B,uBAAA,IAAI,8BAAiB,IAAI,MAAA,CAAC;QAC1B,uBAAA,IAAI,wBAAW,SAAS,MAAA,CAAC;QACzB,uBAAA,IAAI,qBAAQ,IAAI,MAAA,CAAC;QACjB,uBAAA,IAAI,8BAAiB,IAAI,MAAA,CAAC;QAC1B,uBAAA,IAAI,kCAAqB,IAAI,MAAA,CAAC;QAC9B,uBAAA,IAAI,8BAAiB,IAAI,MAAA,CAAC;QAE1B,uBAAA,IAAI,0BAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAA,CAAC;QAE5D,oCAAA,CAAA,iEAAuB,EAAvB,IAAyB,IAAA,CAAA,+BAAA,CAAC;IAC5B,CAAC;IAQD,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,SAA0B,EAC1B,MAAS,EACT,OAAoB,EACpB,MAAoB;QAEpB,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QACpD,MAAM,mBAAmB,GAAG,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,GAAY,CAAC;YACjB,OAAO,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;oBAC7C,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,EAAE,0BAA0B,CAAC,GAAG,CAAC,CAAC;oBACpF,OAAO;wBACL,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,CAAC;qBACZ,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAc,EAAE,CAAC;oBACtB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;wBACpB,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,SAAS,EAAE,CAAA,CAAC,CAAC,SAAS,CAAC;oBACxE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,EAAE,gCAAgC,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC;oBACzG,GAAG,GAAG,KAAK,CAAC;oBACZ,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE,oCAAoC;gBACzC,KAAK,EAAE,GAAG;aACX,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC;QAC3G,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,uBAAA,IAAI,qBAAQ;gBACV,GAAG,EAAE,MAAM,CAAC,GAAa;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,MAAA,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CAAC,MAAc;QAChC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC;YAC1C,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM;YACN,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,IAAI,uBAAA,IAAI,kCAAc,EAAE,CAAC;YACvB,OAAO,uBAAA,IAAI,kCAAc,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,6BAA6B;YAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,uBAAA,IAAI,yBAAK,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,uBAAA,IAAI,yBAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAA,IAAI,yBAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1E,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,uBAAA,IAAI,8BAAiB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,KAAK,CAAC,KAAK,IAAI,EAAE;;gBACf,uBAAA,IAAI,kCAAqB,GAAG,EAAE;oBAC5B,uBAAA,IAAI,8BAAiB,IAAI,MAAA,CAAC;oBAC1B,uBAAA,IAAI,kCAAqB,IAAI,MAAA,CAAC;oBAC9B,OAAO,EAAE,CAAC;gBACZ,CAAC,MAAA,CAAC;gBAEF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBAErB,qCAAqC;gBACrC,OAAO,uBAAA,IAAI,4BAAQ,KAAK,eAAe,IAAI,uBAAA,IAAI,gCAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC9E,uDAAA,CAAA,gEAAgB,EAAhB,IAAkB,IAAA,CAAA,MAAA,CAAC;oBACnB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,MAAA,CAAC;QAEH,OAAO,uBAAA,IAAI,kCAAc,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,uBAAA,IAAI,kCAAc,EAAE,CAAC;YACvB,OAAO,uBAAA,IAAI,kCAAc,CAAC;QAC5B,CAAC;QAED,uBAAA,IAAI,8BAAiB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;qBACI,IAAI,uBAAA,IAAI,4BAAQ,KAAK,SAAS,IAAI,uBAAA,IAAI,4BAAQ,KAAK,eAAe,EAAE,CAAC;oBACxE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,uBAAA,IAAI,8BAAiB,IAAI,MAAA,CAAC;QAC5B,CAAC,CAAC,MAAA,CAAC;QAEH,OAAO,uBAAA,IAAI,kCAAc,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,uBAAA,IAAI,kCAAc,CAAC;QAC5B,CAAC;QACD,uBAAA,IAAI,8BAAiB,QAAQ,MAAA,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAES,WAAW;QACnB,uBAAA,IAAI,wBAAW,aAAa,MAAA,CAAC;QAC7B,uBAAA,IAAI,8BAAiB,IAAI,CAAC,WAAW,EAAE,MAAA,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAES,cAAc,CAAC,QAAiC;QACxD,uBAAA,IAAI,8BAAiB,QAAQ,MAAA,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAES,cAAc;QACtB,uBAAA,IAAI,wDAAW,MAAf,IAAI,EAAY,WAAW,CAAC,CAAC;IAC/B,CAAC;IAES,WAAW;QACnB,uBAAA,IAAI,wDAAW,MAAf,IAAI,EAAY,SAAS,CAAC,CAAC;IAC7B,CAAC;IAES,UAAU,CAAC,MAA8B;QACjD,uBAAA,IAAI,wDAAW,MAAf,IAAI,EAAY,SAAS,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAES,WAAW,CAAC,KAAU,EAAE,UAAU,GAAG,IAAI;QACjD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,IAAI,uBAAA,IAAI,gCAAY,GAAG,IAAI,CAAC,UAAU,CAAC;QACnE,uBAAA,IAAI,wDAAW,MAAf,IAAI,EAAY,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAiDD,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;IACvC,CAAC;IAED,UAAU;QACR,OAAO,CAAC,CAAC,uBAAA,IAAI,kCAAc,CAAC;IAC9B,CAAC;IAED,QAAQ;QACN,OAAO,cAAc,CAAC,QAAQ,CAAC,uBAAA,IAAI,4BAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,uBAAA,IAAI,wBAAI,CAAC;IAClB,CAAC;IAED,IAAI,EAAE,CAAC,KAAa;QAClB,uBAAA,IAAI,oBAAO,KAAK,MAAA,CAAC;IACnB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,yBAAK,CAAC;IACnB,CAAC;IAED,IAAI,oBAAoB;QACtB,OAAO,uBAAA,IAAI,sCAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAA,IAAI,sCAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,uBAAA,IAAI,sCAAkB,CAAC;IAChC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,yBAAK,CAAC;IACnB,CAAC;IAED,IAAc,gBAAgB,CAAC,KAAoB;QACjD,uBAAA,IAAI,kCAAqB,KAAK,MAAA,CAAC;IACjC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,uBAAA,IAAI,+BAAW,CAAC;IACzB,CAAC;IAED,IAAc,MAAM;QAClB,OAAO,uBAAA,IAAI,4BAAQ,CAAC;IACtB,CAAC;IAED,IAAc,UAAU;QACtB,OAAO,uBAAA,IAAI,4BAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,IAAc,MAAM;QAClB,OAAO,uBAAA,IAAI,4BAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,gCAAY,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,uBAAA,IAAI,4BAAQ,CAAC;IACtB,CAAC;IAED,IAAc,MAAM,CAAC,KAAyB;QAC5C,uBAAA,IAAI,wBAAW,KAAK,MAAA,CAAC;IACvB,CAAC;IAED,IAAc,SAAS;QACrB,OAAO,uBAAA,IAAI,+BAAW,CAAC;IACzB,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,uBAAA,IAAI,8BAAU,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,KAAmC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QACD,uBAAA,IAAI,2BAAc,KAAK,MAAA,CAAC;IAC1B,CAAC;IAES,GAAG,CAAC,KAAe,EAAE,GAAG,GAAe;QAC/C,SAAS,CAAC,uBAAA,IAAI,4BAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,IAAc,MAAM;QAClB,OAAO,uBAAA,IAAI,4BAAQ,CAAC;IACtB,CAAC;;ytBApIU,MAAqD,EAAE,GAAG,SAAgB;IACnF,uBAAA,IAAI,wBAAW,MAAM,MAAA,CAAC;IACtB,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,oBAAoB,GAAG,IAAI,CAAC;IAChC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;YACD,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAE,MAAM,CAAE,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,MAAM;QACR,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAE,GAAG,EAAE,SAAS,CAAE,GAAG,SAAS,CAAC;YACrC,IAAI,SAAS,EAAE,CAAC;gBACd,uBAAA,IAAI,wBAAW,eAAe,MAAA,CAAC;gBAC/B,cAAc,GAAG,KAAK,CAAC;gBACvB,oBAAoB,GAAG,KAAK,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,uBAAA,IAAI,sCAAkB,IAAI,oBAAoB,EAAE,CAAC;QACnD,uBAAA,IAAI,sCAAkB,MAAtB,IAAI,CAAoB,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,uBAAA,IAAI,2BAAc,IAAI,MAAA,CAAC;IACzB,CAAC;AACH,CAAC;AApQM,mCAAa,CAAC,EAAJ,CAAK;eAJM,YAAY","sourcesContent":["import path from 'path';\nimport { type Downloadable } from '../../entities/Downloadable.js';\nimport {type LogLevel} from '../../utils/logging/Logger.js';\nimport type Logger from '../../utils/logging/Logger.js';\nimport { commonLog } from '../../utils/logging/Logger.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport { type DownloaderConfig } from '../Downloader.js';\nimport type Bottleneck from 'bottleneck';\n\nexport class DownloadTaskError extends Error {\n task: IDownloadTask;\n cause?: Error;\n\n constructor(message: string, task: IDownloadTask, cause?: Error) {\n super(message);\n this.name = 'DownloadTaskError';\n this.task = task;\n this.cause = cause;\n }\n}\n\nexport type DownloadTaskSkipReason = {\n message: string;\n} & ({\n name: 'destFileExists';\n existingDestFilePath: string;\n} | {\n name: 'includeMediaByFilenameUnfulfilled';\n itemType: 'image' | 'audio' | 'attachment';\n pattern: string;\n destFilename: string;\n} | {\n name: 'dependentTaskNotCompleted'\n} | {\n name: 'other';\n})\n\nexport interface DownloadProgress {\n destFilename: string;\n destFilePath: string;\n lengthUnit: string;\n length?: number; // Measured in `lengthUnit`\n lengthDownloaded: number; // Measured in `lengthUnit`\n percent?: number;\n sizeDownloaded: number; // Kb\n speed: number; // Kb/s\n}\n\nexport interface DownloadTaskParams<T extends Downloadable = Downloadable> {\n src: string;\n srcEntity: T,\n config: DownloaderConfig<any>;\n callbacks: DownloadTaskCallbacks | null;\n logger?: Logger | null;\n}\n\nexport interface DownloadTaskCallbacks {\n onStart: (task: DownloadTask) => void;\n onProgress: (task: DownloadTask, progress: DownloadProgress | null) => void;\n onComplete: (task: DownloadTask) => void;\n onAbort: (task: DownloadTask) => void;\n onSkip: (task: DownloadTask, reason: DownloadTaskSkipReason) => void;\n onError: (error: DownloadTaskError, willRetry: boolean) => void;\n onSpawn: (origin: DownloadTask, spawn: DownloadTask) => void;\n}\n\nexport type DownloadTaskStatus =\n 'pending' |\n 'pending-retry' | // Pending retry on error\n 'downloading' |\n 'error' |\n 'completed' |\n 'aborted' |\n 'skipped';\n\nconst ENDED_STATUSES: DownloadTaskStatus[] = [\n 'error',\n 'completed',\n 'aborted',\n 'skipped'\n];\n\nexport interface IDownloadTask {\n id: number;\n src: string;\n srcEntity: Downloadable;\n retryCount: number;\n resolvedDestFilename: string | null;\n resolvedDestPath: string | null;\n getProgress: () => DownloadProgress | null;\n}\n\nexport default abstract class DownloadTask<T extends Downloadable = Downloadable> implements IDownloadTask {\n\n protected abstract name: string;\n\n static #idCounter = 0;\n\n #id: number;\n #config: DownloaderConfig<any>;\n #src: string;\n #retryCount: number;\n #resolvedDestPath: string | null;\n #srcEntity: T;\n #callbacks: DownloadTaskCallbacks | null;\n #logger?: Logger | null;\n #lastProgress: DownloadProgress | null;\n #status: DownloadTaskStatus;\n #fsHelper: FSHelper;\n #doa: {\n msg: string;\n cause: unknown;\n } | null;\n\n #startPromise: Promise<void> | null;\n #startingCallback: (() => void) | null;\n #abortPromise: Promise<void> | null;\n\n constructor(params: DownloadTaskParams<T>) {\n this.#id = DownloadTask.#idCounter;\n this.#config = params.config;\n this.#src = params.src;\n this.#retryCount = 0;\n this.#resolvedDestPath = null;\n this.#srcEntity = params.srcEntity;\n this.#callbacks = params.callbacks;\n this.#logger = params.logger;\n this.#lastProgress = null;\n this.#status = 'pending';\n this.#doa = null;\n this.#startPromise = null;\n this.#startingCallback = null;\n this.#abortPromise = null;\n\n this.#fsHelper = new FSHelper(params.config, params.logger);\n\n DownloadTask.#idCounter++;\n }\n\n protected abstract resolveDestPath(signal?: AbortSignal): Promise<string>;\n protected abstract doStart(): Promise<void>;\n protected abstract doAbort(): Promise<void>;\n protected abstract doDestroy(): Promise<void>;\n protected abstract doGetProgress(): DownloadProgress | null | undefined;\n\n static async create<A extends DownloadTask<B>, B extends Downloadable, C extends DownloadTaskParams<B>>(\n classname: new (p: C) => A,\n params: C,\n limiter?: Bottleneck,\n signal?: AbortSignal\n ): Promise<A> {\n const task = new classname(params);\n const maxRetries = params.config.request.maxRetries;\n const __doResolveDestPath = async () => {\n let t = 0;\n let err: unknown;\n while (t < maxRetries + 1) {\n try {\n const p = await task.resolveDestPath(signal);\n task.resolvedDestPath = p;\n task.log('debug', `(Task create #${task.srcEntity.id}) Resolved dest path: \"${p}\"`);\n return {\n hasError: false,\n destPath: p\n };\n }\n catch (error: unknown) {\n if (signal?.aborted) {\n throw error;\n }\n const willRetry = t < maxRetries ? 'will retry' : 'max reached';\n const retryStr = t > 0 ? `retried ${t} times - ${willRetry}`: willRetry;\n task.log('error', `(Task create #${task.srcEntity.id}) Error resolving dest path (${retryStr}):`, error);\n err = error;\n t++;\n }\n }\n return {\n hasError: true,\n msg: 'Could not resolve destination path',\n error: err\n };\n };\n const result = limiter ? await limiter.schedule(() => __doResolveDestPath()) : await __doResolveDestPath();\n if (result.hasError) {\n task.#doa = {\n msg: result.msg as string,\n cause: result.error\n };\n }\n return task;\n }\n\n addSuffixToDestPath(suffix: string) {\n if (!this.resolvedDestPath) {\n throw Error('Destination file path not resolved');\n }\n const parts = path.parse(this.resolvedDestPath);\n const newFilename = FSHelper.createFilename({\n name: parts.name,\n suffix,\n ext: parts.ext\n });\n this.resolvedDestPath = path.resolve(parts.dir, newFilename);\n }\n\n start() {\n if (this.#startPromise) {\n return this.#startPromise;\n }\n\n if (this.hasEnded()) {\n // Cannot start an ended task\n return Promise.resolve();\n }\n\n if (this.#doa) {\n this.notifyError(Error(this.#doa.msg, { cause: this.#doa.cause }), false);\n return Promise.resolve();\n }\n\n this.#startPromise = new Promise<void>((resolve) => {\n void (async () => {\n this.#startingCallback = () => {\n this.#startPromise = null;\n this.#startingCallback = null;\n resolve();\n };\n \n await this.doStart();\n \n // Retry on error, up to `maxRetries`\n while (this.#status === 'pending-retry' && this.#retryCount < this.maxRetries) {\n this.#retryCount++;\n await this.doStart();\n }\n })();\n });\n\n return this.#startPromise;\n }\n\n abort() {\n if (this.#abortPromise) {\n return this.#abortPromise;\n }\n\n this.#abortPromise = new Promise<void>((resolve) => {\n void (async () => {\n if (this.isRunning()) {\n await this.doAbort();\n }\n else if (this.#status === 'pending' || this.#status === 'pending-retry') {\n this.notifyAbort();\n }\n resolve();\n })();\n })\n .finally(() => {\n this.#abortPromise = null;\n });\n\n return this.#abortPromise;\n }\n\n getProgress() {\n const progress = this.doGetProgress();\n if (progress === undefined) {\n return this.#lastProgress;\n }\n this.#lastProgress = progress;\n return progress;\n }\n\n protected notifyStart() {\n this.#status = 'downloading';\n this.#lastProgress = this.getProgress();\n if (this.callbacks?.onStart) {\n this.callbacks.onStart(this);\n }\n }\n\n protected notifyProgress(progress: DownloadProgress | null) {\n this.#lastProgress = progress;\n if (this.callbacks?.onProgress) {\n this.callbacks.onProgress(this, progress);\n }\n }\n\n protected notifyComplete() {\n this.#notifyEnd('completed');\n }\n\n protected notifyAbort() {\n this.#notifyEnd('aborted');\n }\n\n protected notifySkip(reason: DownloadTaskSkipReason) {\n this.#notifyEnd('skipped', reason);\n }\n\n protected notifyError(error: any, allowRetry = true) {\n const msg = error instanceof Error ? error.message : error;\n const err = new DownloadTaskError(msg, this);\n if (error instanceof Error) {\n err.cause = error;\n }\n const willRetry = allowRetry && this.#retryCount < this.maxRetries;\n this.#notifyEnd('error', err, willRetry);\n }\n\n #notifyEnd(status: 'error', err: DownloadTaskError, willRetry: boolean): void;\n #notifyEnd(status: 'skipped', reason: DownloadTaskSkipReason): void;\n #notifyEnd(status: 'aborted'): void;\n #notifyEnd(status: 'completed'): void;\n #notifyEnd(status: 'completed' | 'aborted' | 'skipped' | 'error', ...cbPayload: any[]) {\n this.#status = status;\n let clearCallbacks = true;\n let callStartingCallback = true;\n switch (status) {\n case 'completed':\n if (this.callbacks?.onComplete) {\n this.callbacks.onComplete(this);\n }\n break;\n case 'aborted':\n if (this.callbacks?.onAbort) {\n this.callbacks.onAbort(this);\n }\n break;\n case 'skipped':\n if (this.callbacks?.onSkip) {\n const [ reason ] = cbPayload;\n this.callbacks.onSkip(this, reason);\n }\n break;\n case 'error': {\n const [ err, willRetry ] = cbPayload;\n if (willRetry) {\n this.#status = 'pending-retry';\n clearCallbacks = false;\n callStartingCallback = false;\n }\n if (this.callbacks?.onError) {\n this.callbacks.onError(err, willRetry);\n }\n }\n }\n\n if (this.#startingCallback && callStartingCallback) {\n this.#startingCallback();\n }\n\n if (clearCallbacks) {\n this.#callbacks = null;\n }\n }\n\n isRunning() {\n return this.status === 'downloading';\n }\n\n isAborting() {\n return !!this.#abortPromise;\n }\n\n hasEnded() {\n return ENDED_STATUSES.includes(this.#status);\n }\n\n get id() {\n return this.#id;\n }\n\n set id(value: number) {\n this.#id = value;\n }\n\n get src() {\n return this.#src;\n }\n\n get resolvedDestFilename() {\n return this.#resolvedDestPath ? path.basename(this.#resolvedDestPath) : null;\n }\n\n get resolvedDestPath() {\n return this.#resolvedDestPath;\n }\n\n get doa() {\n return this.#doa;\n }\n\n protected set resolvedDestPath(value: string | null) {\n this.#resolvedDestPath = value;\n }\n\n get srcEntity() {\n return this.#srcEntity;\n }\n\n protected get config() {\n return this.#config;\n }\n\n protected get maxRetries() {\n return this.#config.request.maxRetries;\n }\n\n protected get dryRun() {\n return this.#config.dryRun;\n }\n\n get retryCount() {\n return this.#retryCount;\n }\n\n get status() {\n return this.#status;\n }\n\n protected set status(value: DownloadTaskStatus) {\n this.#status = value;\n }\n\n protected get callbacks() {\n return this.#callbacks;\n }\n\n protected get fsHelper() {\n return this.#fsHelper;\n }\n\n setCallbacks(value: DownloadTaskCallbacks | null) {\n if (this.status !== 'pending') {\n throw Error('You can only set callbacks of a pending task');\n }\n this.#callbacks = value;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n\n protected get logger() {\n return this.#logger;\n }\n}\n"]}
|
|
@@ -78,7 +78,7 @@ class DownloadTaskBatch extends EventEmitter {
|
|
|
78
78
|
if (!this.isAborted() && !this.isDestroyed()) {
|
|
79
79
|
__classPrivateFieldGet(this, _DownloadTaskBatch_instances, "m", _DownloadTaskBatch_reassignTaskId).call(this, spawn);
|
|
80
80
|
__classPrivateFieldGet(this, _DownloadTaskBatch_tasks, "f").push(spawn);
|
|
81
|
-
void
|
|
81
|
+
// void this.#limiter.schedule(() => spawn.start());
|
|
82
82
|
this.emit('taskSpawn', { origin, spawn });
|
|
83
83
|
void spawn.start();
|
|
84
84
|
}
|