patreon-dl 3.7.0 → 3.8.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 (68) hide show
  1. package/README.md +29 -1
  2. package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
  3. package/dist/browse/api/ContentAPIMixin.d.ts +3 -3
  4. package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
  5. package/dist/browse/api/index.d.ts +10 -10
  6. package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
  7. package/dist/browse/db/ContentDBMixin.d.ts +13 -13
  8. package/dist/browse/db/index.d.ts +16 -16
  9. package/dist/browse/web/assets/index-CQnQD2xz.css +1 -0
  10. package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
  11. package/dist/browse/web/index.html +2 -2
  12. package/dist/cli/CLIOptions.js +2 -0
  13. package/dist/cli/CLIOptions.js.map +1 -1
  14. package/dist/cli/CommandLineParser.d.ts +4 -0
  15. package/dist/cli/CommandLineParser.js +65 -32
  16. package/dist/cli/CommandLineParser.js.map +1 -1
  17. package/dist/cli/ConfigFileParser.js +2 -0
  18. package/dist/cli/ConfigFileParser.js.map +1 -1
  19. package/dist/cli/helper/PostList.d.ts +6 -0
  20. package/dist/cli/helper/PostList.js +106 -0
  21. package/dist/cli/helper/PostList.js.map +1 -0
  22. package/dist/cli/index.js +73 -53
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/downloaders/Bootstrap.d.ts +5 -0
  25. package/dist/downloaders/Bootstrap.js +10 -0
  26. package/dist/downloaders/Bootstrap.js.map +1 -1
  27. package/dist/downloaders/Downloader.d.ts +4 -4
  28. package/dist/downloaders/Downloader.js +5 -58
  29. package/dist/downloaders/Downloader.js.map +1 -1
  30. package/dist/downloaders/DownloaderOptions.d.ts +1 -0
  31. package/dist/downloaders/DownloaderOptions.js +2 -0
  32. package/dist/downloaders/DownloaderOptions.js.map +1 -1
  33. package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
  34. package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
  35. package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
  36. package/dist/downloaders/InitialData.js +20 -6
  37. package/dist/downloaders/InitialData.js.map +1 -1
  38. package/dist/downloaders/PostDownloader.js +62 -98
  39. package/dist/downloaders/PostDownloader.js.map +1 -1
  40. package/dist/downloaders/PostsFetcher.js +4 -2
  41. package/dist/downloaders/PostsFetcher.js.map +1 -1
  42. package/dist/downloaders/ProductDownloader.js +31 -21
  43. package/dist/downloaders/ProductDownloader.js.map +1 -1
  44. package/dist/downloaders/task/M3U8DownloadTask.d.ts +1 -0
  45. package/dist/downloaders/task/M3U8DownloadTask.js +137 -39
  46. package/dist/downloaders/task/M3U8DownloadTask.js.map +1 -1
  47. package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
  48. package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
  49. package/dist/parsers/PageParser.js +8 -3
  50. package/dist/parsers/PageParser.js.map +1 -1
  51. package/dist/utils/Fetcher.d.ts +4 -1
  52. package/dist/utils/Fetcher.js +6 -1
  53. package/dist/utils/Fetcher.js.map +1 -1
  54. package/dist/utils/URLHelper.d.ts +4 -0
  55. package/dist/utils/URLHelper.js +17 -0
  56. package/dist/utils/URLHelper.js.map +1 -1
  57. package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
  58. package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
  59. package/dist/utils/logging/ConsoleLogger.js +5 -0
  60. package/dist/utils/logging/ConsoleLogger.js.map +1 -1
  61. package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
  62. package/dist/utils/yt/InnertubeLoader.js +14 -14
  63. package/dist/utils/yt/InnertubeLoader.js.map +1 -1
  64. package/dist/utils/yt/PoToken.js +53 -27
  65. package/dist/utils/yt/PoToken.js.map +1 -1
  66. package/package.json +12 -8
  67. package/dist/browse/web/assets/index-CW4CUoWl.css +0 -1
  68. package/dist/browse/web/assets/index-CziUWlSw.js +0 -218
