patreon-dl 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/bin/patreon-dl-vimeo.js +36 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -0
- 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/DownloaderOptions.d.ts +3 -1
- package/dist/downloaders/DownloaderOptions.d.ts.map +1 -1
- package/dist/downloaders/DownloaderOptions.js +1 -0
- package/dist/downloaders/DownloaderOptions.js.map +1 -1
- package/dist/downloaders/task/ExternalDownloaderTask.d.ts.map +1 -1
- package/dist/downloaders/task/ExternalDownloaderTask.js +22 -2
- package/dist/downloaders/task/ExternalDownloaderTask.js.map +1 -1
- package/dist/entities/Post.d.ts +1 -0
- package/dist/entities/Post.d.ts.map +1 -1
- package/dist/entities/Post.js.map +1 -1
- package/dist/parsers/PostParser.d.ts.map +1 -1
- package/dist/parsers/PostParser.js +1 -0
- package/dist/parsers/PostParser.js.map +1 -1
- package/dist/utils/Fetcher.d.ts +1 -1
- package/dist/utils/Fetcher.d.ts.map +1 -1
- package/dist/utils/Fetcher.js +2 -2
- package/dist/utils/Fetcher.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -223,6 +223,13 @@ Note that you can override an option from a configuration file with one provided
|
|
|
223
223
|
|
|
224
224
|
## Changelog
|
|
225
225
|
|
|
226
|
+
v2.4.1
|
|
227
|
+
- Fix Vimeo download script obtaining and downloading from player URL in embed HTML ([#65](https://github.com/patrickkfkan/patreon-dl/issues/65))
|
|
228
|
+
- Add `post-url` and `cookie` to available external downloader exec params
|
|
229
|
+
- API changes (non-breaking):
|
|
230
|
+
- Expose `cookie` in `DownloaderConfig`
|
|
231
|
+
|
|
232
|
+
|
|
226
233
|
v2.4.0
|
|
227
234
|
- Support additional URL format: `https://www.patreon.com/cw/<creator>/posts`
|
|
228
235
|
- Add `stopOn` option ([#63](https://github.com/patrickkfkan/patreon-dl/issues/63))
|
package/bin/patreon-dl-vimeo.js
CHANGED
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
* --yt-dlp "</path/to/yt-dlp>": if yt-dlp is not in the PATH
|
|
17
17
|
*
|
|
18
18
|
* Upon encountering a post with embedded Vimeo content, 'patreon-dl' will call this script. The following then happens:
|
|
19
|
-
* - This script obtains the video URL from 'embed.html' or 'embed.url'.
|
|
19
|
+
* - This script obtains the video URL from 'embed.html' or 'embed.url'. The former is always preferable since it is what's actually
|
|
20
|
+
* played within the Patreon post, and furthermore 'embed.url' sometimes returns "Page not found"
|
|
21
|
+
* (see issue: https://github.com/patrickkfkan/patreon-dl/issues/65).
|
|
20
22
|
* - The URL is passed to yt-dlp.
|
|
21
23
|
* - yt-dlp downloads the video from URL and saves it to 'dest.dir'. The filename is determined by the specified
|
|
22
24
|
* format '%(title)s.%(ext)s' (see: https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#output-template).
|
|
@@ -31,11 +33,42 @@ function tryGetPlayerURL(html) {
|
|
|
31
33
|
if (!html) {
|
|
32
34
|
return null;
|
|
33
35
|
}
|
|
36
|
+
|
|
34
37
|
const regex = /https:\/\/player\.vimeo\.com\/video\/\d+/g;
|
|
35
38
|
const match = regex.exec(html);
|
|
36
39
|
if (match && match[0]) {
|
|
40
|
+
console.log('Found Vimeo player URL from embed HTML:', match[0]);
|
|
37
41
|
return match[0];
|
|
38
42
|
}
|
|
43
|
+
|
|
44
|
+
const regex2 = /src="(\/\/cdn.embedly.com\/widgets.+?)"/g;
|
|
45
|
+
const match2 = regex2.exec(html);
|
|
46
|
+
if (match2 && match2[1]) {
|
|
47
|
+
const embedlyURL = match2[1];
|
|
48
|
+
console.log('Found Embedly URL from embed HTML:', embedlyURL);
|
|
49
|
+
let embedlySrc;
|
|
50
|
+
try {
|
|
51
|
+
const urlObj = new URL(`https:${embedlyURL}`);
|
|
52
|
+
embedlySrc = urlObj.searchParams.get('src');
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('Error parsing Embedly URL:', error);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const embedlySrcObj = new URL(embedlySrc);
|
|
59
|
+
if (embedlySrcObj.hostname === 'player.vimeo.com') {
|
|
60
|
+
console.log(`Got Vimeo player URL from Embedly src: ${embedlySrc}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.warn(`Embedly src "${embedlySrc}" does not correspond to Vimeo player URL`);
|
|
64
|
+
}
|
|
65
|
+
return embedlySrc;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`Error parsing Embedly src "${embedlySrc}":`, error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
39
72
|
return null;
|
|
40
73
|
}
|
|
41
74
|
|
|
@@ -54,8 +87,8 @@ async function download(url, o, videoPassword, ytdlpPath) {
|
|
|
54
87
|
return await new Promise((resolve, reject) => {
|
|
55
88
|
let settled = false;
|
|
56
89
|
const args = [
|
|
57
|
-
'-o',
|
|
58
|
-
|
|
90
|
+
'-o', o,
|
|
91
|
+
'--referer', 'https://patreon.com/'
|
|
59
92
|
];
|
|
60
93
|
const printArgs = [...args];
|
|
61
94
|
if (videoPassword) {
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,OAAO,OAAO,oBAAoB;;;IAiBjC,KAAK;IA6XL,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;CAMzB"}
|
package/dist/cli/index.js
CHANGED
|
@@ -26,6 +26,7 @@ import envPaths from 'env-paths';
|
|
|
26
26
|
import YouTubeConfigurator from './helper/YouTubeConfigurator.js';
|
|
27
27
|
import ObjectHelper from '../utils/ObjectHelper.js';
|
|
28
28
|
import copy from 'fast-copy';
|
|
29
|
+
import cliTruncate from 'cli-truncate';
|
|
29
30
|
import { createProxyAgent } from '../utils/Proxy.js';
|
|
30
31
|
const YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';
|
|
31
32
|
class PatreonDownloaderCLI {
|
|
@@ -175,6 +176,9 @@ _PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo
|
|
|
175
176
|
if (config.include?.postsPublished?.before) {
|
|
176
177
|
displayConfig.include.postsPublished.before = config.include.postsPublished.before.toString();
|
|
177
178
|
}
|
|
179
|
+
if (config.cookie) {
|
|
180
|
+
displayConfig.cookie = cliTruncate(displayConfig.cookie, 20, { position: 'middle', space: true });
|
|
181
|
+
}
|
|
178
182
|
return ObjectHelper.clean(displayConfig, {
|
|
179
183
|
deep: true, cleanNulls: true, cleanEmptyObjects: true
|
|
180
184
|
});
|
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 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 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 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"]}
|
|
@@ -38,7 +38,7 @@ class Downloader extends EventEmitter {
|
|
|
38
38
|
...bootstrap,
|
|
39
39
|
...getDownloaderInit(options)
|
|
40
40
|
};
|
|
41
|
-
this.fetcher = new Fetcher(this.config, options?.
|
|
41
|
+
this.fetcher = new Fetcher(this.config, options?.logger);
|
|
42
42
|
this.fsHelper = new FSHelper(this.config, this.logger);
|
|
43
43
|
this.logger = options?.logger;
|
|
44
44
|
if (this.config.pathToFFmpeg) {
|
|
@@ -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?.cookie, 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} 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"]}
|
|
@@ -61,7 +61,9 @@ export interface DownloaderOptions {
|
|
|
61
61
|
logger?: Logger | null;
|
|
62
62
|
dryRun?: boolean;
|
|
63
63
|
}
|
|
64
|
-
export type DownloaderInit = DeepRequired<Pick<DownloaderOptions, 'outDir' | 'useStatusCache' | 'stopOn' | 'pathToFFmpeg' | 'pathToYouTubeCredentials' | 'dirNameFormat' | 'filenameFormat' | 'include' | 'request' | 'fileExistsAction' | 'embedDownloaders' | 'dryRun'
|
|
64
|
+
export type DownloaderInit = DeepRequired<Pick<DownloaderOptions, 'outDir' | 'useStatusCache' | 'stopOn' | 'pathToFFmpeg' | 'pathToYouTubeCredentials' | 'dirNameFormat' | 'filenameFormat' | 'include' | 'request' | 'fileExistsAction' | 'embedDownloaders' | 'dryRun'>> & {
|
|
65
|
+
cookie?: string;
|
|
66
|
+
};
|
|
65
67
|
export declare function getDownloaderInit(options?: DownloaderOptions): DownloaderInit;
|
|
66
68
|
export declare function getDefaultDownloaderOutDir(): string;
|
|
67
69
|
export declare function getDefaultDownloaderOptions(): DeepRequired<DownloaderOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloaderOptions.d.ts","sourceRoot":"","sources":["../../src/downloaders/DownloaderOptions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DownloaderOptions.d.ts","sourceRoot":"","sources":["../../src/downloaders/DownloaderOptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,7 @@ export function getDownloaderInit(options) {
|
|
|
63
63
|
proxy = null;
|
|
64
64
|
}
|
|
65
65
|
return {
|
|
66
|
+
cookie: options?.cookie,
|
|
66
67
|
outDir: options?.outDir ? path.resolve(options.outDir) : defaults.outDir,
|
|
67
68
|
useStatusCache: pickDefined(options?.useStatusCache, defaults.useStatusCache),
|
|
68
69
|
stopOn: pickDefined(options?.stopOn, defaults.stopOn),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloaderOptions.js","sourceRoot":"","sources":["../../src/downloaders/DownloaderOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type Logger from '../utils/logging/Logger.js';\nimport { type DeepRequired, pickDefined } from '../utils/Misc.js';\nimport type DateTime from '../utils/DateTime.js';\n\nexport type FileExistsAction = 'overwrite' | 'skip' | 'saveAsCopy' | 'saveAsCopyIfNewer';\nexport type StopOnCondition = 'never' | 'postPreviouslyDownloaded' | 'postPublishDateOutOfRange';\n\nexport interface DownloaderIncludeOptions {\n lockedContent?: boolean;\n postsWithMediaType?: Array<'image' | 'video' | 'audio' | 'attachment' | 'podcast'> | 'any' | 'none';\n postsInTier?: Array<string> | 'any';\n postsPublished?: {\n after?: DateTime | null;\n before?: DateTime | null;\n };\n campaignInfo?: boolean;\n contentInfo?: boolean;\n previewMedia?: boolean | Array<'image' | 'video' | 'audio'>;\n contentMedia?: boolean | Array<'image' | 'video' | 'audio' | 'attachment' | 'file'>;\n allMediaVariants?: boolean;\n mediaByFilename?: {\n images?: string | null;\n audio?: string | null;\n attachments?: string | null;\n };\n comments?: boolean;\n}\n\nexport interface ProxyOptions {\n url: string;\n rejectUnauthorizedTLS?: boolean;\n}\n\nexport interface EmbedDownloader {\n provider: string;\n exec: string;\n}\n\nexport interface DownloaderOptions {\n cookie?: string;\n useStatusCache?: boolean;\n stopOn?: StopOnCondition;\n pathToFFmpeg?: string | null;\n pathToYouTubeCredentials?: string | null;\n outDir?: string;\n dirNameFormat?: {\n campaign?: string;\n content?: string;\n };\n filenameFormat?: {\n media?: string;\n }\n include?: DownloaderIncludeOptions;\n request?: {\n maxRetries?: number;\n maxConcurrent?: number;\n minTime?: number;\n proxy?: ProxyOptions | null;\n };\n fileExistsAction?: {\n content?: FileExistsAction;\n info?: FileExistsAction;\n infoAPI?: FileExistsAction;\n };\n embedDownloaders?: EmbedDownloader[];\n logger?: Logger | null;\n dryRun?: boolean;\n}\n\nexport type DownloaderInit = DeepRequired<Pick<DownloaderOptions,\n 'outDir' |\n 'useStatusCache' |\n 'stopOn' |\n 'pathToFFmpeg' |\n 'pathToYouTubeCredentials' |\n 'dirNameFormat' |\n 'filenameFormat' |\n 'include' |\n 'request' |\n 'fileExistsAction' |\n 'embedDownloaders' |\n 'dryRun'>>;\n\nconst DEFAULT_DOWNLOADER_INIT: DeepRequired<DownloaderInit> = {\n outDir: process.cwd(),\n useStatusCache: true,\n stopOn: 'never',\n pathToFFmpeg: null,\n pathToYouTubeCredentials: null,\n dirNameFormat: {\n campaign: '{creator.vanity}[ - ]?{campaign.name}',\n content: '{content.id}[ - ]?{content.name}'\n },\n filenameFormat: {\n media: '{media.filename}'\n },\n include: {\n lockedContent: true,\n postsWithMediaType: 'any',\n postsInTier: 'any',\n postsPublished: {\n after: null,\n before: null\n },\n campaignInfo: true,\n contentInfo: true,\n previewMedia: true,\n contentMedia: true,\n allMediaVariants: false,\n mediaByFilename: {\n images: null,\n audio: null,\n attachments: null\n },\n comments: false\n },\n request: {\n maxRetries: 3,\n maxConcurrent: 10,\n minTime: 333,\n proxy: {\n url: '',\n rejectUnauthorizedTLS: true\n },\n },\n fileExistsAction: {\n content: 'skip',\n info: 'saveAsCopyIfNewer',\n infoAPI: 'overwrite'\n },\n embedDownloaders: [],\n dryRun: false\n};\n\nexport function getDownloaderInit(options?: DownloaderOptions): DownloaderInit {\n const defaults = DEFAULT_DOWNLOADER_INIT;\n\n let proxy: DownloaderInit['request']['proxy'] = null;\n if (options?.request?.proxy && defaults.request.proxy) {\n proxy = {\n url: options.request.proxy.url,\n rejectUnauthorizedTLS: pickDefined(options.request.proxy.rejectUnauthorizedTLS, defaults.request.proxy.rejectUnauthorizedTLS)\n };\n }\n if (!proxy?.url) {\n proxy = null;\n }\n\n return {\n outDir: options?.outDir ? path.resolve(options.outDir) : defaults.outDir,\n useStatusCache: pickDefined(options?.useStatusCache, defaults.useStatusCache),\n stopOn: pickDefined(options?.stopOn, defaults.stopOn),\n pathToFFmpeg: pickDefined(options?.pathToFFmpeg, defaults.pathToFFmpeg),\n pathToYouTubeCredentials: pickDefined(options?.pathToYouTubeCredentials, defaults.pathToYouTubeCredentials),\n dirNameFormat: {\n campaign: options?.dirNameFormat?.campaign || defaults.dirNameFormat.campaign,\n content: options?.dirNameFormat?.content || defaults.dirNameFormat.content\n },\n filenameFormat: {\n media: options?.filenameFormat?.media || defaults.filenameFormat.media\n },\n include: {\n lockedContent: pickDefined(options?.include?.lockedContent, defaults.include.lockedContent),\n postsWithMediaType: pickDefined(options?.include?.postsWithMediaType, defaults.include.postsWithMediaType),\n postsInTier: pickDefined(options?.include?.postsInTier, defaults.include.postsInTier),\n postsPublished: {\n after: pickDefined(options?.include?.postsPublished?.after, defaults.include.postsPublished.after),\n before: pickDefined(options?.include?.postsPublished?.before, defaults.include.postsPublished.before)\n },\n campaignInfo: pickDefined(options?.include?.campaignInfo, defaults.include.campaignInfo),\n contentInfo: pickDefined(options?.include?.contentInfo, defaults.include.contentInfo),\n previewMedia: pickDefined(options?.include?.previewMedia, defaults.include.previewMedia),\n contentMedia: pickDefined(options?.include?.contentMedia, defaults.include.contentMedia),\n allMediaVariants: pickDefined(options?.include?.allMediaVariants, defaults.include.allMediaVariants),\n mediaByFilename: {\n images: pickDefined(options?.include?.mediaByFilename?.images, defaults.include.mediaByFilename.images),\n audio: pickDefined(options?.include?.mediaByFilename?.audio, defaults.include.mediaByFilename.audio),\n attachments: pickDefined(options?.include?.mediaByFilename?.attachments, defaults.include.mediaByFilename.attachments)\n },\n comments: pickDefined(options?.include?.comments, defaults.include.comments)\n },\n request: {\n maxRetries: pickDefined(options?.request?.maxRetries, defaults.request.maxRetries),\n maxConcurrent: pickDefined(options?.request?.maxConcurrent, defaults.request.maxConcurrent),\n minTime: pickDefined(options?.request?.minTime, defaults.request.minTime),\n proxy\n },\n fileExistsAction: {\n content: options?.fileExistsAction?.content || defaults.fileExistsAction.content,\n info: options?.fileExistsAction?.info || defaults.fileExistsAction.info,\n infoAPI: options?.fileExistsAction?.infoAPI || defaults.fileExistsAction.infoAPI\n },\n embedDownloaders: pickDefined(options?.embedDownloaders, defaults.embedDownloaders),\n dryRun: pickDefined(options?.dryRun, defaults.dryRun)\n };\n}\n\nexport function getDefaultDownloaderOutDir() {\n return DEFAULT_DOWNLOADER_INIT.outDir;\n}\n\nexport function getDefaultDownloaderOptions(): DeepRequired<DownloaderOptions> {\n return {\n ...getDownloaderInit(),\n cookie: '',\n logger: null\n };\n}"]}
|
|
1
|
+
{"version":3,"file":"DownloaderOptions.js","sourceRoot":"","sources":["../../src/downloaders/DownloaderOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport type Logger from '../utils/logging/Logger.js';\nimport { type DeepRequired, pickDefined } from '../utils/Misc.js';\nimport type DateTime from '../utils/DateTime.js';\n\nexport type FileExistsAction = 'overwrite' | 'skip' | 'saveAsCopy' | 'saveAsCopyIfNewer';\nexport type StopOnCondition = 'never' | 'postPreviouslyDownloaded' | 'postPublishDateOutOfRange';\n\nexport interface DownloaderIncludeOptions {\n lockedContent?: boolean;\n postsWithMediaType?: Array<'image' | 'video' | 'audio' | 'attachment' | 'podcast'> | 'any' | 'none';\n postsInTier?: Array<string> | 'any';\n postsPublished?: {\n after?: DateTime | null;\n before?: DateTime | null;\n };\n campaignInfo?: boolean;\n contentInfo?: boolean;\n previewMedia?: boolean | Array<'image' | 'video' | 'audio'>;\n contentMedia?: boolean | Array<'image' | 'video' | 'audio' | 'attachment' | 'file'>;\n allMediaVariants?: boolean;\n mediaByFilename?: {\n images?: string | null;\n audio?: string | null;\n attachments?: string | null;\n };\n comments?: boolean;\n}\n\nexport interface ProxyOptions {\n url: string;\n rejectUnauthorizedTLS?: boolean;\n}\n\nexport interface EmbedDownloader {\n provider: string;\n exec: string;\n}\n\nexport interface DownloaderOptions {\n cookie?: string;\n useStatusCache?: boolean;\n stopOn?: StopOnCondition;\n pathToFFmpeg?: string | null;\n pathToYouTubeCredentials?: string | null;\n outDir?: string;\n dirNameFormat?: {\n campaign?: string;\n content?: string;\n };\n filenameFormat?: {\n media?: string;\n }\n include?: DownloaderIncludeOptions;\n request?: {\n maxRetries?: number;\n maxConcurrent?: number;\n minTime?: number;\n proxy?: ProxyOptions | null;\n };\n fileExistsAction?: {\n content?: FileExistsAction;\n info?: FileExistsAction;\n infoAPI?: FileExistsAction;\n };\n embedDownloaders?: EmbedDownloader[];\n logger?: Logger | null;\n dryRun?: boolean;\n}\n\nexport type DownloaderInit = DeepRequired<Pick<DownloaderOptions,\n 'outDir' |\n 'useStatusCache' |\n 'stopOn' |\n 'pathToFFmpeg' |\n 'pathToYouTubeCredentials' |\n 'dirNameFormat' |\n 'filenameFormat' |\n 'include' |\n 'request' |\n 'fileExistsAction' |\n 'embedDownloaders' |\n 'dryRun'>> & {\n cookie?: string;\n };\n\nconst DEFAULT_DOWNLOADER_INIT: DownloaderInit = {\n outDir: process.cwd(),\n useStatusCache: true,\n stopOn: 'never',\n pathToFFmpeg: null,\n pathToYouTubeCredentials: null,\n dirNameFormat: {\n campaign: '{creator.vanity}[ - ]?{campaign.name}',\n content: '{content.id}[ - ]?{content.name}'\n },\n filenameFormat: {\n media: '{media.filename}'\n },\n include: {\n lockedContent: true,\n postsWithMediaType: 'any',\n postsInTier: 'any',\n postsPublished: {\n after: null,\n before: null\n },\n campaignInfo: true,\n contentInfo: true,\n previewMedia: true,\n contentMedia: true,\n allMediaVariants: false,\n mediaByFilename: {\n images: null,\n audio: null,\n attachments: null\n },\n comments: false\n },\n request: {\n maxRetries: 3,\n maxConcurrent: 10,\n minTime: 333,\n proxy: {\n url: '',\n rejectUnauthorizedTLS: true\n },\n },\n fileExistsAction: {\n content: 'skip',\n info: 'saveAsCopyIfNewer',\n infoAPI: 'overwrite'\n },\n embedDownloaders: [],\n dryRun: false\n};\n\nexport function getDownloaderInit(options?: DownloaderOptions): DownloaderInit {\n const defaults = DEFAULT_DOWNLOADER_INIT;\n\n let proxy: DownloaderInit['request']['proxy'] = null;\n if (options?.request?.proxy && defaults.request.proxy) {\n proxy = {\n url: options.request.proxy.url,\n rejectUnauthorizedTLS: pickDefined(options.request.proxy.rejectUnauthorizedTLS, defaults.request.proxy.rejectUnauthorizedTLS)\n };\n }\n if (!proxy?.url) {\n proxy = null;\n }\n\n return {\n cookie: options?.cookie,\n outDir: options?.outDir ? path.resolve(options.outDir) : defaults.outDir,\n useStatusCache: pickDefined(options?.useStatusCache, defaults.useStatusCache),\n stopOn: pickDefined(options?.stopOn, defaults.stopOn),\n pathToFFmpeg: pickDefined(options?.pathToFFmpeg, defaults.pathToFFmpeg),\n pathToYouTubeCredentials: pickDefined(options?.pathToYouTubeCredentials, defaults.pathToYouTubeCredentials),\n dirNameFormat: {\n campaign: options?.dirNameFormat?.campaign || defaults.dirNameFormat.campaign,\n content: options?.dirNameFormat?.content || defaults.dirNameFormat.content\n },\n filenameFormat: {\n media: options?.filenameFormat?.media || defaults.filenameFormat.media\n },\n include: {\n lockedContent: pickDefined(options?.include?.lockedContent, defaults.include.lockedContent),\n postsWithMediaType: pickDefined(options?.include?.postsWithMediaType, defaults.include.postsWithMediaType),\n postsInTier: pickDefined(options?.include?.postsInTier, defaults.include.postsInTier),\n postsPublished: {\n after: pickDefined(options?.include?.postsPublished?.after, defaults.include.postsPublished.after),\n before: pickDefined(options?.include?.postsPublished?.before, defaults.include.postsPublished.before)\n },\n campaignInfo: pickDefined(options?.include?.campaignInfo, defaults.include.campaignInfo),\n contentInfo: pickDefined(options?.include?.contentInfo, defaults.include.contentInfo),\n previewMedia: pickDefined(options?.include?.previewMedia, defaults.include.previewMedia),\n contentMedia: pickDefined(options?.include?.contentMedia, defaults.include.contentMedia),\n allMediaVariants: pickDefined(options?.include?.allMediaVariants, defaults.include.allMediaVariants),\n mediaByFilename: {\n images: pickDefined(options?.include?.mediaByFilename?.images, defaults.include.mediaByFilename.images),\n audio: pickDefined(options?.include?.mediaByFilename?.audio, defaults.include.mediaByFilename.audio),\n attachments: pickDefined(options?.include?.mediaByFilename?.attachments, defaults.include.mediaByFilename.attachments)\n },\n comments: pickDefined(options?.include?.comments, defaults.include.comments)\n },\n request: {\n maxRetries: pickDefined(options?.request?.maxRetries, defaults.request.maxRetries),\n maxConcurrent: pickDefined(options?.request?.maxConcurrent, defaults.request.maxConcurrent),\n minTime: pickDefined(options?.request?.minTime, defaults.request.minTime),\n proxy\n },\n fileExistsAction: {\n content: options?.fileExistsAction?.content || defaults.fileExistsAction.content,\n info: options?.fileExistsAction?.info || defaults.fileExistsAction.info,\n infoAPI: options?.fileExistsAction?.infoAPI || defaults.fileExistsAction.infoAPI\n },\n embedDownloaders: pickDefined(options?.embedDownloaders, defaults.embedDownloaders),\n dryRun: pickDefined(options?.dryRun, defaults.dryRun)\n };\n}\n\nexport function getDefaultDownloaderOutDir() {\n return DEFAULT_DOWNLOADER_INIT.outDir;\n}\n\nexport function getDefaultDownloaderOptions(): DeepRequired<DownloaderOptions> {\n return {\n ...getDownloaderInit(),\n cookie: '',\n logger: null\n };\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalDownloaderTask.d.ts","sourceRoot":"","sources":["../../../src/downloaders/task/ExternalDownloaderTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,YAAY,EAAE,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGtG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,4BAA6B,SAAQ,kBAAkB;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,YAAY;;IAE9D,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;gBAOX,MAAM,EAAE,4BAA4B;IAShD,SAAS,CAAC,eAAe;IAIzB,SAAS,CAAC,OAAO;cAoGD,OAAO;cAgBP,SAAS;IAMzB,SAAS,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"ExternalDownloaderTask.d.ts","sourceRoot":"","sources":["../../../src/downloaders/task/ExternalDownloaderTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,YAAY,EAAE,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGtG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,4BAA6B,SAAQ,kBAAkB;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,YAAY;;IAE9D,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;gBAOX,MAAM,EAAE,4BAA4B;IAShD,SAAS,CAAC,eAAe;IAIzB,SAAS,CAAC,OAAO;cAoGD,OAAO;cAgBP,SAAS;IAMzB,SAAS,CAAC,aAAa;IA8BvB,MAAM,CAAC,mBAAmB,CACxB,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAC7B,EAAE,EAAE,eAAe,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,qBAAqB,GAAG,IAAI,EACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CA0DpC"}
|
|
@@ -162,11 +162,13 @@ class ExternalDownloaderTask extends DownloadTask {
|
|
|
162
162
|
}
|
|
163
163
|
const dict = {
|
|
164
164
|
'post.id': embed.postId,
|
|
165
|
+
'post.url': embed.postURL,
|
|
165
166
|
'embed.provider': embed.provider,
|
|
166
167
|
'embed.provider.url': embed.providerURL,
|
|
167
168
|
'embed.url': embed.url,
|
|
168
169
|
'embed.subject': embed.subject,
|
|
169
170
|
'embed.html': embed.html,
|
|
171
|
+
'cookie': config.cookie || '',
|
|
170
172
|
'dest.dir': destDir
|
|
171
173
|
};
|
|
172
174
|
const args = stringArgv(dl.exec);
|
|
@@ -178,7 +180,7 @@ class ExternalDownloaderTask extends DownloadTask {
|
|
|
178
180
|
for (let i = 0; i < args.length; i++) {
|
|
179
181
|
const arg = args[i];
|
|
180
182
|
const interpolated = Formatter.format(arg, dict).result.trim();
|
|
181
|
-
if (!interpolated) {
|
|
183
|
+
if (!interpolated && arg !== '{cookie}') {
|
|
182
184
|
__log('warn', `Could not create task: got empty string for command arg '${arg}'`);
|
|
183
185
|
return null;
|
|
184
186
|
}
|
|
@@ -199,7 +201,25 @@ class ExternalDownloaderTask extends DownloadTask {
|
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
203
|
_ExternalDownloaderTask_exec = new WeakMap(), _ExternalDownloaderTask_proc = new WeakMap(), _ExternalDownloaderTask_abortController = new WeakMap(), _ExternalDownloaderTask_abortingCallback = new WeakMap(), _ExternalDownloaderTask_instances = new WeakSet(), _ExternalDownloaderTask_getCommandString = function _ExternalDownloaderTask_getCommandString() {
|
|
202
|
-
const quotedArgs = __classPrivateFieldGet(this, _ExternalDownloaderTask_exec, "f").args.map((arg) =>
|
|
204
|
+
const quotedArgs = __classPrivateFieldGet(this, _ExternalDownloaderTask_exec, "f").args.map((arg) => {
|
|
205
|
+
const _arg = arg.trim();
|
|
206
|
+
if (_arg.startsWith('"') && _arg.endsWith('"')) {
|
|
207
|
+
return _arg;
|
|
208
|
+
}
|
|
209
|
+
if (_arg.includes('=') && _arg.startsWith('-')) {
|
|
210
|
+
const equalPosition = _arg.indexOf('=');
|
|
211
|
+
const argKey = _arg.substring(0, equalPosition);
|
|
212
|
+
let argValue = _arg.substring(equalPosition);
|
|
213
|
+
if (argValue.includes(' ')) {
|
|
214
|
+
argValue = `"${argValue}"`;
|
|
215
|
+
}
|
|
216
|
+
return `${argKey}=${argValue}`;
|
|
217
|
+
}
|
|
218
|
+
if (_arg.includes(' ')) {
|
|
219
|
+
return `"${_arg}"`;
|
|
220
|
+
}
|
|
221
|
+
return _arg;
|
|
222
|
+
});
|
|
203
223
|
return [
|
|
204
224
|
__classPrivateFieldGet(this, _ExternalDownloaderTask_exec, "f").command,
|
|
205
225
|
...quotedArgs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalDownloaderTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/ExternalDownloaderTask.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess } from 'child_process';\nimport { type PostEmbed } from '../../entities/Post.js';\nimport Formatter from '../../utils/Formatter.js';\nimport URLHelper from '../../utils/URLHelper.js';\nimport {type LogLevel} from '../../utils/logging/Logger.js';\nimport type Logger from '../../utils/logging/Logger.js';\nimport { type EmbedDownloader } from '../DownloaderOptions.js';\nimport DownloadTask, { type DownloadTaskCallbacks, type DownloadTaskParams } from './DownloadTask.js';\nimport spawn from '@patrickkfkan/cross-spawn';\nimport stringArgv from 'string-argv';\nimport { type DownloaderConfig } from '../Downloader.js';\n\nexport interface ExternalDownloaderTaskParams extends DownloadTaskParams {\n name: string;\n exec: {\n command: string;\n args: string[];\n };\n}\n\nexport default class ExternalDownloaderTask extends DownloadTask {\n\n protected name: string;\n\n #exec: ExternalDownloaderTaskParams['exec'];\n #proc: ChildProcess | null;\n #abortController: AbortController | null;\n #abortingCallback: (() => void) | null;\n\n constructor(params: ExternalDownloaderTaskParams) {\n super(params);\n this.#exec = params.exec;\n this.#abortController = null;\n this.#abortingCallback = null;\n this.#proc = null;\n this.name = params.name;\n }\n\n protected resolveDestPath() {\n return Promise.resolve('(not applicable)');\n } \n\n protected doStart() {\n return new Promise<void>((resolve) => {\n\n if (this.status === 'aborted') {\n resolve();\n return;\n }\n\n try {\n this.#abortController = new AbortController();\n const commandStr = this.#getCommandString();\n\n if (this.dryRun) {\n this.notifyStart();\n this.log('debug', `(dry-run) -> Skip command \"${commandStr}\"`);\n this.notifyComplete();\n resolve();\n return;\n }\n\n this.log('debug', `Going to execute \"${commandStr}\"`);\n const proc = spawn(this.#exec.command, this.#exec.args);\n this.log('debug', `[pid: ${proc.pid}] Exec \"${commandStr}\"`);\n let resolved = false;\n let lastErrMsg: string | null = null;\n\n proc.stdout?.on('data', (data) => {\n this.log('debug', `[pid ${proc.pid}] stdout:`, data.toString());\n });\n\n proc.stderr?.on('data', (data) => {\n this.log('warn', `[pid ${proc.pid}] stderr:`, data.toString());\n lastErrMsg = data;\n });\n\n proc.on('error', (err) => {\n resolved = true;\n if (this.#abortingCallback) {\n this.#abortingCallback();\n return;\n }\n this.notifyError(err);\n resolve();\n });\n\n proc.on('exit', (code, signal) => {\n if (resolved) {\n return;\n }\n resolved = true;\n if (this.#abortingCallback) {\n this.log('debug', `[pid: ${proc.pid}] Process exit due to abort`);\n this.#abortingCallback();\n return;\n }\n const signalStr = signal !== null ? `; signal: ${signal}` : '';\n this.log('debug', `[pid: ${proc.pid}] Process exit (code: ${code}${signalStr})`);\n if (code === 0) {\n this.notifyComplete();\n }\n else {\n const e = lastErrMsg ? `. Last captured error message: ${lastErrMsg}` : '';\n this.notifyError(`Process failed with exit code ${code} (pid: ${proc.pid})${e}`);\n }\n resolve();\n });\n\n this.#proc = proc;\n this.notifyStart();\n\n this.#abortController.signal.onabort = () => {\n if (proc.pid) {\n proc.kill('SIGKILL');\n }\n else if (this.#abortingCallback) {\n this.#abortingCallback();\n resolve();\n }\n };\n }\n catch (error: any) {\n if (this.#abortingCallback) {\n this.#abortingCallback();\n return;\n }\n this.notifyError(error);\n resolve();\n }\n })\n .finally(() => {\n if (this.#proc) {\n this.#proc.removeAllListeners();\n this.#proc.stdout?.removeAllListeners();\n this.#proc.stderr?.removeAllListeners();\n this.#proc = null;\n }\n this.#abortController = null;\n });\n }\n\n protected async doAbort() {\n return new Promise<void>((resolve) => {\n if (this.#abortController) {\n this.#abortingCallback = () => {\n this.#abortingCallback = null;\n this.notifyAbort();\n resolve();\n };\n this.#abortController.abort();\n }\n else {\n resolve();\n }\n });\n }\n\n protected async doDestroy() {\n this.#proc?.removeAllListeners();\n this.#proc = null;\n return Promise.resolve();\n }\n\n protected doGetProgress() {\n return undefined;\n }\n\n #getCommandString() {\n const quotedArgs = this.#exec.args.map((arg) => arg.includes(' ') ? `\"${arg}\"` : arg);\n return [\n this.#exec.command,\n ...quotedArgs\n ].join(' ');\n }\n\n static fromEmbedDownloader(\n config: DownloaderConfig<any>,\n dl: EmbedDownloader,\n embed: PostEmbed,\n destDir: string,\n callbacks: DownloadTaskCallbacks | null,\n logger: Logger | null | undefined\n ) {\n if (!embed.url) {\n return null;\n }\n const originator = `embed.downloader.${embed.provider}`;\n const __log = (level: LogLevel, ...message: any[]) => {\n logger?.log({\n level,\n originator,\n message\n });\n };\n if (!URLHelper.validateURL(embed.url)) {\n __log('warn', `Could not create task: invalid URL \"${embed.url}\"`);\n return null;\n }\n const dict = {\n 'post.id': embed.postId,\n 'embed.provider': embed.provider,\n 'embed.provider.url': embed.providerURL,\n 'embed.url': embed.url,\n 'embed.subject': embed.subject,\n 'embed.html': embed.html,\n 'dest.dir': destDir\n };\n\n const args = stringArgv(dl.exec);\n const cmd = args.shift();\n if (!cmd) {\n __log('warn', 'Could not create task: no command specified');\n return null;\n }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const interpolated = Formatter.format(arg, dict).result.trim();\n if (!interpolated) {\n __log('warn', `Could not create task: got empty string for command arg '${arg}'`);\n return null;\n }\n args[i] = interpolated;\n }\n\n return new ExternalDownloaderTask({\n name: originator,\n exec: {\n command: cmd,\n args\n },\n config,\n callbacks,\n logger,\n src: embed.url,\n srcEntity: embed\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExternalDownloaderTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/ExternalDownloaderTask.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess } from 'child_process';\nimport { type PostEmbed } from '../../entities/Post.js';\nimport Formatter from '../../utils/Formatter.js';\nimport URLHelper from '../../utils/URLHelper.js';\nimport {type LogLevel} from '../../utils/logging/Logger.js';\nimport type Logger from '../../utils/logging/Logger.js';\nimport { type EmbedDownloader } from '../DownloaderOptions.js';\nimport DownloadTask, { type DownloadTaskCallbacks, type DownloadTaskParams } from './DownloadTask.js';\nimport spawn from '@patrickkfkan/cross-spawn';\nimport stringArgv from 'string-argv';\nimport { type DownloaderConfig } from '../Downloader.js';\n\nexport interface ExternalDownloaderTaskParams extends DownloadTaskParams {\n name: string;\n exec: {\n command: string;\n args: string[];\n };\n}\n\nexport default class ExternalDownloaderTask extends DownloadTask {\n\n protected name: string;\n\n #exec: ExternalDownloaderTaskParams['exec'];\n #proc: ChildProcess | null;\n #abortController: AbortController | null;\n #abortingCallback: (() => void) | null;\n\n constructor(params: ExternalDownloaderTaskParams) {\n super(params);\n this.#exec = params.exec;\n this.#abortController = null;\n this.#abortingCallback = null;\n this.#proc = null;\n this.name = params.name;\n }\n\n protected resolveDestPath() {\n return Promise.resolve('(not applicable)');\n } \n\n protected doStart() {\n return new Promise<void>((resolve) => {\n\n if (this.status === 'aborted') {\n resolve();\n return;\n }\n\n try {\n this.#abortController = new AbortController();\n const commandStr = this.#getCommandString();\n\n if (this.dryRun) {\n this.notifyStart();\n this.log('debug', `(dry-run) -> Skip command \"${commandStr}\"`);\n this.notifyComplete();\n resolve();\n return;\n }\n\n this.log('debug', `Going to execute \"${commandStr}\"`);\n const proc = spawn(this.#exec.command, this.#exec.args);\n this.log('debug', `[pid: ${proc.pid}] Exec \"${commandStr}\"`);\n let resolved = false;\n let lastErrMsg: string | null = null;\n\n proc.stdout?.on('data', (data) => {\n this.log('debug', `[pid ${proc.pid}] stdout:`, data.toString());\n });\n\n proc.stderr?.on('data', (data) => {\n this.log('warn', `[pid ${proc.pid}] stderr:`, data.toString());\n lastErrMsg = data;\n });\n\n proc.on('error', (err) => {\n resolved = true;\n if (this.#abortingCallback) {\n this.#abortingCallback();\n return;\n }\n this.notifyError(err);\n resolve();\n });\n\n proc.on('exit', (code, signal) => {\n if (resolved) {\n return;\n }\n resolved = true;\n if (this.#abortingCallback) {\n this.log('debug', `[pid: ${proc.pid}] Process exit due to abort`);\n this.#abortingCallback();\n return;\n }\n const signalStr = signal !== null ? `; signal: ${signal}` : '';\n this.log('debug', `[pid: ${proc.pid}] Process exit (code: ${code}${signalStr})`);\n if (code === 0) {\n this.notifyComplete();\n }\n else {\n const e = lastErrMsg ? `. Last captured error message: ${lastErrMsg}` : '';\n this.notifyError(`Process failed with exit code ${code} (pid: ${proc.pid})${e}`);\n }\n resolve();\n });\n\n this.#proc = proc;\n this.notifyStart();\n\n this.#abortController.signal.onabort = () => {\n if (proc.pid) {\n proc.kill('SIGKILL');\n }\n else if (this.#abortingCallback) {\n this.#abortingCallback();\n resolve();\n }\n };\n }\n catch (error: any) {\n if (this.#abortingCallback) {\n this.#abortingCallback();\n return;\n }\n this.notifyError(error);\n resolve();\n }\n })\n .finally(() => {\n if (this.#proc) {\n this.#proc.removeAllListeners();\n this.#proc.stdout?.removeAllListeners();\n this.#proc.stderr?.removeAllListeners();\n this.#proc = null;\n }\n this.#abortController = null;\n });\n }\n\n protected async doAbort() {\n return new Promise<void>((resolve) => {\n if (this.#abortController) {\n this.#abortingCallback = () => {\n this.#abortingCallback = null;\n this.notifyAbort();\n resolve();\n };\n this.#abortController.abort();\n }\n else {\n resolve();\n }\n });\n }\n\n protected async doDestroy() {\n this.#proc?.removeAllListeners();\n this.#proc = null;\n return Promise.resolve();\n }\n\n protected doGetProgress() {\n return undefined;\n }\n\n #getCommandString() {\n const quotedArgs = this.#exec.args.map((arg) => {\n const _arg = arg.trim();\n if (_arg.startsWith('\"') && _arg.endsWith('\"')) {\n return _arg;\n }\n if (_arg.includes('=') && _arg.startsWith('-')) {\n const equalPosition = _arg.indexOf('=');\n const argKey = _arg.substring(0, equalPosition);\n let argValue = _arg.substring(equalPosition);\n if (argValue.includes(' ')) {\n argValue = `\"${argValue}\"`;\n }\n return `${argKey}=${argValue}`;\n }\n if (_arg.includes(' ')) {\n return `\"${_arg}\"`;\n }\n return _arg;\n });\n return [\n this.#exec.command,\n ...quotedArgs\n ].join(' ');\n }\n\n static fromEmbedDownloader(\n config: DownloaderConfig<any>,\n dl: EmbedDownloader,\n embed: PostEmbed,\n destDir: string,\n callbacks: DownloadTaskCallbacks | null,\n logger: Logger | null | undefined\n ) {\n if (!embed.url) {\n return null;\n }\n const originator = `embed.downloader.${embed.provider}`;\n const __log = (level: LogLevel, ...message: any[]) => {\n logger?.log({\n level,\n originator,\n message\n });\n };\n if (!URLHelper.validateURL(embed.url)) {\n __log('warn', `Could not create task: invalid URL \"${embed.url}\"`);\n return null;\n }\n const dict = {\n 'post.id': embed.postId,\n 'post.url': embed.postURL,\n 'embed.provider': embed.provider,\n 'embed.provider.url': embed.providerURL,\n 'embed.url': embed.url,\n 'embed.subject': embed.subject,\n 'embed.html': embed.html,\n 'cookie': config.cookie || '',\n 'dest.dir': destDir\n };\n\n const args = stringArgv(dl.exec);\n const cmd = args.shift();\n if (!cmd) {\n __log('warn', 'Could not create task: no command specified');\n return null;\n }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const interpolated = Formatter.format(arg, dict).result.trim();\n if (!interpolated && arg !== '{cookie}') {\n __log('warn', `Could not create task: got empty string for command arg '${arg}'`);\n return null;\n }\n args[i] = interpolated;\n }\n\n return new ExternalDownloaderTask({\n name: originator,\n exec: {\n command: cmd,\n args\n },\n config,\n callbacks,\n logger,\n src: embed.url,\n srcEntity: embed\n });\n }\n}\n"]}
|
package/dist/entities/Post.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Post.d.ts","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AAE9C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;;;;;;;;OAcG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACzC,KAAK,EAAE,IAAI,EAAE,CAAC;IAEd;;;OAGG;IACH,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAExB;;;OAGG;IACH,WAAW,EAAE,YAAY,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;OAGG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB;;;;OAIG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;;;OAKG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"Post.d.ts","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AAE9C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;;;;;;;;OAcG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACzC,KAAK,EAAE,IAAI,EAAE,CAAC;IAEd;;;OAGG;IACH,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAExB;;;OAGG;IACH,WAAW,EAAE,YAAY,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;OAGG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB;;;;OAIG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;;;OAKG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Post.js","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type Collection } from './Collection.js';\nimport { type Downloadable } from './Downloadable.js';\nimport { type PostCoverImageMediaItem, type PostThumbnailMediaItem } from './MediaItem.js';\nimport { type Tier } from './Reward.js';\n\nexport type PostCollection = Collection<Post>;\n\nexport interface Post {\n type: 'post';\n id: string;\n /**\n * @privateRemarks\n *\n * `data.attibutes.post_type`\n *\n * Known types:\n * - image_file\n * - video_external_file\n * - audio_file\n * - text_only\n * - poll\n * - link: only embedded link info is saved. Link is not followed / downloaded.\n * - video_embed - only embedded video info is saved. Video itself is not downloaded.\n * - podcast\n */\n postType: string;\n isViewable: boolean;\n url: string | null;\n title: string | null;\n content: string | null;\n teaserText: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n commentCount: number;\n coverImage: PostCoverImageMediaItem | null;\n thumbnail: PostThumbnailMediaItem | null;\n tiers: Tier[];\n\n /**\n * @privateRemarks\n * `data.attibutes.embed`\n */\n embed: PostEmbed | null;\n\n /**\n * @privateRemarks\n * `data.relationships.attachments`\n */\n attachments: Downloadable[];\n\n /**\n * @privateRemarks\n * `data.relationships.audio`\n */\n audio: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.audio_prevew`\n */\n audioPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.images`\n */\n images: Downloadable[];\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.video_preview`\n */\n videoPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.post_file` with\n * `data.attributes.post_type` matching 'video_external_file' / 'podcast'\n */\n video: Downloadable | null;\n\n campaign: Campaign | null;\n\n raw: object;\n}\n\nexport interface PostEmbed {\n id: `${string}-embed`;\n postId: string;\n type: 'videoEmbed' | 'linkEmbed' | 'unknownEmbed';\n description: string | null;\n html: string | null;\n provider: string | null;\n providerURL: string | null;\n subject: string | null;\n url: string | null;\n}\n\nexport type YouTubePostEmbed = PostEmbed & { provider: 'YouTube' }\n"]}
|
|
1
|
+
{"version":3,"file":"Post.js","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type Collection } from './Collection.js';\nimport { type Downloadable } from './Downloadable.js';\nimport { type PostCoverImageMediaItem, type PostThumbnailMediaItem } from './MediaItem.js';\nimport { type Tier } from './Reward.js';\n\nexport type PostCollection = Collection<Post>;\n\nexport interface Post {\n type: 'post';\n id: string;\n /**\n * @privateRemarks\n *\n * `data.attibutes.post_type`\n *\n * Known types:\n * - image_file\n * - video_external_file\n * - audio_file\n * - text_only\n * - poll\n * - link: only embedded link info is saved. Link is not followed / downloaded.\n * - video_embed - only embedded video info is saved. Video itself is not downloaded.\n * - podcast\n */\n postType: string;\n isViewable: boolean;\n url: string | null;\n title: string | null;\n content: string | null;\n teaserText: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n commentCount: number;\n coverImage: PostCoverImageMediaItem | null;\n thumbnail: PostThumbnailMediaItem | null;\n tiers: Tier[];\n\n /**\n * @privateRemarks\n * `data.attibutes.embed`\n */\n embed: PostEmbed | null;\n\n /**\n * @privateRemarks\n * `data.relationships.attachments`\n */\n attachments: Downloadable[];\n\n /**\n * @privateRemarks\n * `data.relationships.audio`\n */\n audio: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.audio_prevew`\n */\n audioPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.images`\n */\n images: Downloadable[];\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.video_preview`\n */\n videoPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.post_file` with\n * `data.attributes.post_type` matching 'video_external_file' / 'podcast'\n */\n video: Downloadable | null;\n\n campaign: Campaign | null;\n\n raw: object;\n}\n\nexport interface PostEmbed {\n id: `${string}-embed`;\n postId: string;\n postURL: string | null;\n type: 'videoEmbed' | 'linkEmbed' | 'unknownEmbed';\n description: string | null;\n html: string | null;\n provider: string | null;\n providerURL: string | null;\n subject: string | null;\n url: string | null;\n}\n\nexport type YouTubePostEmbed = PostEmbed & { provider: 'YouTube' }\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostParser.d.ts","sourceRoot":"","sources":["../../src/parsers/PostParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AAIrF,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;;IAE5C,SAAS,CAAC,IAAI,SAAgB;IAE9B,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;
|
|
1
|
+
{"version":3,"file":"PostParser.d.ts","sourceRoot":"","sources":["../../src/parsers/PostParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AAIrF,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;;IAE5C,SAAS,CAAC,IAAI,SAAgB;IAE9B,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;CA+T/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostParser.js","sourceRoot":"","sources":["../../src/parsers/PostParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Campaign } from '../entities/Campaign.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport { type MediaItem, type PostCoverImageMediaItem, type PostThumbnailMediaItem, type VideoMediaItem } from '../entities/MediaItem.js';\nimport { type Post, type PostCollection, type PostEmbed } from '../entities/Post.js';\nimport { type Tier } from '../entities/Reward.js';\nimport { pickDefined } from '../utils/Misc.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport Parser from './Parser.js';\n\nexport default class PostParser extends Parser {\n\n protected name = 'PostParser';\n\n parsePostsAPIResponse(json: any, _url: string): PostCollection {\n\n this.log('debug', `Parse API response of \"${_url}\"`);\n\n /*If (json.errors) {\n this.log('error', `API response error:`, json.errors);\n return null;\n }*/\n\n const includedJSON = json.included;\n const dataJSON = json.data;\n let postsJSONArray: any[];\n // Check if API data consists of just a single post (not an array).\n // If so, place the post data in an array.\n if (dataJSON && !Array.isArray(dataJSON) && dataJSON.type === 'post') {\n postsJSONArray = [ dataJSON ];\n }\n // If API data is an array, filter out those matching 'post' type.\n else if (dataJSON && Array.isArray(dataJSON)) {\n postsJSONArray = dataJSON.filter((data) => data.type === 'post');\n }\n else {\n // No posts found\n postsJSONArray = [];\n }\n const collection: PostCollection = {\n url: _url,\n items: [],\n total: ObjectHelper.getProperty(json, 'meta.pagination.total') || null,\n nextURL: this.parseCollectionNextURL(json, _url)\n };\n\n let hasIncludedJSON = true;\n if (!includedJSON || !Array.isArray(includedJSON)) {\n this.log('warn', `'included' field missing in API response of \"${_url}\" or has incorrect type - no media items and campaign info will be returned`);\n hasIncludedJSON = false;\n }\n\n if (postsJSONArray.length === 0) {\n this.log('warn', `No posts found in API response of \"${_url}\"`);\n return collection;\n }\n if (postsJSONArray.length > 1) {\n this.log('debug', `${postsJSONArray.length} posts found - iterate and parse`);\n }\n else {\n this.log('debug', '1 post found - parse');\n }\n\n let campaign: Campaign | null | undefined;\n\n for (const postJSON of postsJSONArray) {\n if (!postJSON || typeof postJSON !== 'object') {\n this.log('error', 'Parse error: API data of post has incorrect type');\n continue;\n }\n\n const { id, attributes, relationships = {} } = postJSON;\n\n if (!id) {\n this.log('error', 'Parse error: \\'id\\' field missing in API data of post');\n continue;\n }\n\n this.log('debug', `Parse post #${id}`);\n\n if (!attributes || typeof attributes !== 'object') {\n this.log('error', `Parse error: 'attributes' field missing in API data of post #${id} or has incorrect type`);\n continue;\n }\n\n // Campaign info\n if (campaign === undefined) {\n const campaignId = ObjectHelper.getProperty(postJSON, 'relationships.campaign.data.id') || null;\n if (!campaignId || typeof campaignId !== 'string') {\n this.log('warn', `Campaign ID missing in API data of post #${id} or has incorrect type` +\n ' - no campaign info will be available until campaign ID is obtained');\n }\n else if (hasIncludedJSON) {\n campaign = this.findInAPIResponseIncludedArray(includedJSON, campaignId, 'campaign');\n }\n }\n\n // Viewability\n const isViewable = pickDefined(attributes.current_user_can_view, true);\n if (attributes.current_user_can_view === undefined) {\n this.log('warn', `'current_user_can_view' attribute missing in API data of post #${id} - assuming post is viewable`);\n }\n\n // Get downloadables from relationships\n let audio: Downloadable | null = null;\n let audioPreview: Downloadable | null = null;\n let images: Downloadable[] = [];\n let attachments: Downloadable[] = [];\n if (hasIncludedJSON) {\n const downloadables = this.fetchDownloadablesFromRelationships(\n relationships,\n {\n 'audio': 'audio items',\n 'audio_preview': 'audio preview items',\n 'images': 'images',\n 'attachments_media': 'attachments'\n },\n includedJSON,\n `post #${id}`,\n false\n );\n audio = downloadables.audio?.[0] || null;\n audioPreview = downloadables.audio_preview?.[0] || null;\n images = downloadables.images || [];\n attachments = downloadables.attachments_media || [];\n }\n\n // Get inline media from content (currently only images supported)\n if (hasIncludedJSON && attributes.content) {\n const inlineMedia = this.parseInlineMedia(id, attributes.content, includedJSON);\n images.push(...inlineMedia.images);\n }\n\n // Video preview\n let videoPreview: Downloadable | null = null;\n const vidPreviewJSON = attributes.video_preview;\n if (vidPreviewJSON && typeof vidPreviewJSON === 'object') {\n videoPreview = this.#getVideoMediaItemFromAttr(vidPreviewJSON, includedJSON, id);\n if (!videoPreview.downloadURL && !videoPreview.displayURLs.video) {\n this.log('warn', `Video preview for post #${id} is missing URLs`);\n }\n }\n\n // Video - `postType` is 'video_external_file' and has `postFile`\n let video: Downloadable | null = null;\n const postFileJSON = attributes.post_file;\n const hasPostFile = postFileJSON && typeof postFileJSON === 'object';\n if (attributes.post_type === 'video_external_file' && hasPostFile) {\n video = this.#getVideoMediaItemFromAttr(postFileJSON, includedJSON, id);\n if (!video.downloadURL && !video.displayURLs.video) {\n this.log('warn', `Video for post #${id} is missing URLs`);\n }\n }\n // Repeat for 'podcast' type - but note that `postFile` here can be audio or video.\n // We are only interested in video. For audio, info should have already been obtained\n // through relationships above.\n if (attributes.post_type === 'podcast' && hasPostFile) {\n video = this.#getVideoMediaItemFromAttr(postFileJSON, includedJSON, id, true);\n }\n\n if (attributes.post_type === 'podcast' && isViewable && !video && !audio) {\n this.log('warn', `Post #${id} is podcast type and is viewable, but no video or audio was found`);\n }\n\n // Cover image\n let coverImage: PostCoverImageMediaItem | null = null;\n if (attributes.image) {\n coverImage = {\n type: 'image',\n id,\n filename: isViewable ? 'cover-image' : 'cover-image-preview',\n mimeType: null,\n imageType: 'postCoverImage',\n imageURLs: {\n large: ObjectHelper.getProperty(attributes, 'image.large_url') || null,\n thumbSquareLarge: ObjectHelper.getProperty(attributes, 'image.thumb_square_large_url') || null,\n thumbSquare: ObjectHelper.getProperty(attributes, 'image.thumb_square_url') || null,\n thumb: ObjectHelper.getProperty(attributes, 'image.thumb_url') || null,\n default: ObjectHelper.getProperty(attributes, 'image.url') || null\n }\n };\n }\n\n // Thumbnail\n let thumbnail: PostThumbnailMediaItem | null = null;\n if (attributes.thumbnail) {\n thumbnail = {\n type: 'image',\n id,\n filename: isViewable ? 'thumbnail' : 'thumbnail-preview',\n mimeType: null,\n imageType: 'postThumbnail',\n imageURLs: {\n large: ObjectHelper.getProperty(attributes, 'thumbnail.large') || null,\n large2: ObjectHelper.getProperty(attributes, 'thumbnail.large_2') || null,\n square: ObjectHelper.getProperty(attributes, 'thumbnail.square') || null,\n default: ObjectHelper.getProperty(attributes, 'thumbnail.url') || null\n }\n };\n }\n\n // Embed\n const embedJSON = attributes.embed;\n let embed: PostEmbed | null = null;\n if (embedJSON && typeof embedJSON === 'object') {\n let embedType: PostEmbed['type'];\n switch (attributes.post_type) {\n case 'video_embed':\n embedType = 'videoEmbed';\n break;\n case 'link':\n embedType = 'linkEmbed';\n break;\n default:\n embedType = 'unknownEmbed';\n }\n embed = {\n id: `${id}-embed`,\n postId: id,\n type: embedType,\n description: embedJSON.descripton || null,\n html: embedJSON.html || null,\n provider: embedJSON.provider || null,\n providerURL: embedJSON.provider_url || null,\n subject: embedJSON.subject || null,\n url: embedJSON.url || null\n };\n }\n\n // Tiers\n let tiers: Tier[] = [];\n const tierData = ObjectHelper.getProperty(postJSON, 'relationships.access_rules.data');\n if (Array.isArray(tierData) && campaign) {\n const c = campaign;\n tiers = tierData.reduce<Tier[]>((result, t) => {\n const id = ObjectHelper.getProperty(t, 'id');\n if (id) {\n const tier = this.findInAPIResponseIncludedArray(includedJSON, id, 'tier', c);\n if (tier) {\n result.push(tier);\n }\n }\n return result;\n }, []);\n }\n if (tiers.length === 0) {\n this.log('warn', `Could not obtain tier info for post #${id}`);\n }\n\n const post: Post = {\n id,\n type: 'post',\n postType: attributes.post_type || null,\n isViewable,\n url: attributes.url || null,\n title: attributes.title || null,\n content: attributes.content || null,\n teaserText: attributes.teaser_text || null,\n publishedAt: attributes.published_at || null,\n editedAt: attributes.edited_at || null,\n commentCount: attributes.comment_count || 0,\n coverImage,\n thumbnail,\n tiers,\n embed,\n attachments,\n audio,\n audioPreview,\n images,\n videoPreview,\n video,\n campaign: null,\n raw: json\n };\n\n this.log('debug', `Done parsing post #${id}`);\n\n collection.items.push(post);\n }\n\n if (campaign) {\n this.log('debug', `Campaign #${campaign.id} found while parsing posts`);\n for (const post of collection.items) {\n post.campaign = campaign;\n }\n }\n else {\n this.log('warn', 'No campaign info found while parsing posts');\n }\n\n this.log('debug', 'Done parsing posts');\n\n return collection;\n }\n\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict: true): VideoMediaItem | null;\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict?: false): VideoMediaItem;\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict = false) {\n let miFromIncluded: MediaItem | null = null;\n const _mediaId = attrJSON.media_id !== undefined ? attrJSON.media_id.toString() : null;\n const hasIncludedJSON = includedJSON && Array.isArray(includedJSON)\n if (_mediaId && hasIncludedJSON) {\n // Fetch item from 'included' array, matching `media_id`\n miFromIncluded = this.findInAPIResponseIncludedArray(includedJSON, _mediaId, 'media', 'video');\n }\n const vidInc = miFromIncluded && miFromIncluded.type === 'video' ? miFromIncluded : null;\n if (strict && !miFromIncluded) {\n return null;\n }\n const mediaId = _mediaId || postId; // Fallback to post ID\n\n const { download_url: downloadURL = null, url: displayURL = null } = attrJSON;\n\n // Convert `attrJSON` to Downloadable (VideoMediaItem)\n return {\n type: 'video',\n id: mediaId,\n filename: vidInc?.filename || null,\n mimeType: vidInc?.mimeType || null,\n createdAt: vidInc?.createdAt || null,\n size: {\n width: attrJSON.width || vidInc?.size.width,\n height: attrJSON.height || vidInc?.size.height\n },\n duration: attrJSON.duration || vidInc?.duration,\n downloadURL: downloadURL || vidInc?.downloadURL,\n displayURLs: {\n thumbnail: vidInc?.displayURLs.thumbnail || null,\n video: displayURL || vidInc?.downloadURL\n }\n };\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PostParser.js","sourceRoot":"","sources":["../../src/parsers/PostParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Campaign } from '../entities/Campaign.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport { type MediaItem, type PostCoverImageMediaItem, type PostThumbnailMediaItem, type VideoMediaItem } from '../entities/MediaItem.js';\nimport { type Post, type PostCollection, type PostEmbed } from '../entities/Post.js';\nimport { type Tier } from '../entities/Reward.js';\nimport { pickDefined } from '../utils/Misc.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport Parser from './Parser.js';\n\nexport default class PostParser extends Parser {\n\n protected name = 'PostParser';\n\n parsePostsAPIResponse(json: any, _url: string): PostCollection {\n\n this.log('debug', `Parse API response of \"${_url}\"`);\n\n /*If (json.errors) {\n this.log('error', `API response error:`, json.errors);\n return null;\n }*/\n\n const includedJSON = json.included;\n const dataJSON = json.data;\n let postsJSONArray: any[];\n // Check if API data consists of just a single post (not an array).\n // If so, place the post data in an array.\n if (dataJSON && !Array.isArray(dataJSON) && dataJSON.type === 'post') {\n postsJSONArray = [ dataJSON ];\n }\n // If API data is an array, filter out those matching 'post' type.\n else if (dataJSON && Array.isArray(dataJSON)) {\n postsJSONArray = dataJSON.filter((data) => data.type === 'post');\n }\n else {\n // No posts found\n postsJSONArray = [];\n }\n const collection: PostCollection = {\n url: _url,\n items: [],\n total: ObjectHelper.getProperty(json, 'meta.pagination.total') || null,\n nextURL: this.parseCollectionNextURL(json, _url)\n };\n\n let hasIncludedJSON = true;\n if (!includedJSON || !Array.isArray(includedJSON)) {\n this.log('warn', `'included' field missing in API response of \"${_url}\" or has incorrect type - no media items and campaign info will be returned`);\n hasIncludedJSON = false;\n }\n\n if (postsJSONArray.length === 0) {\n this.log('warn', `No posts found in API response of \"${_url}\"`);\n return collection;\n }\n if (postsJSONArray.length > 1) {\n this.log('debug', `${postsJSONArray.length} posts found - iterate and parse`);\n }\n else {\n this.log('debug', '1 post found - parse');\n }\n\n let campaign: Campaign | null | undefined;\n\n for (const postJSON of postsJSONArray) {\n if (!postJSON || typeof postJSON !== 'object') {\n this.log('error', 'Parse error: API data of post has incorrect type');\n continue;\n }\n\n const { id, attributes, relationships = {} } = postJSON;\n\n if (!id) {\n this.log('error', 'Parse error: \\'id\\' field missing in API data of post');\n continue;\n }\n\n this.log('debug', `Parse post #${id}`);\n\n if (!attributes || typeof attributes !== 'object') {\n this.log('error', `Parse error: 'attributes' field missing in API data of post #${id} or has incorrect type`);\n continue;\n }\n\n // Campaign info\n if (campaign === undefined) {\n const campaignId = ObjectHelper.getProperty(postJSON, 'relationships.campaign.data.id') || null;\n if (!campaignId || typeof campaignId !== 'string') {\n this.log('warn', `Campaign ID missing in API data of post #${id} or has incorrect type` +\n ' - no campaign info will be available until campaign ID is obtained');\n }\n else if (hasIncludedJSON) {\n campaign = this.findInAPIResponseIncludedArray(includedJSON, campaignId, 'campaign');\n }\n }\n\n // Viewability\n const isViewable = pickDefined(attributes.current_user_can_view, true);\n if (attributes.current_user_can_view === undefined) {\n this.log('warn', `'current_user_can_view' attribute missing in API data of post #${id} - assuming post is viewable`);\n }\n\n // Get downloadables from relationships\n let audio: Downloadable | null = null;\n let audioPreview: Downloadable | null = null;\n let images: Downloadable[] = [];\n let attachments: Downloadable[] = [];\n if (hasIncludedJSON) {\n const downloadables = this.fetchDownloadablesFromRelationships(\n relationships,\n {\n 'audio': 'audio items',\n 'audio_preview': 'audio preview items',\n 'images': 'images',\n 'attachments_media': 'attachments'\n },\n includedJSON,\n `post #${id}`,\n false\n );\n audio = downloadables.audio?.[0] || null;\n audioPreview = downloadables.audio_preview?.[0] || null;\n images = downloadables.images || [];\n attachments = downloadables.attachments_media || [];\n }\n\n // Get inline media from content (currently only images supported)\n if (hasIncludedJSON && attributes.content) {\n const inlineMedia = this.parseInlineMedia(id, attributes.content, includedJSON);\n images.push(...inlineMedia.images);\n }\n\n // Video preview\n let videoPreview: Downloadable | null = null;\n const vidPreviewJSON = attributes.video_preview;\n if (vidPreviewJSON && typeof vidPreviewJSON === 'object') {\n videoPreview = this.#getVideoMediaItemFromAttr(vidPreviewJSON, includedJSON, id);\n if (!videoPreview.downloadURL && !videoPreview.displayURLs.video) {\n this.log('warn', `Video preview for post #${id} is missing URLs`);\n }\n }\n\n // Video - `postType` is 'video_external_file' and has `postFile`\n let video: Downloadable | null = null;\n const postFileJSON = attributes.post_file;\n const hasPostFile = postFileJSON && typeof postFileJSON === 'object';\n if (attributes.post_type === 'video_external_file' && hasPostFile) {\n video = this.#getVideoMediaItemFromAttr(postFileJSON, includedJSON, id);\n if (!video.downloadURL && !video.displayURLs.video) {\n this.log('warn', `Video for post #${id} is missing URLs`);\n }\n }\n // Repeat for 'podcast' type - but note that `postFile` here can be audio or video.\n // We are only interested in video. For audio, info should have already been obtained\n // through relationships above.\n if (attributes.post_type === 'podcast' && hasPostFile) {\n video = this.#getVideoMediaItemFromAttr(postFileJSON, includedJSON, id, true);\n }\n\n if (attributes.post_type === 'podcast' && isViewable && !video && !audio) {\n this.log('warn', `Post #${id} is podcast type and is viewable, but no video or audio was found`);\n }\n\n // Cover image\n let coverImage: PostCoverImageMediaItem | null = null;\n if (attributes.image) {\n coverImage = {\n type: 'image',\n id,\n filename: isViewable ? 'cover-image' : 'cover-image-preview',\n mimeType: null,\n imageType: 'postCoverImage',\n imageURLs: {\n large: ObjectHelper.getProperty(attributes, 'image.large_url') || null,\n thumbSquareLarge: ObjectHelper.getProperty(attributes, 'image.thumb_square_large_url') || null,\n thumbSquare: ObjectHelper.getProperty(attributes, 'image.thumb_square_url') || null,\n thumb: ObjectHelper.getProperty(attributes, 'image.thumb_url') || null,\n default: ObjectHelper.getProperty(attributes, 'image.url') || null\n }\n };\n }\n\n // Thumbnail\n let thumbnail: PostThumbnailMediaItem | null = null;\n if (attributes.thumbnail) {\n thumbnail = {\n type: 'image',\n id,\n filename: isViewable ? 'thumbnail' : 'thumbnail-preview',\n mimeType: null,\n imageType: 'postThumbnail',\n imageURLs: {\n large: ObjectHelper.getProperty(attributes, 'thumbnail.large') || null,\n large2: ObjectHelper.getProperty(attributes, 'thumbnail.large_2') || null,\n square: ObjectHelper.getProperty(attributes, 'thumbnail.square') || null,\n default: ObjectHelper.getProperty(attributes, 'thumbnail.url') || null\n }\n };\n }\n\n // Embed\n const embedJSON = attributes.embed;\n let embed: PostEmbed | null = null;\n if (embedJSON && typeof embedJSON === 'object') {\n let embedType: PostEmbed['type'];\n switch (attributes.post_type) {\n case 'video_embed':\n embedType = 'videoEmbed';\n break;\n case 'link':\n embedType = 'linkEmbed';\n break;\n default:\n embedType = 'unknownEmbed';\n }\n embed = {\n id: `${id}-embed`,\n postId: id,\n postURL: attributes.url || null,\n type: embedType,\n description: embedJSON.descripton || null,\n html: embedJSON.html || null,\n provider: embedJSON.provider || null,\n providerURL: embedJSON.provider_url || null,\n subject: embedJSON.subject || null,\n url: embedJSON.url || null\n };\n }\n\n // Tiers\n let tiers: Tier[] = [];\n const tierData = ObjectHelper.getProperty(postJSON, 'relationships.access_rules.data');\n if (Array.isArray(tierData) && campaign) {\n const c = campaign;\n tiers = tierData.reduce<Tier[]>((result, t) => {\n const id = ObjectHelper.getProperty(t, 'id');\n if (id) {\n const tier = this.findInAPIResponseIncludedArray(includedJSON, id, 'tier', c);\n if (tier) {\n result.push(tier);\n }\n }\n return result;\n }, []);\n }\n if (tiers.length === 0) {\n this.log('warn', `Could not obtain tier info for post #${id}`);\n }\n\n const post: Post = {\n id,\n type: 'post',\n postType: attributes.post_type || null,\n isViewable,\n url: attributes.url || null,\n title: attributes.title || null,\n content: attributes.content || null,\n teaserText: attributes.teaser_text || null,\n publishedAt: attributes.published_at || null,\n editedAt: attributes.edited_at || null,\n commentCount: attributes.comment_count || 0,\n coverImage,\n thumbnail,\n tiers,\n embed,\n attachments,\n audio,\n audioPreview,\n images,\n videoPreview,\n video,\n campaign: null,\n raw: json\n };\n\n this.log('debug', `Done parsing post #${id}`);\n\n collection.items.push(post);\n }\n\n if (campaign) {\n this.log('debug', `Campaign #${campaign.id} found while parsing posts`);\n for (const post of collection.items) {\n post.campaign = campaign;\n }\n }\n else {\n this.log('warn', 'No campaign info found while parsing posts');\n }\n\n this.log('debug', 'Done parsing posts');\n\n return collection;\n }\n\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict: true): VideoMediaItem | null;\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict?: false): VideoMediaItem;\n #getVideoMediaItemFromAttr(attrJSON: any, includedJSON: any, postId: string, strict = false) {\n let miFromIncluded: MediaItem | null = null;\n const _mediaId = attrJSON.media_id !== undefined ? attrJSON.media_id.toString() : null;\n const hasIncludedJSON = includedJSON && Array.isArray(includedJSON)\n if (_mediaId && hasIncludedJSON) {\n // Fetch item from 'included' array, matching `media_id`\n miFromIncluded = this.findInAPIResponseIncludedArray(includedJSON, _mediaId, 'media', 'video');\n }\n const vidInc = miFromIncluded && miFromIncluded.type === 'video' ? miFromIncluded : null;\n if (strict && !miFromIncluded) {\n return null;\n }\n const mediaId = _mediaId || postId; // Fallback to post ID\n\n const { download_url: downloadURL = null, url: displayURL = null } = attrJSON;\n\n // Convert `attrJSON` to Downloadable (VideoMediaItem)\n return {\n type: 'video',\n id: mediaId,\n filename: vidInc?.filename || null,\n mimeType: vidInc?.mimeType || null,\n createdAt: vidInc?.createdAt || null,\n size: {\n width: attrJSON.width || vidInc?.size.width,\n height: attrJSON.height || vidInc?.size.height\n },\n duration: attrJSON.duration || vidInc?.duration,\n downloadURL: downloadURL || vidInc?.downloadURL,\n displayURLs: {\n thumbnail: vidInc?.displayURLs.thumbnail || null,\n video: displayURL || vidInc?.downloadURL\n }\n };\n };\n}\n"]}
|
package/dist/utils/Fetcher.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export type FetcherGetResultOf<T extends FetcherGetType> = T extends 'html' ? st
|
|
|
24
24
|
export default class Fetcher {
|
|
25
25
|
#private;
|
|
26
26
|
name: string;
|
|
27
|
-
constructor(config: DownloaderConfig<any>,
|
|
27
|
+
constructor(config: DownloaderConfig<any>, logger?: Logger | null);
|
|
28
28
|
get<T extends FetcherGetType>(args: {
|
|
29
29
|
url: string;
|
|
30
30
|
type: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":"AAKA,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAC,KAAK,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAG9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIrE,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,YAAY;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,CAAC,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAa,SAAQ,KAAK;IAErC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMzD;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7C,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,cAAc,IACrD,CAAC,SAAS,MAAM,GAAG,MAAM,GACzB,CAAC,SAAS,MAAM,GAAG,GAAG,GACtB,KAAK,CAAC;AAIR,MAAM,CAAC,OAAO,OAAO,OAAO;;IAE1B,IAAI,SAAa;gBAQL,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":"AAKA,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAC,KAAK,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAG9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIrE,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,YAAY;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,CAAC,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAa,SAAQ,KAAK;IAErC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMzD;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7C,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,cAAc,IACrD,CAAC,SAAS,MAAM,GAAG,MAAM,GACzB,CAAC,SAAS,MAAM,GAAG,GAAG,GACtB,KAAK,CAAC;AAIR,MAAM,CAAC,OAAO,OAAO,OAAO;;IAE1B,IAAI,SAAa;gBAQL,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ3D,GAAG,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE;QACxC,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,WAAW,CAAA;KACrB,EAAE,EAAE,SAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAoDpC,mBAAmB,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE;QACxD,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB;IA4BK,eAAe,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;;4BA8B7C,sBAAsB;;;;;;;IAoIvD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;CAGlD"}
|
package/dist/utils/Fetcher.js
CHANGED
|
@@ -30,7 +30,7 @@ export class FetcherError extends Error {
|
|
|
30
30
|
}
|
|
31
31
|
const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0';
|
|
32
32
|
class Fetcher {
|
|
33
|
-
constructor(config,
|
|
33
|
+
constructor(config, logger) {
|
|
34
34
|
_Fetcher_instances.add(this);
|
|
35
35
|
this.name = 'Fetcher';
|
|
36
36
|
_Fetcher_cookie.set(this, void 0);
|
|
@@ -38,7 +38,7 @@ class Fetcher {
|
|
|
38
38
|
_Fetcher_dryRun.set(this, void 0);
|
|
39
39
|
_Fetcher_fsHelper.set(this, void 0);
|
|
40
40
|
_Fetcher_proxyAgent.set(this, void 0);
|
|
41
|
-
__classPrivateFieldSet(this, _Fetcher_cookie, cookie, "f");
|
|
41
|
+
__classPrivateFieldSet(this, _Fetcher_cookie, config.cookie, "f");
|
|
42
42
|
__classPrivateFieldSet(this, _Fetcher_logger, logger, "f");
|
|
43
43
|
__classPrivateFieldSet(this, _Fetcher_dryRun, config.dryRun, "f");
|
|
44
44
|
__classPrivateFieldSet(this, _Fetcher_fsHelper, new FSHelper(config, logger), "f");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport { pipeline } from 'stream/promises';\nimport { fetch, Request, type Response } from 'undici';\nimport path from 'path';\nimport { type Dispatcher } from 'undici';\nimport FetcherProgressMonitor from './FetcherProgressMonitor.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport type FilenameResolver from './FllenameResolver.js';\nimport { pickDefined } from './Misc.js';\nimport {type LogLevel} from './logging/Logger.js';\nimport type Logger from './logging/Logger.js';\nimport { commonLog } from './logging/Logger.js';\nimport FSHelper from './FSHelper.js';\nimport { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport Progress from './Progress.js';\nimport { createProxyAgent } from './Proxy.js';\n\nexport interface PrepareDownloadParams<T extends Downloadable> {\n url: string;\n srcEntity: T;\n destFilePath: string;\n signal: AbortSignal;\n}\n\nexport interface StartDownloadOverrides {\n destFilePath?: string;\n tmpFilePath?: string;\n}\n\nexport class FetcherError extends Error {\n\n url: string;\n method: string;\n\n constructor(message: string, url: string, method: string) {\n super(message);\n this.name = 'FetcherError';\n this.url = url;\n this.method = method;\n }\n}\n\nexport type FetcherGetType = 'html' | 'json';\nexport type FetcherGetResultOf<T extends FetcherGetType> =\n T extends 'html' ? string :\n T extends 'json' ? any :\n never;\n\nconst USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0';\n\nexport default class Fetcher {\n\n name = 'Fetcher';\n\n #cookie?: string;\n #logger?: Logger | null;\n #dryRun: boolean;\n #fsHelper: FSHelper;\n #proxyAgent?: Dispatcher;\n\n constructor(config: DownloaderConfig<any>, cookie?: string, logger?: Logger | null) {\n this.#cookie = cookie;\n this.#logger = logger;\n this.#dryRun = config.dryRun;\n this.#fsHelper = new FSHelper(config, logger);\n this.#proxyAgent = createProxyAgent(config)?.agent || undefined;\n }\n\n async get<T extends FetcherGetType>(args: {\n url: string,\n type: T,\n payload?: Record<string, any>,\n maxRetries: number,\n signal?: AbortSignal\n }, rt = 0): Promise<FetcherGetResultOf<T>> {\n\n const { url, type, payload, maxRetries, signal } = args;\n\n const urlObj = new URL(url);\n if (payload) {\n for (const [ p, v ] of Object.entries(payload)) {\n urlObj.searchParams.set(p, v);\n }\n }\n const request = new Request(urlObj, { method: 'GET' });\n this.#setHeaders(request, type);\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n return await (type === 'html' ? res.text() : res.json()) as FetcherGetResultOf<T>;\n }\n catch (error: any) {\n if (signal?.aborted) {\n throw error;\n }\n if (rt < maxRetries) {\n if (removeAbortHandler) removeAbortHandler();\n return await this.get({ url, type, payload, maxRetries, signal }, rt + 1);\n }\n let errMsg;\n if (error instanceof Error) {\n const errMsgParts = [error.message];\n let _err = error.cause;\n while (_err) {\n errMsgParts.push(_err instanceof Error ? _err.message : JSON.stringify(_err));\n _err = _err instanceof Error ? _err.cause : null;\n }\n errMsg = errMsgParts.join(': ');\n }\n else {\n errMsg = String(error);\n }\n const retriedMsg = rt > 0 ? ` (retried ${rt} times)` : '';\n throw new FetcherError(`${errMsg}${retriedMsg}`, urlObj.toString(), request.method);\n }\n finally {\n if (removeAbortHandler) removeAbortHandler();\n }\n }\n\n async resolveDestFilePath<T extends Downloadable>(params: {\n url: string;\n destDir: string;\n destFilenameResolver: FilenameResolver<T>;\n signal?: AbortSignal;\n }) {\n const { url, destDir, destFilenameResolver, signal } = params;\n const request = new Request(url, { method: 'HEAD' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false });\n const internalAbortController = new AbortController();\n const abortHandler = () => internalAbortController.abort();\n if (signal) {\n signal.addEventListener('abort', abortHandler, {once: true});\n }\n\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n if (this.#assertResponseOK(res, url, request.method, false)) {\n const destFilename = destFilenameResolver.resolve(res);\n const destFilePath = path.resolve(destDir, destFilename);\n return destFilePath;\n }\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n return undefined as never;\n }\n\n async prepareDownload<T extends Downloadable>(params: PrepareDownloadParams<T>) {\n const { url, srcEntity, destFilePath, signal } = params;\n const request = new Request(url, { method: 'GET' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false });\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n\n try {\n let res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n // Special handling for attachment\n if (params.srcEntity.type === 'attachment' && !res.ok && res.redirected && res.url) {\n const redirectReq = new Request(res.url, { method: 'GET' });\n this.#setHeaders(redirectReq, 'html', { setCookie: false, setHost: false });\n res = await fetch(redirectReq, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n }\n\n if (this.#assertResponseOK(res, url, request.method)) {\n const destFilename = path.parse(destFilePath).base;\n const progress = new Progress(res, {\n reportInterval: 300\n });\n const monitor = new FetcherProgressMonitor(progress, destFilename, destFilePath);\n\n const _res = res;\n const start = (overrides?: StartDownloadOverrides) => {\n const _destFilePath = overrides?.destFilePath || destFilePath;\n const _tmpFilePath = overrides?.tmpFilePath || FSHelper.createTmpFilePath(_destFilePath, srcEntity.id);\n return this.#startDownload(_res, _tmpFilePath, _destFilePath, progress, removeAbortHandler)\n };\n const abort = () => {\n if (removeAbortHandler) removeAbortHandler();\n internalAbortController.abort();\n };\n\n return {\n monitor,\n start,\n abort\n };\n }\n }\n catch (error: unknown) {\n if (removeAbortHandler) removeAbortHandler();\n throw error;\n }\n\n return undefined as never;\n }\n\n async #startDownload(\n response: Response & { body: NodeJS.ReadableStream },\n tmpFilePath: string,\n destFilePath: string,\n progress: Progress,\n cleanup?: () => void) {\n\n try {\n let size = 0;\n if (this.#dryRun) {\n try {\n for await (const chunk of response.body) {\n size += chunk.length;\n }\n }\n catch (_error: unknown) {\n // Do nothing\n }\n }\n else {\n this.log('debug', `Pipe \"${response.url}\" to \"${tmpFilePath}\"`);\n await pipeline(\n response.body,\n progress.stream,\n fs.createWriteStream(tmpFilePath)\n );\n size = fs.lstatSync(tmpFilePath).size;\n }\n\n const commit = () => {\n this.#commitDownload(tmpFilePath, destFilePath, size, cleanup);\n };\n\n const discard = () => {\n this.#cleanupDownload(tmpFilePath, cleanup);\n };\n\n return {\n tmpFilePath,\n commit,\n discard\n };\n }\n catch (error) {\n this.#cleanupDownload(tmpFilePath, cleanup);\n throw error;\n }\n }\n\n #commitDownload(tmpFilePath: string, destFilePath: string, size: number, cleanup?: () => void) {\n try {\n this.log('debug', `Commit \"${tmpFilePath}\" to \"${destFilePath}; filesize: ${size} bytes`);\n this.#fsHelper.rename(tmpFilePath, destFilePath);\n }\n finally {\n this.#cleanupDownload(tmpFilePath, cleanup);\n }\n }\n\n #cleanupDownload(tmpFilePath: string, extra?: () => void) {\n try {\n if (this.#dryRun || fs.existsSync(tmpFilePath)) {\n this.log('debug', `Clean up \"${tmpFilePath}\"`);\n this.#fsHelper.unlink(tmpFilePath);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${tmpFilePath}:`, error);\n }\n finally {\n if (extra) extra();\n }\n }\n\n #setHeaders(request: Request, type: 'html' | 'json', opts?: { setCookie?: boolean; setHost?: boolean; }) {\n const setCookie = pickDefined(opts?.setCookie, true);\n const setHost = pickDefined(opts?.setHost, true);\n if (this.#cookie && setCookie) {\n request.headers.set('Cookie', this.#cookie);\n }\n if (setHost) {\n request.headers.set('Host', 'www.patreon.com');\n }\n request.headers.set('User-Agent', USER_AGENT);\n if (type === 'json') {\n request.headers.set('Content-Type', 'application/vnd.api+json');\n }\n else {\n request.headers.set('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8');\n }\n }\n\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody: false): response is Response;\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody?: true): response is Response & { body: NodeJS.ReadableStream };\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody = true) {\n if (!response) {\n throw new FetcherError('No response', originURL, method);\n }\n if (!response.ok) {\n throw new FetcherError(`${response.status} - ${response.statusText}`, originURL, method);\n }\n if (requireBody && !response.body) {\n throw new FetcherError('Empty response body', originURL, method);\n }\n return true;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport { pipeline } from 'stream/promises';\nimport { fetch, Request, type Response } from 'undici';\nimport path from 'path';\nimport { type Dispatcher } from 'undici';\nimport FetcherProgressMonitor from './FetcherProgressMonitor.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport type FilenameResolver from './FllenameResolver.js';\nimport { pickDefined } from './Misc.js';\nimport {type LogLevel} from './logging/Logger.js';\nimport type Logger from './logging/Logger.js';\nimport { commonLog } from './logging/Logger.js';\nimport FSHelper from './FSHelper.js';\nimport { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport Progress from './Progress.js';\nimport { createProxyAgent } from './Proxy.js';\n\nexport interface PrepareDownloadParams<T extends Downloadable> {\n url: string;\n srcEntity: T;\n destFilePath: string;\n signal: AbortSignal;\n}\n\nexport interface StartDownloadOverrides {\n destFilePath?: string;\n tmpFilePath?: string;\n}\n\nexport class FetcherError extends Error {\n\n url: string;\n method: string;\n\n constructor(message: string, url: string, method: string) {\n super(message);\n this.name = 'FetcherError';\n this.url = url;\n this.method = method;\n }\n}\n\nexport type FetcherGetType = 'html' | 'json';\nexport type FetcherGetResultOf<T extends FetcherGetType> =\n T extends 'html' ? string :\n T extends 'json' ? any :\n never;\n\nconst USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0';\n\nexport default class Fetcher {\n\n name = 'Fetcher';\n\n #cookie?: string;\n #logger?: Logger | null;\n #dryRun: boolean;\n #fsHelper: FSHelper;\n #proxyAgent?: Dispatcher;\n\n constructor(config: DownloaderConfig<any>, logger?: Logger | null) {\n this.#cookie = config.cookie;\n this.#logger = logger;\n this.#dryRun = config.dryRun;\n this.#fsHelper = new FSHelper(config, logger);\n this.#proxyAgent = createProxyAgent(config)?.agent || undefined;\n }\n\n async get<T extends FetcherGetType>(args: {\n url: string,\n type: T,\n payload?: Record<string, any>,\n maxRetries: number,\n signal?: AbortSignal\n }, rt = 0): Promise<FetcherGetResultOf<T>> {\n\n const { url, type, payload, maxRetries, signal } = args;\n\n const urlObj = new URL(url);\n if (payload) {\n for (const [ p, v ] of Object.entries(payload)) {\n urlObj.searchParams.set(p, v);\n }\n }\n const request = new Request(urlObj, { method: 'GET' });\n this.#setHeaders(request, type);\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n return await (type === 'html' ? res.text() : res.json()) as FetcherGetResultOf<T>;\n }\n catch (error: any) {\n if (signal?.aborted) {\n throw error;\n }\n if (rt < maxRetries) {\n if (removeAbortHandler) removeAbortHandler();\n return await this.get({ url, type, payload, maxRetries, signal }, rt + 1);\n }\n let errMsg;\n if (error instanceof Error) {\n const errMsgParts = [error.message];\n let _err = error.cause;\n while (_err) {\n errMsgParts.push(_err instanceof Error ? _err.message : JSON.stringify(_err));\n _err = _err instanceof Error ? _err.cause : null;\n }\n errMsg = errMsgParts.join(': ');\n }\n else {\n errMsg = String(error);\n }\n const retriedMsg = rt > 0 ? ` (retried ${rt} times)` : '';\n throw new FetcherError(`${errMsg}${retriedMsg}`, urlObj.toString(), request.method);\n }\n finally {\n if (removeAbortHandler) removeAbortHandler();\n }\n }\n\n async resolveDestFilePath<T extends Downloadable>(params: {\n url: string;\n destDir: string;\n destFilenameResolver: FilenameResolver<T>;\n signal?: AbortSignal;\n }) {\n const { url, destDir, destFilenameResolver, signal } = params;\n const request = new Request(url, { method: 'HEAD' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false });\n const internalAbortController = new AbortController();\n const abortHandler = () => internalAbortController.abort();\n if (signal) {\n signal.addEventListener('abort', abortHandler, {once: true});\n }\n\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n if (this.#assertResponseOK(res, url, request.method, false)) {\n const destFilename = destFilenameResolver.resolve(res);\n const destFilePath = path.resolve(destDir, destFilename);\n return destFilePath;\n }\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n return undefined as never;\n }\n\n async prepareDownload<T extends Downloadable>(params: PrepareDownloadParams<T>) {\n const { url, srcEntity, destFilePath, signal } = params;\n const request = new Request(url, { method: 'GET' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false });\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n\n try {\n let res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n // Special handling for attachment\n if (params.srcEntity.type === 'attachment' && !res.ok && res.redirected && res.url) {\n const redirectReq = new Request(res.url, { method: 'GET' });\n this.#setHeaders(redirectReq, 'html', { setCookie: false, setHost: false });\n res = await fetch(redirectReq, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n }\n\n if (this.#assertResponseOK(res, url, request.method)) {\n const destFilename = path.parse(destFilePath).base;\n const progress = new Progress(res, {\n reportInterval: 300\n });\n const monitor = new FetcherProgressMonitor(progress, destFilename, destFilePath);\n\n const _res = res;\n const start = (overrides?: StartDownloadOverrides) => {\n const _destFilePath = overrides?.destFilePath || destFilePath;\n const _tmpFilePath = overrides?.tmpFilePath || FSHelper.createTmpFilePath(_destFilePath, srcEntity.id);\n return this.#startDownload(_res, _tmpFilePath, _destFilePath, progress, removeAbortHandler)\n };\n const abort = () => {\n if (removeAbortHandler) removeAbortHandler();\n internalAbortController.abort();\n };\n\n return {\n monitor,\n start,\n abort\n };\n }\n }\n catch (error: unknown) {\n if (removeAbortHandler) removeAbortHandler();\n throw error;\n }\n\n return undefined as never;\n }\n\n async #startDownload(\n response: Response & { body: NodeJS.ReadableStream },\n tmpFilePath: string,\n destFilePath: string,\n progress: Progress,\n cleanup?: () => void) {\n\n try {\n let size = 0;\n if (this.#dryRun) {\n try {\n for await (const chunk of response.body) {\n size += chunk.length;\n }\n }\n catch (_error: unknown) {\n // Do nothing\n }\n }\n else {\n this.log('debug', `Pipe \"${response.url}\" to \"${tmpFilePath}\"`);\n await pipeline(\n response.body,\n progress.stream,\n fs.createWriteStream(tmpFilePath)\n );\n size = fs.lstatSync(tmpFilePath).size;\n }\n\n const commit = () => {\n this.#commitDownload(tmpFilePath, destFilePath, size, cleanup);\n };\n\n const discard = () => {\n this.#cleanupDownload(tmpFilePath, cleanup);\n };\n\n return {\n tmpFilePath,\n commit,\n discard\n };\n }\n catch (error) {\n this.#cleanupDownload(tmpFilePath, cleanup);\n throw error;\n }\n }\n\n #commitDownload(tmpFilePath: string, destFilePath: string, size: number, cleanup?: () => void) {\n try {\n this.log('debug', `Commit \"${tmpFilePath}\" to \"${destFilePath}; filesize: ${size} bytes`);\n this.#fsHelper.rename(tmpFilePath, destFilePath);\n }\n finally {\n this.#cleanupDownload(tmpFilePath, cleanup);\n }\n }\n\n #cleanupDownload(tmpFilePath: string, extra?: () => void) {\n try {\n if (this.#dryRun || fs.existsSync(tmpFilePath)) {\n this.log('debug', `Clean up \"${tmpFilePath}\"`);\n this.#fsHelper.unlink(tmpFilePath);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${tmpFilePath}:`, error);\n }\n finally {\n if (extra) extra();\n }\n }\n\n #setHeaders(request: Request, type: 'html' | 'json', opts?: { setCookie?: boolean; setHost?: boolean; }) {\n const setCookie = pickDefined(opts?.setCookie, true);\n const setHost = pickDefined(opts?.setHost, true);\n if (this.#cookie && setCookie) {\n request.headers.set('Cookie', this.#cookie);\n }\n if (setHost) {\n request.headers.set('Host', 'www.patreon.com');\n }\n request.headers.set('User-Agent', USER_AGENT);\n if (type === 'json') {\n request.headers.set('Content-Type', 'application/vnd.api+json');\n }\n else {\n request.headers.set('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8');\n }\n }\n\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody: false): response is Response;\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody?: true): response is Response & { body: NodeJS.ReadableStream };\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody = true) {\n if (!response) {\n throw new FetcherError('No response', originURL, method);\n }\n if (!response.ok) {\n throw new FetcherError(`${response.status} - ${response.statusText}`, originURL, method);\n }\n if (requireBody && !response.body) {\n throw new FetcherError('Empty response body', originURL, method);\n }\n return true;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patreon-dl",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "Patreon Downloader",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dist/index.js",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"capitalize": "^2.0.4",
|
|
62
62
|
"cheerio": "^1.0.0",
|
|
63
63
|
"cli-color": "^2.0.3",
|
|
64
|
+
"cli-truncate": "^4.0.0",
|
|
64
65
|
"command-line-args": "^5.2.1",
|
|
65
66
|
"command-line-usage": "^7.0.1",
|
|
66
67
|
"configparser": "^0.3.10",
|