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,213 @@
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 _FetcherDownloadTask_instances, _FetcherDownloadTask_fetcher, _FetcherDownloadTask_destDir, _FetcherDownloadTask_destFilenameResolver, _FetcherDownloadTask_fileExistsAction, _FetcherDownloadTask_abortController, _FetcherDownloadTask_progressMonitor, _FetcherDownloadTask_abortingCallback, _FetcherDownloadTask_checkAndSpawnFFmpegDownloadTask, _FetcherDownloadTask_isM3U8FilePath, _FetcherDownloadTask_convertFetcherProgress;
13
+ import path from 'path';
14
+ import fs from 'fs';
15
+ import DownloadTask from './DownloadTask.js';
16
+ import FFmpegDownloadTask from './FFmpegDownloadTask.js';
17
+ import { AbortError } from 'node-fetch';
18
+ import FSHelper from '../../utils/FSHelper.js';
19
+ export default class FetcherDownloadTask extends DownloadTask {
20
+ constructor(params) {
21
+ super(params);
22
+ _FetcherDownloadTask_instances.add(this);
23
+ this.name = 'FetcherDownloadTask';
24
+ _FetcherDownloadTask_fetcher.set(this, void 0);
25
+ _FetcherDownloadTask_destDir.set(this, void 0);
26
+ _FetcherDownloadTask_destFilenameResolver.set(this, void 0);
27
+ _FetcherDownloadTask_fileExistsAction.set(this, void 0);
28
+ _FetcherDownloadTask_abortController.set(this, void 0);
29
+ _FetcherDownloadTask_progressMonitor.set(this, void 0);
30
+ _FetcherDownloadTask_abortingCallback.set(this, void 0);
31
+ __classPrivateFieldSet(this, _FetcherDownloadTask_fetcher, params.fetcher, "f");
32
+ __classPrivateFieldSet(this, _FetcherDownloadTask_destDir, params.destDir, "f");
33
+ __classPrivateFieldSet(this, _FetcherDownloadTask_destFilenameResolver, params.destFilenameResolver, "f");
34
+ __classPrivateFieldSet(this, _FetcherDownloadTask_fileExistsAction, params.fileExistsAction, "f");
35
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortController, null, "f");
36
+ __classPrivateFieldSet(this, _FetcherDownloadTask_progressMonitor, null, "f");
37
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortingCallback, null, "f");
38
+ }
39
+ doStart() {
40
+ return new Promise(async (resolve) => {
41
+ if (this.status === 'aborted') {
42
+ resolve();
43
+ }
44
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortController, new AbortController(), "f");
45
+ /**
46
+ * Change status to downloading ahead of notifyStart(), so that task can be
47
+ * aborted even though we have not yet obtained progress monitor from `Fetcher.download()`.
48
+ */
49
+ this.status = 'downloading';
50
+ let skipped = false;
51
+ const fileExistsAction = __classPrivateFieldGet(this, _FetcherDownloadTask_fileExistsAction, "f");
52
+ try {
53
+ const { destFilePath, monitor, start, abort } = await __classPrivateFieldGet(this, _FetcherDownloadTask_fetcher, "f").prepareDownload({
54
+ url: this.src,
55
+ destDir: __classPrivateFieldGet(this, _FetcherDownloadTask_destDir, "f"),
56
+ srcEntity: this.srcEntity,
57
+ destFilenameResolver: __classPrivateFieldGet(this, _FetcherDownloadTask_destFilenameResolver, "f"),
58
+ signal: __classPrivateFieldGet(this, _FetcherDownloadTask_abortController, "f").signal
59
+ });
60
+ this.resolvedDestPath = destFilePath;
61
+ // Skip download?
62
+ let skipDownload = { skip: false };
63
+ let lastDownloadedFilePath = null;
64
+ if (fileExistsAction === 'saveAsCopy' || fileExistsAction === 'saveAsCopyIfNewer') {
65
+ const inc = FSHelper.checkFileExistsAndIncrement(destFilePath);
66
+ this.resolvedDestPath = inc.filePath;
67
+ lastDownloadedFilePath = inc.preceding;
68
+ }
69
+ else if (fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {
70
+ const isM3U8 = this.srcEntity.type === 'video' && __classPrivateFieldGet(this, _FetcherDownloadTask_instances, "m", _FetcherDownloadTask_isM3U8FilePath).call(this, destFilePath);
71
+ const mp4FilePath = FSHelper.changeFilePathExtension(destFilePath, '.mp4');
72
+ if (isM3U8 && !fs.existsSync(mp4FilePath)) {
73
+ this.log('debug', `Ignoring 'fileExistsAction: skip' for URL "${this.src}": target download is M3U8 playlist and its ` +
74
+ `associated media file "${mp4FilePath}" does not exist`);
75
+ }
76
+ else {
77
+ skipDownload = {
78
+ skip: true,
79
+ reason: {
80
+ name: 'destFileExists',
81
+ message: `Destination file exists (${destFilePath})`,
82
+ existingDestFilePath: destFilePath
83
+ }
84
+ };
85
+ }
86
+ }
87
+ const __handleSkip = (skipAction) => {
88
+ if (skipDownload.skip) {
89
+ skipped = true;
90
+ skipAction();
91
+ const reason = skipDownload.reason;
92
+ this.notifySkip(reason);
93
+ resolve();
94
+ return true;
95
+ }
96
+ return false;
97
+ };
98
+ if (__handleSkip(abort)) {
99
+ return;
100
+ }
101
+ monitor.on('progress', (progress) => {
102
+ this.notifyProgress(__classPrivateFieldGet(this, _FetcherDownloadTask_instances, "m", _FetcherDownloadTask_convertFetcherProgress).call(this, progress));
103
+ });
104
+ __classPrivateFieldSet(this, _FetcherDownloadTask_progressMonitor, monitor, "f");
105
+ this.notifyStart();
106
+ const { tmpFilePath, commit, discard } = await start({ destFilePath: this.resolvedDestPath });
107
+ let proceedWithCommit = true;
108
+ if (fileExistsAction === 'saveAsCopyIfNewer' && lastDownloadedFilePath && fs.existsSync(lastDownloadedFilePath)) {
109
+ // Compare checksum of downloaded file with that of last download
110
+ const compareMsg = `(saveAsCopyIfNewer) Compare "${tmpFilePath}" with "${lastDownloadedFilePath}"`;
111
+ proceedWithCommit = !(await FSHelper.compareFiles(tmpFilePath, lastDownloadedFilePath));
112
+ if (!proceedWithCommit) {
113
+ this.log('debug', `${compareMsg}: Files match`);
114
+ skipDownload = {
115
+ skip: true,
116
+ reason: {
117
+ name: 'destFileExists',
118
+ message: `Destination file exists with same content (${lastDownloadedFilePath})`,
119
+ existingDestFilePath: lastDownloadedFilePath
120
+ }
121
+ };
122
+ this.resolvedDestPath = lastDownloadedFilePath;
123
+ __handleSkip(discard);
124
+ }
125
+ else {
126
+ this.log('debug', `${compareMsg}: Files do not match`);
127
+ }
128
+ }
129
+ if (proceedWithCommit) {
130
+ commit();
131
+ }
132
+ __classPrivateFieldGet(this, _FetcherDownloadTask_instances, "m", _FetcherDownloadTask_checkAndSpawnFFmpegDownloadTask).call(this, this.resolvedDestPath, destFilePath);
133
+ if (proceedWithCommit) {
134
+ this.notifyComplete();
135
+ resolve();
136
+ }
137
+ }
138
+ catch (error) {
139
+ if (error instanceof AbortError) {
140
+ if (!skipped) {
141
+ this.notifyAbort();
142
+ if (__classPrivateFieldGet(this, _FetcherDownloadTask_abortingCallback, "f")) {
143
+ __classPrivateFieldGet(this, _FetcherDownloadTask_abortingCallback, "f").call(this);
144
+ }
145
+ }
146
+ }
147
+ else {
148
+ this.notifyError(error);
149
+ }
150
+ resolve();
151
+ }
152
+ })
153
+ .finally(() => {
154
+ if (__classPrivateFieldGet(this, _FetcherDownloadTask_progressMonitor, "f")) {
155
+ __classPrivateFieldGet(this, _FetcherDownloadTask_progressMonitor, "f").removeAllListeners();
156
+ __classPrivateFieldSet(this, _FetcherDownloadTask_progressMonitor, null, "f");
157
+ }
158
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortController, null, "f");
159
+ });
160
+ }
161
+ async doAbort() {
162
+ return new Promise((resolve) => {
163
+ if (__classPrivateFieldGet(this, _FetcherDownloadTask_abortController, "f")) {
164
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortingCallback, () => {
165
+ __classPrivateFieldSet(this, _FetcherDownloadTask_abortingCallback, null, "f");
166
+ resolve();
167
+ }, "f");
168
+ __classPrivateFieldGet(this, _FetcherDownloadTask_abortController, "f").abort();
169
+ }
170
+ else {
171
+ resolve();
172
+ }
173
+ });
174
+ }
175
+ async doDestroy() {
176
+ __classPrivateFieldSet(this, _FetcherDownloadTask_destDir, '', "f");
177
+ }
178
+ doGetProgress() {
179
+ if (__classPrivateFieldGet(this, _FetcherDownloadTask_progressMonitor, "f")) {
180
+ return __classPrivateFieldGet(this, _FetcherDownloadTask_instances, "m", _FetcherDownloadTask_convertFetcherProgress).call(this, __classPrivateFieldGet(this, _FetcherDownloadTask_progressMonitor, "f").getProgress());
181
+ }
182
+ return undefined;
183
+ }
184
+ }
185
+ _FetcherDownloadTask_fetcher = new WeakMap(), _FetcherDownloadTask_destDir = new WeakMap(), _FetcherDownloadTask_destFilenameResolver = new WeakMap(), _FetcherDownloadTask_fileExistsAction = new WeakMap(), _FetcherDownloadTask_abortController = new WeakMap(), _FetcherDownloadTask_progressMonitor = new WeakMap(), _FetcherDownloadTask_abortingCallback = new WeakMap(), _FetcherDownloadTask_instances = new WeakSet(), _FetcherDownloadTask_checkAndSpawnFFmpegDownloadTask = function _FetcherDownloadTask_checkAndSpawnFFmpegDownloadTask(currentDestFilePath, preferredOutputFilePath) {
186
+ if (this.srcEntity.type === 'video' && __classPrivateFieldGet(this, _FetcherDownloadTask_instances, "m", _FetcherDownloadTask_isM3U8FilePath).call(this, currentDestFilePath) && this.callbacks) {
187
+ // Spawn FFmpeg task to download actual stream
188
+ const spawn = new FFmpegDownloadTask({
189
+ src: currentDestFilePath,
190
+ srcEntity: this.srcEntity,
191
+ maxRetries: this.maxRetries,
192
+ callbacks: this.callbacks,
193
+ logger: this.logger,
194
+ destFilePath: FSHelper.changeFilePathExtension(preferredOutputFilePath, '.mp4'),
195
+ fileExistsAction: __classPrivateFieldGet(this, _FetcherDownloadTask_fileExistsAction, "f")
196
+ });
197
+ this.callbacks.onSpawn(this, spawn);
198
+ }
199
+ }, _FetcherDownloadTask_isM3U8FilePath = function _FetcherDownloadTask_isM3U8FilePath(filePath) {
200
+ return path.extname(filePath) === '.m3u8';
201
+ }, _FetcherDownloadTask_convertFetcherProgress = function _FetcherDownloadTask_convertFetcherProgress(progress) {
202
+ return {
203
+ destFilename: progress.destFilename,
204
+ destFilePath: progress.destFilePath,
205
+ lengthUnit: 'byte',
206
+ length: progress.length,
207
+ lengthDownloaded: progress.transferred,
208
+ percent: progress.percentage,
209
+ sizeDownloaded: Number((progress.transferred / 1000).toFixed(2)),
210
+ speed: Number((progress.speed / 1000).toFixed(2))
211
+ };
212
+ };
213
+ //# sourceMappingURL=FetcherDownloadTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetcherDownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/FetcherDownloadTask.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport Fetcher from '../../utils/Fetcher.js';\nimport FetcherProgressMonitor, { FetcherProgress } from '../../utils/FetcherProgressMonitor.js';\nimport FilenameResolver from '../../utils/FllenameResolver.js';\nimport DownloadTask, { DownloadTaskParams, DownloadProgress, DownloadTaskSkipReason } from './DownloadTask.js';\nimport FFmpegDownloadTask from './FFmpegDownloadTask.js';\nimport { Downloadable } from '../../entities/Downloadable.js';\nimport { AbortError } from 'node-fetch';\nimport { FileExistsAction } from '../DownloaderOptions.js';\nimport FSHelper from '../../utils/FSHelper.js';\n\nexport interface FetcherDownloadTaskParams<T extends Downloadable> extends DownloadTaskParams {\n fetcher: Fetcher;\n destDir: string;\n destFilenameResolver: FilenameResolver<T>;\n fileExistsAction: FileExistsAction;\n}\n\nexport default class FetcherDownloadTask<T extends Downloadable> extends DownloadTask {\n\n protected name = 'FetcherDownloadTask';\n\n #fetcher: Fetcher;\n\n #destDir: string;\n #destFilenameResolver: FilenameResolver<T>;\n #fileExistsAction: FileExistsAction;\n #abortController: AbortController | null;\n #progressMonitor: FetcherProgressMonitor | null;\n #abortingCallback: (() => void) | null;\n\n constructor(params: FetcherDownloadTaskParams<T>) {\n super(params);\n this.#fetcher = params.fetcher;\n this.#destDir = params.destDir;\n this.#destFilenameResolver = params.destFilenameResolver;\n this.#fileExistsAction = params.fileExistsAction;\n this.#abortController = null;\n this.#progressMonitor = null;\n this.#abortingCallback = null;\n }\n\n #checkAndSpawnFFmpegDownloadTask(\n currentDestFilePath: string,\n preferredOutputFilePath: string) {\n\n if (this.srcEntity.type === 'video' && this.#isM3U8FilePath(currentDestFilePath) && this.callbacks) {\n // Spawn FFmpeg task to download actual stream\n const spawn = new FFmpegDownloadTask({\n src: currentDestFilePath,\n srcEntity: this.srcEntity,\n maxRetries: this.maxRetries,\n callbacks: this.callbacks,\n logger: this.logger,\n destFilePath: FSHelper.changeFilePathExtension(preferredOutputFilePath, '.mp4'),\n fileExistsAction: this.#fileExistsAction\n });\n this.callbacks.onSpawn(this, spawn);\n }\n }\n\n #isM3U8FilePath(filePath: string) {\n return path.extname(filePath) === '.m3u8';\n }\n\n protected doStart() {\n return new Promise<void>(async (resolve) => {\n\n if (this.status === 'aborted') {\n resolve();\n }\n\n this.#abortController = new AbortController();\n\n /**\n * Change status to downloading ahead of notifyStart(), so that task can be\n * aborted even though we have not yet obtained progress monitor from `Fetcher.download()`.\n */\n this.status = 'downloading';\n let skipped = false;\n const fileExistsAction = this.#fileExistsAction;\n try {\n const { destFilePath, monitor, start, abort } = await this.#fetcher.prepareDownload({\n url: this.src,\n destDir: this.#destDir,\n srcEntity: this.srcEntity,\n destFilenameResolver: this.#destFilenameResolver,\n signal: this.#abortController.signal\n });\n\n this.resolvedDestPath = destFilePath;\n\n // Skip download?\n let skipDownload: { skip: false; } | { skip: true; reason: DownloadTaskSkipReason } = { skip: false };\n let lastDownloadedFilePath: string | null = null;\n if (fileExistsAction === 'saveAsCopy' || fileExistsAction === 'saveAsCopyIfNewer') {\n const inc = FSHelper.checkFileExistsAndIncrement(destFilePath);\n this.resolvedDestPath = inc.filePath;\n lastDownloadedFilePath = inc.preceding;\n }\n else if (fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {\n const isM3U8 = this.srcEntity.type === 'video' && this.#isM3U8FilePath(destFilePath);\n const mp4FilePath = FSHelper.changeFilePathExtension(destFilePath, '.mp4');\n if (isM3U8 && !fs.existsSync(mp4FilePath)) {\n this.log('debug', `Ignoring 'fileExistsAction: skip' for URL \"${this.src}\": target download is M3U8 playlist and its ` +\n `associated media file \"${mp4FilePath}\" does not exist`);\n }\n else {\n skipDownload = {\n skip: true,\n reason: {\n name: 'destFileExists',\n message: `Destination file exists (${destFilePath})`,\n existingDestFilePath: destFilePath\n }\n };\n }\n }\n\n const __handleSkip = (skipAction: () => void) => {\n if (skipDownload.skip) {\n skipped = true;\n skipAction();\n const reason = skipDownload.reason;\n this.notifySkip(reason);\n resolve();\n return true;\n }\n return false;\n };\n\n if (__handleSkip(abort)) {\n return;\n }\n\n monitor.on('progress', (progress) => {\n this.notifyProgress(this.#convertFetcherProgress(progress));\n });\n\n this.#progressMonitor = monitor;\n\n this.notifyStart();\n\n const { tmpFilePath, commit, discard } = await start({ destFilePath: this.resolvedDestPath });\n\n let proceedWithCommit = true;\n if (fileExistsAction === 'saveAsCopyIfNewer' && lastDownloadedFilePath && fs.existsSync(lastDownloadedFilePath)) {\n // Compare checksum of downloaded file with that of last download\n const compareMsg = `(saveAsCopyIfNewer) Compare \"${tmpFilePath}\" with \"${lastDownloadedFilePath}\"`;\n proceedWithCommit = !(await FSHelper.compareFiles(tmpFilePath, lastDownloadedFilePath));\n if (!proceedWithCommit) {\n this.log('debug', `${compareMsg}: Files match`);\n skipDownload = {\n skip: true,\n reason: {\n name: 'destFileExists',\n message: `Destination file exists with same content (${lastDownloadedFilePath})`,\n existingDestFilePath: lastDownloadedFilePath\n }\n };\n this.resolvedDestPath = lastDownloadedFilePath;\n __handleSkip(discard);\n }\n else {\n this.log('debug', `${compareMsg}: Files do not match`);\n }\n }\n\n if (proceedWithCommit) {\n commit();\n }\n\n this.#checkAndSpawnFFmpegDownloadTask(this.resolvedDestPath, destFilePath);\n\n if (proceedWithCommit) {\n this.notifyComplete();\n resolve();\n }\n }\n catch (error: any) {\n if (error instanceof AbortError) {\n if (!skipped) {\n this.notifyAbort();\n if (this.#abortingCallback) {\n this.#abortingCallback();\n }\n }\n }\n else {\n this.notifyError(error);\n }\n resolve();\n }\n })\n .finally(() => {\n if (this.#progressMonitor) {\n this.#progressMonitor.removeAllListeners();\n this.#progressMonitor = null;\n }\n this.#abortController = null;\n });\n }\n\n protected async doAbort() {\n return new Promise<void>((resolve) => {\n if (this.#abortController) {\n this.#abortingCallback = () => {\n this.#abortingCallback = null;\n resolve();\n };\n this.#abortController.abort();\n }\n else {\n resolve();\n }\n });\n }\n\n protected async doDestroy() {\n this.#destDir = '';\n }\n\n protected doGetProgress() {\n if (this.#progressMonitor) {\n return this.#convertFetcherProgress(this.#progressMonitor.getProgress());\n }\n return undefined;\n }\n\n #convertFetcherProgress(progress: FetcherProgress): DownloadProgress {\n return {\n destFilename: progress.destFilename,\n destFilePath: progress.destFilePath,\n lengthUnit: 'byte',\n length: progress.length,\n lengthDownloaded: progress.transferred,\n percent: progress.percentage,\n sizeDownloaded: Number((progress.transferred / 1000).toFixed(2)),\n speed: Number((progress.speed / 1000).toFixed(2))\n };\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export * from './DownloadTaskBatchEvent.js';
2
+ export { IDownloadTask, DownloadTaskStatus, DownloadProgress, DownloadTaskError, DownloadTaskSkipReason } from './DownloadTask.js';
3
+ export { IDownloadTaskBatch } from './DownloadTaskBatch.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/downloaders/task/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACnI,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './DownloadTaskBatchEvent.js';
2
+ export { DownloadTaskError } from './DownloadTask.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/downloaders/task/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAuD,iBAAiB,EAA0B,MAAM,mBAAmB,CAAC","sourcesContent":["export * from './DownloadTaskBatchEvent.js';\nexport { IDownloadTask, DownloadTaskStatus, DownloadProgress, DownloadTaskError, DownloadTaskSkipReason } from './DownloadTask.js';\nexport { IDownloadTaskBatch } from './DownloadTaskBatch.js';\n"]}
@@ -0,0 +1,3 @@
1
+ import { Campaign } from '../../entities/Campaign.js';
2
+ export declare function generateCampaignSummary(campaign: Campaign): string;
3
+ //# sourceMappingURL=CampaignInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CampaignInfo.d.ts","sourceRoot":"","sources":["../../../src/downloaders/templates/CampaignInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAqCtD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,UA6BzD"}
@@ -0,0 +1,58 @@
1
+ const CAMPAIGN_INFO_TEMPLATE = `Campaign
2
+ --------
3
+ ID: {campaign.id}
4
+ Name: {campaign.name}
5
+ Created: {campaign.createdAt}
6
+ Published: {campaign.publishedAt}
7
+ Summary: {campaign.summary}
8
+ URL: {campaign.url}
9
+
10
+ Creator
11
+ -------
12
+ ID: {campaign.creator.id}
13
+ Name: {campaign.creator.fullName}
14
+ Created: {campaign.creator.createdAt}
15
+ URL: {campaign.creator.url}
16
+ `;
17
+ const REWARD_INFO_TEMPLATE = `Reward: {reward.title}
18
+ -------
19
+ ID: {reward.id}
20
+ Description: {reward.description}
21
+ Amount: {reward.amount}
22
+ Created: {reward.createdAt}
23
+ Published: {reward.publishedAt}
24
+ URL: {reward.url}
25
+
26
+ `;
27
+ const COMBINED_TEMPLATE = `{campaign.info}
28
+ {rewards.info}
29
+ `;
30
+ export function generateCampaignSummary(campaign) {
31
+ const campaignInfo = CAMPAIGN_INFO_TEMPLATE
32
+ .replaceAll('{campaign.id}', campaign.id)
33
+ .replaceAll('{campaign.name}', campaign.name)
34
+ .replaceAll('{campaign.createdAt}', campaign.createdAt || '')
35
+ .replaceAll('{campaign.publishedAt}', campaign.publishedAt || '')
36
+ .replaceAll('{campaign.summary}', campaign.summary || '')
37
+ .replaceAll('{campaign.url}', campaign.url || '')
38
+ .replaceAll('{campaign.creator.id}', campaign.creator?.id || '')
39
+ .replaceAll('{campaign.creator.fullName}', campaign.creator?.fullName || '')
40
+ .replaceAll('{campaign.creator.createdAt}', campaign.creator?.createdAt || '')
41
+ .replaceAll('{campaign.creator.url}', campaign.creator?.url || '');
42
+ const rewardSnippets = [];
43
+ for (const reward of campaign.rewards) {
44
+ const snippet = REWARD_INFO_TEMPLATE
45
+ .replaceAll('{reward.id}', reward.id)
46
+ .replaceAll('{reward.title}', reward.title || '')
47
+ .replaceAll('{reward.description}', reward.description || '')
48
+ .replaceAll('{reward.amount}', reward.amount || '')
49
+ .replaceAll('{reward.createdAt}', reward.createdAt || '')
50
+ .replaceAll('{reward.publishedAt}', reward.publishedAt || '')
51
+ .replaceAll('{reward.url}', reward.url || '');
52
+ rewardSnippets.push(snippet);
53
+ }
54
+ return COMBINED_TEMPLATE
55
+ .replaceAll('{campaign.info}', campaignInfo)
56
+ .replaceAll('{rewards.info}', rewardSnippets.join(''));
57
+ }
58
+ //# sourceMappingURL=CampaignInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CampaignInfo.js","sourceRoot":"","sources":["../../../src/downloaders/templates/CampaignInfo.ts"],"names":[],"mappings":"AAEA,MAAM,sBAAsB,GAC5B;;;;;;;;;;;;;;;CAeC,CAAC;AAEF,MAAM,oBAAoB,GAC1B;;;;;;;;;CASC,CAAC;AAEF,MAAM,iBAAiB,GACvB;;CAEC,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,MAAM,YAAY,GAAG,sBAAsB;SACxC,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC;SACxC,UAAU,CAAC,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC;SAC5C,UAAU,CAAC,sBAAsB,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;SAC5D,UAAU,CAAC,wBAAwB,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;SAChE,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;SACxD,UAAU,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;SAChD,UAAU,CAAC,uBAAuB,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;SAC/D,UAAU,CAAC,6BAA6B,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;SAC3E,UAAU,CAAC,8BAA8B,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;SAC7E,UAAU,CAAC,wBAAwB,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAErE,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE;QACrC,MAAM,OAAO,GAAG,oBAAoB;aACjC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;aACpC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;aAChD,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;aAC5D,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;aAClD,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;aACxD,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;aAC5D,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAChD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC9B;IAED,OAAO,iBAAiB;SACrB,UAAU,CAAC,iBAAiB,EAAE,YAAY,CAAC;SAC3C,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["import { Campaign } from '../../entities/Campaign.js';\n\nconst CAMPAIGN_INFO_TEMPLATE =\n`Campaign\n--------\nID: {campaign.id}\nName: {campaign.name}\nCreated: {campaign.createdAt}\nPublished: {campaign.publishedAt}\nSummary: {campaign.summary}\nURL: {campaign.url}\n\nCreator\n-------\nID: {campaign.creator.id}\nName: {campaign.creator.fullName}\nCreated: {campaign.creator.createdAt}\nURL: {campaign.creator.url}\n`;\n\nconst REWARD_INFO_TEMPLATE =\n`Reward: {reward.title}\n-------\nID: {reward.id}\nDescription: {reward.description}\nAmount: {reward.amount}\nCreated: {reward.createdAt}\nPublished: {reward.publishedAt}\nURL: {reward.url}\n\n`;\n\nconst COMBINED_TEMPLATE =\n`{campaign.info}\n{rewards.info}\n`;\n\nexport function generateCampaignSummary(campaign: Campaign) {\n const campaignInfo = CAMPAIGN_INFO_TEMPLATE\n .replaceAll('{campaign.id}', campaign.id)\n .replaceAll('{campaign.name}', campaign.name)\n .replaceAll('{campaign.createdAt}', campaign.createdAt || '')\n .replaceAll('{campaign.publishedAt}', campaign.publishedAt || '')\n .replaceAll('{campaign.summary}', campaign.summary || '')\n .replaceAll('{campaign.url}', campaign.url || '')\n .replaceAll('{campaign.creator.id}', campaign.creator?.id || '')\n .replaceAll('{campaign.creator.fullName}', campaign.creator?.fullName || '')\n .replaceAll('{campaign.creator.createdAt}', campaign.creator?.createdAt || '')\n .replaceAll('{campaign.creator.url}', campaign.creator?.url || '');\n\n const rewardSnippets: string[] = [];\n for (const reward of campaign.rewards) {\n const snippet = REWARD_INFO_TEMPLATE\n .replaceAll('{reward.id}', reward.id)\n .replaceAll('{reward.title}', reward.title || '')\n .replaceAll('{reward.description}', reward.description || '')\n .replaceAll('{reward.amount}', reward.amount || '')\n .replaceAll('{reward.createdAt}', reward.createdAt || '')\n .replaceAll('{reward.publishedAt}', reward.publishedAt || '')\n .replaceAll('{reward.url}', reward.url || '');\n rewardSnippets.push(snippet);\n }\n\n return COMBINED_TEMPLATE\n .replaceAll('{campaign.info}', campaignInfo)\n .replaceAll('{rewards.info}', rewardSnippets.join(''));\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { Post, PostEmbed } from '../../entities/Post.js';
2
+ export declare function generatePostSummary(post: Post): string;
3
+ export declare function generatePostEmbedSummary(embed: PostEmbed): string;
4
+ //# sourceMappingURL=PostInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostInfo.d.ts","sourceRoot":"","sources":["../../../src/downloaders/templates/PostInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA2BzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,UAY7C;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,UAWxD"}
@@ -0,0 +1,45 @@
1
+ const POST_INFO_TEMPLATE = `Post
2
+ --------
3
+ ID: {post.id}
4
+ Type: {post.type}
5
+ Title: {post.title}
6
+ Teaser: {post.teaser}
7
+ Content: {post.content}
8
+ Published: {post.publishedAt}
9
+ Last Edited: {post.editedAt}
10
+ URL: {post.url}
11
+ `;
12
+ const POST_EMBED_TEMPLATE = `Embed
13
+ --------
14
+ Type: {embed.type}
15
+ Description: {embed.description}
16
+ HTML: {embed.html}
17
+ Provider: {embed.provider}
18
+ provider URL: {embed.providerURL}
19
+ Subject: {embed.subject}
20
+ URL: {embed.url}
21
+ `;
22
+ export function generatePostSummary(post) {
23
+ const postInfo = POST_INFO_TEMPLATE
24
+ .replaceAll('{post.id}', post.id)
25
+ .replaceAll('{post.type}', post.postType)
26
+ .replaceAll('{post.title}', post.title || '')
27
+ .replaceAll('{post.teaser}', post.teaserText || '')
28
+ .replaceAll('{post.content}', post.content || '')
29
+ .replaceAll('{post.publishedAt}', post.publishedAt || '')
30
+ .replaceAll('{post.editedAt}', post.editedAt || '')
31
+ .replaceAll('{post.url}', post.url || '');
32
+ return postInfo;
33
+ }
34
+ export function generatePostEmbedSummary(embed) {
35
+ const embedInfo = POST_EMBED_TEMPLATE
36
+ .replaceAll('{embed.type}', embed.type)
37
+ .replaceAll('{embed.description}', embed.description || '')
38
+ .replaceAll('{embed.html}', embed.html || '')
39
+ .replaceAll('{embed.provider}', embed.provider || '')
40
+ .replaceAll('{embed.providerURL}', embed.providerURL || '')
41
+ .replaceAll('{embed.subject}', embed.subject || '')
42
+ .replaceAll('{embed.url}', embed.url || '');
43
+ return embedInfo;
44
+ }
45
+ //# sourceMappingURL=PostInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostInfo.js","sourceRoot":"","sources":["../../../src/downloaders/templates/PostInfo.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GACxB;;;;;;;;;;CAUC,CAAC;AAEF,MAAM,mBAAmB,GACzB;;;;;;;;;CASC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,MAAM,QAAQ,GAAG,kBAAkB;SAChC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC;SACxC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5C,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;SAClD,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChD,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxD,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;SAClD,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAgB;IACvD,MAAM,SAAS,GAAG,mBAAmB;SAClC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC;SACtC,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;SAC1D,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SAC5C,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;SACpD,UAAU,CAAC,qBAAqB,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;SAC1D,UAAU,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;SAClD,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAE9C,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { Post, PostEmbed } from '../../entities/Post.js';\n\nconst POST_INFO_TEMPLATE =\n`Post\n--------\nID: {post.id}\nType: {post.type}\nTitle: {post.title}\nTeaser: {post.teaser}\nContent: {post.content}\nPublished: {post.publishedAt}\nLast Edited: {post.editedAt}\nURL: {post.url}\n`;\n\nconst POST_EMBED_TEMPLATE =\n`Embed\n--------\nType: {embed.type}\nDescription: {embed.description}\nHTML: {embed.html}\nProvider: {embed.provider}\nprovider URL: {embed.providerURL}\nSubject: {embed.subject}\nURL: {embed.url}\n`;\n\nexport function generatePostSummary(post: Post) {\n const postInfo = POST_INFO_TEMPLATE\n .replaceAll('{post.id}', post.id)\n .replaceAll('{post.type}', post.postType)\n .replaceAll('{post.title}', post.title || '')\n .replaceAll('{post.teaser}', post.teaserText || '')\n .replaceAll('{post.content}', post.content || '')\n .replaceAll('{post.publishedAt}', post.publishedAt || '')\n .replaceAll('{post.editedAt}', post.editedAt || '')\n .replaceAll('{post.url}', post.url || '');\n\n return postInfo;\n}\n\nexport function generatePostEmbedSummary(embed: PostEmbed) {\n const embedInfo = POST_EMBED_TEMPLATE\n .replaceAll('{embed.type}', embed.type)\n .replaceAll('{embed.description}', embed.description || '')\n .replaceAll('{embed.html}', embed.html || '')\n .replaceAll('{embed.provider}', embed.provider || '')\n .replaceAll('{embed.providerURL}', embed.providerURL || '')\n .replaceAll('{embed.subject}', embed.subject || '')\n .replaceAll('{embed.url}', embed.url || '');\n\n return embedInfo;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { Product } from '../../entities/Product.js';
2
+ export declare function generateProductSummary(product: Product): string;
3
+ //# sourceMappingURL=ProductInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductInfo.d.ts","sourceRoot":"","sources":["../../../src/downloaders/templates/ProductInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAapD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,UAUtD"}
@@ -0,0 +1,20 @@
1
+ const PRODUCT_INFO_TEMPLATE = `Product
2
+ --------
3
+ ID: {product.id}
4
+ Name: {product.name}
5
+ Description: {product.description}
6
+ Price: {product.price}
7
+ Published: {product.publishedAt}
8
+ URL: {product.url}
9
+ `;
10
+ export function generateProductSummary(product) {
11
+ const productInfo = PRODUCT_INFO_TEMPLATE
12
+ .replaceAll('{product.id}', product.id)
13
+ .replaceAll('{product.name}', product.name || '')
14
+ .replaceAll('{product.description}', product.description || '')
15
+ .replaceAll('{product.price}', product.price || '')
16
+ .replaceAll('{product.publishedAt}', product.publishedAt || '')
17
+ .replaceAll('{product.url}', product.url || '');
18
+ return productInfo;
19
+ }
20
+ //# sourceMappingURL=ProductInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductInfo.js","sourceRoot":"","sources":["../../../src/downloaders/templates/ProductInfo.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAC3B;;;;;;;;CAQC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,WAAW,GAAG,qBAAqB;SACtC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC;SACtC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SAChD,UAAU,CAAC,uBAAuB,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SAC9D,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SAClD,UAAU,CAAC,uBAAuB,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SAC9D,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAElD,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { Product } from '../../entities/Product.js';\n\nconst PRODUCT_INFO_TEMPLATE =\n`Product\n--------\nID: {product.id}\nName: {product.name}\nDescription: {product.description}\nPrice: {product.price}\nPublished: {product.publishedAt}\nURL: {product.url}\n`;\n\nexport function generateProductSummary(product: Product) {\n const productInfo = PRODUCT_INFO_TEMPLATE\n .replaceAll('{product.id}', product.id)\n .replaceAll('{product.name}', product.name || '')\n .replaceAll('{product.description}', product.description || '')\n .replaceAll('{product.price}', product.price || '')\n .replaceAll('{product.publishedAt}', product.publishedAt || '')\n .replaceAll('{product.url}', product.url || '');\n\n return productInfo;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface Attachment {
2
+ type: 'attachment';
3
+ id: string;
4
+ name: string | null;
5
+ url: string | null;
6
+ }
7
+ //# sourceMappingURL=Attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../src/entities/Attachment.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attachment.js","sourceRoot":"","sources":["../../src/entities/Attachment.ts"],"names":[],"mappings":"","sourcesContent":["export interface Attachment {\n type: 'attachment';\n id: string;\n name: string | null;\n url: string | null;\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { Downloadable } from './Downloadable.js';
2
+ import { Reward } from './Reward.js';
3
+ import { User } from './User.js';
4
+ export interface Campaign {
5
+ type: 'campaign';
6
+ id: string;
7
+ name: string;
8
+ createdAt: string | null;
9
+ publishedAt: string | null;
10
+ avatarImage: Downloadable;
11
+ coverPhoto: Downloadable;
12
+ summary: string | null;
13
+ url: string | null;
14
+ currency: string | null;
15
+ rewards: Reward[];
16
+ creator: User | null;
17
+ raw: object;
18
+ }
19
+ //# sourceMappingURL=Campaign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Campaign.d.ts","sourceRoot":"","sources":["../../src/entities/Campaign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,YAAY,CAAC;IAC1B,UAAU,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Campaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Campaign.js","sourceRoot":"","sources":["../../src/entities/Campaign.ts"],"names":[],"mappings":"","sourcesContent":["import { Downloadable } from './Downloadable.js';\nimport { Reward } from './Reward.js';\nimport { User } from './User.js';\n\nexport interface Campaign {\n type: 'campaign';\n id: string;\n name: string;\n createdAt: string | null;\n publishedAt: string | null;\n avatarImage: Downloadable;\n coverPhoto: Downloadable;\n summary: string | null;\n url: string | null;\n currency: string | null;\n rewards: Reward[];\n creator: User | null;\n raw: object;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { Attachment } from './Attachment.js';
2
+ import { MediaItem } from './MediaItem.js';
3
+ export type Downloadable = MediaItem | Attachment;
4
+ export declare const DOWNLOADABLE_TYPES: readonly ["media", "attachment"];
5
+ export declare function isTypeDownloadable(type: string): type is typeof DOWNLOADABLE_TYPES[number];
6
+ //# sourceMappingURL=Downloadable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Downloadable.d.ts","sourceRoot":"","sources":["../../src/entities/Downloadable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAElD,eAAO,MAAM,kBAAkB,kCAAqC,CAAC;AAErE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAE1F"}
@@ -0,0 +1,5 @@
1
+ export const DOWNLOADABLE_TYPES = ['media', 'attachment'];
2
+ export function isTypeDownloadable(type) {
3
+ return DOWNLOADABLE_TYPES.includes(type);
4
+ }
5
+ //# sourceMappingURL=Downloadable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Downloadable.js","sourceRoot":"","sources":["../../src/entities/Downloadable.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAE,OAAO,EAAE,YAAY,CAAW,CAAC;AAErE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,kBAAkB,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { Attachment } from './Attachment.js';\nimport { MediaItem } from './MediaItem.js';\n\nexport type Downloadable = MediaItem | Attachment;\n\nexport const DOWNLOADABLE_TYPES = [ 'media', 'attachment' ] as const;\n\nexport function isTypeDownloadable(type: string): type is typeof DOWNLOADABLE_TYPES[number] {\n return DOWNLOADABLE_TYPES.includes(type as any);\n}\n"]}
@@ -0,0 +1,95 @@
1
+ export interface MediaLike {
2
+ type: string;
3
+ id: string;
4
+ filename: string | null;
5
+ mimeType: string | null;
6
+ }
7
+ export type ImageType = 'single' | 'default' | 'campaignCoverPhoto' | 'postCoverImage' | 'postThumbnail';
8
+ export interface SingleImageMediaItem extends MediaLike {
9
+ type: 'image';
10
+ imageType: 'single';
11
+ imageURL: string | null;
12
+ }
13
+ export interface DefaultImageMediaItem extends MediaLike {
14
+ type: 'image';
15
+ imageType: 'default';
16
+ createdAt: string | null;
17
+ downloadURL: string | null;
18
+ imageURLs: {
19
+ default: string | null;
20
+ defaultSmall: string | null;
21
+ original: string | null;
22
+ thumbnail: string | null;
23
+ thumbnailLarge: string | null;
24
+ thumbnailSmall: string | null;
25
+ };
26
+ }
27
+ export interface CampaignCoverPhotoMediaItem extends MediaLike {
28
+ type: 'image';
29
+ imageType: 'campaignCoverPhoto';
30
+ imageURLs: {
31
+ large: string | null;
32
+ medium: string | null;
33
+ small: string | null;
34
+ xlarge: string | null;
35
+ xsmall: string | null;
36
+ };
37
+ }
38
+ export interface PostCoverImageMediaItem extends MediaLike {
39
+ type: 'image';
40
+ imageType: 'postCoverImage';
41
+ imageURLs: {
42
+ large: string | null;
43
+ thumbSquareLarge: string | null;
44
+ thumbSquare: string | null;
45
+ thumb: string | null;
46
+ default: string | null;
47
+ };
48
+ }
49
+ export interface PostThumbnailMediaItem extends MediaLike {
50
+ type: 'image';
51
+ imageType: 'postThumbnail';
52
+ imageURLs: {
53
+ large: string | null;
54
+ large2: string | null;
55
+ square: string | null;
56
+ default: string | null;
57
+ };
58
+ }
59
+ export type ImageMediaItem<T extends ImageType> = T extends 'single' ? SingleImageMediaItem : T extends 'default' ? DefaultImageMediaItem : T extends 'campaignCoverPhoto' ? CampaignCoverPhotoMediaItem : T extends 'postCoverImage' ? PostCoverImageMediaItem : T extends 'postThumbnail' ? PostThumbnailMediaItem : never;
60
+ export interface VideoMediaItem extends MediaLike {
61
+ type: 'video';
62
+ createdAt: string | null;
63
+ size: {
64
+ width: number | null;
65
+ height: number | null;
66
+ };
67
+ duration: number | null;
68
+ downloadURL: string | null;
69
+ displayURLs: {
70
+ thumbnail: string | null;
71
+ video: string | null;
72
+ };
73
+ }
74
+ export interface AudioMediaItem extends MediaLike {
75
+ type: 'audio';
76
+ createdAt: string | null;
77
+ url: string | null;
78
+ }
79
+ export interface FileMediaItem extends MediaLike {
80
+ type: 'file';
81
+ createdAt: string | null;
82
+ downloadURL: string | null;
83
+ }
84
+ /**
85
+ * Minimal `MediaItem` typically used to represent media-type properties of elements, such
86
+ * as video thumbnails and campaign avatar / cover photos.
87
+ * As a `MediaItem` type, and hence also a `Downloadable` type, it can be used to create
88
+ * `MediaFilenameResolver` and `DownloadTask` instances.
89
+ */
90
+ export interface DummyMediaItem extends MediaLike {
91
+ type: 'dummy';
92
+ srcURLs: Record<string, string | null>;
93
+ }
94
+ export type MediaItem = ImageMediaItem<any> | VideoMediaItem | AudioMediaItem | FileMediaItem | DummyMediaItem;
95
+ //# sourceMappingURL=MediaItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaItem.d.ts","sourceRoot":"","sources":["../../src/entities/MediaItem.ts"],"names":[],"mappings":"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"}