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.
- package/README.md +422 -0
- package/bin/patreon-dl.js +5 -0
- package/dist/cli/CLIOptionValidator.d.ts +9 -0
- package/dist/cli/CLIOptionValidator.d.ts.map +1 -0
- package/dist/cli/CLIOptionValidator.js +85 -0
- package/dist/cli/CLIOptionValidator.js.map +1 -0
- package/dist/cli/CLIOptions.d.ts +20 -0
- package/dist/cli/CLIOptions.d.ts.map +1 -0
- package/dist/cli/CLIOptions.js +75 -0
- package/dist/cli/CLIOptions.js.map +1 -0
- package/dist/cli/CommandLineParser.d.ts +11 -0
- package/dist/cli/CommandLineParser.d.ts.map +1 -0
- package/dist/cli/CommandLineParser.js +212 -0
- package/dist/cli/CommandLineParser.js.map +1 -0
- package/dist/cli/ConfigFileParser.d.ts +9 -0
- package/dist/cli/ConfigFileParser.d.ts.map +1 -0
- package/dist/cli/ConfigFileParser.js +163 -0
- package/dist/cli/ConfigFileParser.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +162 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/downloaders/Bootstrap.d.ts +29 -0
- package/dist/downloaders/Bootstrap.d.ts.map +1 -0
- package/dist/downloaders/Bootstrap.js +51 -0
- package/dist/downloaders/Bootstrap.js.map +1 -0
- package/dist/downloaders/Downloader.d.ts +59 -0
- package/dist/downloaders/Downloader.d.ts.map +1 -0
- package/dist/downloaders/Downloader.js +357 -0
- package/dist/downloaders/Downloader.js.map +1 -0
- package/dist/downloaders/DownloaderEvent.d.ts +47 -0
- package/dist/downloaders/DownloaderEvent.d.ts.map +1 -0
- package/dist/downloaders/DownloaderEvent.js +6 -0
- package/dist/downloaders/DownloaderEvent.js.map +1 -0
- package/dist/downloaders/DownloaderOptions.d.ts +39 -0
- package/dist/downloaders/DownloaderOptions.d.ts.map +1 -0
- package/dist/downloaders/DownloaderOptions.js +69 -0
- package/dist/downloaders/DownloaderOptions.js.map +1 -0
- package/dist/downloaders/PostDownloader.d.ts +8 -0
- package/dist/downloaders/PostDownloader.d.ts.map +1 -0
- package/dist/downloaders/PostDownloader.js +428 -0
- package/dist/downloaders/PostDownloader.js.map +1 -0
- package/dist/downloaders/ProductDownloader.d.ts +8 -0
- package/dist/downloaders/ProductDownloader.d.ts.map +1 -0
- package/dist/downloaders/ProductDownloader.js +171 -0
- package/dist/downloaders/ProductDownloader.js.map +1 -0
- package/dist/downloaders/cache/StatusCache.d.ts +43 -0
- package/dist/downloaders/cache/StatusCache.d.ts.map +1 -0
- package/dist/downloaders/cache/StatusCache.js +206 -0
- package/dist/downloaders/cache/StatusCache.js.map +1 -0
- package/dist/downloaders/index.d.ts +7 -0
- package/dist/downloaders/index.d.ts.map +1 -0
- package/dist/downloaders/index.js +6 -0
- package/dist/downloaders/index.js.map +1 -0
- package/dist/downloaders/task/DownloadTask.d.ts +89 -0
- package/dist/downloaders/task/DownloadTask.d.ts.map +1 -0
- package/dist/downloaders/task/DownloadTask.js +240 -0
- package/dist/downloaders/task/DownloadTask.js.map +1 -0
- package/dist/downloaders/task/DownloadTaskBatch.d.ts +45 -0
- package/dist/downloaders/task/DownloadTaskBatch.d.ts.map +1 -0
- package/dist/downloaders/task/DownloadTaskBatch.js +195 -0
- package/dist/downloaders/task/DownloadTaskBatch.js.map +1 -0
- package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts +32 -0
- package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts.map +1 -0
- package/dist/downloaders/task/DownloadTaskBatchEvent.js +2 -0
- package/dist/downloaders/task/DownloadTaskBatchEvent.js.map +1 -0
- package/dist/downloaders/task/DownloadTaskFactory.d.ts +20 -0
- package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -0
- package/dist/downloaders/task/DownloadTaskFactory.js +177 -0
- package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -0
- package/dist/downloaders/task/FFmpegDownloadTask.d.ts +27 -0
- package/dist/downloaders/task/FFmpegDownloadTask.d.ts.map +1 -0
- package/dist/downloaders/task/FFmpegDownloadTask.js +206 -0
- package/dist/downloaders/task/FFmpegDownloadTask.js.map +1 -0
- package/dist/downloaders/task/FetcherDownloadTask.d.ts +21 -0
- package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -0
- package/dist/downloaders/task/FetcherDownloadTask.js +213 -0
- package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -0
- package/dist/downloaders/task/index.d.ts +4 -0
- package/dist/downloaders/task/index.d.ts.map +1 -0
- package/dist/downloaders/task/index.js +3 -0
- package/dist/downloaders/task/index.js.map +1 -0
- package/dist/downloaders/templates/CampaignInfo.d.ts +3 -0
- package/dist/downloaders/templates/CampaignInfo.d.ts.map +1 -0
- package/dist/downloaders/templates/CampaignInfo.js +58 -0
- package/dist/downloaders/templates/CampaignInfo.js.map +1 -0
- package/dist/downloaders/templates/PostInfo.d.ts +4 -0
- package/dist/downloaders/templates/PostInfo.d.ts.map +1 -0
- package/dist/downloaders/templates/PostInfo.js +45 -0
- package/dist/downloaders/templates/PostInfo.js.map +1 -0
- package/dist/downloaders/templates/ProductInfo.d.ts +3 -0
- package/dist/downloaders/templates/ProductInfo.d.ts.map +1 -0
- package/dist/downloaders/templates/ProductInfo.js +20 -0
- package/dist/downloaders/templates/ProductInfo.js.map +1 -0
- package/dist/entities/Attachment.d.ts +7 -0
- package/dist/entities/Attachment.d.ts.map +1 -0
- package/dist/entities/Attachment.js +2 -0
- package/dist/entities/Attachment.js.map +1 -0
- package/dist/entities/Campaign.d.ts +19 -0
- package/dist/entities/Campaign.d.ts.map +1 -0
- package/dist/entities/Campaign.js +2 -0
- package/dist/entities/Campaign.js.map +1 -0
- package/dist/entities/Downloadable.d.ts +6 -0
- package/dist/entities/Downloadable.d.ts.map +1 -0
- package/dist/entities/Downloadable.js +5 -0
- package/dist/entities/Downloadable.js.map +1 -0
- package/dist/entities/MediaItem.d.ts +95 -0
- package/dist/entities/MediaItem.d.ts.map +1 -0
- package/dist/entities/MediaItem.js +2 -0
- package/dist/entities/MediaItem.js.map +1 -0
- package/dist/entities/Post.d.ts +87 -0
- package/dist/entities/Post.d.ts.map +1 -0
- package/dist/entities/Post.js +2 -0
- package/dist/entities/Post.js.map +1 -0
- package/dist/entities/Product.d.ts +17 -0
- package/dist/entities/Product.d.ts.map +1 -0
- package/dist/entities/Product.js +2 -0
- package/dist/entities/Product.js.map +1 -0
- package/dist/entities/Reward.d.ts +14 -0
- package/dist/entities/Reward.d.ts.map +1 -0
- package/dist/entities/Reward.js +2 -0
- package/dist/entities/Reward.js.map +1 -0
- package/dist/entities/User.d.ts +15 -0
- package/dist/entities/User.d.ts.map +1 -0
- package/dist/entities/User.js +2 -0
- package/dist/entities/User.js.map +1 -0
- package/dist/entities/index.d.ts +9 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +6 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/PageParser.d.ts +6 -0
- package/dist/parsers/PageParser.d.ts.map +1 -0
- package/dist/parsers/PageParser.js +23 -0
- package/dist/parsers/PageParser.js.map +1 -0
- package/dist/parsers/Parser.d.ts +43 -0
- package/dist/parsers/Parser.d.ts.map +1 -0
- package/dist/parsers/Parser.js +439 -0
- package/dist/parsers/Parser.js.map +1 -0
- package/dist/parsers/PostParser.d.ts +7 -0
- package/dist/parsers/PostParser.d.ts.map +1 -0
- package/dist/parsers/PostParser.js +259 -0
- package/dist/parsers/PostParser.js.map +1 -0
- package/dist/parsers/ProductParser.d.ts +7 -0
- package/dist/parsers/ProductParser.d.ts.map +1 -0
- package/dist/parsers/ProductParser.js +70 -0
- package/dist/parsers/ProductParser.js.map +1 -0
- package/dist/utils/AttachmentFilenameResolver.d.ts +9 -0
- package/dist/utils/AttachmentFilenameResolver.d.ts.map +1 -0
- package/dist/utils/AttachmentFilenameResolver.js +73 -0
- package/dist/utils/AttachmentFilenameResolver.js.map +1 -0
- package/dist/utils/FSHelper.d.ts +57 -0
- package/dist/utils/FSHelper.d.ts.map +1 -0
- package/dist/utils/FSHelper.js +214 -0
- package/dist/utils/FSHelper.js.map +1 -0
- package/dist/utils/Fetcher.d.ts +45 -0
- package/dist/utils/Fetcher.d.ts.map +1 -0
- package/dist/utils/Fetcher.js +192 -0
- package/dist/utils/Fetcher.js.map +1 -0
- package/dist/utils/FetcherProgressMonitor.d.ts +18 -0
- package/dist/utils/FetcherProgressMonitor.d.ts.map +1 -0
- package/dist/utils/FetcherProgressMonitor.js +56 -0
- package/dist/utils/FetcherProgressMonitor.js.map +1 -0
- package/dist/utils/FilenameFormatHelper.d.ts +44 -0
- package/dist/utils/FilenameFormatHelper.d.ts.map +1 -0
- package/dist/utils/FilenameFormatHelper.js +98 -0
- package/dist/utils/FilenameFormatHelper.js.map +1 -0
- package/dist/utils/FllenameResolver.d.ts +20 -0
- package/dist/utils/FllenameResolver.d.ts.map +1 -0
- package/dist/utils/FllenameResolver.js +55 -0
- package/dist/utils/FllenameResolver.js.map +1 -0
- package/dist/utils/Formatter.d.ts +21 -0
- package/dist/utils/Formatter.d.ts.map +1 -0
- package/dist/utils/Formatter.js +112 -0
- package/dist/utils/Formatter.js.map +1 -0
- package/dist/utils/MediaFilenameResolver.d.ts +9 -0
- package/dist/utils/MediaFilenameResolver.d.ts.map +1 -0
- package/dist/utils/MediaFilenameResolver.js +90 -0
- package/dist/utils/MediaFilenameResolver.js.map +1 -0
- package/dist/utils/Misc.d.ts +14 -0
- package/dist/utils/Misc.d.ts.map +1 -0
- package/dist/utils/Misc.js +4 -0
- package/dist/utils/Misc.js.map +1 -0
- package/dist/utils/ObjectHelper.d.ts +4 -0
- package/dist/utils/ObjectHelper.d.ts.map +1 -0
- package/dist/utils/ObjectHelper.js +30 -0
- package/dist/utils/ObjectHelper.js.map +1 -0
- package/dist/utils/PackageInfo.d.ts +10 -0
- package/dist/utils/PackageInfo.d.ts.map +1 -0
- package/dist/utils/PackageInfo.js +33 -0
- package/dist/utils/PackageInfo.js.map +1 -0
- package/dist/utils/URLHelper.d.ts +40 -0
- package/dist/utils/URLHelper.d.ts.map +1 -0
- package/dist/utils/URLHelper.js +192 -0
- package/dist/utils/URLHelper.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logging/ChainLogger.d.ts +11 -0
- package/dist/utils/logging/ChainLogger.d.ts.map +1 -0
- package/dist/utils/logging/ChainLogger.js +50 -0
- package/dist/utils/logging/ChainLogger.js.map +1 -0
- package/dist/utils/logging/ConsoleLogger.d.ts +31 -0
- package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -0
- package/dist/utils/logging/ConsoleLogger.js +126 -0
- package/dist/utils/logging/ConsoleLogger.js.map +1 -0
- package/dist/utils/logging/FileLogger.d.ts +26 -0
- package/dist/utils/logging/FileLogger.d.ts.map +1 -0
- package/dist/utils/logging/FileLogger.js +147 -0
- package/dist/utils/logging/FileLogger.js.map +1 -0
- package/dist/utils/logging/Logger.d.ts +12 -0
- package/dist/utils/logging/Logger.d.ts.map +1 -0
- package/dist/utils/logging/Logger.js +15 -0
- package/dist/utils/logging/Logger.js.map +1 -0
- package/dist/utils/logging/index.d.ts +7 -0
- package/dist/utils/logging/index.d.ts.map +1 -0
- package/dist/utils/logging/index.js +7 -0
- package/dist/utils/logging/index.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|