@@ -0,0 +1,106 @@
1
+ import { EOL } from 'os';
2
+ import Downloader from '../../downloaders/Downloader.js';
3
+ import PostsFetcher from '../../downloaders/PostsFetcher.js';
4
+ import { commonLog } from '../../utils/logging/Logger.js';
5
+ import { getCLIOptions } from '../CLIOptions.js';
6
+ import CommandLineParser from '../CommandLineParser.js';
7
+ import ConsoleLogger from '../../utils/logging/ConsoleLogger.js';
8
+ import URLHelper from '../../utils/URLHelper.js';
9
+ import { IncludeCriteriaHelper } from '../../downloaders/IncludeCriteriaHelper.js';
10
+ export async function listPosts(options) {
11
+ let listPostsTargets;
12
+ try {
13
+ listPostsTargets = CommandLineParser.listPosts();
14
+ }
15
+ catch (error) {
16
+ await options.onOptionError(error);
17
+ return { hasError: true };
18
+ }
19
+ if (listPostsTargets) {
20
+ const { byVanity: vanities, byUserId: userIds } = listPostsTargets;
21
+ let hasError = false;
22
+ const options = getCLIOptions(true);
23
+ const consoleLogger = new ConsoleLogger(options.consoleLogger);
24
+ const warnLogger = new ConsoleLogger({
25
+ logLevel: 'warn'
26
+ });
27
+ const abortController = new AbortController();
28
+ const abortHandler = () => {
29
+ console.log('Abort');
30
+ abortController.abort();
31
+ };
32
+ process.on('SIGINT', abortHandler);
33
+ const __doList = async (targets, targetType) => {
34
+ for (const target of targets) {
35
+ try {
36
+ const url = URLHelper.constructUserPostsURL(targetType === 'vanity' ? { vanity: target } : { userId: target });
37
+ const downloader = await Downloader.getInstance(url, options);
38
+ const PostDownloader = (await import('../../downloaders/PostDownloader.js')).default;
39
+ if (!(downloader instanceof PostDownloader)) {
40
+ throw Error('Type mismatch: PostDownloader expected');
41
+ }
42
+ const config = downloader.getConfig(false);
43
+ const postsFetcher = new PostsFetcher({
44
+ config,
45
+ fetcher: downloader.getFetcher(),
46
+ logger: warnLogger,
47
+ signal: abortController.signal
48
+ });
49
+ console.log(`*** Posts by ${target} ***${EOL}`);
50
+ postsFetcher.begin();
51
+ let breakWhile = false;
52
+ while (postsFetcher.hasNext()) {
53
+ const { list, aborted, error } = await postsFetcher.next();
54
+ if (!list || aborted) {
55
+ break;
56
+ }
57
+ if (!list && error) {
58
+ commonLog(consoleLogger, 'error', null, 'Error fetching posts:', error);
59
+ hasError = true;
60
+ return;
61
+ }
62
+ for (const post of list.items) {
63
+ if (abortController.signal.aborted) {
64
+ return;
65
+ }
66
+ const criteriaHelper = new IncludeCriteriaHelper(warnLogger);
67
+ const criteriaCheck = criteriaHelper.checkPost(post, config);
68
+ if (criteriaCheck.ok) {
69
+ console.log(post.title);
70
+ console.log(post.publishedAt);
71
+ console.log(post.url);
72
+ console.log('');
73
+ continue;
74
+ }
75
+ if (criteriaCheck.reason === 'publishDateOutOfRange') {
76
+ const publishedAt = post.publishedAt ? new Date(post.publishedAt).getTime() : null;
77
+ const after = config.include.postsPublished.after?.valueOf().getTime();
78
+ if (publishedAt && after && publishedAt < after) {
79
+ // All subsequent posts will be out of date range, so we can return right away.
80
+ breakWhile = true;
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ if (breakWhile) {
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ catch (error) {
91
+ commonLog(consoleLogger, 'error', null, `Error listing posts for ${target}:`, error);
92
+ hasError = true;
93
+ }
94
+ }
95
+ };
96
+ await __doList(vanities, 'vanity');
97
+ if (abortController.signal.aborted || hasError) {
98
+ return { hasError };
99
+ }
100
+ await __doList(userIds, 'userId');
101
+ process.off('SIGINT', abortHandler);
102
+ return { hasError };
103
+ }
104
+ return false;
105
+ }
106
+ //# sourceMappingURL=PostList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostList.js","sourceRoot":"","sources":["../../../src/cli/helper/PostList.ts"],"names":[],"mappings":"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","sourcesContent":["import { EOL } from 'os';\nimport Downloader from '../../downloaders/Downloader.js';\nimport PostsFetcher from '../../downloaders/PostsFetcher.js';\nimport { commonLog } from '../../utils/logging/Logger.js';\nimport { getCLIOptions } from '../CLIOptions.js';\nimport CommandLineParser from '../CommandLineParser.js';\nimport ConsoleLogger from '../../utils/logging/ConsoleLogger.js';\nimport URLHelper from '../../utils/URLHelper.js';\nimport { IncludeCriteriaHelper } from '../../downloaders/IncludeCriteriaHelper.js';\n\nexport type ListPostsResult = false | {\n hasError: boolean;\n};\n\nexport async function listPosts(options: {\n onOptionError: (error: unknown) => Promise<void>;\n}): Promise<ListPostsResult> {\n let listPostsTargets;\n try {\n listPostsTargets = CommandLineParser.listPosts();\n }\n catch (error) {\n await options.onOptionError(error);\n return { hasError: true };\n }\n if (listPostsTargets) {\n const { byVanity: vanities, byUserId: userIds } = listPostsTargets;\n let hasError = false;\n const options = getCLIOptions(true);\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\n const warnLogger = new ConsoleLogger({\n logLevel: 'warn'\n });\n\n const abortController = new AbortController();\n const abortHandler = () => {\n console.log('Abort');\n abortController.abort();\n };\n process.on('SIGINT', abortHandler);\n\n const __doList = async (targets: string[], targetType: 'vanity' | 'userId') => {\n for (const target of targets) {\n try {\n const url = URLHelper.constructUserPostsURL(\n targetType === 'vanity' ?{ vanity: target } : { userId: target }\n );\n const downloader = await Downloader.getInstance(\n url,\n options\n );\n const PostDownloader = (await import('../../downloaders/PostDownloader.js')).default;\n if (!(downloader instanceof PostDownloader)) {\n throw Error('Type mismatch: PostDownloader expected');\n }\n\n const config = downloader.getConfig(false);\n const postsFetcher = new PostsFetcher({\n config,\n fetcher: downloader.getFetcher(),\n logger: warnLogger,\n signal: abortController.signal\n });\n \n console.log(`*** Posts by ${target} ***${EOL}`);\n \n postsFetcher.begin();\n let breakWhile = false;\n while (postsFetcher.hasNext()) {\n const { list, aborted, error } = await postsFetcher.next();\n if (!list || aborted) {\n break;\n }\n if (!list && error) {\n commonLog(consoleLogger, 'error', null, 'Error fetching posts:', error);\n hasError = true;\n return;\n }\n for (const post of list.items) {\n if (abortController.signal.aborted) {\n return;\n }\n const criteriaHelper = new IncludeCriteriaHelper(warnLogger);\n const criteriaCheck = criteriaHelper.checkPost(post, config);\n if (criteriaCheck.ok) {\n console.log(post.title);\n console.log(post.publishedAt);\n console.log(post.url);\n console.log('');\n continue;\n }\n if (criteriaCheck.reason === 'publishDateOutOfRange') {\n const publishedAt = post.publishedAt ? new Date(post.publishedAt).getTime() : null;\n const after = config.include.postsPublished.after?.valueOf().getTime();\n if (publishedAt && after && publishedAt < after) {\n // All subsequent posts will be out of date range, so we can return right away.\n breakWhile = true;\n break;\n }\n }\n }\n if (breakWhile) {\n break;\n }\n }\n }\n catch (error) {\n commonLog(consoleLogger, 'error', null, `Error listing posts for ${target}:`, error);\n hasError = true;\n }\n }\n };\n\n await __doList(vanities, 'vanity');\n if (abortController.signal.aborted || hasError) {\n return { hasError }; \n }\n await __doList(userIds, 'userId');\n process.off('SIGINT', abortHandler);\n return { hasError };\n }\n\n return false;\n}"]}
package/dist/cli/index.js CHANGED
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
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
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _PatreonDownloaderCLI_instances, _PatreonDownloaderCLI_logger, _PatreonDownloaderCLI_packageInfo, _PatreonDownloaderCLI_globalConfPath, _PatreonDownloaderCLI_fileLoggers, _PatreonDownloaderCLI_getYouTubeCredentialsPath, _PatreonDownloaderCLI_getApplicableIncludeOptions, _PatreonDownloaderCLI_getDisplayConfig, _PatreonDownloaderCLI_createAndStartDownloader, _PatreonDownloaderCLI_confirmProceed, _PatreonDownloaderCLI_createLoggers;
12
+ var _PatreonDownloaderCLI_instances, _PatreonDownloaderCLI_logger, _PatreonDownloaderCLI_packageInfo, _PatreonDownloaderCLI_globalConfPath, _PatreonDownloaderCLI_fileLoggers, _PatreonDownloaderCLI_printOptionError, _PatreonDownloaderCLI_listTiers, _PatreonDownloaderCLI_listPosts, _PatreonDownloaderCLI_getYouTubeCredentialsPath, _PatreonDownloaderCLI_getApplicableIncludeOptions, _PatreonDownloaderCLI_getDisplayConfig, _PatreonDownloaderCLI_createAndStartDownloader, _PatreonDownloaderCLI_confirmProceed, _PatreonDownloaderCLI_createLoggers;
13
13
  import { EOL } from 'os';
14
14
  import PromptSync from 'prompt-sync';
15
15
  import path from 'path';
@@ -29,6 +29,7 @@ import copy from 'fast-copy';
29
29
  import cliTruncate from 'cli-truncate';
30
30
  import { isDenoInstalled } from '../utils/Misc.js';
31
31
  import { createProxyAgent } from '../utils/Proxy.js';
32
+ import { listPosts } from './helper/PostList.js';
32
33
  const YT_CREDENTIALS_FILENAME = 'youtube-credentials.json';
33
34
  class PatreonDownloaderCLI {
34
35
  constructor() {
@@ -44,6 +45,7 @@ class PatreonDownloaderCLI {
44
45
  __classPrivateFieldSet(this, _PatreonDownloaderCLI_packageInfo, getPackageInfo(), "f");
45
46
  __classPrivateFieldSet(this, _PatreonDownloaderCLI_globalConfPath, envPaths(__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").name || 'patreon-dl', { suffix: '' }).config, "f");
46
47
  }
48
+ ;
47
49
  async start() {
48
50
  if (CommandLineParser.showUsage()) {
49
51
  return this.exit(0);
@@ -51,68 +53,22 @@ class PatreonDownloaderCLI {
51
53
  if (__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner) {
52
54
  console.log(`${EOL}${__classPrivateFieldGet(this, _PatreonDownloaderCLI_packageInfo, "f").banner}${EOL}`);
53
55
  }
54
- const __printOptionError = (error) => {
55
- console.error('Error processing options: ', error instanceof Error ? error.message : error, EOL, 'See usage with \'-h\' option.');
56
- return this.exit(1);
57
- };
58
56
  const ytCredsPath = __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_getYouTubeCredentialsPath).call(this);
59
57
  if (CommandLineParser.configureYouTube()) {
60
58
  return this.exit(await YouTubeConfigurator.start(ytCredsPath));
61
59
  }
62
- let listTiersTargets;
63
- try {
64
- listTiersTargets = CommandLineParser.listTiers();
60
+ if (await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_listTiers).call(this)) {
61
+ return;
65
62
  }
66
- catch (error) {
67
- return __printOptionError(error);
68
- }
69
- if (listTiersTargets) {
70
- const { byVanity: vanities, byUserId: userIds } = listTiersTargets;
71
- let hasError = false;
72
- const options = getCLIOptions(true);
73
- const consoleLogger = new ConsoleLogger(options.consoleLogger);
74
- const __doList = async (targets, targetType) => {
75
- for (const target of targets) {
76
- try {
77
- const campaign = await Downloader.getCampaign(targetType === 'vanity' ? target : { userId: target }, undefined, {
78
- ...options,
79
- logger: consoleLogger
80
- });
81
- if (campaign) {
82
- const p = targetType === 'userId' ? 'user #' : '';
83
- console.log(`*** Tiers for ${p}${target} ***${EOL}`);
84
- const idColWidth = campaign.rewards.reduce((len, reward) => {
85
- return Math.max(len, reward.id.length);
86
- }, 0);
87
- const gap = ' ';
88
- console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
89
- console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
90
- campaign.rewards.forEach((reward) => {
91
- console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
92
- });
93
- console.log(EOL);
94
- }
95
- else {
96
- commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
97
- throw Error();
98
- }
99
- }
100
- catch (_error) {
101
- console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
102
- hasError = true;
103
- }
104
- }
105
- };
106
- await __doList(vanities, 'vanity');
107
- await __doList(userIds, 'userId');
108
- return this.exit(hasError ? 1 : 0);
63
+ if (await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_listPosts).call(this)) {
64
+ return;
109
65
  }
110
66
  let options;
111
67
  try {
112
68
  options = getCLIOptions();
113
69
  }
114
70
  catch (error) {
115
- return __printOptionError(error);
71
+ return __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error);
116
72
  }
117
73
  const targetsWithError = [];
118
74
  const targetEndMessages = [];
@@ -156,7 +112,71 @@ class PatreonDownloaderCLI {
156
112
  process.exit(code);
157
113
  }
158
114
  }
159
- _PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo = new WeakMap(), _PatreonDownloaderCLI_globalConfPath = new WeakMap(), _PatreonDownloaderCLI_fileLoggers = new WeakMap(), _PatreonDownloaderCLI_instances = new WeakSet(), _PatreonDownloaderCLI_getYouTubeCredentialsPath = function _PatreonDownloaderCLI_getYouTubeCredentialsPath() {
115
+ _PatreonDownloaderCLI_logger = new WeakMap(), _PatreonDownloaderCLI_packageInfo = new WeakMap(), _PatreonDownloaderCLI_globalConfPath = new WeakMap(), _PatreonDownloaderCLI_fileLoggers = new WeakMap(), _PatreonDownloaderCLI_instances = new WeakSet(), _PatreonDownloaderCLI_printOptionError = function _PatreonDownloaderCLI_printOptionError(error) {
116
+ console.error('Error processing options: ', error instanceof Error ? error.message : error, EOL, 'See usage with \'-h\' option.');
117
+ return this.exit(1);
118
+ }, _PatreonDownloaderCLI_listTiers = async function _PatreonDownloaderCLI_listTiers() {
119
+ let listTiersTargets;
120
+ try {
121
+ listTiersTargets = CommandLineParser.listTiers();
122
+ }
123
+ catch (error) {
124
+ await __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error);
125
+ return true;
126
+ }
127
+ if (listTiersTargets) {
128
+ const { byVanity: vanities, byUserId: userIds } = listTiersTargets;
129
+ let hasError = false;
130
+ const options = getCLIOptions(true);
131
+ const consoleLogger = new ConsoleLogger(options.consoleLogger);
132
+ const __doList = async (targets, targetType) => {
133
+ for (const target of targets) {
134
+ try {
135
+ const campaign = await Downloader.getCampaign(targetType === 'vanity' ? target : { userId: target }, undefined, {
136
+ ...options,
137
+ logger: consoleLogger
138
+ });
139
+ if (campaign) {
140
+ const p = targetType === 'userId' ? 'user #' : '';
141
+ console.log(`*** Tiers for ${p}${target} ***${EOL}`);
142
+ const idColWidth = campaign.rewards.reduce((len, reward) => {
143
+ return Math.max(len, reward.id.length);
144
+ }, 0);
145
+ const gap = ' ';
146
+ console.log(`ID${gap}${' '.repeat(idColWidth - 2)}Title`);
147
+ console.log('-'.repeat(idColWidth) + gap + '-'.repeat('title'.length));
148
+ campaign.rewards.forEach((reward) => {
149
+ console.log(`${reward.id}${' '.repeat(idColWidth - reward.id.length)}${gap}${reward.title || 'Public'}`);
150
+ });
151
+ console.log(EOL);
152
+ }
153
+ else {
154
+ commonLog(consoleLogger, 'error', null, 'Failed to obtain campaign info');
155
+ throw Error();
156
+ }
157
+ }
158
+ catch (_error) {
159
+ console.error(`${EOL}Error fetching tier data for "${target}"${EOL}${EOL}`);
160
+ hasError = true;
161
+ }
162
+ }
163
+ };
164
+ await __doList(vanities, 'vanity');
165
+ await __doList(userIds, 'userId');
166
+ await this.exit(hasError ? 1 : 0);
167
+ return true;
168
+ }
169
+ return false;
170
+ }, _PatreonDownloaderCLI_listPosts = async function _PatreonDownloaderCLI_listPosts() {
171
+ const result = await listPosts({
172
+ onOptionError: (error) => __classPrivateFieldGet(this, _PatreonDownloaderCLI_instances, "m", _PatreonDownloaderCLI_printOptionError).call(this, error)
173
+ });
174
+ if (!result) {
175
+ return false;
176
+ }
177
+ await this.exit(result.hasError ? 1 : 0);
178
+ return true;
179
+ }, _PatreonDownloaderCLI_getYouTubeCredentialsPath = function _PatreonDownloaderCLI_getYouTubeCredentialsPath() {
160
180
  return path.resolve(__classPrivateFieldGet(this, _PatreonDownloaderCLI_globalConfPath, "f"), YT_CREDENTIALS_FILENAME);
161
181
  }, _PatreonDownloaderCLI_getApplicableIncludeOptions = function _PatreonDownloaderCLI_getApplicableIncludeOptions(local, global) {
162
182
  if (!local) {
@@ -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, 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, { FileLoggerType, type DownloaderFileLoggerInit } 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 { isDenoInstalled, type DeepPartial } from '../utils/Misc.js';\nimport { createProxyAgent } from '../utils/Proxy.js';\nimport { type Product } from '../entities/Product.js';\nimport { type Post } from '../entities/Post.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 options = getCLIOptions(true);\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\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 {\n ...options,\n logger: consoleLogger\n }\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.include?.productsPublished?.after) {\n displayConfig.include.productsPublished.after = config.include.productsPublished.after.toString();\n delete displayConfig.include.postsPublished.after;\n }\n if (config.include?.productsPublished?.before) {\n displayConfig.include.productsPublished.before = config.include.productsPublished.before.toString();\n delete displayConfig.include.postsPublished.before;\n }\n if (config.cookie) {\n displayConfig.cookie = cliTruncate(displayConfig.cookie, 20, { position: 'middle', space: true });\n }\n if (config.include?.mediaByFilename) {\n for (const [k, v] of Object.entries(config.include.mediaByFilename)) {\n if (v) {\n if (v.startsWith('!')) {\n const stripped = v.substring(1);\n if (!stripped) {\n delete displayConfig.include.mediaByFilename[k];\n }\n else {\n displayConfig.include.mediaByFilename[k] = {\n pattern: v.substring(1),\n 'case-sensitive': false\n };\n }\n }\n else {\n displayConfig.include.mediaByFilename[k] = {\n pattern: v,\n 'case-sensitive': true\n };\n }\n }\n }\n }\n return ObjectHelper.clean(displayConfig, {\n deep: true, cleanNulls: true, cleanEmptyObjects: true\n });\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n const __checkProxy = () => {\n const proxyAgentInfo = createProxyAgent(options);\n if (proxyAgentInfo) {\n if (proxyAgentInfo.protocol !== 'http') {\n commonLog(logger, 'warn', null,\n `${proxyAgentInfo.protocol.toUpperCase()} proxy specified in config. Note that some operations use FFmpeg to download video streams. Since FFmpeg only supports HTTP proxy, these operations will ignore the specified proxy options.`, EOL);\n }\n }\n }\n\n const __checkDeno = () => {\n const ytExternalDownloader = options.embedDownloaders && options.embedDownloaders.find((downloader) => downloader.provider.toLowerCase() === 'youtube' && downloader.exec);\n if(!ytExternalDownloader) {\n const di = isDenoInstalled(options.pathToDeno || undefined);\n if (!di.installed) {\n commonLog(logger, 'warn', null,\n `WARNING: Deno (https://deno.com) is not found on this system. For embedded YouTube videos, the downloader needs to run code obtained from YouTube / Google servers. Without Deno, such code will be executed without sandboxing. Running un-sandboxed code exposes your system to potential security vulnerabilities, including unauthorized access, data corruption, or malicious operations.`,\n EOL\n );\n }\n else if (di.version) {\n commonLog(logger, 'info', null, `Deno ${di.version} installed`, EOL);\n }\n else {\n commonLog(logger, 'info', null, `Deno installed`, 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 __checkDeno();\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 Partial<DownloaderConfig<Post>> & Partial<DownloaderConfig<Product>>;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productFetch;\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 __checkDeno();\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: `, this.#getDisplayConfig(downloader.getConfig()));\n if (index === 0) {\n __checkProxy();\n __checkDeno();\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: DownloaderFileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const fullOptions = {\n init: fileLoggerInit,\n ...fileLoggerOptions\n };\n const { filePath } = FileLogger.getPathInfo(FileLoggerType.Downloader, fullOptions);\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fullOptions);\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, 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, { FileLoggerType, type DownloaderFileLoggerInit } 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 { isDenoInstalled, type DeepPartial } from '../utils/Misc.js';\nimport { createProxyAgent } from '../utils/Proxy.js';\nimport { type Product } from '../entities/Product.js';\nimport { type Post } from '../entities/Post.js';\nimport { listPosts } from './helper/PostList.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 #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 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 ytCredsPath = this.#getYouTubeCredentialsPath();\n if (CommandLineParser.configureYouTube()) {\n return this.exit(await YouTubeConfigurator.start(ytCredsPath));\n }\n\n if (await this.#listTiers()) {\n return;\n }\n\n if (await this.#listPosts()) {\n return;\n }\n\n let options;\n try {\n options = getCLIOptions();\n }\n catch (error) {\n return this.#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 async #listTiers(): Promise<boolean> {\n let listTiersTargets;\n try {\n listTiersTargets = CommandLineParser.listTiers();\n }\n catch (error) {\n await this.#printOptionError(error);\n return true;\n }\n if (listTiersTargets) {\n const { byVanity: vanities, byUserId: userIds } = listTiersTargets;\n let hasError = false;\n const options = getCLIOptions(true);\n const consoleLogger = new ConsoleLogger(options.consoleLogger);\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 {\n ...options,\n logger: consoleLogger\n }\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 await this.exit(hasError ? 1 : 0);\n return true;\n }\n\n return false;\n }\n\n async #listPosts(): Promise<boolean> {\n const result = await listPosts({\n onOptionError: (error) => this.#printOptionError(error)\n });\n if (!result) {\n return false;\n }\n await this.exit(result.hasError ? 1 : 0);\n return true;\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.include?.productsPublished?.after) {\n displayConfig.include.productsPublished.after = config.include.productsPublished.after.toString();\n delete displayConfig.include.postsPublished.after;\n }\n if (config.include?.productsPublished?.before) {\n displayConfig.include.productsPublished.before = config.include.productsPublished.before.toString();\n delete displayConfig.include.postsPublished.before;\n }\n if (config.cookie) {\n displayConfig.cookie = cliTruncate(displayConfig.cookie, 20, { position: 'middle', space: true });\n }\n if (config.include?.mediaByFilename) {\n for (const [k, v] of Object.entries(config.include.mediaByFilename)) {\n if (v) {\n if (v.startsWith('!')) {\n const stripped = v.substring(1);\n if (!stripped) {\n delete displayConfig.include.mediaByFilename[k];\n }\n else {\n displayConfig.include.mediaByFilename[k] = {\n pattern: v.substring(1),\n 'case-sensitive': false\n };\n }\n }\n else {\n displayConfig.include.mediaByFilename[k] = {\n pattern: v,\n 'case-sensitive': true\n };\n }\n }\n }\n }\n return ObjectHelper.clean(displayConfig, {\n deep: true, cleanNulls: true, cleanEmptyObjects: true\n });\n }\n\n async #createAndStartDownloader(targetURLs: CLITargetURLEntry[], index: number, options: CLIOptions) {\n const { url: targetURL } = targetURLs[index];\n const includeOpts = this.#getApplicableIncludeOptions(targetURLs[index].include, options.include);\n\n // Create loggers\n const { chainLogger: logger, consoleLogger, fileLoggers } = this.#createLoggers(targetURL, options);\n this.#logger = logger;\n\n // Create downloader\n let downloader: Downloader<any>;\n const ytCredsPath = this.#getYouTubeCredentialsPath();\n try {\n downloader = await Downloader.getInstance(targetURL, {\n ...options,\n include: includeOpts,\n pathToYouTubeCredentials: fs.existsSync(ytCredsPath) ? ytCredsPath : null,\n logger: this.#logger\n });\n }\n catch (error) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance:', error);\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n if (!downloader) {\n commonLog(logger, 'error', null, 'Failed to get downloader instance (unknown reason)');\n return { hasError: true, endMessage: 'Downloader init error' };\n }\n\n const downloaderName = downloader.name;\n const __logBegin = () => {\n commonLog(logger, 'info', null, `*** BEGIN target URL: ${targetURL} ***`, EOL);\n };\n\n const __checkProxy = () => {\n const proxyAgentInfo = createProxyAgent(options);\n if (proxyAgentInfo) {\n if (proxyAgentInfo.protocol !== 'http') {\n commonLog(logger, 'warn', null,\n `${proxyAgentInfo.protocol.toUpperCase()} proxy specified in config. Note that some operations use FFmpeg to download video streams. Since FFmpeg only supports HTTP proxy, these operations will ignore the specified proxy options.`, EOL);\n }\n }\n }\n\n const __checkDeno = () => {\n const ytExternalDownloader = options.embedDownloaders && options.embedDownloaders.find((downloader) => downloader.provider.toLowerCase() === 'youtube' && downloader.exec);\n if(!ytExternalDownloader) {\n const di = isDenoInstalled(options.pathToDeno || undefined);\n if (!di.installed) {\n commonLog(logger, 'warn', null,\n `WARNING: Deno (https://deno.com) is not found on this system. For embedded YouTube videos, the downloader needs to run code obtained from YouTube / Google servers. Without Deno, such code will be executed without sandboxing. Running un-sandboxed code exposes your system to potential security vulnerabilities, including unauthorized access, data corruption, or malicious operations.`,\n EOL\n );\n }\n else if (di.version) {\n commonLog(logger, 'info', null, `Deno ${di.version} installed`, EOL);\n }\n else {\n commonLog(logger, 'info', null, `Deno installed`, 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 __checkDeno();\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 Partial<DownloaderConfig<Post>> & Partial<DownloaderConfig<Product>>;\n delete conf.targetURL;\n delete conf.type;\n delete conf.postFetch;\n delete conf.productFetch;\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 __checkDeno();\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: `, this.#getDisplayConfig(downloader.getConfig()));\n if (index === 0) {\n __checkProxy();\n __checkDeno();\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: DownloaderFileLoggerInit = {\n targetURL,\n outDir: options.outDir,\n date: new Date()\n };\n const fileLoggers = options.fileLoggers?.reduce<FileLogger[]>((result, fileLoggerOptions) => {\n try {\n const fullOptions = {\n init: fileLoggerInit,\n ...fileLoggerOptions\n };\n const { filePath } = FileLogger.getPathInfo(FileLoggerType.Downloader, fullOptions);\n const existingFileLogger = this.#fileLoggers.find((logger) => logger.getConfig().logFilePath === filePath);\n const fl = existingFileLogger || new FileLogger(fullOptions);\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"]}
@@ -39,6 +39,11 @@ export interface PostDownloaderBootstrapData extends BootstrapData {
39
39
  collectionId: string;
40
40
  filters?: Record<string, any>;
41
41
  campaignId?: string;
42
+ } | {
43
+ type: 'byURL';
44
+ url: string;
45
+ filters?: Record<string, any>;
46
+ campaignId?: string;
42
47
  } | {
43
48
  type: 'byFile';
44
49
  filePath: string;
@@ -84,6 +84,16 @@ export default class Bootstrap {
84
84
  }
85
85
  };
86
86
  }
87
+ if (analysis.type === 'customURL') {
88
+ return {
89
+ type: 'post',
90
+ targetURL: url,
91
+ postFetch: {
92
+ type: 'byURL',
93
+ url: analysis.url
94
+ }
95
+ };
96
+ }
87
97
  if (analysis.type === 'post') {
88
98
  return {
89
99
  type: 'post',
@@ -1 +1 @@
1
- {"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport { type Post } from '../entities/Post.js';\nimport { type Product } from '../entities/Product.js';\nimport URLHelper from '../utils/URLHelper.js';\nimport path from 'path';\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 productFetch: {\n type: 'single';\n productId: string;\n } | {\n type: 'byShop';\n vanity: string;\n campaignId?: string;\n } | {\n type: 'byFile';\n filePath: string;\n };\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 campaignId?: string;\n } | {\n type: 'byUserId';\n userId: string;\n filters?: Record<string, any>;\n campaignId?: string;\n } | {\n type: 'byCollection';\n collectionId: string;\n filters?: Record<string, any>;\n campaignId?: string;\n } | {\n type: 'byFile';\n filePath: string;\n };\n}\n\nexport type DownloaderBootstrapData<T extends DownloaderType> =\n T['type'] extends 'product' ? ProductDownloaderBootstrapData :\n T['type'] extends 'post' ? PostDownloaderBootstrapData :\n never;\n\nexport default class Bootstrap {\n\n static getDownloaderBootstrapDataByURL(url: string) {\n // Check if url points to local API data file.\n // This is for debugging purposes.\n const fileExists = existsSync(url);\n if (fileExists && path.basename(url) === 'post-api.json') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byFile',\n filePath: path.resolve(url)\n }\n } satisfies PostDownloaderBootstrapData;\n }\n\n // Likewise for 'product-api.json'\n if (fileExists && path.basename(url) === 'product-api.json') {\n return {\n type: 'product',\n targetURL: url,\n productFetch: {\n type: 'byFile',\n filePath: path.resolve(url)\n }\n } satisfies ProductDownloaderBootstrapData;\n }\n\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 productFetch: {\n type: 'single',\n productId: analysis.productId\n }\n } as ProductDownloaderBootstrapData;\n }\n\n if (analysis.type === 'shop') {\n return {\n type: 'product',\n targetURL: url,\n productFetch: {\n type: 'byShop',\n vanity: analysis.vanity\n }\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 === 'postsByUserId') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUserId',\n userId: analysis.userId,\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"]}
1
+ {"version":3,"file":"Bootstrap.js","sourceRoot":"","sources":["../../src/downloaders/Bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport { type Post } from '../entities/Post.js';\nimport { type Product } from '../entities/Product.js';\nimport URLHelper from '../utils/URLHelper.js';\nimport path from 'path';\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 productFetch: {\n type: 'single';\n productId: string;\n } | {\n type: 'byShop';\n vanity: string;\n campaignId?: string;\n } | {\n type: 'byFile';\n filePath: string;\n };\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 campaignId?: string;\n } | {\n type: 'byUserId';\n userId: string;\n filters?: Record<string, any>;\n campaignId?: string;\n } | {\n type: 'byCollection';\n collectionId: string;\n filters?: Record<string, any>;\n campaignId?: string;\n } | {\n type: 'byURL';\n url: string;\n filters?: Record<string, any>;\n campaignId?: string;\n } | {\n type: 'byFile';\n filePath: string;\n };\n}\n\nexport type DownloaderBootstrapData<T extends DownloaderType> =\n T['type'] extends 'product' ? ProductDownloaderBootstrapData :\n T['type'] extends 'post' ? PostDownloaderBootstrapData :\n never;\n\nexport default class Bootstrap {\n\n static getDownloaderBootstrapDataByURL(url: string) {\n // Check if url points to local API data file.\n // This is for debugging purposes.\n const fileExists = existsSync(url);\n if (fileExists && path.basename(url) === 'post-api.json') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byFile',\n filePath: path.resolve(url)\n }\n } satisfies PostDownloaderBootstrapData;\n }\n\n // Likewise for 'product-api.json'\n if (fileExists && path.basename(url) === 'product-api.json') {\n return {\n type: 'product',\n targetURL: url,\n productFetch: {\n type: 'byFile',\n filePath: path.resolve(url)\n }\n } satisfies ProductDownloaderBootstrapData;\n }\n\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 productFetch: {\n type: 'single',\n productId: analysis.productId\n }\n } as ProductDownloaderBootstrapData;\n }\n\n if (analysis.type === 'shop') {\n return {\n type: 'product',\n targetURL: url,\n productFetch: {\n type: 'byShop',\n vanity: analysis.vanity\n }\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 === 'postsByUserId') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byUserId',\n userId: analysis.userId,\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 === 'customURL') {\n return {\n type: 'post',\n targetURL: url,\n postFetch: {\n type: 'byURL',\n url: analysis.url\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"]}
@@ -11,8 +11,7 @@ import FSHelper, { type WriteTextFileResult } from '../utils/FSHelper.js';
11
11
  import DownloadTaskBatch from './task/DownloadTaskBatch.js';
12
12
  import { type Downloadable } from '../entities/Downloadable.js';
13
13
  import { type DBInstance } from '../browse/db/index.js';
14
- import { type Product } from '../entities/Product.js';
15
- import { type Collection, type Post } from '../entities/Post.js';
14
+ import { type Collection } from '../entities/Post.js';
16
15
  export type DownloaderConfig<T extends DownloaderType> = DownloaderInit & DownloaderBootstrapData<T>;
17
16
  export interface DownloaderStartParams {
18
17
  signal?: AbortSignal;
@@ -66,7 +65,8 @@ export default abstract class Downloader<T extends DownloaderType> extends Event
66
65
  static getCampaign(params: GetCampaignParams, signal?: AbortSignal, options?: Logger | null | Pick<DownloaderOptions, 'cookie' | 'request' | 'logger'>): Promise<Campaign | null>;
67
66
  protected saveCampaignInfo(campaign: Campaign | null, signal?: AbortSignal): Promise<void>;
68
67
  protected log(level: LogLevel, ...msg: any[]): void;
69
- getConfig(): deepFreeze.DeepReadonly<DownloaderConfig<T>>;
68
+ getConfig(ro: false): DownloaderConfig<T>;
69
+ getConfig(ro?: true): deepFreeze.DeepReadonly<DownloaderConfig<T>>;
70
70
  protected checkAbortSignal(signal: AbortSignal | undefined): boolean;
71
71
  protected logWriteTextFileResult(result: WriteTextFileResult, target: {
72
72
  id: string;
@@ -83,8 +83,8 @@ export default abstract class Downloader<T extends DownloaderType> extends Event
83
83
  json: any;
84
84
  error: any;
85
85
  }>;
86
- protected isPublishDateOutOfRange(entity: Post | Product, emit?: boolean): boolean;
87
86
  protected closeDB(): Promise<void>;
87
+ getFetcher(): Fetcher;
88
88
  on<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;
89
89
  once<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;
90
90
  off<T extends DownloaderEvent>(event: T, listener: (args: DownloaderEventPayloadOf<T>) => void): this;