patreon-dl 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +422 -0
  2. package/bin/patreon-dl.js +5 -0
  3. package/dist/cli/CLIOptionValidator.d.ts +9 -0
  4. package/dist/cli/CLIOptionValidator.d.ts.map +1 -0
  5. package/dist/cli/CLIOptionValidator.js +85 -0
  6. package/dist/cli/CLIOptionValidator.js.map +1 -0
  7. package/dist/cli/CLIOptions.d.ts +20 -0
  8. package/dist/cli/CLIOptions.d.ts.map +1 -0
  9. package/dist/cli/CLIOptions.js +75 -0
  10. package/dist/cli/CLIOptions.js.map +1 -0
  11. package/dist/cli/CommandLineParser.d.ts +11 -0
  12. package/dist/cli/CommandLineParser.d.ts.map +1 -0
  13. package/dist/cli/CommandLineParser.js +212 -0
  14. package/dist/cli/CommandLineParser.js.map +1 -0
  15. package/dist/cli/ConfigFileParser.d.ts +9 -0
  16. package/dist/cli/ConfigFileParser.d.ts.map +1 -0
  17. package/dist/cli/ConfigFileParser.js +163 -0
  18. package/dist/cli/ConfigFileParser.js.map +1 -0
  19. package/dist/cli/index.d.ts +7 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +162 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/downloaders/Bootstrap.d.ts +29 -0
  24. package/dist/downloaders/Bootstrap.d.ts.map +1 -0
  25. package/dist/downloaders/Bootstrap.js +51 -0
  26. package/dist/downloaders/Bootstrap.js.map +1 -0
  27. package/dist/downloaders/Downloader.d.ts +59 -0
  28. package/dist/downloaders/Downloader.d.ts.map +1 -0
  29. package/dist/downloaders/Downloader.js +357 -0
  30. package/dist/downloaders/Downloader.js.map +1 -0
  31. package/dist/downloaders/DownloaderEvent.d.ts +47 -0
  32. package/dist/downloaders/DownloaderEvent.d.ts.map +1 -0
  33. package/dist/downloaders/DownloaderEvent.js +6 -0
  34. package/dist/downloaders/DownloaderEvent.js.map +1 -0
  35. package/dist/downloaders/DownloaderOptions.d.ts +39 -0
  36. package/dist/downloaders/DownloaderOptions.d.ts.map +1 -0
  37. package/dist/downloaders/DownloaderOptions.js +69 -0
  38. package/dist/downloaders/DownloaderOptions.js.map +1 -0
  39. package/dist/downloaders/PostDownloader.d.ts +8 -0
  40. package/dist/downloaders/PostDownloader.d.ts.map +1 -0
  41. package/dist/downloaders/PostDownloader.js +428 -0
  42. package/dist/downloaders/PostDownloader.js.map +1 -0
  43. package/dist/downloaders/ProductDownloader.d.ts +8 -0
  44. package/dist/downloaders/ProductDownloader.d.ts.map +1 -0
  45. package/dist/downloaders/ProductDownloader.js +171 -0
  46. package/dist/downloaders/ProductDownloader.js.map +1 -0
  47. package/dist/downloaders/cache/StatusCache.d.ts +43 -0
  48. package/dist/downloaders/cache/StatusCache.d.ts.map +1 -0
  49. package/dist/downloaders/cache/StatusCache.js +206 -0
  50. package/dist/downloaders/cache/StatusCache.js.map +1 -0
  51. package/dist/downloaders/index.d.ts +7 -0
  52. package/dist/downloaders/index.d.ts.map +1 -0
  53. package/dist/downloaders/index.js +6 -0
  54. package/dist/downloaders/index.js.map +1 -0
  55. package/dist/downloaders/task/DownloadTask.d.ts +89 -0
  56. package/dist/downloaders/task/DownloadTask.d.ts.map +1 -0
  57. package/dist/downloaders/task/DownloadTask.js +240 -0
  58. package/dist/downloaders/task/DownloadTask.js.map +1 -0
  59. package/dist/downloaders/task/DownloadTaskBatch.d.ts +45 -0
  60. package/dist/downloaders/task/DownloadTaskBatch.d.ts.map +1 -0
  61. package/dist/downloaders/task/DownloadTaskBatch.js +195 -0
  62. package/dist/downloaders/task/DownloadTaskBatch.js.map +1 -0
  63. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts +32 -0
  64. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts.map +1 -0
  65. package/dist/downloaders/task/DownloadTaskBatchEvent.js +2 -0
  66. package/dist/downloaders/task/DownloadTaskBatchEvent.js.map +1 -0
  67. package/dist/downloaders/task/DownloadTaskFactory.d.ts +20 -0
  68. package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -0
  69. package/dist/downloaders/task/DownloadTaskFactory.js +177 -0
  70. package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -0
  71. package/dist/downloaders/task/FFmpegDownloadTask.d.ts +27 -0
  72. package/dist/downloaders/task/FFmpegDownloadTask.d.ts.map +1 -0
  73. package/dist/downloaders/task/FFmpegDownloadTask.js +206 -0
  74. package/dist/downloaders/task/FFmpegDownloadTask.js.map +1 -0
  75. package/dist/downloaders/task/FetcherDownloadTask.d.ts +21 -0
  76. package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -0
  77. package/dist/downloaders/task/FetcherDownloadTask.js +213 -0
  78. package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -0
  79. package/dist/downloaders/task/index.d.ts +4 -0
  80. package/dist/downloaders/task/index.d.ts.map +1 -0
  81. package/dist/downloaders/task/index.js +3 -0
  82. package/dist/downloaders/task/index.js.map +1 -0
  83. package/dist/downloaders/templates/CampaignInfo.d.ts +3 -0
  84. package/dist/downloaders/templates/CampaignInfo.d.ts.map +1 -0
  85. package/dist/downloaders/templates/CampaignInfo.js +58 -0
  86. package/dist/downloaders/templates/CampaignInfo.js.map +1 -0
  87. package/dist/downloaders/templates/PostInfo.d.ts +4 -0
  88. package/dist/downloaders/templates/PostInfo.d.ts.map +1 -0
  89. package/dist/downloaders/templates/PostInfo.js +45 -0
  90. package/dist/downloaders/templates/PostInfo.js.map +1 -0
  91. package/dist/downloaders/templates/ProductInfo.d.ts +3 -0
  92. package/dist/downloaders/templates/ProductInfo.d.ts.map +1 -0
  93. package/dist/downloaders/templates/ProductInfo.js +20 -0
  94. package/dist/downloaders/templates/ProductInfo.js.map +1 -0
  95. package/dist/entities/Attachment.d.ts +7 -0
  96. package/dist/entities/Attachment.d.ts.map +1 -0
  97. package/dist/entities/Attachment.js +2 -0
  98. package/dist/entities/Attachment.js.map +1 -0
  99. package/dist/entities/Campaign.d.ts +19 -0
  100. package/dist/entities/Campaign.d.ts.map +1 -0
  101. package/dist/entities/Campaign.js +2 -0
  102. package/dist/entities/Campaign.js.map +1 -0
  103. package/dist/entities/Downloadable.d.ts +6 -0
  104. package/dist/entities/Downloadable.d.ts.map +1 -0
  105. package/dist/entities/Downloadable.js +5 -0
  106. package/dist/entities/Downloadable.js.map +1 -0
  107. package/dist/entities/MediaItem.d.ts +95 -0
  108. package/dist/entities/MediaItem.d.ts.map +1 -0
  109. package/dist/entities/MediaItem.js +2 -0
  110. package/dist/entities/MediaItem.js.map +1 -0
  111. package/dist/entities/Post.d.ts +87 -0
  112. package/dist/entities/Post.d.ts.map +1 -0
  113. package/dist/entities/Post.js +2 -0
  114. package/dist/entities/Post.js.map +1 -0
  115. package/dist/entities/Product.d.ts +17 -0
  116. package/dist/entities/Product.d.ts.map +1 -0
  117. package/dist/entities/Product.js +2 -0
  118. package/dist/entities/Product.js.map +1 -0
  119. package/dist/entities/Reward.d.ts +14 -0
  120. package/dist/entities/Reward.d.ts.map +1 -0
  121. package/dist/entities/Reward.js +2 -0
  122. package/dist/entities/Reward.js.map +1 -0
  123. package/dist/entities/User.d.ts +15 -0
  124. package/dist/entities/User.d.ts.map +1 -0
  125. package/dist/entities/User.js +2 -0
  126. package/dist/entities/User.js.map +1 -0
  127. package/dist/entities/index.d.ts +9 -0
  128. package/dist/entities/index.d.ts.map +1 -0
  129. package/dist/entities/index.js +6 -0
  130. package/dist/entities/index.js.map +1 -0
  131. package/dist/index.d.ts +8 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +8 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/parsers/PageParser.d.ts +6 -0
  136. package/dist/parsers/PageParser.d.ts.map +1 -0
  137. package/dist/parsers/PageParser.js +23 -0
  138. package/dist/parsers/PageParser.js.map +1 -0
  139. package/dist/parsers/Parser.d.ts +43 -0
  140. package/dist/parsers/Parser.d.ts.map +1 -0
  141. package/dist/parsers/Parser.js +439 -0
  142. package/dist/parsers/Parser.js.map +1 -0
  143. package/dist/parsers/PostParser.d.ts +7 -0
  144. package/dist/parsers/PostParser.d.ts.map +1 -0
  145. package/dist/parsers/PostParser.js +259 -0
  146. package/dist/parsers/PostParser.js.map +1 -0
  147. package/dist/parsers/ProductParser.d.ts +7 -0
  148. package/dist/parsers/ProductParser.d.ts.map +1 -0
  149. package/dist/parsers/ProductParser.js +70 -0
  150. package/dist/parsers/ProductParser.js.map +1 -0
  151. package/dist/utils/AttachmentFilenameResolver.d.ts +9 -0
  152. package/dist/utils/AttachmentFilenameResolver.d.ts.map +1 -0
  153. package/dist/utils/AttachmentFilenameResolver.js +73 -0
  154. package/dist/utils/AttachmentFilenameResolver.js.map +1 -0
  155. package/dist/utils/FSHelper.d.ts +57 -0
  156. package/dist/utils/FSHelper.d.ts.map +1 -0
  157. package/dist/utils/FSHelper.js +214 -0
  158. package/dist/utils/FSHelper.js.map +1 -0
  159. package/dist/utils/Fetcher.d.ts +45 -0
  160. package/dist/utils/Fetcher.d.ts.map +1 -0
  161. package/dist/utils/Fetcher.js +192 -0
  162. package/dist/utils/Fetcher.js.map +1 -0
  163. package/dist/utils/FetcherProgressMonitor.d.ts +18 -0
  164. package/dist/utils/FetcherProgressMonitor.d.ts.map +1 -0
  165. package/dist/utils/FetcherProgressMonitor.js +56 -0
  166. package/dist/utils/FetcherProgressMonitor.js.map +1 -0
  167. package/dist/utils/FilenameFormatHelper.d.ts +44 -0
  168. package/dist/utils/FilenameFormatHelper.d.ts.map +1 -0
  169. package/dist/utils/FilenameFormatHelper.js +98 -0
  170. package/dist/utils/FilenameFormatHelper.js.map +1 -0
  171. package/dist/utils/FllenameResolver.d.ts +20 -0
  172. package/dist/utils/FllenameResolver.d.ts.map +1 -0
  173. package/dist/utils/FllenameResolver.js +55 -0
  174. package/dist/utils/FllenameResolver.js.map +1 -0
  175. package/dist/utils/Formatter.d.ts +21 -0
  176. package/dist/utils/Formatter.d.ts.map +1 -0
  177. package/dist/utils/Formatter.js +112 -0
  178. package/dist/utils/Formatter.js.map +1 -0
  179. package/dist/utils/MediaFilenameResolver.d.ts +9 -0
  180. package/dist/utils/MediaFilenameResolver.d.ts.map +1 -0
  181. package/dist/utils/MediaFilenameResolver.js +90 -0
  182. package/dist/utils/MediaFilenameResolver.js.map +1 -0
  183. package/dist/utils/Misc.d.ts +14 -0
  184. package/dist/utils/Misc.d.ts.map +1 -0
  185. package/dist/utils/Misc.js +4 -0
  186. package/dist/utils/Misc.js.map +1 -0
  187. package/dist/utils/ObjectHelper.d.ts +4 -0
  188. package/dist/utils/ObjectHelper.d.ts.map +1 -0
  189. package/dist/utils/ObjectHelper.js +30 -0
  190. package/dist/utils/ObjectHelper.js.map +1 -0
  191. package/dist/utils/PackageInfo.d.ts +10 -0
  192. package/dist/utils/PackageInfo.d.ts.map +1 -0
  193. package/dist/utils/PackageInfo.js +33 -0
  194. package/dist/utils/PackageInfo.js.map +1 -0
  195. package/dist/utils/URLHelper.d.ts +40 -0
  196. package/dist/utils/URLHelper.d.ts.map +1 -0
  197. package/dist/utils/URLHelper.js +192 -0
  198. package/dist/utils/URLHelper.js.map +1 -0
  199. package/dist/utils/index.d.ts +2 -0
  200. package/dist/utils/index.d.ts.map +1 -0
  201. package/dist/utils/index.js +2 -0
  202. package/dist/utils/index.js.map +1 -0
  203. package/dist/utils/logging/ChainLogger.d.ts +11 -0
  204. package/dist/utils/logging/ChainLogger.d.ts.map +1 -0
  205. package/dist/utils/logging/ChainLogger.js +50 -0
  206. package/dist/utils/logging/ChainLogger.js.map +1 -0
  207. package/dist/utils/logging/ConsoleLogger.d.ts +31 -0
  208. package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -0
  209. package/dist/utils/logging/ConsoleLogger.js +126 -0
  210. package/dist/utils/logging/ConsoleLogger.js.map +1 -0
  211. package/dist/utils/logging/FileLogger.d.ts +26 -0
  212. package/dist/utils/logging/FileLogger.d.ts.map +1 -0
  213. package/dist/utils/logging/FileLogger.js +147 -0
  214. package/dist/utils/logging/FileLogger.js.map +1 -0
  215. package/dist/utils/logging/Logger.d.ts +12 -0
  216. package/dist/utils/logging/Logger.d.ts.map +1 -0
  217. package/dist/utils/logging/Logger.js +15 -0
  218. package/dist/utils/logging/Logger.js.map +1 -0
  219. package/dist/utils/logging/index.d.ts +7 -0
  220. package/dist/utils/logging/index.d.ts.map +1 -0
  221. package/dist/utils/logging/index.js +7 -0
  222. package/dist/utils/logging/index.js.map +1 -0
  223. package/package.json +78 -0
