patreon-dl 3.7.1 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
- package/dist/browse/api/ContentAPIMixin.d.ts +3 -3
- package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
- package/dist/browse/api/index.d.ts +10 -10
- package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
- package/dist/browse/db/ContentDBMixin.d.ts +13 -13
- package/dist/browse/db/ContentDBMixin.js +1 -1
- package/dist/browse/db/ContentDBMixin.js.map +1 -1
- package/dist/browse/db/MediaDBMixin.js +1 -1
- package/dist/browse/db/MediaDBMixin.js.map +1 -1
- package/dist/browse/db/index.d.ts +16 -16
- package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
- package/dist/browse/web/index.html +1 -1
- package/dist/cli/CommandLineParser.d.ts +4 -0
- package/dist/cli/CommandLineParser.js +65 -32
- package/dist/cli/CommandLineParser.js.map +1 -1
- package/dist/cli/helper/PostList.d.ts +6 -0
- package/dist/cli/helper/PostList.js +106 -0
- package/dist/cli/helper/PostList.js.map +1 -0
- package/dist/cli/index.js +73 -53
- package/dist/cli/index.js.map +1 -1
- package/dist/downloaders/Bootstrap.d.ts +5 -0
- package/dist/downloaders/Bootstrap.js +10 -0
- package/dist/downloaders/Bootstrap.js.map +1 -1
- package/dist/downloaders/Downloader.d.ts +4 -4
- package/dist/downloaders/Downloader.js +6 -59
- package/dist/downloaders/Downloader.js.map +1 -1
- package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
- package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
- package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
- package/dist/downloaders/InitialData.js +20 -6
- package/dist/downloaders/InitialData.js.map +1 -1
- package/dist/downloaders/PostDownloader.js +67 -103
- package/dist/downloaders/PostDownloader.js.map +1 -1
- package/dist/downloaders/PostsFetcher.js +7 -5
- package/dist/downloaders/PostsFetcher.js.map +1 -1
- package/dist/downloaders/ProductDownloader.js +31 -21
- package/dist/downloaders/ProductDownloader.js.map +1 -1
- package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
- package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
- package/dist/parsers/PageParser.js +7 -2
- package/dist/parsers/PageParser.js.map +1 -1
- package/dist/parsers/PostParser.d.ts +4 -1
- package/dist/parsers/PostParser.js +54 -5
- package/dist/parsers/PostParser.js.map +1 -1
- package/dist/utils/Fetcher.d.ts +1 -0
- package/dist/utils/Fetcher.js +5 -0
- package/dist/utils/Fetcher.js.map +1 -1
- package/dist/utils/URLHelper.d.ts +4 -0
- package/dist/utils/URLHelper.js +17 -0
- package/dist/utils/URLHelper.js.map +1 -1
- package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
- package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
- package/dist/utils/logging/ConsoleLogger.js +5 -0
- package/dist/utils/logging/ConsoleLogger.js.map +1 -1
- package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
- package/dist/utils/yt/InnertubeLoader.js +14 -14
- package/dist/utils/yt/InnertubeLoader.js.map +1 -1
- package/dist/utils/yt/PoToken.js +53 -27
- package/dist/utils/yt/PoToken.js.map +1 -1
- package/package.json +12 -8
- package/dist/browse/web/assets/index-B1h15ViZ.js +0 -218
|
@@ -20,6 +20,7 @@ import { TargetSkipReason } from './DownloaderEvent.js';
|
|
|
20
20
|
import { ProductType } from '../entities/Product.js';
|
|
21
21
|
import Bootstrap from './Bootstrap.js';
|
|
22
22
|
import ProductsFetcher from './ProductsFetcher.js';
|
|
23
|
+
import { IncludeCriteriaHelper } from './IncludeCriteriaHelper.js';
|
|
23
24
|
class ProductDownloader extends Downloader {
|
|
24
25
|
constructor() {
|
|
25
26
|
super(...arguments);
|
|
@@ -218,29 +219,38 @@ _ProductDownloader_startPromise = new WeakMap(), _ProductDownloader_instances =
|
|
|
218
219
|
}
|
|
219
220
|
}, _ProductDownloader_doDownload = async function _ProductDownloader_doDownload(product, productDirs, statusCache, db, signal) {
|
|
220
221
|
// Step 1: Check whether we should download product
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
222
|
+
const criteriaHelper = new IncludeCriteriaHelper(this.logger);
|
|
223
|
+
const criteriaCheck = criteriaHelper.checkProduct(product, this.config);
|
|
224
|
+
if (!criteriaCheck.ok) {
|
|
225
|
+
switch (criteriaCheck.reason) {
|
|
226
|
+
case 'unviewable': {
|
|
227
|
+
this.log('warn', `Skipped downloading product #${product.id}: not accessible by current user`);
|
|
228
|
+
this.emit('targetEnd', {
|
|
229
|
+
target: product,
|
|
230
|
+
isSkipped: true,
|
|
231
|
+
skipReason: TargetSkipReason.Inaccessible,
|
|
232
|
+
skipMessage: 'Target is not accessible by current user'
|
|
233
|
+
});
|
|
234
|
+
return {
|
|
235
|
+
status: 'skippedUnviewable'
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
case 'publishDateOutOfRange': {
|
|
239
|
+
this.log('warn', `Skipped downloading product #${product.id}: publish date out of range`);
|
|
240
|
+
this.emit('targetEnd', {
|
|
241
|
+
target: product,
|
|
242
|
+
isSkipped: true,
|
|
243
|
+
skipReason: TargetSkipReason.PublishDateOutOfRange,
|
|
244
|
+
skipMessage: 'Publish date out of range'
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
status: 'skippedPublishDateOutOfRange'
|
|
248
|
+
};
|
|
249
|
+
}
|
|
237
250
|
}
|
|
238
251
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
return {
|
|
242
|
-
status: 'skippedPublishDateOutOfRange'
|
|
243
|
-
};
|
|
252
|
+
if (!product.isAccessible && this.config.include.lockedContent) {
|
|
253
|
+
this.log('warn', `Product #${product.id} is not accessible by current user`);
|
|
244
254
|
}
|
|
245
255
|
this.fsHelper.createDir(productDirs.root);
|
|
246
256
|
// Step 2: save product info
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductDownloader.js","sourceRoot":"","sources":["../../src/downloaders/ProductDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import ProductParser from '../parsers/ProductParser.js';\nimport URLHelper from '../utils/URLHelper.js';\nimport Downloader, { type DownloaderConfig, type DownloaderStartParams } from './Downloader.js';\nimport StatusCache from './cache/StatusCache.js';\nimport { generateProductSummary } from './templates/ProductInfo.js';\nimport path from 'path';\nimport { TargetSkipReason } from './DownloaderEvent.js';\nimport { ProductType, type Product } from '../entities/Product.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport Bootstrap from './Bootstrap.js';\nimport ProductsFetcher from './ProductsFetcher.js';\nimport { type ProductDirectories } from '../utils/FSHelper.js';\nimport { type DBInstance } from '../browse/db/index.js';\n\nexport default class ProductDownloader extends Downloader<Product> {\n\n static version = '1.0.1';\n\n name = 'ProductDownloader';\n\n #startPromise: Promise<void> | null = null;\n\n doStart(params?: DownloaderStartParams): Promise<void> {\n\n if (this.#startPromise) {\n throw Error('Downloader already running');\n }\n\n this.#startPromise = this.#doStart(params)\n .finally(() => {\n this.#startPromise = null;\n });\n\n return this.#startPromise;\n }\n\n async #doStart(params?: DownloaderStartParams): Promise<void> {\n try {\n const { signal } = params || {};\n const productFetch = this.config.productFetch;\n const db = await this.db();\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n\n if (productFetch.type === 'byShop') {\n this.log('info', `Targeting products by '${productFetch.vanity}'`);\n }\n else if (productFetch.type === 'byFile') {\n this.log('info', `Target product given by API data in \"${productFetch.filePath}\"`);\n }\n else {\n this.log('info', `Targeting product #${productFetch.productId}`);\n }\n\n // Step 1: get products (if by shop) or target product\n const productsFetcher = new ProductsFetcher({\n config: this.config,\n fetcher: this.fetcher,\n logger: this.logger,\n signal\n });\n productsFetcher.on('statusChange', ({current}) => {\n if (current.status === 'running') {\n this.emit('fetchBegin', { targetType: productsFetcher.getTargetType() });\n }\n });\n productsFetcher.begin();\n\n // Step 2: download products in each fetched list\n let downloaded = 0;\n let skippedUnviewable = 0;\n let skippedRedundant = 0;\n let skippedPublishDateOutOfRange = 0;\n let campaignSaved = false;\n let stopConditionMet = false;\n const productsParser = new ProductParser(this.logger);\n while (productsFetcher.hasNext()) {\n const { list, aborted, error } = await productsFetcher.next();\n if (!list || aborted) {\n break;\n }\n if (!list && error) {\n this.emit('end', { aborted: false, error, message: 'ProductsFetcher error' });\n return;\n }\n if (!campaignSaved && list.items[0]?.campaign) {\n await this.saveCampaignInfo(list.items[0].campaign, signal);\n campaignSaved = true;\n if (this.checkAbortSignal(signal)) {\n return;\n }\n }\n\n for (const _product of list.items) {\n\n if (stopConditionMet) {\n break;\n }\n\n let product = _product;\n\n if (this.#isFetchingMultipleProducts(productFetch)) {\n // Refresh to ensure media links have not expired\n this.log('debug', `Refresh product #${_product.id}`);\n const productURL = URLHelper.constructProductAPIURL(product.id);\n const { json } = await this.commonFetchAPI(productURL, signal);\n let refreshed: Product | null = null;\n if (json) {\n refreshed = productsParser.parseProductsAPIResponse(json, productURL).items[0] || null;\n if (!refreshed) {\n this.log('warn', `Refreshed product #${_product.id} but got empty value - going to use existing data`);\n }\n else if (refreshed.id !== _product.id) {\n this.log('warn', `Refreshed product #${_product.id} but ID mismatch - going to use existing data`);\n refreshed = null;\n }\n else {\n // Refreshed data does not have productType - reinstate it\n refreshed.productType = _product.productType;\n }\n }\n else if (this.checkAbortSignal(signal)) {\n return;\n }\n else {\n this.log('warn', `Failed to refresh product #${_product.id} - going to use existing data`);\n }\n if (refreshed) {\n this.log('debug', `Use refreshed product data #${refreshed.id}`);\n product = refreshed;\n }\n }\n\n this.emit('targetBegin', { target: product });\n\n // Step 4.1: product directories\n const productDirs = this.fsHelper.getProductDirs(product);\n this.log('debug', 'Product directories:', productDirs);\n\n // Step 4.2: Check with status cache\n const statusCache = StatusCache.getInstance(this.config, productDirs.statusCache, this.logger);\n if (!product.productType || product.productType === ProductType.DigitalCommerce) {\n const statusCacheValidation = statusCache.validate(product, productDirs.root, this.config)\n if (!statusCacheValidation.invalidated) {\n this.log('info', `Skipped downloading product #${product.id}: already downloaded`);\n this.emit('targetEnd', {\n target: product,\n isSkipped: true,\n skipReason: TargetSkipReason.AlreadyDownloaded,\n skipMessage: 'Target already downloaded'\n });\n skippedRedundant++;\n if (this.config.stopOn === 'previouslyDownloaded') {\n stopConditionMet = true;\n }\n continue;\n }\n }\n \n switch ((await this.#doDownload(\n product,\n productDirs,\n statusCache,\n db,\n signal\n )).status) {\n case 'aborted':\n return;\n case 'downloaded':\n downloaded++;\n break;\n case 'skippedPublishDateOutOfRange':\n skippedPublishDateOutOfRange++;\n if (this.config.stopOn === 'postPublishDateOutOfRange' ||\n this.config.stopOn === 'publishDateOutOfRange'\n ) {\n stopConditionMet = true;\n }\n break;\n case 'skippedUnviewable':\n skippedUnviewable++;\n break;\n }\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n }\n\n if (stopConditionMet) {\n break;\n }\n }\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n\n if (stopConditionMet && this.#isFetchingMultipleProducts(productFetch)) {\n this.log('info', `Stop downloader: stop condition \"${this.config.stopOn}\" met`)\n }\n\n // Done\n if (productFetch.type === 'byShop') {\n this.log('info', `Done downloading products by '${productFetch.vanity}'`);\n }\n else if (productFetch.type === 'byFile') {\n this.log('info', `Done downloading product given in \"${productFetch.filePath}\"`);\n }\n else {\n this.log('info', `Done downloading product #${productFetch.productId}`);\n }\n let endMessage = 'Done';\n if (this.#isFetchingMultipleProducts(productFetch)) {\n const skippedStrParts: string[] = [];\n if (skippedUnviewable) {\n skippedStrParts.push(`${skippedUnviewable} unviewable`);\n }\n if (skippedRedundant) {\n skippedStrParts.push(`${skippedRedundant} redundant`);\n }\n if (skippedPublishDateOutOfRange) {\n skippedStrParts.push(`${skippedPublishDateOutOfRange} with publish date out of range`);\n }\n const skippedStr = skippedStrParts.length > 0 ? ` (skipped: ${skippedStrParts.join(', ')})` : '';\n endMessage = `Total ${downloaded} / ${productsFetcher.getTotal()} products processed${skippedStr}`;\n this.log('info', endMessage);\n }\n this.emit('end', { aborted: false, message: endMessage });\n }\n finally {\n await this.closeDB();\n if (this.logger) {\n await this.logger.end();\n }\n }\n }\n\n async #doDownload(\n product: Product,\n productDirs: ProductDirectories,\n statusCache: StatusCache,\n db: DBInstance,\n signal?: AbortSignal\n ): Promise<{status: 'skippedUnviewable' | 'skippedPublishDateOutOfRange' | 'aborted' | 'downloaded' }> {\n // Step 1: Check whether we should download product\n // -- 1.1 Accessibility\n if (!product.isAccessible) {\n if (this.config.include.lockedContent) {\n this.log('warn', `Product #${product.id} is not accessible by current user`);\n }\n else {\n this.log('warn', `Skipped downloading product #${product.id}: not accessible by current user`);\n this.emit('targetEnd', {\n target: product,\n isSkipped: true,\n skipReason: TargetSkipReason.Inaccessible,\n skipMessage: 'Target is not accessible by current user'\n });\n return {\n status: 'skippedUnviewable'\n };\n }\n }\n // -- 1.4 Config option 'include.productsPublished'\n if (this.isPublishDateOutOfRange(product)) {\n return {\n status: 'skippedPublishDateOutOfRange'\n };\n }\n\n this.fsHelper.createDir(productDirs.root);\n\n // Step 2: save product info\n if (this.config.include.contentInfo) {\n this.log('info', 'Save product info');\n this.emit('phaseBegin', { target: product, phase: 'saveInfo' });\n this.fsHelper.createDir(productDirs.info);\n const summary = generateProductSummary(product);\n const summaryFile = path.resolve(productDirs.info, 'info.txt');\n const saveSummaryResult = await this.fsHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, product, 'product summary');\n\n const productRawFile = path.resolve(productDirs.info, 'product-api.json');\n const saveProductRawResult = await this.fsHelper.writeTextFile(\n productRawFile, product.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveProductRawResult, product, 'product API data');\n this.emit('phaseEnd', { target: product, phase: 'saveInfo' });\n }\n\n // Step 3: Download product media items\n const incPreview = this.config.include.previewMedia;\n const incContent = this.config.include.contentMedia;\n this.log('info', 'Download:', {\n ['preview items']: incPreview === true ? 'yes' : incPreview === false ? 'no' : JSON.stringify(incPreview),\n ['content items']: incContent === true ? 'yes' : incContent === false ? 'no' : JSON.stringify(incContent)\n });\n\n const __inc = (inc: boolean | Array<any>, target: Downloadable) => {\n if (typeof inc === 'boolean') {\n return inc;\n }\n return (inc.includes(target.type as any));\n };\n\n const previewMedia = product.previewMedia.filter((tt) => __inc(incPreview, tt));\n const contentMedia = product.contentMedia.filter((tt) => __inc(incContent, tt));\n const campaignDir = product.campaign ? this.fsHelper.getCampaignDirs(product.campaign).root : null;\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseBegin', { target: product, phase: 'saveMedia' });\n const batchResult = await this.createDownloadTaskBatch(\n `Product #${product.id} (${product.name})`,\n signal,\n\n previewMedia.length > 0 ? {\n target: previewMedia,\n targetName: `product #${product.id} -> preview media`,\n src: product,\n dirs: {\n campaign: campaignDir,\n main: productDirs.previewMedia,\n thumbnails: productDirs.thumbnails\n },\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n contentMedia.length > 0 ? {\n target: contentMedia,\n targetName: `product #${product.id} -> content media`,\n src: product,\n dirs: {\n campaign: campaignDir,\n main: productDirs.contentMedia,\n thumbnails: productDirs.thumbnails\n },\n fileExistsAction: this.config.fileExistsAction.content,\n ignoreCreateTaskErrors: !product.isAccessible\n } : null\n );\n\n const { batch } = batchResult;\n\n const abortHandler = () => {\n void (async () => {\n this.log('info', 'Abort signal received');\n if (batch) {\n await batch.abort();\n }\n })();\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n \n try {\n if (this.checkAbortSignal(signal)) {\n return {\n status: 'aborted'\n };\n }\n \n batch.prestart();\n this.log('info', `Download batch created (#${batch.id}): ${batch.getTasks('pending').length} downloads pending`);\n this.emit('phaseBegin', { target: product, phase: 'batchDownload', batch });\n\n await batch.start();\n\n // Step 4: Update status cache\n statusCache.updateOnDownload(product, productDirs.root, batch.getTasks('error').length > 0 || batchResult.errorCount > 0, this.config);\n\n await batch.destroy();\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n this.emit('phaseEnd', { target: product, phase: 'batchDownload' });\n this.emit('phaseEnd', { target: product, phase: 'saveMedia' });\n }\n\n if (this.checkAbortSignal(signal)) {\n return {\n status: 'aborted'\n };\n }\n\n // Step 5: Save to DB\n let skipDB = false;\n let saveReferencedEntityId: (id: string) => void;\n const dbProduct = db.getContent(product.id, 'product');\n if (!product.isAccessible) {\n // Skip if existing db record (if any) refers to accessible product\n skipDB = dbProduct !== null && dbProduct.isAccessible;\n }\n if (!skipDB) {\n db.saveContent(product);\n saveReferencedEntityId = (id) => {\n product.referencedEntityId = id;\n db.saveContent(product);\n };\n }\n else {\n this.log('info', `Skip overwrite existing accessible product #${product.id} in DB with current unviewable version`);\n saveReferencedEntityId = (id) => {\n // Ensure referencedEntityId is updated\n dbProduct!.referencedEntityId = id;\n db.saveContent(dbProduct!);\n };\n }\n\n // Step 6: check product type and download referenced product / collection\n await this.#processProductType(product, saveReferencedEntityId, signal);\n\n // Done\n this.log('info', `Done downloading product #${product.id}`);\n this.emit('targetEnd', { target: product, isSkipped: false });\n\n return {\n status: 'downloaded'\n }\n }\n\n // Carry out further action based on product type\n async #processProductType(\n product: Product,\n saveReferencedEntityId: (id: string) => void,\n signal?: AbortSignal\n ) {\n if (product.productType === undefined || product.productType === ProductType.DigitalCommerce) {\n this.log('debug', `Product type \"${product.productType}\": no further action required`);\n return;\n }\n if (product.productType === ProductType.Post || product.productType === ProductType.Collection) {\n const bootstrap = Bootstrap.getDownloaderBootstrapDataByURL(product.url);\n if (bootstrap?.type === 'post') {\n this.log('info', `Download ${product.productType} referenced by product: ${product.url}`);\n const PostDownloader = (await import('./PostDownloader.js')).default;\n const downloader = new PostDownloader(\n {\n ...this.config,\n ...bootstrap\n },\n this.db,\n this.logger,\n {\n skipSaveCampaign: true,\n keepLoggerOpen: true,\n keepDBOpen: true\n }\n );\n try {\n await downloader.start({ signal });\n this.log('info', `Done downloading ${product.productType} referenced by product`);\n }\n catch (error) {\n if (signal?.aborted) {\n throw error;\n }\n this.log('error', `Error downloading ${product.productType} referenced by product (url: ${product.url})`, error);\n }\n let referencedEntityId: string | undefined = undefined;\n let bootstrapMismatch = false;\n if (bootstrap.postFetch.type === 'single') {\n bootstrapMismatch = product.productType !== ProductType.Post;\n referencedEntityId = bootstrap.postFetch.postId;\n }\n if (bootstrap.postFetch.type === 'byCollection') {\n bootstrapMismatch = product.productType !== ProductType.Collection;\n referencedEntityId = bootstrap.postFetch.collectionId;\n }\n if (bootstrapMismatch) {\n this.log('warn', `Product type \"${product.productType}\" does not match URL \"${product.url}\" (${bootstrap.postFetch.type})`);\n }\n else if (referencedEntityId) {\n saveReferencedEntityId(referencedEntityId);\n }\n }\n else {\n this.log('error', `Product type is \"${product.productType}\" but could not create downloader from URL \"${product.url}\"`);\n }\n return;\n }\n this.log('debug', `Unknown product type \"${product.productType}\": no further action can be taken`);\n return;\n }\n\n #isFetchingMultipleProducts(productFetch: DownloaderConfig<Product>['productFetch']): productFetch is DownloaderConfig<Product>['productFetch'] & { type: 'byShop' } {\n return productFetch.type === 'byShop';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ProductDownloader.js","sourceRoot":"","sources":["../../src/downloaders/ProductDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import ProductParser from '../parsers/ProductParser.js';\nimport URLHelper from '../utils/URLHelper.js';\nimport Downloader, { type DownloaderConfig, type DownloaderStartParams } from './Downloader.js';\nimport StatusCache from './cache/StatusCache.js';\nimport { generateProductSummary } from './templates/ProductInfo.js';\nimport path from 'path';\nimport { TargetSkipReason } from './DownloaderEvent.js';\nimport { ProductType, type Product } from '../entities/Product.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport Bootstrap from './Bootstrap.js';\nimport ProductsFetcher from './ProductsFetcher.js';\nimport { type ProductDirectories } from '../utils/FSHelper.js';\nimport { type DBInstance } from '../browse/db/index.js';\nimport { IncludeCriteriaHelper } from './IncludeCriteriaHelper.js';\n\nexport default class ProductDownloader extends Downloader<Product> {\n\n static version = '1.0.1';\n\n name = 'ProductDownloader';\n\n #startPromise: Promise<void> | null = null;\n\n doStart(params?: DownloaderStartParams): Promise<void> {\n\n if (this.#startPromise) {\n throw Error('Downloader already running');\n }\n\n this.#startPromise = this.#doStart(params)\n .finally(() => {\n this.#startPromise = null;\n });\n\n return this.#startPromise;\n }\n\n async #doStart(params?: DownloaderStartParams): Promise<void> {\n try {\n const { signal } = params || {};\n const productFetch = this.config.productFetch;\n const db = await this.db();\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n\n if (productFetch.type === 'byShop') {\n this.log('info', `Targeting products by '${productFetch.vanity}'`);\n }\n else if (productFetch.type === 'byFile') {\n this.log('info', `Target product given by API data in \"${productFetch.filePath}\"`);\n }\n else {\n this.log('info', `Targeting product #${productFetch.productId}`);\n }\n\n // Step 1: get products (if by shop) or target product\n const productsFetcher = new ProductsFetcher({\n config: this.config,\n fetcher: this.fetcher,\n logger: this.logger,\n signal\n });\n productsFetcher.on('statusChange', ({current}) => {\n if (current.status === 'running') {\n this.emit('fetchBegin', { targetType: productsFetcher.getTargetType() });\n }\n });\n productsFetcher.begin();\n\n // Step 2: download products in each fetched list\n let downloaded = 0;\n let skippedUnviewable = 0;\n let skippedRedundant = 0;\n let skippedPublishDateOutOfRange = 0;\n let campaignSaved = false;\n let stopConditionMet = false;\n const productsParser = new ProductParser(this.logger);\n while (productsFetcher.hasNext()) {\n const { list, aborted, error } = await productsFetcher.next();\n if (!list || aborted) {\n break;\n }\n if (!list && error) {\n this.emit('end', { aborted: false, error, message: 'ProductsFetcher error' });\n return;\n }\n if (!campaignSaved && list.items[0]?.campaign) {\n await this.saveCampaignInfo(list.items[0].campaign, signal);\n campaignSaved = true;\n if (this.checkAbortSignal(signal)) {\n return;\n }\n }\n\n for (const _product of list.items) {\n\n if (stopConditionMet) {\n break;\n }\n\n let product = _product;\n\n if (this.#isFetchingMultipleProducts(productFetch)) {\n // Refresh to ensure media links have not expired\n this.log('debug', `Refresh product #${_product.id}`);\n const productURL = URLHelper.constructProductAPIURL(product.id);\n const { json } = await this.commonFetchAPI(productURL, signal);\n let refreshed: Product | null = null;\n if (json) {\n refreshed = productsParser.parseProductsAPIResponse(json, productURL).items[0] || null;\n if (!refreshed) {\n this.log('warn', `Refreshed product #${_product.id} but got empty value - going to use existing data`);\n }\n else if (refreshed.id !== _product.id) {\n this.log('warn', `Refreshed product #${_product.id} but ID mismatch - going to use existing data`);\n refreshed = null;\n }\n else {\n // Refreshed data does not have productType - reinstate it\n refreshed.productType = _product.productType;\n }\n }\n else if (this.checkAbortSignal(signal)) {\n return;\n }\n else {\n this.log('warn', `Failed to refresh product #${_product.id} - going to use existing data`);\n }\n if (refreshed) {\n this.log('debug', `Use refreshed product data #${refreshed.id}`);\n product = refreshed;\n }\n }\n\n this.emit('targetBegin', { target: product });\n\n // Step 4.1: product directories\n const productDirs = this.fsHelper.getProductDirs(product);\n this.log('debug', 'Product directories:', productDirs);\n\n // Step 4.2: Check with status cache\n const statusCache = StatusCache.getInstance(this.config, productDirs.statusCache, this.logger);\n if (!product.productType || product.productType === ProductType.DigitalCommerce) {\n const statusCacheValidation = statusCache.validate(product, productDirs.root, this.config)\n if (!statusCacheValidation.invalidated) {\n this.log('info', `Skipped downloading product #${product.id}: already downloaded`);\n this.emit('targetEnd', {\n target: product,\n isSkipped: true,\n skipReason: TargetSkipReason.AlreadyDownloaded,\n skipMessage: 'Target already downloaded'\n });\n skippedRedundant++;\n if (this.config.stopOn === 'previouslyDownloaded') {\n stopConditionMet = true;\n }\n continue;\n }\n }\n \n switch ((await this.#doDownload(\n product,\n productDirs,\n statusCache,\n db,\n signal\n )).status) {\n case 'aborted':\n return;\n case 'downloaded':\n downloaded++;\n break;\n case 'skippedPublishDateOutOfRange':\n skippedPublishDateOutOfRange++;\n if (this.config.stopOn === 'postPublishDateOutOfRange' ||\n this.config.stopOn === 'publishDateOutOfRange'\n ) {\n stopConditionMet = true;\n }\n break;\n case 'skippedUnviewable':\n skippedUnviewable++;\n break;\n }\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n }\n\n if (stopConditionMet) {\n break;\n }\n }\n\n if (this.checkAbortSignal(signal)) {\n return;\n }\n\n if (stopConditionMet && this.#isFetchingMultipleProducts(productFetch)) {\n this.log('info', `Stop downloader: stop condition \"${this.config.stopOn}\" met`)\n }\n\n // Done\n if (productFetch.type === 'byShop') {\n this.log('info', `Done downloading products by '${productFetch.vanity}'`);\n }\n else if (productFetch.type === 'byFile') {\n this.log('info', `Done downloading product given in \"${productFetch.filePath}\"`);\n }\n else {\n this.log('info', `Done downloading product #${productFetch.productId}`);\n }\n let endMessage = 'Done';\n if (this.#isFetchingMultipleProducts(productFetch)) {\n const skippedStrParts: string[] = [];\n if (skippedUnviewable) {\n skippedStrParts.push(`${skippedUnviewable} unviewable`);\n }\n if (skippedRedundant) {\n skippedStrParts.push(`${skippedRedundant} redundant`);\n }\n if (skippedPublishDateOutOfRange) {\n skippedStrParts.push(`${skippedPublishDateOutOfRange} with publish date out of range`);\n }\n const skippedStr = skippedStrParts.length > 0 ? ` (skipped: ${skippedStrParts.join(', ')})` : '';\n endMessage = `Total ${downloaded} / ${productsFetcher.getTotal()} products processed${skippedStr}`;\n this.log('info', endMessage);\n }\n this.emit('end', { aborted: false, message: endMessage });\n }\n finally {\n await this.closeDB();\n if (this.logger) {\n await this.logger.end();\n }\n }\n }\n\n async #doDownload(\n product: Product,\n productDirs: ProductDirectories,\n statusCache: StatusCache,\n db: DBInstance,\n signal?: AbortSignal\n ): Promise<{status: 'skippedUnviewable' | 'skippedPublishDateOutOfRange' | 'aborted' | 'downloaded' }> {\n // Step 1: Check whether we should download product\n const criteriaHelper = new IncludeCriteriaHelper(this.logger);\n const criteriaCheck = criteriaHelper.checkProduct(product, this.config);\n if (!criteriaCheck.ok) {\n switch (criteriaCheck.reason) {\n case 'unviewable': {\n this.log('warn', `Skipped downloading product #${product.id}: not accessible by current user`);\n this.emit('targetEnd', {\n target: product,\n isSkipped: true,\n skipReason: TargetSkipReason.Inaccessible,\n skipMessage: 'Target is not accessible by current user'\n });\n return {\n status: 'skippedUnviewable'\n };\n }\n case 'publishDateOutOfRange': {\n this.log('warn', `Skipped downloading product #${product.id}: publish date out of range`);\n this.emit('targetEnd', {\n target: product,\n isSkipped: true,\n skipReason: TargetSkipReason.PublishDateOutOfRange,\n skipMessage: 'Publish date out of range'\n });\n return {\n status: 'skippedPublishDateOutOfRange'\n };\n }\n }\n }\n\n if (!product.isAccessible && this.config.include.lockedContent) {\n this.log('warn', `Product #${product.id} is not accessible by current user`);\n }\n\n this.fsHelper.createDir(productDirs.root);\n\n // Step 2: save product info\n if (this.config.include.contentInfo) {\n this.log('info', 'Save product info');\n this.emit('phaseBegin', { target: product, phase: 'saveInfo' });\n this.fsHelper.createDir(productDirs.info);\n const summary = generateProductSummary(product);\n const summaryFile = path.resolve(productDirs.info, 'info.txt');\n const saveSummaryResult = await this.fsHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, product, 'product summary');\n\n const productRawFile = path.resolve(productDirs.info, 'product-api.json');\n const saveProductRawResult = await this.fsHelper.writeTextFile(\n productRawFile, product.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(saveProductRawResult, product, 'product API data');\n this.emit('phaseEnd', { target: product, phase: 'saveInfo' });\n }\n\n // Step 3: Download product media items\n const incPreview = this.config.include.previewMedia;\n const incContent = this.config.include.contentMedia;\n this.log('info', 'Download:', {\n ['preview items']: incPreview === true ? 'yes' : incPreview === false ? 'no' : JSON.stringify(incPreview),\n ['content items']: incContent === true ? 'yes' : incContent === false ? 'no' : JSON.stringify(incContent)\n });\n\n const __inc = (inc: boolean | Array<any>, target: Downloadable) => {\n if (typeof inc === 'boolean') {\n return inc;\n }\n return (inc.includes(target.type as any));\n };\n\n const previewMedia = product.previewMedia.filter((tt) => __inc(incPreview, tt));\n const contentMedia = product.contentMedia.filter((tt) => __inc(incContent, tt));\n const campaignDir = product.campaign ? this.fsHelper.getCampaignDirs(product.campaign).root : null;\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseBegin', { target: product, phase: 'saveMedia' });\n const batchResult = await this.createDownloadTaskBatch(\n `Product #${product.id} (${product.name})`,\n signal,\n\n previewMedia.length > 0 ? {\n target: previewMedia,\n targetName: `product #${product.id} -> preview media`,\n src: product,\n dirs: {\n campaign: campaignDir,\n main: productDirs.previewMedia,\n thumbnails: productDirs.thumbnails\n },\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n contentMedia.length > 0 ? {\n target: contentMedia,\n targetName: `product #${product.id} -> content media`,\n src: product,\n dirs: {\n campaign: campaignDir,\n main: productDirs.contentMedia,\n thumbnails: productDirs.thumbnails\n },\n fileExistsAction: this.config.fileExistsAction.content,\n ignoreCreateTaskErrors: !product.isAccessible\n } : null\n );\n\n const { batch } = batchResult;\n\n const abortHandler = () => {\n void (async () => {\n this.log('info', 'Abort signal received');\n if (batch) {\n await batch.abort();\n }\n })();\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n \n try {\n if (this.checkAbortSignal(signal)) {\n return {\n status: 'aborted'\n };\n }\n \n batch.prestart();\n this.log('info', `Download batch created (#${batch.id}): ${batch.getTasks('pending').length} downloads pending`);\n this.emit('phaseBegin', { target: product, phase: 'batchDownload', batch });\n\n await batch.start();\n\n // Step 4: Update status cache\n statusCache.updateOnDownload(product, productDirs.root, batch.getTasks('error').length > 0 || batchResult.errorCount > 0, this.config);\n\n await batch.destroy();\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n this.emit('phaseEnd', { target: product, phase: 'batchDownload' });\n this.emit('phaseEnd', { target: product, phase: 'saveMedia' });\n }\n\n if (this.checkAbortSignal(signal)) {\n return {\n status: 'aborted'\n };\n }\n\n // Step 5: Save to DB\n let skipDB = false;\n let saveReferencedEntityId: (id: string) => void;\n const dbProduct = db.getContent(product.id, 'product');\n if (!product.isAccessible) {\n // Skip if existing db record (if any) refers to accessible product\n skipDB = dbProduct !== null && dbProduct.isAccessible;\n }\n if (!skipDB) {\n db.saveContent(product);\n saveReferencedEntityId = (id) => {\n product.referencedEntityId = id;\n db.saveContent(product);\n };\n }\n else {\n this.log('info', `Skip overwrite existing accessible product #${product.id} in DB with current unviewable version`);\n saveReferencedEntityId = (id) => {\n // Ensure referencedEntityId is updated\n dbProduct!.referencedEntityId = id;\n db.saveContent(dbProduct!);\n };\n }\n\n // Step 6: check product type and download referenced product / collection\n await this.#processProductType(product, saveReferencedEntityId, signal);\n\n // Done\n this.log('info', `Done downloading product #${product.id}`);\n this.emit('targetEnd', { target: product, isSkipped: false });\n\n return {\n status: 'downloaded'\n }\n }\n\n // Carry out further action based on product type\n async #processProductType(\n product: Product,\n saveReferencedEntityId: (id: string) => void,\n signal?: AbortSignal\n ) {\n if (product.productType === undefined || product.productType === ProductType.DigitalCommerce) {\n this.log('debug', `Product type \"${product.productType}\": no further action required`);\n return;\n }\n if (product.productType === ProductType.Post || product.productType === ProductType.Collection) {\n const bootstrap = Bootstrap.getDownloaderBootstrapDataByURL(product.url);\n if (bootstrap?.type === 'post') {\n this.log('info', `Download ${product.productType} referenced by product: ${product.url}`);\n const PostDownloader = (await import('./PostDownloader.js')).default;\n const downloader = new PostDownloader(\n {\n ...this.config,\n ...bootstrap\n },\n this.db,\n this.logger,\n {\n skipSaveCampaign: true,\n keepLoggerOpen: true,\n keepDBOpen: true\n }\n );\n try {\n await downloader.start({ signal });\n this.log('info', `Done downloading ${product.productType} referenced by product`);\n }\n catch (error) {\n if (signal?.aborted) {\n throw error;\n }\n this.log('error', `Error downloading ${product.productType} referenced by product (url: ${product.url})`, error);\n }\n let referencedEntityId: string | undefined = undefined;\n let bootstrapMismatch = false;\n if (bootstrap.postFetch.type === 'single') {\n bootstrapMismatch = product.productType !== ProductType.Post;\n referencedEntityId = bootstrap.postFetch.postId;\n }\n if (bootstrap.postFetch.type === 'byCollection') {\n bootstrapMismatch = product.productType !== ProductType.Collection;\n referencedEntityId = bootstrap.postFetch.collectionId;\n }\n if (bootstrapMismatch) {\n this.log('warn', `Product type \"${product.productType}\" does not match URL \"${product.url}\" (${bootstrap.postFetch.type})`);\n }\n else if (referencedEntityId) {\n saveReferencedEntityId(referencedEntityId);\n }\n }\n else {\n this.log('error', `Product type is \"${product.productType}\" but could not create downloader from URL \"${product.url}\"`);\n }\n return;\n }\n this.log('debug', `Unknown product type \"${product.productType}\": no further action can be taken`);\n return;\n }\n\n #isFetchingMultipleProducts(productFetch: DownloaderConfig<Product>['productFetch']): productFetch is DownloaderConfig<Product>['productFetch'] & { type: 'byShop' } {\n return productFetch.type === 'byShop';\n }\n}\n"]}
|
|
@@ -321,9 +321,7 @@ _a = YouTubeDownloadTask, _YouTubeDownloadTask_destDir = new WeakMap(), _YouTube
|
|
|
321
321
|
return (await InnertubeLoader.getInstance(this.config)).getVideoInfo(videoId);
|
|
322
322
|
}, _YouTubeDownloadTask_resolveURL = async function _YouTubeDownloadTask_resolveURL(url) {
|
|
323
323
|
if (!__classPrivateFieldGet(_a, _a, "f", _YouTubeDownloadTask_innertubeForResolveURL)) {
|
|
324
|
-
__classPrivateFieldSet(_a, _a, await InnertubeLib.Innertube.create(
|
|
325
|
-
player_id: '9f4cc5e4'
|
|
326
|
-
}), "f", _YouTubeDownloadTask_innertubeForResolveURL);
|
|
324
|
+
__classPrivateFieldSet(_a, _a, await InnertubeLib.Innertube.create(), "f", _YouTubeDownloadTask_innertubeForResolveURL);
|
|
327
325
|
}
|
|
328
326
|
const innertube = __classPrivateFieldGet(_a, _a, "f", _YouTubeDownloadTask_innertubeForResolveURL);
|
|
329
327
|
const endpoint = await innertube.resolveURL(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YouTubeDownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/YouTubeDownloadTask.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport * as InnertubeLib from 'youtubei.js';\nimport { type YT, type Misc } from 'youtubei.js';\nimport { type YouTubePostEmbed } from '../../entities/Post.js';\nimport FFmpegDownloadTaskBase, { type FFmpegCommandParams, type FFmpegDownloadTaskBaseParams } from './FFmpegDownloadTaskBase.js';\nimport InnertubeLoader from '../../utils/yt/InnertubeLoader.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport fs from 'fs';\nimport DownloadTask from './DownloadTask.js';\nimport YouTubeStreamDownloadTask from './YouTubeStreamDownloadTask.js';\nimport { type FileExistsAction } from '../DownloaderOptions.js';\nimport type Fetcher from '../../utils/Fetcher.js';\nimport { fetch } from 'undici';\n\nexport interface YouTubeDownloadTaskParams extends FFmpegDownloadTaskBaseParams<YouTubePostEmbed> {\n destDir: string;\n fetcher: Fetcher;\n}\n\ninterface ItagFormat {\n ext: string;\n width?: number;\n height?: number;\n acodec?: string;\n abr?: number;\n vcodec?: string;\n format_note?: string;\n preference?: number;\n container?: string;\n fps?: number;\n}\n\n// Taken from yt-dlp:\n// https://github.com/yt-dlp/yt-dlp/blob/349f36606fa7fb658216334a73ac7825c13503c2/yt_dlp/extractor/youtube/_video.py#L138\nconst ITAG_FORMATS: Record<number, ItagFormat> = {\n // NB: Used in YoutubeWebArchiveIE and GoogleDriveIE\n 5: { 'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 6: { 'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 13: { 'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v' },\n 17: { 'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'abr': 24, 'vcodec': 'mp4v' },\n 18: { 'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 96, 'vcodec': 'h264' },\n 22: { 'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 34: { 'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 35: { 'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well\n 36: { 'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v' },\n 37: { 'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 38: { 'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 43: { 'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 44: { 'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 45: { 'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 46: { 'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 59: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 78: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // 3D videos\n 82: { 'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 83: { 'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 84: { 'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 85: { 'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 100: { 'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8', 'preference': -20 },\n 101: { 'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n 102: { 'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n\n // Apple HTTP Live Streaming\n 91: { 'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 92: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 93: { 'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 94: { 'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 95: { 'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 96: { 'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 132: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 151: { 'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 24, 'vcodec': 'h264', 'preference': -10 },\n\n // DASH mp4 video\n 133: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 134: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 135: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 136: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 137: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 138: { 'ext': 'mp4', 'format_note': 'DASH video', 'vcodec': 'h264' }, // Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)\n 160: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 212: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 264: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 298: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 299: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 266: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'h264' },\n\n // Dash mp4 audio\n 139: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 48, 'container': 'm4a_dash' },\n 140: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 128, 'container': 'm4a_dash' },\n 141: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 256, 'container': 'm4a_dash' },\n 256: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 258: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 325: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'dtse', 'container': 'm4a_dash' },\n 328: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'ec-3', 'container': 'm4a_dash' },\n\n // Dash webm\n 167: { 'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 168: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 169: { 'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 170: { 'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 218: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 219: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 278: { 'ext': 'webm', 'height': 144, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp9' },\n 242: { 'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 243: { 'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 244: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 245: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 246: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 247: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 248: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 271: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n\n // itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)\n 272: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 302: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 303: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 308: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 313: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 315: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n\n // Dash webm audio\n 171: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 128 },\n 172: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 256 },\n\n // Dash webm audio with opus inside\n 249: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 50 },\n 250: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 70 },\n 251: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 160 },\n\n // RTMP (unnamed)\n //'_rtmp': {'protocol': 'rtmp'},\n\n // av01 video only formats sometimes served with \"unknown\" codecs\n 394: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 395: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 396: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'av01.0.01M.08' },\n 397: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'av01.0.04M.08' },\n 398: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'av01.0.05M.08' },\n 399: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'av01.0.08M.08' },\n 400: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n 401: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n}\n\ntype StreamType = 'video' | 'audio' | 'video+audio';\n\ntype Stream<T extends StreamType> = {\n type: T;\n url: string;\n quality: string;\n itag: number;\n contentLength?: number;\n cpn: string;\n};\n\ntype StreamBundle = {\n type: 'separateAV';\n video: Stream<'video'>;\n audio: Stream<'audio'>;\n} | {\n type: 'combinedAV';\n stream: Stream<'video+audio'>;\n} | {\n type: 'videoOnly';\n stream: Stream<'video'>;\n} | {\n type: 'audioOnly';\n stream: Stream<'audio'>;\n};\n\ninterface YouTubeFFmpegCommandParams extends FFmpegCommandParams {\n inputs: (FFmpegCommandParams['inputs'][number] & { stream: Stream<any> })[];\n};\n\nexport default class YouTubeDownloadTask extends FFmpegDownloadTaskBase<YouTubePostEmbed> {\n\n name = 'YouTubeDownloadTask';\n\n static #innertubeForResolveURL: InnertubeLib.Innertube | null = null;\n\n #destDir: string;\n #fileExistsAction: FileExistsAction;\n #video: YT.VideoInfo | null;\n #ffmpegCommandParams: YouTubeFFmpegCommandParams | null;\n #fetcher: Fetcher;\n\n constructor(params: YouTubeDownloadTaskParams) {\n super(params);\n this.#destDir = params.destDir;\n this.#fileExistsAction = params.fileExistsAction;\n this.#video = null;\n this.#ffmpegCommandParams = null;\n this.#fetcher = params.fetcher;\n }\n\n protected async resolveDestPath(signal?: AbortSignal) {\n const params = await this.getFFmpegCommandParams(signal);\n return params.output;\n }\n\n async getInnertube() {\n return (await InnertubeLoader.getInstance(this.config)).innertube;\n }\n\n async #getInfo(videoId: string) {\n return (await InnertubeLoader.getInstance(this.config)).getVideoInfo(videoId);\n }\n\n protected async doStart() {\n const innertube = await this.getInnertube();\n const ffmpegParams = await this.getFFmpegCommandParams();\n\n const destFilePath = ffmpegParams.output;\n if (this.#fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {\n await this.setDownloaded(destFilePath);\n this.notifySkip({\n name: 'destFileExists',\n message: `Destination file exists (${destFilePath})`,\n existingDestFilePath: destFilePath\n });\n return;\n }\n\n const __checkStreamDownloads = (tasks: YouTubeStreamDownloadTask<any>[], resolve: (value: 'complete' | 'incomplete') => void) => {\n if (tasks.every((task) => task.hasEnded())) {\n resolve(tasks.every((task) => task.status === 'completed') ? 'complete' : 'incomplete');\n }\n }\n\n const streamDownloadsResult = await new Promise<'complete' | 'incomplete'>((resolve) => {\n void (async () => {\n const tasks = await Promise.all(ffmpegParams.inputs.map(({ input, stream }) =>\n DownloadTask.create(YouTubeStreamDownloadTask, {\n downloadType: 'main',\n callbacks: this.callbacks,\n config: this.config,\n logger: this.logger,\n src: this.src,\n srcEntity: this.srcEntity,\n innertube,\n stream,\n destFilePath: input,\n callback: () => __checkStreamDownloads(tasks, resolve)\n })\n ));\n for (const task of tasks) {\n this.callbacks?.onSpawn(this, task);\n }\n })();\n });\n\n try {\n if (streamDownloadsResult === 'complete') {\n if (this.config.dryRun) {\n this.log('debug', 'YouTube stream(s) downloaded');\n this.log('debug', '(dry-run) -> Skip FFmpeg processing on downloaded stream(s)');\n this.notifyComplete();\n }\n else {\n this.log('debug', 'YouTube stream(s) downloaded - going to run FFmpeg on downloaded stream(s)');\n await super.doStart();\n }\n return;\n }\n \n this.notifySkip({\n name: 'dependentTaskNotCompleted',\n message: 'One or more dependent tasks did not complete'\n });\n }\n finally {\n for (const { input } of ffmpegParams.inputs) {\n try {\n if (this.config.dryRun || fs.existsSync(input)) {\n this.log('debug', `Clean up \"${input}\"`);\n this.fsHelper.unlink(input);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${input}\":`, error);\n }\n }\n }\n }\n\n protected async getFFmpegCommandParams(signal?: AbortSignal): Promise<YouTubeFFmpegCommandParams> {\n if (this.#ffmpegCommandParams) {\n return this.#ffmpegCommandParams;\n }\n\n const videoURL = this.src;\n\n this.log('debug', `Fetch video info from \"${videoURL}\"`);\n const videoId = await this.#resolveURL(videoURL);\n const video = await this.#getInfo(videoId);\n\n this.log('debug', `Choose best-quality stream for YouTube video #${video.basic_info.id}`);\n const stream = await this.#pickStream(video);\n if (!stream) {\n const errMsg = `Stream not found for YouTube video #${video.basic_info.id || videoId}`;\n this.log('error', errMsg);\n if (video.playability_status) {\n this.log('error', `The playability status of the video is: ${video.playability_status.status} - ${video.playability_status.reason}`);\n }\n throw Error(errMsg);\n }\n\n // Test streams - YT sometimes imposes a delay before the streams become accessible\n const streamURLs: {label: string; url: string; }[] = [];\n if (stream.type === 'separateAV') {\n streamURLs.push(\n { label: 'video stream', url: stream.video.url },\n { label: 'audio stream', url: stream.audio.url }\n );\n }\n else {\n streamURLs.push({ label: 'stream', url: stream.stream.url });\n }\n for (const { label, url } of streamURLs) {\n const startTime = new Date().getTime();\n let tries = 0;\n let testStreamResult = await this.#head(url, signal);\n while (!testStreamResult.ok && tries < 3) {\n if (signal?.aborted) {\n throw Error('Aborted');\n }\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validation failed (${testStreamResult.status} - ${testStreamResult.statusText}); retrying after 2s...`);\n await this.#sleep(2000, signal);\n tries++;\n testStreamResult = await this.#head(url, signal);\n }\n const endTime = new Date().getTime();\n const timeTaken = (endTime - startTime) / 1000;\n if (tries === 3) {\n this.log('warn', `(#${video.basic_info.id}) failed to validate YouTube ${label} URL \"${url}\" (retried ${tries} times in ${timeTaken}s).`);\n }\n else {\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validated in ${timeTaken}s.`);\n }\n }\n\n this.#video = video;\n const _quality = stream.type === 'separateAV' ? stream.video.quality : stream.stream.quality;\n const quality = _quality ? ` (${_quality})` : '';\n const basename = `youtube-${video.basic_info.id}${quality}`;\n const inputs: YouTubeFFmpegCommandParams['inputs'] = [];\n const outputOptions: FFmpegCommandParams['outputOptions'] = [];\n let ext = '';\n\n const __getInputFilePath = <T extends StreamType>(stream: Stream<T>) => {\n const _ext = ITAG_FORMATS[stream.itag]?.ext ? `.${ITAG_FORMATS[stream.itag].ext}` : '';\n return path.resolve(this.#destDir, FSHelper.sanitizeFilename(`${basename}.f${stream.itag}${_ext}`))\n };\n\n if (stream.type === 'separateAV') {\n this.log('debug', `Obtained separate video and audio stream URLs for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `Video stream URL: ${stream.video.url}`);\n this.log('debug', `Audio stream URL: ${stream.audio.url}`);\n inputs.push(\n {\n input: __getInputFilePath(stream.video),\n stream: stream.video\n },\n {\n input: __getInputFilePath(stream.audio),\n stream: stream.audio,\n }\n );\n outputOptions.push(\n '-map 0:v', // Copy all video streams from videoStreamURL\n '-map 1:a', // Copy all audio streams from audioStreamURL\n '-f mp4',\n '-strict experimental' // Required when muxing Opus audio into MP4 on older FFmpeg versions (< 4.3)\n );\n ext = '.mp4';\n }\n else {\n this.log('debug', `Obtained single stream URL for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `${stream.type === 'audioOnly' ? '(Audio only) '\n : stream.type === 'videoOnly' ? '(Video only) '\n : ''}Stream URL: ${stream.stream.url}`);\n inputs.push({\n input: __getInputFilePath(stream.stream),\n stream: stream.stream\n });\n if (stream.type === 'audioOnly') {\n outputOptions.push('-f m4a');\n ext = '.m4a';\n }\n }\n const output = path.resolve(this.#destDir, FSHelper.sanitizeFilename(`youtube-${video.basic_info.id}${quality}${ext}`));\n\n this.#ffmpegCommandParams = {\n inputs,\n output,\n outputOptions,\n noProxy: true // Inputs are going to be all local files, so should not use proxy.\n };\n\n return this.#ffmpegCommandParams;\n }\n\n protected getTargetDuration(): number | null {\n return this.#video?.basic_info.duration || null;\n }\n\n async #resolveURL(url: string): Promise<string> {\n if (!YouTubeDownloadTask.#innertubeForResolveURL) {\n YouTubeDownloadTask.#innertubeForResolveURL = await InnertubeLib.Innertube.create({\n player_id: '9f4cc5e4'\n });\n }\n const innertube = YouTubeDownloadTask.#innertubeForResolveURL;\n const endpoint = await innertube.resolveURL(url);\n /**\n * Endpoint MUST have `videoId` in its payload.\n * On first resolve of YT shared links ('https://youtu.be/...),\n * this returns `url` in the payload instead of `videoID`. We would\n * have to resolve it once more.\n */\n const payload = endpoint.payload && typeof endpoint.payload === 'object' ? endpoint.payload : null;\n if (payload && Reflect.has(payload, 'videoId')) {\n return payload.videoId;\n }\n if (payload && Reflect.has(payload, 'url')) {\n return this.#resolveURL(payload.url);\n }\n throw Error(`Failed to resolve YouTube URL \"${url}\": no videoId found`);\n }\n\n async #pickStream(video: YT.VideoInfo): Promise<StreamBundle | null> {\n const innertube = await this.getInnertube();\n const maxResolution = this.config.maxVideoResolution ?? null;\n\n // First, get the best streams without filtering\n let bestVideoWithAudio: Misc.Format | null;\n let bestVideo: Misc.Format | null;\n let bestAudio: Misc.Format | null;\n\n try {\n bestVideoWithAudio = video.chooseFormat({ quality: 'best', type: 'video+audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideoWithAudio = null;\n }\n try {\n // `bestVideo` may also contain audio\n bestVideo = video.chooseFormat({ quality: 'best', type: 'video', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideo = null;\n }\n try {\n // `bestAudio` is audio only\n bestAudio = video.chooseFormat({ quality: 'best', type: 'audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestAudio = null;\n }\n\n // If max resolution is set and video exceeds it, find a lower resolution\n if (maxResolution !== null && maxResolution > 0) {\n const checkAndDowngrade = (format: Misc.Format | null, type: 'video+audio' | 'video'): Misc.Format | null => {\n if (!format || !format.height) {\n return format;\n }\n\n if (format.height <= maxResolution) {\n // Current format is within limit\n return format;\n }\n\n // Current format exceeds limit, find best format at or below max resolution\n this.log('debug', `Video resolution ${format.height}p exceeds max ${maxResolution}p, finding lower resolution...`);\n\n const availableFormats = type === 'video+audio'\n ? (video.streaming_data?.formats || [])\n : (video.streaming_data?.adaptive_formats || []).filter(f => f.has_video);\n\n // Sort by height descending and find the best one at or below maxResolution\n const suitableFormats = availableFormats\n .filter(f => f.height && f.height <= maxResolution)\n .sort((a, b) => (b.height || 0) - (a.height || 0));\n\n if (suitableFormats.length > 0) {\n this.log('debug', `Selected ${suitableFormats[0].height}p as alternative`);\n return suitableFormats[0];\n }\n\n // No suitable format found, use original (better to have high res than nothing)\n this.log('warn', `No video format found at or below ${maxResolution}p, using original ${format.height}p`);\n return format;\n };\n\n bestVideoWithAudio = checkAndDowngrade(bestVideoWithAudio, 'video+audio');\n bestVideo = checkAndDowngrade(bestVideo, 'video');\n // Audio doesn't need downgrading\n }\n\n if (!bestVideoWithAudio && !bestVideo && !bestAudio) {\n return null;\n }\n\n const __decipher = async (format: Misc.Format) => {\n return {\n url: await format.decipher(innertube.session.player),\n quality: {\n video: format.quality_label || format.quality || '',\n audio: format.audio_quality || ''\n },\n itag: format.itag,\n contentLength: format.content_length\n };\n };\n\n if (bestVideoWithAudio && (\n (bestVideo && bestVideoWithAudio.itag === bestVideo.itag) || (!bestVideo && !bestAudio))) {\n\n const stream = await __decipher(bestVideoWithAudio);\n return {\n type: 'combinedAV',\n stream: {\n type: 'video+audio',\n quality: stream.quality.video,\n itag: stream.itag,\n contentLength: stream.contentLength,\n url: stream.url,\n cpn: video.cpn\n }\n };\n }\n\n const videoWithAudioStream = bestVideoWithAudio ? await __decipher(bestVideoWithAudio) : null;\n const videoStream = bestVideo ? await __decipher(bestVideo) : videoWithAudioStream;\n const audioStream = bestAudio ? await __decipher(bestAudio) : videoWithAudioStream;\n\n if (videoStream && audioStream) {\n return {\n type: 'separateAV',\n video: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n },\n audio: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (videoStream) {\n return {\n type: 'videoOnly',\n stream: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (audioStream) {\n return {\n type: 'audioOnly',\n stream: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n return null;\n }\n\n #sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new Error('Aborted'));\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error('Aborted'));\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n }\n\n async #head(url: string, signal?: AbortSignal) {\n const res = await fetch(url, { method: 'HEAD', signal, dispatcher: this.#fetcher.proxyAgent });\n return {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"YouTubeDownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/YouTubeDownloadTask.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport * as InnertubeLib from 'youtubei.js';\nimport { type YT, type Misc } from 'youtubei.js';\nimport { type YouTubePostEmbed } from '../../entities/Post.js';\nimport FFmpegDownloadTaskBase, { type FFmpegCommandParams, type FFmpegDownloadTaskBaseParams } from './FFmpegDownloadTaskBase.js';\nimport InnertubeLoader from '../../utils/yt/InnertubeLoader.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport fs from 'fs';\nimport DownloadTask from './DownloadTask.js';\nimport YouTubeStreamDownloadTask from './YouTubeStreamDownloadTask.js';\nimport { type FileExistsAction } from '../DownloaderOptions.js';\nimport type Fetcher from '../../utils/Fetcher.js';\nimport { fetch } from 'undici';\n\nexport interface YouTubeDownloadTaskParams extends FFmpegDownloadTaskBaseParams<YouTubePostEmbed> {\n destDir: string;\n fetcher: Fetcher;\n}\n\ninterface ItagFormat {\n ext: string;\n width?: number;\n height?: number;\n acodec?: string;\n abr?: number;\n vcodec?: string;\n format_note?: string;\n preference?: number;\n container?: string;\n fps?: number;\n}\n\n// Taken from yt-dlp:\n// https://github.com/yt-dlp/yt-dlp/blob/349f36606fa7fb658216334a73ac7825c13503c2/yt_dlp/extractor/youtube/_video.py#L138\nconst ITAG_FORMATS: Record<number, ItagFormat> = {\n // NB: Used in YoutubeWebArchiveIE and GoogleDriveIE\n 5: { 'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 6: { 'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 13: { 'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v' },\n 17: { 'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'abr': 24, 'vcodec': 'mp4v' },\n 18: { 'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 96, 'vcodec': 'h264' },\n 22: { 'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 34: { 'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 35: { 'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well\n 36: { 'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v' },\n 37: { 'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 38: { 'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 43: { 'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 44: { 'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 45: { 'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 46: { 'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 59: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 78: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // 3D videos\n 82: { 'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 83: { 'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 84: { 'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 85: { 'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 100: { 'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8', 'preference': -20 },\n 101: { 'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n 102: { 'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n\n // Apple HTTP Live Streaming\n 91: { 'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 92: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 93: { 'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 94: { 'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 95: { 'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 96: { 'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 132: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 151: { 'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 24, 'vcodec': 'h264', 'preference': -10 },\n\n // DASH mp4 video\n 133: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 134: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 135: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 136: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 137: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 138: { 'ext': 'mp4', 'format_note': 'DASH video', 'vcodec': 'h264' }, // Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)\n 160: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 212: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 264: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 298: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 299: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 266: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'h264' },\n\n // Dash mp4 audio\n 139: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 48, 'container': 'm4a_dash' },\n 140: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 128, 'container': 'm4a_dash' },\n 141: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 256, 'container': 'm4a_dash' },\n 256: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 258: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 325: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'dtse', 'container': 'm4a_dash' },\n 328: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'ec-3', 'container': 'm4a_dash' },\n\n // Dash webm\n 167: { 'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 168: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 169: { 'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 170: { 'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 218: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 219: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 278: { 'ext': 'webm', 'height': 144, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp9' },\n 242: { 'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 243: { 'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 244: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 245: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 246: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 247: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 248: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 271: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n\n // itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)\n 272: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 302: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 303: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 308: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 313: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 315: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n\n // Dash webm audio\n 171: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 128 },\n 172: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 256 },\n\n // Dash webm audio with opus inside\n 249: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 50 },\n 250: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 70 },\n 251: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 160 },\n\n // RTMP (unnamed)\n //'_rtmp': {'protocol': 'rtmp'},\n\n // av01 video only formats sometimes served with \"unknown\" codecs\n 394: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 395: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 396: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'av01.0.01M.08' },\n 397: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'av01.0.04M.08' },\n 398: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'av01.0.05M.08' },\n 399: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'av01.0.08M.08' },\n 400: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n 401: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n}\n\ntype StreamType = 'video' | 'audio' | 'video+audio';\n\ntype Stream<T extends StreamType> = {\n type: T;\n url: string;\n quality: string;\n itag: number;\n contentLength?: number;\n cpn: string;\n};\n\ntype StreamBundle = {\n type: 'separateAV';\n video: Stream<'video'>;\n audio: Stream<'audio'>;\n} | {\n type: 'combinedAV';\n stream: Stream<'video+audio'>;\n} | {\n type: 'videoOnly';\n stream: Stream<'video'>;\n} | {\n type: 'audioOnly';\n stream: Stream<'audio'>;\n};\n\ninterface YouTubeFFmpegCommandParams extends FFmpegCommandParams {\n inputs: (FFmpegCommandParams['inputs'][number] & { stream: Stream<any> })[];\n};\n\nexport default class YouTubeDownloadTask extends FFmpegDownloadTaskBase<YouTubePostEmbed> {\n\n name = 'YouTubeDownloadTask';\n\n static #innertubeForResolveURL: InnertubeLib.Innertube | null = null;\n\n #destDir: string;\n #fileExistsAction: FileExistsAction;\n #video: YT.VideoInfo | null;\n #ffmpegCommandParams: YouTubeFFmpegCommandParams | null;\n #fetcher: Fetcher;\n\n constructor(params: YouTubeDownloadTaskParams) {\n super(params);\n this.#destDir = params.destDir;\n this.#fileExistsAction = params.fileExistsAction;\n this.#video = null;\n this.#ffmpegCommandParams = null;\n this.#fetcher = params.fetcher;\n }\n\n protected async resolveDestPath(signal?: AbortSignal) {\n const params = await this.getFFmpegCommandParams(signal);\n return params.output;\n }\n\n async getInnertube() {\n return (await InnertubeLoader.getInstance(this.config)).innertube;\n }\n\n async #getInfo(videoId: string) {\n return (await InnertubeLoader.getInstance(this.config)).getVideoInfo(videoId);\n }\n\n protected async doStart() {\n const innertube = await this.getInnertube();\n const ffmpegParams = await this.getFFmpegCommandParams();\n\n const destFilePath = ffmpegParams.output;\n if (this.#fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {\n await this.setDownloaded(destFilePath);\n this.notifySkip({\n name: 'destFileExists',\n message: `Destination file exists (${destFilePath})`,\n existingDestFilePath: destFilePath\n });\n return;\n }\n\n const __checkStreamDownloads = (tasks: YouTubeStreamDownloadTask<any>[], resolve: (value: 'complete' | 'incomplete') => void) => {\n if (tasks.every((task) => task.hasEnded())) {\n resolve(tasks.every((task) => task.status === 'completed') ? 'complete' : 'incomplete');\n }\n }\n\n const streamDownloadsResult = await new Promise<'complete' | 'incomplete'>((resolve) => {\n void (async () => {\n const tasks = await Promise.all(ffmpegParams.inputs.map(({ input, stream }) =>\n DownloadTask.create(YouTubeStreamDownloadTask, {\n downloadType: 'main',\n callbacks: this.callbacks,\n config: this.config,\n logger: this.logger,\n src: this.src,\n srcEntity: this.srcEntity,\n innertube,\n stream,\n destFilePath: input,\n callback: () => __checkStreamDownloads(tasks, resolve)\n })\n ));\n for (const task of tasks) {\n this.callbacks?.onSpawn(this, task);\n }\n })();\n });\n\n try {\n if (streamDownloadsResult === 'complete') {\n if (this.config.dryRun) {\n this.log('debug', 'YouTube stream(s) downloaded');\n this.log('debug', '(dry-run) -> Skip FFmpeg processing on downloaded stream(s)');\n this.notifyComplete();\n }\n else {\n this.log('debug', 'YouTube stream(s) downloaded - going to run FFmpeg on downloaded stream(s)');\n await super.doStart();\n }\n return;\n }\n \n this.notifySkip({\n name: 'dependentTaskNotCompleted',\n message: 'One or more dependent tasks did not complete'\n });\n }\n finally {\n for (const { input } of ffmpegParams.inputs) {\n try {\n if (this.config.dryRun || fs.existsSync(input)) {\n this.log('debug', `Clean up \"${input}\"`);\n this.fsHelper.unlink(input);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${input}\":`, error);\n }\n }\n }\n }\n\n protected async getFFmpegCommandParams(signal?: AbortSignal): Promise<YouTubeFFmpegCommandParams> {\n if (this.#ffmpegCommandParams) {\n return this.#ffmpegCommandParams;\n }\n\n const videoURL = this.src;\n\n this.log('debug', `Fetch video info from \"${videoURL}\"`);\n const videoId = await this.#resolveURL(videoURL);\n const video = await this.#getInfo(videoId);\n\n this.log('debug', `Choose best-quality stream for YouTube video #${video.basic_info.id}`);\n const stream = await this.#pickStream(video);\n if (!stream) {\n const errMsg = `Stream not found for YouTube video #${video.basic_info.id || videoId}`;\n this.log('error', errMsg);\n if (video.playability_status) {\n this.log('error', `The playability status of the video is: ${video.playability_status.status} - ${video.playability_status.reason}`);\n }\n throw Error(errMsg);\n }\n\n // Test streams - YT sometimes imposes a delay before the streams become accessible\n const streamURLs: {label: string; url: string; }[] = [];\n if (stream.type === 'separateAV') {\n streamURLs.push(\n { label: 'video stream', url: stream.video.url },\n { label: 'audio stream', url: stream.audio.url }\n );\n }\n else {\n streamURLs.push({ label: 'stream', url: stream.stream.url });\n }\n for (const { label, url } of streamURLs) {\n const startTime = new Date().getTime();\n let tries = 0;\n let testStreamResult = await this.#head(url, signal);\n while (!testStreamResult.ok && tries < 3) {\n if (signal?.aborted) {\n throw Error('Aborted');\n }\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validation failed (${testStreamResult.status} - ${testStreamResult.statusText}); retrying after 2s...`);\n await this.#sleep(2000, signal);\n tries++;\n testStreamResult = await this.#head(url, signal);\n }\n const endTime = new Date().getTime();\n const timeTaken = (endTime - startTime) / 1000;\n if (tries === 3) {\n this.log('warn', `(#${video.basic_info.id}) failed to validate YouTube ${label} URL \"${url}\" (retried ${tries} times in ${timeTaken}s).`);\n }\n else {\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validated in ${timeTaken}s.`);\n }\n }\n\n this.#video = video;\n const _quality = stream.type === 'separateAV' ? stream.video.quality : stream.stream.quality;\n const quality = _quality ? ` (${_quality})` : '';\n const basename = `youtube-${video.basic_info.id}${quality}`;\n const inputs: YouTubeFFmpegCommandParams['inputs'] = [];\n const outputOptions: FFmpegCommandParams['outputOptions'] = [];\n let ext = '';\n\n const __getInputFilePath = <T extends StreamType>(stream: Stream<T>) => {\n const _ext = ITAG_FORMATS[stream.itag]?.ext ? `.${ITAG_FORMATS[stream.itag].ext}` : '';\n return path.resolve(this.#destDir, FSHelper.sanitizeFilename(`${basename}.f${stream.itag}${_ext}`))\n };\n\n if (stream.type === 'separateAV') {\n this.log('debug', `Obtained separate video and audio stream URLs for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `Video stream URL: ${stream.video.url}`);\n this.log('debug', `Audio stream URL: ${stream.audio.url}`);\n inputs.push(\n {\n input: __getInputFilePath(stream.video),\n stream: stream.video\n },\n {\n input: __getInputFilePath(stream.audio),\n stream: stream.audio,\n }\n );\n outputOptions.push(\n '-map 0:v', // Copy all video streams from videoStreamURL\n '-map 1:a', // Copy all audio streams from audioStreamURL\n '-f mp4',\n '-strict experimental' // Required when muxing Opus audio into MP4 on older FFmpeg versions (< 4.3)\n );\n ext = '.mp4';\n }\n else {\n this.log('debug', `Obtained single stream URL for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `${stream.type === 'audioOnly' ? '(Audio only) '\n : stream.type === 'videoOnly' ? '(Video only) '\n : ''}Stream URL: ${stream.stream.url}`);\n inputs.push({\n input: __getInputFilePath(stream.stream),\n stream: stream.stream\n });\n if (stream.type === 'audioOnly') {\n outputOptions.push('-f m4a');\n ext = '.m4a';\n }\n }\n const output = path.resolve(this.#destDir, FSHelper.sanitizeFilename(`youtube-${video.basic_info.id}${quality}${ext}`));\n\n this.#ffmpegCommandParams = {\n inputs,\n output,\n outputOptions,\n noProxy: true // Inputs are going to be all local files, so should not use proxy.\n };\n\n return this.#ffmpegCommandParams;\n }\n\n protected getTargetDuration(): number | null {\n return this.#video?.basic_info.duration || null;\n }\n\n async #resolveURL(url: string): Promise<string> {\n if (!YouTubeDownloadTask.#innertubeForResolveURL) {\n YouTubeDownloadTask.#innertubeForResolveURL = await InnertubeLib.Innertube.create();\n }\n const innertube = YouTubeDownloadTask.#innertubeForResolveURL;\n const endpoint = await innertube.resolveURL(url);\n /**\n * Endpoint MUST have `videoId` in its payload.\n * On first resolve of YT shared links ('https://youtu.be/...),\n * this returns `url` in the payload instead of `videoID`. We would\n * have to resolve it once more.\n */\n const payload = endpoint.payload && typeof endpoint.payload === 'object' ? endpoint.payload : null;\n if (payload && Reflect.has(payload, 'videoId')) {\n return payload.videoId;\n }\n if (payload && Reflect.has(payload, 'url')) {\n return this.#resolveURL(payload.url);\n }\n throw Error(`Failed to resolve YouTube URL \"${url}\": no videoId found`);\n }\n\n async #pickStream(video: YT.VideoInfo): Promise<StreamBundle | null> {\n const innertube = await this.getInnertube();\n const maxResolution = this.config.maxVideoResolution ?? null;\n\n // First, get the best streams without filtering\n let bestVideoWithAudio: Misc.Format | null;\n let bestVideo: Misc.Format | null;\n let bestAudio: Misc.Format | null;\n\n try {\n bestVideoWithAudio = video.chooseFormat({ quality: 'best', type: 'video+audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideoWithAudio = null;\n }\n try {\n // `bestVideo` may also contain audio\n bestVideo = video.chooseFormat({ quality: 'best', type: 'video', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideo = null;\n }\n try {\n // `bestAudio` is audio only\n bestAudio = video.chooseFormat({ quality: 'best', type: 'audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestAudio = null;\n }\n\n // If max resolution is set and video exceeds it, find a lower resolution\n if (maxResolution !== null && maxResolution > 0) {\n const checkAndDowngrade = (format: Misc.Format | null, type: 'video+audio' | 'video'): Misc.Format | null => {\n if (!format || !format.height) {\n return format;\n }\n\n if (format.height <= maxResolution) {\n // Current format is within limit\n return format;\n }\n\n // Current format exceeds limit, find best format at or below max resolution\n this.log('debug', `Video resolution ${format.height}p exceeds max ${maxResolution}p, finding lower resolution...`);\n\n const availableFormats = type === 'video+audio'\n ? (video.streaming_data?.formats || [])\n : (video.streaming_data?.adaptive_formats || []).filter(f => f.has_video);\n\n // Sort by height descending and find the best one at or below maxResolution\n const suitableFormats = availableFormats\n .filter(f => f.height && f.height <= maxResolution)\n .sort((a, b) => (b.height || 0) - (a.height || 0));\n\n if (suitableFormats.length > 0) {\n this.log('debug', `Selected ${suitableFormats[0].height}p as alternative`);\n return suitableFormats[0];\n }\n\n // No suitable format found, use original (better to have high res than nothing)\n this.log('warn', `No video format found at or below ${maxResolution}p, using original ${format.height}p`);\n return format;\n };\n\n bestVideoWithAudio = checkAndDowngrade(bestVideoWithAudio, 'video+audio');\n bestVideo = checkAndDowngrade(bestVideo, 'video');\n // Audio doesn't need downgrading\n }\n\n if (!bestVideoWithAudio && !bestVideo && !bestAudio) {\n return null;\n }\n\n const __decipher = async (format: Misc.Format) => {\n return {\n url: await format.decipher(innertube.session.player),\n quality: {\n video: format.quality_label || format.quality || '',\n audio: format.audio_quality || ''\n },\n itag: format.itag,\n contentLength: format.content_length\n };\n };\n\n if (bestVideoWithAudio && (\n (bestVideo && bestVideoWithAudio.itag === bestVideo.itag) || (!bestVideo && !bestAudio))) {\n\n const stream = await __decipher(bestVideoWithAudio);\n return {\n type: 'combinedAV',\n stream: {\n type: 'video+audio',\n quality: stream.quality.video,\n itag: stream.itag,\n contentLength: stream.contentLength,\n url: stream.url,\n cpn: video.cpn\n }\n };\n }\n\n const videoWithAudioStream = bestVideoWithAudio ? await __decipher(bestVideoWithAudio) : null;\n const videoStream = bestVideo ? await __decipher(bestVideo) : videoWithAudioStream;\n const audioStream = bestAudio ? await __decipher(bestAudio) : videoWithAudioStream;\n\n if (videoStream && audioStream) {\n return {\n type: 'separateAV',\n video: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n },\n audio: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (videoStream) {\n return {\n type: 'videoOnly',\n stream: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (audioStream) {\n return {\n type: 'audioOnly',\n stream: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n return null;\n }\n\n #sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new Error('Aborted'));\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error('Aborted'));\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n }\n\n async #head(url: string, signal?: AbortSignal) {\n const res = await fetch(url, { method: 'HEAD', signal, dispatcher: this.#fetcher.proxyAgent });\n return {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText\n };\n }\n}\n"]}
|
|
@@ -61,9 +61,14 @@ class PageParser extends Parser {
|
|
|
61
61
|
}
|
|
62
62
|
const campaignIdRegex = /{\\"self\\":\\"https:\/\/www\.patreon\.com\/api\/campaigns\/(.+?)\\"}/gm;
|
|
63
63
|
this.log('debug', `Trying pattern in Next.js streaming response: ${campaignIdRegex}`);
|
|
64
|
-
|
|
64
|
+
let campaignIdMatch = campaignIdRegex.exec(html);
|
|
65
65
|
if (!campaignIdMatch || !campaignIdMatch[1]) {
|
|
66
|
-
|
|
66
|
+
const campaignIdRegexSimple = /{\\"self\\":\\"https:\/\/[^"]+\/api\/campaigns\/(.+?)\\"}/gm;
|
|
67
|
+
this.log('debug', `Trying fallback pattern: ${campaignIdRegexSimple}`);
|
|
68
|
+
campaignIdMatch = campaignIdRegexSimple.exec(html);
|
|
69
|
+
}
|
|
70
|
+
if (!campaignIdMatch || !campaignIdMatch[1]) {
|
|
71
|
+
throw Error(`Initial data not found - campaign ID not found in Next.js streaming response`);
|
|
67
72
|
}
|
|
68
73
|
const campaignId = campaignIdMatch ? campaignIdMatch[1] : undefined;
|
|
69
74
|
return {
|