@@ -0,0 +1,162 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _PatreonDownloaderCLI_instances, _PatreonDownloaderCLI_logger, _PatreonDownloaderCLI_packageInfo, _PatreonDownloaderCLI_confirmProceed, _PatreonDownloaderCLI_createLoggers;
13
+ import { EOL } from 'os';
14
+ import PromptSync from 'prompt-sync';
15
+ import Downloader from '../downloaders/Downloader.js';
16
+ import ConsoleLogger from '../utils/logging/ConsoleLogger.js';
17
+ import { getCLIOptions } from './CLIOptions.js';
18
+ import CommandLineParser from './CommandLineParser.js';
19
+ import { commonLog } from '../utils/logging/Logger.js';
20
+ import FileLogger from '../utils/logging/FileLogger.js';
21
+ import ChainLogger from '../utils/logging/ChainLogger.js';
22
+ import { getPackageInfo } from '../utils/PackageInfo.js';
23
+ export default class PatreonDownloaderCLI {
24
+ constructor() {
25
+ _PatreonDownloaderCLI_instances.add(this);
26
+ _PatreonDownloaderCLI_logger.set(this, void 0);
27
+ _PatreonDownloaderCLI_packageInfo.set(this, void 0);
28
+ __classPrivateFieldSet(this, _PatreonDownloaderCLI_logger, null, "f");
29
+ __classPrivateFieldSet(this, _PatreonDownloaderCLI_packageInfo, getPackageInfo(), "f");
30
+ }
31
+ async start() {
32
+ if (CommandLineParser.showUsage()) {
33
+ return this.exit(0);
34
+ }
35
+ if (__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner) {
36
+ console.log(`${EOL}${__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner}${EOL}`);
37
+ }
38
+ let options;
39
+ try {
40
+ options = getCLIOptions();
41
+ }
42
+ catch (error) {
43
+ console.error('Error processing options: ', error instanceof Error ? error.message : error, EOL, 'See usage with \'-h\' option.');
44
+ return this.exit(1);
45
+ }
46
+ const { chainLogger: logger, consoleLogger, fileLoggers } = __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_createLoggers).call(this, options);
47
+ __classPrivateFieldSet(this, _PatreonDownloaderCLI_logger, logger, "f");
48
+ // Create downloader
49
+ let downloader;
50
+ try {
51
+ downloader = await Downloader.getInstance(options.targetURL, {
52
+ ...options,
53
+ logger
54
+ });
55
+ }
56
+ catch (error) {
57
+ commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);
58
+ return this.exit(1);
59
+ }
60
+ if (!downloader) {
61
+ commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');
62
+ return this.exit(1);
63
+ }
64
+ const downloaderName = downloader.name;
65
+ if (!options.noPrompt) {
66
+ if (!consoleLogger.getConfig().enabled) {
67
+ console.log('Console logging disabled', EOL);
68
+ }
69
+ if (fileLoggers.length > 0) {
70
+ console.log('Log files');
71
+ console.log('---------');
72
+ for (const fl of fileLoggers) {
73
+ const flConf = fl.getConfig();
74
+ console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);
75
+ }
76
+ console.log(EOL);
77
+ }
78
+ console.log(`Created ${downloaderName} instance with config: `, downloader.getConfig(), EOL);
79
+ if (!__classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_confirmProceed).call(this)) {
80
+ console.log('Abort');
81
+ return this.exit(1);
82
+ }
83
+ }
84
+ else {
85
+ commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());
86
+ }
87
+ let hasDownloaderError = false;
88
+ downloader.on('end', ({ aborted, error }) => {
89
+ if (aborted) {
90
+ commonLog(logger, 'info', null, `${downloaderName} aborted`);
91
+ }
92
+ else if (!error) {
93
+ commonLog(logger, 'info', null, `${downloaderName} end`);
94
+ }
95
+ else {
96
+ commonLog(logger, 'warn', null, `${downloaderName} end with error`);
97
+ hasDownloaderError = true;
98
+ }
99
+ });
100
+ try {
101
+ const abortController = new AbortController();
102
+ process.on('SIGINT', () => {
103
+ abortController.abort();
104
+ });
105
+ await downloader.start({ signal: abortController.signal });
106
+ return this.exit(hasDownloaderError ? 1 : 0);
107
+ }
108
+ catch (error) {
109
+ commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);
110
+ return this.exit(1);
111
+ }
112
+ }
113
+ async exit(code) {
114
+ if (__classPrivateFieldGet(this, _PatreonDownloaderCLI_logger, "f")) {
115
+ await __classPrivateFieldGet(this, _PatreonDownloaderCLI_logger, "f").end();
116
+ }
117
+ process.exit(code);
118
+ }
119
+ }
120
+ _PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo = new WeakMap(), _PatreonDownloaderCLI_instances = new WeakSet(), _PatreonDownloaderCLI_confirmProceed = function _PatreonDownloaderCLI_confirmProceed(prompt) {
121
+ if (!prompt) {
122
+ prompt = PromptSync({ sigint: true });
123
+ }
124
+ const confirmProceed = prompt('Proceed (Y/n)? ');
125
+ if (!confirmProceed.trim() || confirmProceed.trim().toLowerCase() === 'y') {
126
+ return true;
127
+ }
128
+ else if (confirmProceed.trim().toLowerCase() === 'n') {
129
+ return false;
130
+ }
131
+ return __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_confirmProceed).call(this, prompt);
132
+ }, _PatreonDownloaderCLI_createLoggers = function _PatreonDownloaderCLI_createLoggers(options) {
133
+ // Create file loggers
134
+ const fileLoggerInit = {
135
+ targetURL: options.targetURL,
136
+ outDir: options.outDir,
137
+ date: new Date()
138
+ };
139
+ const fileLoggers = options.fileLoggers?.reduce((result, fileLoggerOptions) => {
140
+ try {
141
+ const fl = new FileLogger(fileLoggerInit, fileLoggerOptions);
142
+ result.push(fl);
143
+ }
144
+ catch (error) {
145
+ console.warn('Failed to create file logger: ', error instanceof Error ? error.message : error);
146
+ }
147
+ return result;
148
+ }, []) || [];
149
+ // Create console logger
150
+ const consoleLogger = new ConsoleLogger(options.consoleLogger);
151
+ // Chain logger
152
+ const chainLogger = new ChainLogger([
153
+ consoleLogger,
154
+ ...fileLoggers
155
+ ]);
156
+ return {
157
+ chainLogger,
158
+ consoleLogger,
159
+ fileLoggers
160
+ };
161
+ };
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 Downloader from '../downloaders/Downloader.js';\nimport ConsoleLogger from '../utils/logging/ConsoleLogger.js';\nimport { CLIOptions, getCLIOptions } from './CLIOptions.js';\nimport CommandLineParser from './CommandLineParser.js';\nimport Logger, { commonLog } from '../utils/logging/Logger.js';\nimport FileLogger, { FileLoggerInit } from '../utils/logging/FileLogger.js';\nimport ChainLogger from '../utils/logging/ChainLogger.js';\nimport { PackageInfo, getPackageInfo } from '../utils/PackageInfo.js';\n\nexport default class PatreonDownloaderCLI {\n\n #logger: Logger | null;\n #packageInfo: PackageInfo;\n\n constructor() {\n this.#logger = null;\n this.#packageInfo = getPackageInfo();\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 let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\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 { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(options);\n this.#logger = logger;\n\n // Create downloader\n let downloader;\n try {\n downloader = await Downloader.getInstance(options.targetURL, {\n ...options,\n logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return this.exit(1);\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return this.exit(1);\n }\n\n const downloaderName = downloader.name;\n\n if (!options.noPrompt) {\n if (!consoleLogger.getConfig().enabled) {\n console.log('Console logging disabled', EOL);\n }\n\n if (fileLoggers.length > 0) {\n console.log('Log files');\n console.log('---------');\n for (const fl of fileLoggers) {\n const flConf = fl.getConfig();\n console.log(`- ${flConf.logLevel}: ${flConf.logFilePath}`);\n }\n console.log(EOL);\n }\n\n console.log(`Created ${downloaderName} instance with config: `, downloader.getConfig(), EOL);\n\n if (!this.#confirmProceed()) {\n console.log('Abort');\n return this.exit(1);\n }\n }\n else {\n commonLog(logger, 'debug', null, `Created ${downloaderName} instance with config: `, downloader.getConfig());\n }\n\n let hasDownloaderError = false;\n downloader.on('end', ({aborted, error}) => {\n if (aborted) {\n commonLog(logger, 'info', null, `${downloaderName} aborted`);\n }\n else if (!error) {\n commonLog(logger, 'info', null, `${downloaderName} end`);\n }\n else {\n commonLog(logger, 'warn', null, `${downloaderName} end with error`);\n hasDownloaderError = true;\n }\n });\n\n try {\n const abortController = new AbortController();\n process.on('SIGINT', () => {\n abortController.abort();\n });\n await downloader.start({ signal: abortController.signal });\n return this.exit(hasDownloaderError ? 1 : 0);\n }\n catch (error) {\n commonLog(logger, 'error', null, `Uncaught ${downloaderName} error:`, error);\n return this.exit(1);\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(options: CLIOptions) {\n // Create file loggers\n const fileLoggerInit: FileLoggerInit = {\n targetURL: options.targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const fl = 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"]}
@@ -0,0 +1,29 @@
1
+ export type DownloaderType = 'product' | 'post';
2
+ export interface BootstrapData {
3
+ type: string;
4
+ targetURL: string;
5
+ }
6
+ export interface ProductDownloaderBootstrapData extends BootstrapData {
7
+ type: 'product';
8
+ productId: string;
9
+ }
10
+ export interface PostDownloaderBootstrapData extends BootstrapData {
11
+ type: 'post';
12
+ postFetch: {
13
+ type: 'single';
14
+ postId: string;
15
+ } | {
16
+ type: 'byUser';
17
+ vanity: string;
18
+ filters?: Record<string, any>;
19
+ } | {
20
+ type: 'byCollection';
21
+ collectionId: string;
22
+ filters?: Record<string, any>;
23
+ };
24
+ }
25
+ export type DownloaderBootstrapData<T extends DownloaderType> = T extends 'product' ? ProductDownloaderBootstrapData : T extends 'post' ? PostDownloaderBootstrapData : never;
26
+ export default class Bootstrap {
27
+ static getDownloaderBootstrapDataByURL(url: string): ProductDownloaderBootstrapData | PostDownloaderBootstrapData | null;
28
+ }
29
+ //# sourceMappingURL=Bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bootstrap.d.ts","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,8BAA+B,SAAQ,aAAa;IACnE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG;QACF,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,GAAG;QACF,IAAI,EAAE,cAAc,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,IAC1D,CAAC,SAAS,SAAS,GAAG,8BAA8B,GACpD,CAAC,SAAS,MAAM,GAAG,2BAA2B,GAC9C,KAAK,CAAC;AAER,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAG,EAAE,MAAM;CAoDnD"}
@@ -0,0 +1,51 @@
1
+ import URLHelper from '../utils/URLHelper.js';
2
+ export default class Bootstrap {
3
+ static getDownloaderBootstrapDataByURL(url) {
4
+ const analysis = URLHelper.analyzeURL(url);
5
+ if (!analysis) {
6
+ return null;
7
+ }
8
+ if (analysis.type === 'product') {
9
+ return {
10
+ type: 'product',
11
+ targetURL: url,
12
+ productId: analysis.productId
13
+ };
14
+ }
15
+ if (analysis.type === 'postsByUser') {
16
+ return {
17
+ type: 'post',
18
+ targetURL: url,
19
+ postFetch: {
20
+ type: 'byUser',
21
+ vanity: analysis.vanity,
22
+ filters: analysis.filters
23
+ }
24
+ };
25
+ }
26
+ if (analysis.type === 'postsByCollection') {
27
+ return {
28
+ type: 'post',
29
+ targetURL: url,
30
+ postFetch: {
31
+ type: 'byCollection',
32
+ collectionId: analysis.collectionId,
33
+ filters: analysis.filters
34
+ }
35
+ };
36
+ }
37
+ if (analysis.type === 'post') {
38
+ return {
39
+ type: 'post',
40
+ targetURL: url,
41
+ postFetch: {
42
+ type: 'single',
43
+ postId: analysis.postId,
44
+ slug: analysis.slug
45
+ }
46
+ };
47
+ }
48
+ return null;
49
+ }
50
+ }
51
+ //# sourceMappingURL=Bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAmC9C,MAAM,CAAC,OAAO,OAAO,SAAS;IAE5B,MAAM,CAAC,+BAA+B,CAAC,GAAW;QAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,QAAQ,CAAC,SAAS;aACI,CAAC;SACrC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE;YACnC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACzC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,cAAc;oBACpB,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;aAC6B,CAAC;SAClC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB;aAC6B,CAAC;SAClC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import URLHelper from '../utils/URLHelper.js';\n\nexport type DownloaderType = 'product' | 'post';\n\nexport interface BootstrapData {\n type: string;\n targetURL: string;\n}\n\nexport interface ProductDownloaderBootstrapData extends BootstrapData {\n type: 'product';\n productId: string;\n}\n\nexport interface PostDownloaderBootstrapData extends BootstrapData {\n type: 'post';\n postFetch: {\n type: 'single';\n postId: string;\n } | {\n type: 'byUser';\n vanity: string;\n filters?: Record<string, any>;\n } | {\n type: 'byCollection';\n collectionId: string;\n filters?: Record<string, any>;\n };\n}\n\nexport type DownloaderBootstrapData<T extends DownloaderType> =\n T extends 'product' ? ProductDownloaderBootstrapData :\n T extends 'post' ? PostDownloaderBootstrapData :\n never;\n\nexport default class Bootstrap {\n\n static getDownloaderBootstrapDataByURL(url: string) {\n const analysis = URLHelper.analyzeURL(url);\n if (!analysis) {\n return null;\n }\n\n if (analysis.type === 'product') {\n return {\n type: 'product',\n targetURL: url,\n productId: analysis.productId\n } as ProductDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByUser') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUser',\n vanity: analysis.vanity,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'postsByCollection') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byCollection',\n collectionId: analysis.collectionId,\n filters: analysis.filters\n }\n } as PostDownloaderBootstrapData;\n }\n\n if (analysis.type === 'post') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'single',\n postId: analysis.postId,\n slug: analysis.slug\n }\n } as PostDownloaderBootstrapData;\n }\n\n return null;\n }\n}\n"]}
@@ -0,0 +1,59 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import deepFreeze from 'deep-freeze';
4
+ import Fetcher from '../utils/Fetcher.js';
5
+ import { DownloaderBootstrapData, DownloaderType } from './Bootstrap.js';
6
+ import { DownloaderInit, DownloaderOptions, FileExistsAction } from './DownloaderOptions.js';
7
+ import { DownloaderEvent, DownloaderEventPayloadOf } from './DownloaderEvent.js';
8
+ import Logger, { LogLevel } from '../utils/logging/Logger.js';
9
+ import { Campaign } from '../entities/Campaign.js';
10
+ import { WriteTextFileResult } from '../utils/FSHelper.js';
11
+ import DownloadTaskBatch from './task/DownloadTaskBatch.js';
12
+ import { Downloadable } from '../entities/Downloadable.js';
13
+ export type DownloaderConfig<T extends DownloaderType> = DownloaderInit & Omit<DownloaderBootstrapData<T>, 'type'>;
14
+ export interface DownloaderStartParams {
15
+ signal?: AbortSignal;
16
+ }
17
+ interface CreateDownloadTaskParams {
18
+ target: Downloadable[];
19
+ targetName: string;
20
+ destDir: string;
21
+ fileExistsAction: FileExistsAction;
22
+ }
23
+ export default abstract class Downloader<T extends DownloaderType> extends EventEmitter {
24
+ #private;
25
+ abstract name: string;
26
+ protected fetcher: Fetcher;
27
+ protected config: deepFreeze.DeepReadonly<DownloaderConfig<T>>;
28
+ protected logger?: Logger | null;
29
+ constructor(bootstrap: DownloaderBootstrapData<T>, options?: DownloaderOptions);
30
+ protected createDownloadTaskBatch(name: string, ...createTasks: Array<CreateDownloadTaskParams | null>): DownloadTaskBatch;
31
+ protected addToDownloadTaskBatch(batch: DownloadTaskBatch, ...createTasks: Array<CreateDownloadTaskParams | null>): DownloadTaskBatch;
32
+ abstract start(params: DownloaderStartParams): Promise<void>;
33
+ static getInstance(url: string, options?: DownloaderOptions): Promise<import("./PostDownloader.js").default | import("./ProductDownloader.js").default>;
34
+ protected saveCampaignInfo(campaign: Campaign | null, signal?: AbortSignal): Promise<void>;
35
+ protected log(level: LogLevel, ...msg: any[]): void;
36
+ getConfig(): deepFreeze.DeepReadonly<DownloaderConfig<T>>;
37
+ protected checkAbortSignal(signal: AbortSignal | undefined, resolve: () => void): boolean;
38
+ protected logWriteTextFileResult<T>(result: WriteTextFileResult, target: T & {
39
+ id: string;
40
+ }, targetName: string): void;
41
+ protected commonFetchAPI(url: string, signal?: AbortSignal): Promise<{
42
+ json: any;
43
+ error: any;
44
+ }>;
45
+ protected fetchCampaign(campaignId: string, signal?: AbortSignal): Promise<{
46
+ json: any;
47
+ error: any;
48
+ }>;
49
+ protected fetchUser(userId: string, signal?: AbortSignal): Promise<{
50
+ json: any;
51
+ error: any;
52
+ }>;
53
+ on<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;
54
+ once<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;
55
+ off<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;
56
+ emit<T extends DownloaderEvent>(event: T, args: DownloaderEventPayloadOf<T>): boolean;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=Downloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Downloader.d.ts","sourceRoot":"","sources":["../../src/downloaders/Downloader.ts"],"names":[],"mappings":"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"}