patreon-dl 1.6.1 → 1.6.2

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 CHANGED
@@ -641,6 +641,9 @@ Each event emitted by a download task batch has a payload, which is an object wi
641
641
 
642
642
  ## Changelog
643
643
 
644
+ v1.6.2
645
+ - Fix 'campaign ID not found' error due to Patreon changes
646
+
644
647
  v1.6.1
645
648
  - Fix file extension sometimes missing ([#20](https://github.com/patrickkfkan/patreon-dl/issues/20))
646
649
 
@@ -486,8 +486,8 @@ _PostDownloader_startPromise = new WeakMap(), _PostDownloader_instances = new We
486
486
  }
487
487
  throw Error();
488
488
  }
489
- const campaignId = ObjectHelper.getProperty(initialData, 'bootstrap.campaign.data.id');
490
- const currentUserId = ObjectHelper.getProperty(initialData, 'bootstrap.currentUser.data.id');
489
+ const campaignId = ObjectHelper.getProperty(initialData, 'pageBootstrap.campaign.data.id');
490
+ const currentUserId = ObjectHelper.getProperty(initialData, 'commonBootstrap.currentUser.data.id');
491
491
  this.log('debug', `Initial data: campaign ID '${campaignId}'; current user ID '${currentUserId}'`);
492
492
  if (!campaignId) {
493
493
  const err = Error(`Campaign ID not found in initial data of "${url}"`);
@@ -1 +1 @@
1
- {"version":3,"file":"PostDownloader.js","sourceRoot":"","sources":["../../src/downloaders/PostDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbortError } from 'node-fetch';\nimport FSHelper from '../utils/FSHelper.js';\nimport URLHelper, { PostSortOrder } from '../utils/URLHelper.js';\nimport Downloader, { DownloaderConfig, DownloaderStartParams } from './Downloader.js';\nimport DownloadTaskBatch from './task/DownloadTaskBatch.js';\nimport PageParser from '../parsers/PageParser.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport PostParser from '../parsers/PostParser.js';\nimport { Post } from '../entities/Post.js';\nimport { Downloadable, isYouTubeEmbed } from '../entities/Downloadable.js';\nimport StatusCache from './cache/StatusCache.js';\nimport { generatePostEmbedSummary, generatePostSummary } from './templates/PostInfo.js';\nimport path from 'path';\nimport { TargetSkipReason } from './DownloaderEvent.js';\nimport DownloadTaskFactory from './task/DownloadTaskFactory.js';\n\nexport default class PostDownloader extends Downloader<Post> {\n\n static version = '1.1.1';\n\n name = 'PostDownloader';\n\n #startPromise: Promise<void> | null = null;\n\n start(params?: DownloaderStartParams): Promise<void> {\n\n if (this.#startPromise) {\n throw Error('Downloader already running');\n }\n\n this.#startPromise = new Promise<void>(async (resolve) => {\n\n const { signal } = params || {};\n const postFetch = this.config.postFetch;\n let batch: DownloadTaskBatch | null = null;\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n const abortHandler = async () => {\n this.log('info', 'Abort signal received');\n if (batch) {\n await batch.abort();\n }\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n\n if (postFetch.type === 'byUser') {\n this.log('info', `Targeting posts by '${postFetch.vanity}'`);\n }\n else if (postFetch.type === 'byUserId') {\n this.log('info', `Targeting posts by user #${postFetch.userId}`);\n }\n else if (postFetch.type === 'byCollection') {\n this.log('info', `Targeting posts in collection #${postFetch.collectionId}`);\n }\n else { // Single\n this.log('info', `Targeting post #${postFetch.postId}`);\n }\n if (this.#isFetchingMultiplePosts(postFetch) && postFetch.filters) {\n const filterStr = Object.entries(postFetch.filters).map(([ key, value ]) => `${key}=${value}`).join('; ');\n if (filterStr) {\n this.log('info', `Filters: ${filterStr}`);\n }\n }\n\n // Step 1: Get initial posts (if by user) or target post\n let postsAPIURL: string;\n try {\n postsAPIURL = await this.#getInitialPostsAPIUL(signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n if (this.#isFetchingMultiplePosts(postFetch)) {\n this.log('info', 'Fetch posts');\n this.log('debug', `Request initial posts from API URL \"${postsAPIURL}\"`);\n this.emit('fetchBegin', { targetType: 'posts' });\n }\n else {\n this.log('info', 'Fetch target post');\n this.log('debug', `Request post #${postFetch.postId} from API URL \"${postsAPIURL}`);\n this.emit('fetchBegin', { targetType: 'post' });\n }\n let json;\n try {\n json = await this.#requestPosts(postsAPIURL, signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n\n // Step 2: parse, download and, if targeting posts by user, repeat for next batch\n const postsParser = new PostParser(this.logger);\n let total: number | null = null;\n let downloaded = 0;\n let skippedUnviewable = 0;\n let skippedRedundant = 0;\n let skippedUnmetMediaTypeCriteria = 0;\n let skippedNotInTier = 0;\n let campaignSaved = false;\n while (json) {\n const collection = postsParser.parsePostsAPIResponse(json, postsAPIURL);\n\n if (!campaignSaved && collection.posts[0]?.campaign) {\n await this.saveCampaignInfo(collection.posts[0].campaign, signal);\n campaignSaved = true;\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n }\n\n total = collection.total;\n if (this.#isFetchingMultiplePosts(postFetch)) {\n this.log('debug', `${collection.posts.length} posts fetched`);\n }\n\n for (const post of collection.posts) {\n\n this.emit('targetBegin', { target: post });\n\n // Step 4.1: post directories\n const postDirs = FSHelper.getPostDirs(post, this.config);\n this.log('debug', 'Post directories:', postDirs);\n\n // Step 4.2: Check with status cache\n const statusCache = StatusCache.getInstance(postDirs.statusCache, this.logger, this.config.useStatusCache);\n if (statusCache.validate(post, postDirs.root, this.config)) {\n this.log('info', `Skipped downloading post #${post.id}: already downloaded and nothing has changed since last download`);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.AlreadyDownloaded,\n skipMessage: 'Target already downloaded and nothing has changed since last download'\n });\n skippedRedundant++;\n continue;\n }\n\n this.log('info', `Download post #${post.id} (${post.title})`);\n\n // Step 4.3: Check whether we should download post\n // -- 4.3.1: Viewability\n if (!post.isViewable) {\n if (this.config.include.lockedContent) {\n this.log('warn', `Post #${post.id} is not viewable by current user`);\n }\n else {\n this.log('warn', `Skipped downloading post #${post.id}: not viewable by current user`);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.Inaccessible,\n skipMessage: 'Target is not viewable by current user'\n });\n skippedUnviewable++;\n continue;\n }\n }\n\n // -- 4.3.2: Config option 'include.postsWithMediaType'\n const postsWithMediaType = this.config.include.postsWithMediaType;\n if (postsWithMediaType !== 'any') {\n const hasAttachments = post.attachments.length > 0;\n const hasAudio = !!post.audio || !!post.audioPreview;\n const hasImages = post.images.length > 0;\n const hasVideo = !!post.video || !!post.videoPreview || !!(post.embed && post.embed.type === 'videoEmbed');\n\n let skip = false;\n if (postsWithMediaType === 'none') {\n skip = hasAttachments || hasAudio || hasImages || hasVideo;\n }\n else if (Array.isArray(postsWithMediaType)) {\n skip = !(\n (postsWithMediaType.includes('attachment') && hasAttachments) ||\n (postsWithMediaType.includes('audio') && hasAudio) ||\n (postsWithMediaType.includes('image') && hasImages) ||\n (postsWithMediaType.includes('video') && hasVideo));\n }\n\n if (skip) {\n this.log('warn', `Skipped downloading post #${post.id}: unmet media type criteria`);\n this.log('debug', 'Match criteria failed:', `config.include.postsWithMediaType: ${JSON.stringify(postsWithMediaType)} <-> post #${post.id}:`, {\n hasAttachments,\n hasAudio,\n hasImages,\n hasVideo\n });\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.UnmetMediaTypeCriteria,\n skipMessage: 'Target does not meet media type criteria'\n });\n skippedUnmetMediaTypeCriteria++;\n continue;\n }\n }\n\n // -- 4.3.3: Config option 'include.postsInTier'\n const postsInTier = this.config.include.postsInTier;\n const isAnyTier = postsInTier === 'any' || postsInTier.includes('any');\n if (!isAnyTier) {\n const applicableTierIds = postsInTier.filter((id) => post.campaign?.rewards.find((r) => r.id === id));\n if (!post.campaign) {\n this.log('warn', 'config.include.postsInTier: ignored - post missing campaign info');\n }\n else {\n this.log('debug', 'config.include.postsInTier: applicable tier IDs:', applicableTierIds);\n }\n let skip = false;\n if (!post.campaign) {\n skip = false;\n }\n else if (applicableTierIds.length === 0) {\n skip = true;\n }\n else if (!post.tiers.find((tier) => tier.id === 'patrons')) {\n skip = applicableTierIds.every((id) => !post.tiers.find((tier) => tier.id === id));\n }\n if (skip) {\n this.log('warn', `Skipped downloading post #${post.id}: not in tier`);\n this.log('debug', 'Match criteria failed:', `config.include.postsInTier: ${JSON.stringify(applicableTierIds)} <-> post #${post.id}:`, post.tiers);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.NotInTier,\n skipMessage: 'Target not in tier'\n });\n skippedNotInTier++;\n continue;\n }\n if (post.campaign) {\n this.log('debug', 'Match criteria OK:', `config.include.postsInTier: ${JSON.stringify(applicableTierIds)} <-> post #${post.id}:`, post.tiers);\n }\n }\n\n // Step 4.4: Save post info\n if (this.config.include.contentInfo) {\n this.log('info', `Save post info #${post.id}`);\n this.emit('phaseBegin', { target: post, phase: 'saveInfo' });\n FSHelper.createDir(postDirs.info);\n // Post raw data might not be complete or consistent with other posts in the collection.\n // Fetch directly from API.\n // Strictly speaking, we should check for 'error' in results, but since it's not going to be fatal we'll just skip it.\n const { json: fetchedPostAPIData } = await this.commonFetchAPI(\n URLHelper.constructPostsAPIURL({\n postId: post.id,\n campaignId: post.campaign?.id\n }),\n signal\n );\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n // Save summary and raw json\n const summary = generatePostSummary(post);\n const summaryFile = path.resolve(postDirs.info, 'info.txt');\n const saveSummaryResult = await FSHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, post, 'post summary');\n\n const postRawFile = path.resolve(postDirs.info, 'post-api.json');\n const savePostRawResult = await FSHelper.writeTextFile(\n postRawFile, fetchedPostAPIData || post.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(savePostRawResult, post, 'post API data');\n this.emit('phaseEnd', { target: post, phase: 'saveInfo' });\n\n // (Downloading of info media items deferred to the next step)\n }\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseBegin', { target: post, phase: 'saveMedia' });\n }\n\n // Step 4.5: save embed info\n if (post.embed && this.config.include.contentMedia) {\n this.log('info', `Save embed info of post #${post.id}`);\n FSHelper.createDir(postDirs.embed);\n const embedSummary = generatePostEmbedSummary(post.embed);\n let embedFilename;\n switch (post.embed.type) {\n case 'videoEmbed':\n embedFilename = 'embedded-video.txt';\n break;\n case 'linkEmbed':\n embedFilename = 'embedded-link.txt';\n break;\n default:\n embedFilename = 'embedded-unknown.txt';\n }\n const embedFile = path.resolve(postDirs.embed, embedFilename);\n const saveSummaryResult = await FSHelper.writeTextFile(embedFile, embedSummary, this.config.fileExistsAction.content);\n this.logWriteTextFileResult(saveSummaryResult, post, 'embed info');\n }\n\n // Step 4.6: create download tasks\n if (this.config.include.previewMedia ||\n this.config.include.contentMedia ||\n this.config.include.contentInfo) {\n\n batch = this.#createDownloadTaskBatchForPost(post, postDirs);\n\n if (this.config.include.contentInfo) {\n const infoElements: Downloadable[] = [];\n if (post.coverImage) {\n infoElements.push(post.coverImage);\n }\n if (post.thumbnail) {\n infoElements.push(post.thumbnail);\n }\n if (infoElements.length > 0) {\n this.addToDownloadTaskBatch(batch,\n {\n target: infoElements,\n targetName: `post #${post.id} -> info elements`,\n destDir: postDirs.info,\n fileExistsAction: this.config.fileExistsAction.info\n }\n );\n }\n }\n\n this.log('info', `Download batch created (#${batch.id}): ${batch.getTasks('pending').length} downloads pending`);\n this.emit('phaseBegin', { target: post, phase: 'batchDownload', batch });\n\n await batch.start();\n\n // Step 4.7: Update status cache\n statusCache.updateOnDownload(post, postDirs.root, batch.getTasks('error').length > 0, this.config);\n\n await batch.destroy();\n batch = null;\n this.emit('phaseEnd', { target: post, phase: 'batchDownload'});\n }\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseEnd', { target: post, phase: 'saveMedia' });\n }\n\n downloaded++;\n this.emit('targetEnd', { target: post, isSkipped: false });\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n }\n\n if (this.#isFetchingMultiplePosts(postFetch)) {\n if (collection.nextURL) {\n this.log('info', 'Fetch more posts');\n this.log('debug', `Request next batch of posts from API URL \"${collection.nextURL}`);\n this.emit('fetchBegin', { targetType: 'posts' });\n try {\n json = await this.#requestPosts(collection.nextURL, signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n }\n else {\n this.log('debug', 'No further posts to fetch');\n json = null;\n }\n }\n else {\n json = null;\n }\n }\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n // Done\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n if (postFetch.type === 'byUser') {\n this.log('info', `Done downloading posts by '${postFetch.vanity}'`);\n }\n else if (postFetch.type === 'byUserId') {\n this.log('info', `Done downloading posts by user #${postFetch.userId}`);\n }\n else if (postFetch.type === 'byCollection') {\n this.log('info', `Done downloading posts in collection #${postFetch.collectionId}`);\n }\n else {\n this.log('info', `Done downloading post #${postFetch.postId}`);\n }\n let endMessage = 'Done';\n if (this.#isFetchingMultiplePosts(postFetch)) {\n const skippedStrParts: string[] = [];\n if (skippedUnviewable) {\n skippedStrParts.push(`${skippedUnviewable} unviewable`);\n }\n if (skippedRedundant) {\n skippedStrParts.push(`${skippedRedundant} redundant`);\n }\n if (skippedUnmetMediaTypeCriteria) {\n skippedStrParts.push(`${skippedUnmetMediaTypeCriteria} with unmet media type criteria`);\n }\n if (skippedNotInTier) {\n skippedStrParts.push(`${skippedNotInTier} not in tier`);\n }\n const skippedStr = skippedStrParts.length > 0 ? ` (skipped: ${skippedStrParts.join(', ')})` : '';\n endMessage = `Total ${downloaded} / ${total} posts processed${skippedStr}`;\n this.log('info', endMessage);\n }\n this.emit('end', { aborted: false, message: endMessage });\n this.#startPromise = null;\n resolve();\n })\n .finally(async () => {\n if (this.logger) {\n await this.logger.end();\n }\n this.#startPromise = null;\n });\n\n return this.#startPromise;\n }\n\n #isFetchingMultiplePosts(postFetch: DownloaderConfig<Post>['postFetch']): postFetch is DownloaderConfig<Post>['postFetch'] & { type: 'byUser' | 'byUserId' | 'byCollection' } {\n return postFetch.type === 'byUser' || postFetch.type === 'byUserId' || postFetch.type === 'byCollection';\n }\n\n async #getInitialPostsAPIUL(signal: AbortSignal | undefined, resolveOnAbort: () => void, resolveOnError: () => void) {\n const postFetch = this.config.postFetch;\n if (this.#isFetchingMultiplePosts(postFetch)) {\n const pageURL = this.#getInitialDataPageURL();\n const { campaignId, currentUserId } = await this.#getInitialData(pageURL, signal, resolveOnAbort, resolveOnError);\n let sort: PostSortOrder | undefined;\n if (postFetch.type === 'byCollection') {\n sort = PostSortOrder.CollectionOrder;\n }\n\n return URLHelper.constructPostsAPIURL({\n campaignId,\n currentUserId: this.config.include.lockedContent ? undefined : currentUserId,\n filters: postFetch.filters,\n sort\n });\n }\n\n return URLHelper.constructPostsAPIURL({ postId: postFetch.postId });\n }\n\n #getInitialDataPageURL() {\n const postFetch = this.config.postFetch;\n switch (postFetch.type) {\n case 'byUser':\n return URLHelper.constructCampaignPageURL({ vanity: postFetch.vanity });\n case 'byUserId':\n return URLHelper.constructCampaignPageURL({ userId: postFetch.userId });\n case 'byCollection':\n return URLHelper.constructCollectionURL(postFetch.collectionId);\n default:\n throw Error(`postFetch type mismatch: expecting 'byUser', 'byUserId' or 'byCollection' but got '${postFetch.type}'`);\n }\n }\n\n async #getInitialData(url: string, signal: AbortSignal | undefined, resolveOnAbort?: () => void, resolveOnError?: () => void) {\n this.log('debug', `Fetch initial data from \"${url}\"`);\n let page, requestPageError;\n try {\n page = await this.fetcher.get({ url, type: 'html', maxRetries: this.config.request.maxRetries, signal });\n }\n catch (error) {\n if (error instanceof AbortError) {\n this.log('warn', 'Page request aborted');\n }\n else {\n requestPageError = error;\n }\n page = null;\n }\n if (!page) {\n if (resolveOnAbort && this.checkAbortSignal(signal, resolveOnAbort)) {\n throw Error();\n }\n this.log('error', `Error requesting page \"${url}\": `, requestPageError);\n this.emit('end', { aborted: false, error: requestPageError, message: 'Request error' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n const pageParser = new PageParser(this.logger);\n let initialData, parseInitialDataError;\n try {\n initialData = pageParser.parseInitialData(page, url);\n }\n catch (error) {\n parseInitialDataError = error;\n initialData = null;\n }\n if (!initialData) {\n this.log('error', `Failed to obtain initial page data from \"${url}\":`, parseInitialDataError);\n this.emit('end', { aborted: false, error: parseInitialDataError, message: 'Parse error' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n const campaignId = ObjectHelper.getProperty(initialData, 'bootstrap.campaign.data.id');\n const currentUserId = ObjectHelper.getProperty(initialData, 'bootstrap.currentUser.data.id');\n this.log('debug', `Initial data: campaign ID '${campaignId}'; current user ID '${currentUserId}'`);\n if (!campaignId) {\n const err = Error(`Campaign ID not found in initial data of \"${url}\"`);\n this.log('error', err);\n this.emit('end', { aborted: false, error: err, message: 'Data error (campaign ID not found)' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n\n return { campaignId, currentUserId };\n }\n\n async __getCampaign(signal?: AbortSignal) {\n let url: string | null;\n const postFetch = this.config.postFetch;\n switch (postFetch.type) {\n case 'byUser':\n url = URLHelper.constructCampaignPageURL({ vanity: postFetch.vanity });\n break;\n case 'byUserId':\n url = URLHelper.constructCampaignPageURL({ userId: postFetch.userId });\n break;\n default:\n url = null;\n }\n if (!url) {\n throw Error('Internal error: invalid config');\n }\n const { campaignId } = await this.#getInitialData(url, signal);\n const postsParser = new PostParser(this.logger);\n const res = await this.fetchCampaign(campaignId);\n if (signal?.aborted) {\n throw new AbortError();\n }\n if (res.error) {\n throw res.error;\n }\n return postsParser.parseCampaignAPIResponse(res.json);\n }\n\n async #requestPosts(url: string, signal: AbortSignal | undefined, resolveOnAbort: () => void, resolveOnError: () => void) {\n const { json, error: requestAPIError } = await this.commonFetchAPI(url, signal);\n if (!json) {\n if (this.checkAbortSignal(signal, resolveOnAbort)) {\n throw Error();\n }\n this.log('error', 'Failed to fetch posts');\n this.log('warn', 'End with error');\n this.emit('end', { aborted: false, error: requestAPIError, message: 'API request error' });\n resolveOnError();\n throw Error();\n }\n return json;\n }\n\n #createDownloadTaskBatchForPost(post: Post, postDirs: ReturnType<typeof FSHelper['getPostDirs']>) {\n\n const incPreview = this.config.include.previewMedia;\n const incContent = this.config.include.contentMedia;\n\n const __incPreview = (mediaType: 'audio' | 'video' | 'image') => {\n if (typeof incPreview === 'boolean') {\n return incPreview;\n }\n return incPreview.includes(mediaType);\n };\n\n const __incContent = (mediaType: 'audio' | 'video' | 'image' | 'attachment') => {\n if (typeof incContent === 'boolean') {\n return incContent;\n }\n return incContent.includes(mediaType);\n };\n\n const batch = this.createDownloadTaskBatch(\n `Post #${post.id} (${post.title})`,\n\n __incPreview('audio') && post.audioPreview ? {\n target: [ post.audioPreview ],\n targetName: `post #${post.id} -> audio preview`,\n destDir: postDirs.audioPreview,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incPreview('video') && post.videoPreview ? {\n target: [ post.videoPreview ],\n targetName: `post #${post.id} -> video preview`,\n destDir: postDirs.videoPreview,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n /**\n * If post is not viewable by current user, its images will be\n * blurry and we should categorize them as image previews.\n */\n __incPreview('image') && post.images.length > 0 && !post.isViewable ? {\n target: post.images,\n targetName: `post #${post.id} -> image previews`,\n destDir: postDirs.imagePreviews,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('audio') && post.audio ? {\n target: [ post.audio ],\n targetName: `post #${post.id} -> audio`,\n destDir: postDirs.audio,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('video') && post.video ? {\n target: [ post.video ],\n targetName: `post #${post.id} -> video`,\n destDir: postDirs.video,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('image') && post.images.length > 0 && post.isViewable ? {\n target: post.images,\n targetName: `post #${post.id} -> images`,\n destDir: postDirs.images,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('attachment') && post.attachments.length > 0 ? {\n target: post.attachments,\n targetName: `post #${post.id} -> attachments`,\n destDir: postDirs.attachments,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('video') && post.embed &&\n (isYouTubeEmbed(post.embed) || DownloadTaskFactory.findEmbedDownloader(this.config.embedDownloaders, post.embed.provider)) ?\n {\n target: [ post.embed ],\n targetName: `post #${post.id} -> embedded ${post.embed.provider} video`,\n destDir: postDirs.embed,\n fileExistsAction: this.config.fileExistsAction.content\n } : null\n );\n\n return batch;\n }\n}\n"]}
1
+ {"version":3,"file":"PostDownloader.js","sourceRoot":"","sources":["../../src/downloaders/PostDownloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbortError } from 'node-fetch';\nimport FSHelper from '../utils/FSHelper.js';\nimport URLHelper, { PostSortOrder } from '../utils/URLHelper.js';\nimport Downloader, { DownloaderConfig, DownloaderStartParams } from './Downloader.js';\nimport DownloadTaskBatch from './task/DownloadTaskBatch.js';\nimport PageParser from '../parsers/PageParser.js';\nimport ObjectHelper from '../utils/ObjectHelper.js';\nimport PostParser from '../parsers/PostParser.js';\nimport { Post } from '../entities/Post.js';\nimport { Downloadable, isYouTubeEmbed } from '../entities/Downloadable.js';\nimport StatusCache from './cache/StatusCache.js';\nimport { generatePostEmbedSummary, generatePostSummary } from './templates/PostInfo.js';\nimport path from 'path';\nimport { TargetSkipReason } from './DownloaderEvent.js';\nimport DownloadTaskFactory from './task/DownloadTaskFactory.js';\n\nexport default class PostDownloader extends Downloader<Post> {\n\n static version = '1.1.1';\n\n name = 'PostDownloader';\n\n #startPromise: Promise<void> | null = null;\n\n start(params?: DownloaderStartParams): Promise<void> {\n\n if (this.#startPromise) {\n throw Error('Downloader already running');\n }\n\n this.#startPromise = new Promise<void>(async (resolve) => {\n\n const { signal } = params || {};\n const postFetch = this.config.postFetch;\n let batch: DownloadTaskBatch | null = null;\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n const abortHandler = async () => {\n this.log('info', 'Abort signal received');\n if (batch) {\n await batch.abort();\n }\n };\n if (signal) {\n signal.addEventListener('abort', abortHandler, { once: true });\n }\n\n if (postFetch.type === 'byUser') {\n this.log('info', `Targeting posts by '${postFetch.vanity}'`);\n }\n else if (postFetch.type === 'byUserId') {\n this.log('info', `Targeting posts by user #${postFetch.userId}`);\n }\n else if (postFetch.type === 'byCollection') {\n this.log('info', `Targeting posts in collection #${postFetch.collectionId}`);\n }\n else { // Single\n this.log('info', `Targeting post #${postFetch.postId}`);\n }\n if (this.#isFetchingMultiplePosts(postFetch) && postFetch.filters) {\n const filterStr = Object.entries(postFetch.filters).map(([ key, value ]) => `${key}=${value}`).join('; ');\n if (filterStr) {\n this.log('info', `Filters: ${filterStr}`);\n }\n }\n\n // Step 1: Get initial posts (if by user) or target post\n let postsAPIURL: string;\n try {\n postsAPIURL = await this.#getInitialPostsAPIUL(signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n if (this.#isFetchingMultiplePosts(postFetch)) {\n this.log('info', 'Fetch posts');\n this.log('debug', `Request initial posts from API URL \"${postsAPIURL}\"`);\n this.emit('fetchBegin', { targetType: 'posts' });\n }\n else {\n this.log('info', 'Fetch target post');\n this.log('debug', `Request post #${postFetch.postId} from API URL \"${postsAPIURL}`);\n this.emit('fetchBegin', { targetType: 'post' });\n }\n let json;\n try {\n json = await this.#requestPosts(postsAPIURL, signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n\n // Step 2: parse, download and, if targeting posts by user, repeat for next batch\n const postsParser = new PostParser(this.logger);\n let total: number | null = null;\n let downloaded = 0;\n let skippedUnviewable = 0;\n let skippedRedundant = 0;\n let skippedUnmetMediaTypeCriteria = 0;\n let skippedNotInTier = 0;\n let campaignSaved = false;\n while (json) {\n const collection = postsParser.parsePostsAPIResponse(json, postsAPIURL);\n\n if (!campaignSaved && collection.posts[0]?.campaign) {\n await this.saveCampaignInfo(collection.posts[0].campaign, signal);\n campaignSaved = true;\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n }\n\n total = collection.total;\n if (this.#isFetchingMultiplePosts(postFetch)) {\n this.log('debug', `${collection.posts.length} posts fetched`);\n }\n\n for (const post of collection.posts) {\n\n this.emit('targetBegin', { target: post });\n\n // Step 4.1: post directories\n const postDirs = FSHelper.getPostDirs(post, this.config);\n this.log('debug', 'Post directories:', postDirs);\n\n // Step 4.2: Check with status cache\n const statusCache = StatusCache.getInstance(postDirs.statusCache, this.logger, this.config.useStatusCache);\n if (statusCache.validate(post, postDirs.root, this.config)) {\n this.log('info', `Skipped downloading post #${post.id}: already downloaded and nothing has changed since last download`);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.AlreadyDownloaded,\n skipMessage: 'Target already downloaded and nothing has changed since last download'\n });\n skippedRedundant++;\n continue;\n }\n\n this.log('info', `Download post #${post.id} (${post.title})`);\n\n // Step 4.3: Check whether we should download post\n // -- 4.3.1: Viewability\n if (!post.isViewable) {\n if (this.config.include.lockedContent) {\n this.log('warn', `Post #${post.id} is not viewable by current user`);\n }\n else {\n this.log('warn', `Skipped downloading post #${post.id}: not viewable by current user`);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.Inaccessible,\n skipMessage: 'Target is not viewable by current user'\n });\n skippedUnviewable++;\n continue;\n }\n }\n\n // -- 4.3.2: Config option 'include.postsWithMediaType'\n const postsWithMediaType = this.config.include.postsWithMediaType;\n if (postsWithMediaType !== 'any') {\n const hasAttachments = post.attachments.length > 0;\n const hasAudio = !!post.audio || !!post.audioPreview;\n const hasImages = post.images.length > 0;\n const hasVideo = !!post.video || !!post.videoPreview || !!(post.embed && post.embed.type === 'videoEmbed');\n\n let skip = false;\n if (postsWithMediaType === 'none') {\n skip = hasAttachments || hasAudio || hasImages || hasVideo;\n }\n else if (Array.isArray(postsWithMediaType)) {\n skip = !(\n (postsWithMediaType.includes('attachment') && hasAttachments) ||\n (postsWithMediaType.includes('audio') && hasAudio) ||\n (postsWithMediaType.includes('image') && hasImages) ||\n (postsWithMediaType.includes('video') && hasVideo));\n }\n\n if (skip) {\n this.log('warn', `Skipped downloading post #${post.id}: unmet media type criteria`);\n this.log('debug', 'Match criteria failed:', `config.include.postsWithMediaType: ${JSON.stringify(postsWithMediaType)} <-> post #${post.id}:`, {\n hasAttachments,\n hasAudio,\n hasImages,\n hasVideo\n });\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.UnmetMediaTypeCriteria,\n skipMessage: 'Target does not meet media type criteria'\n });\n skippedUnmetMediaTypeCriteria++;\n continue;\n }\n }\n\n // -- 4.3.3: Config option 'include.postsInTier'\n const postsInTier = this.config.include.postsInTier;\n const isAnyTier = postsInTier === 'any' || postsInTier.includes('any');\n if (!isAnyTier) {\n const applicableTierIds = postsInTier.filter((id) => post.campaign?.rewards.find((r) => r.id === id));\n if (!post.campaign) {\n this.log('warn', 'config.include.postsInTier: ignored - post missing campaign info');\n }\n else {\n this.log('debug', 'config.include.postsInTier: applicable tier IDs:', applicableTierIds);\n }\n let skip = false;\n if (!post.campaign) {\n skip = false;\n }\n else if (applicableTierIds.length === 0) {\n skip = true;\n }\n else if (!post.tiers.find((tier) => tier.id === 'patrons')) {\n skip = applicableTierIds.every((id) => !post.tiers.find((tier) => tier.id === id));\n }\n if (skip) {\n this.log('warn', `Skipped downloading post #${post.id}: not in tier`);\n this.log('debug', 'Match criteria failed:', `config.include.postsInTier: ${JSON.stringify(applicableTierIds)} <-> post #${post.id}:`, post.tiers);\n this.emit('targetEnd', {\n target: post,\n isSkipped: true,\n skipReason: TargetSkipReason.NotInTier,\n skipMessage: 'Target not in tier'\n });\n skippedNotInTier++;\n continue;\n }\n if (post.campaign) {\n this.log('debug', 'Match criteria OK:', `config.include.postsInTier: ${JSON.stringify(applicableTierIds)} <-> post #${post.id}:`, post.tiers);\n }\n }\n\n // Step 4.4: Save post info\n if (this.config.include.contentInfo) {\n this.log('info', `Save post info #${post.id}`);\n this.emit('phaseBegin', { target: post, phase: 'saveInfo' });\n FSHelper.createDir(postDirs.info);\n // Post raw data might not be complete or consistent with other posts in the collection.\n // Fetch directly from API.\n // Strictly speaking, we should check for 'error' in results, but since it's not going to be fatal we'll just skip it.\n const { json: fetchedPostAPIData } = await this.commonFetchAPI(\n URLHelper.constructPostsAPIURL({\n postId: post.id,\n campaignId: post.campaign?.id\n }),\n signal\n );\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n // Save summary and raw json\n const summary = generatePostSummary(post);\n const summaryFile = path.resolve(postDirs.info, 'info.txt');\n const saveSummaryResult = await FSHelper.writeTextFile(summaryFile, summary, this.config.fileExistsAction.info);\n this.logWriteTextFileResult(saveSummaryResult, post, 'post summary');\n\n const postRawFile = path.resolve(postDirs.info, 'post-api.json');\n const savePostRawResult = await FSHelper.writeTextFile(\n postRawFile, fetchedPostAPIData || post.raw, this.config.fileExistsAction.infoAPI);\n this.logWriteTextFileResult(savePostRawResult, post, 'post API data');\n this.emit('phaseEnd', { target: post, phase: 'saveInfo' });\n\n // (Downloading of info media items deferred to the next step)\n }\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseBegin', { target: post, phase: 'saveMedia' });\n }\n\n // Step 4.5: save embed info\n if (post.embed && this.config.include.contentMedia) {\n this.log('info', `Save embed info of post #${post.id}`);\n FSHelper.createDir(postDirs.embed);\n const embedSummary = generatePostEmbedSummary(post.embed);\n let embedFilename;\n switch (post.embed.type) {\n case 'videoEmbed':\n embedFilename = 'embedded-video.txt';\n break;\n case 'linkEmbed':\n embedFilename = 'embedded-link.txt';\n break;\n default:\n embedFilename = 'embedded-unknown.txt';\n }\n const embedFile = path.resolve(postDirs.embed, embedFilename);\n const saveSummaryResult = await FSHelper.writeTextFile(embedFile, embedSummary, this.config.fileExistsAction.content);\n this.logWriteTextFileResult(saveSummaryResult, post, 'embed info');\n }\n\n // Step 4.6: create download tasks\n if (this.config.include.previewMedia ||\n this.config.include.contentMedia ||\n this.config.include.contentInfo) {\n\n batch = this.#createDownloadTaskBatchForPost(post, postDirs);\n\n if (this.config.include.contentInfo) {\n const infoElements: Downloadable[] = [];\n if (post.coverImage) {\n infoElements.push(post.coverImage);\n }\n if (post.thumbnail) {\n infoElements.push(post.thumbnail);\n }\n if (infoElements.length > 0) {\n this.addToDownloadTaskBatch(batch,\n {\n target: infoElements,\n targetName: `post #${post.id} -> info elements`,\n destDir: postDirs.info,\n fileExistsAction: this.config.fileExistsAction.info\n }\n );\n }\n }\n\n this.log('info', `Download batch created (#${batch.id}): ${batch.getTasks('pending').length} downloads pending`);\n this.emit('phaseBegin', { target: post, phase: 'batchDownload', batch });\n\n await batch.start();\n\n // Step 4.7: Update status cache\n statusCache.updateOnDownload(post, postDirs.root, batch.getTasks('error').length > 0, this.config);\n\n await batch.destroy();\n batch = null;\n this.emit('phaseEnd', { target: post, phase: 'batchDownload'});\n }\n\n if (this.config.include.previewMedia || this.config.include.contentMedia) {\n this.emit('phaseEnd', { target: post, phase: 'saveMedia' });\n }\n\n downloaded++;\n this.emit('targetEnd', { target: post, isSkipped: false });\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n }\n\n if (this.#isFetchingMultiplePosts(postFetch)) {\n if (collection.nextURL) {\n this.log('info', 'Fetch more posts');\n this.log('debug', `Request next batch of posts from API URL \"${collection.nextURL}`);\n this.emit('fetchBegin', { targetType: 'posts' });\n try {\n json = await this.#requestPosts(collection.nextURL, signal, resolve, resolve);\n }\n catch (error) {\n return;\n }\n }\n else {\n this.log('debug', 'No further posts to fetch');\n json = null;\n }\n }\n else {\n json = null;\n }\n }\n\n if (this.checkAbortSignal(signal, resolve)) {\n return;\n }\n\n // Done\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n if (postFetch.type === 'byUser') {\n this.log('info', `Done downloading posts by '${postFetch.vanity}'`);\n }\n else if (postFetch.type === 'byUserId') {\n this.log('info', `Done downloading posts by user #${postFetch.userId}`);\n }\n else if (postFetch.type === 'byCollection') {\n this.log('info', `Done downloading posts in collection #${postFetch.collectionId}`);\n }\n else {\n this.log('info', `Done downloading post #${postFetch.postId}`);\n }\n let endMessage = 'Done';\n if (this.#isFetchingMultiplePosts(postFetch)) {\n const skippedStrParts: string[] = [];\n if (skippedUnviewable) {\n skippedStrParts.push(`${skippedUnviewable} unviewable`);\n }\n if (skippedRedundant) {\n skippedStrParts.push(`${skippedRedundant} redundant`);\n }\n if (skippedUnmetMediaTypeCriteria) {\n skippedStrParts.push(`${skippedUnmetMediaTypeCriteria} with unmet media type criteria`);\n }\n if (skippedNotInTier) {\n skippedStrParts.push(`${skippedNotInTier} not in tier`);\n }\n const skippedStr = skippedStrParts.length > 0 ? ` (skipped: ${skippedStrParts.join(', ')})` : '';\n endMessage = `Total ${downloaded} / ${total} posts processed${skippedStr}`;\n this.log('info', endMessage);\n }\n this.emit('end', { aborted: false, message: endMessage });\n this.#startPromise = null;\n resolve();\n })\n .finally(async () => {\n if (this.logger) {\n await this.logger.end();\n }\n this.#startPromise = null;\n });\n\n return this.#startPromise;\n }\n\n #isFetchingMultiplePosts(postFetch: DownloaderConfig<Post>['postFetch']): postFetch is DownloaderConfig<Post>['postFetch'] & { type: 'byUser' | 'byUserId' | 'byCollection' } {\n return postFetch.type === 'byUser' || postFetch.type === 'byUserId' || postFetch.type === 'byCollection';\n }\n\n async #getInitialPostsAPIUL(signal: AbortSignal | undefined, resolveOnAbort: () => void, resolveOnError: () => void) {\n const postFetch = this.config.postFetch;\n if (this.#isFetchingMultiplePosts(postFetch)) {\n const pageURL = this.#getInitialDataPageURL();\n const { campaignId, currentUserId } = await this.#getInitialData(pageURL, signal, resolveOnAbort, resolveOnError);\n let sort: PostSortOrder | undefined;\n if (postFetch.type === 'byCollection') {\n sort = PostSortOrder.CollectionOrder;\n }\n\n return URLHelper.constructPostsAPIURL({\n campaignId,\n currentUserId: this.config.include.lockedContent ? undefined : currentUserId,\n filters: postFetch.filters,\n sort\n });\n }\n\n return URLHelper.constructPostsAPIURL({ postId: postFetch.postId });\n }\n\n #getInitialDataPageURL() {\n const postFetch = this.config.postFetch;\n switch (postFetch.type) {\n case 'byUser':\n return URLHelper.constructCampaignPageURL({ vanity: postFetch.vanity });\n case 'byUserId':\n return URLHelper.constructCampaignPageURL({ userId: postFetch.userId });\n case 'byCollection':\n return URLHelper.constructCollectionURL(postFetch.collectionId);\n default:\n throw Error(`postFetch type mismatch: expecting 'byUser', 'byUserId' or 'byCollection' but got '${postFetch.type}'`);\n }\n }\n\n async #getInitialData(url: string, signal: AbortSignal | undefined, resolveOnAbort?: () => void, resolveOnError?: () => void) {\n this.log('debug', `Fetch initial data from \"${url}\"`);\n let page, requestPageError;\n try {\n page = await this.fetcher.get({ url, type: 'html', maxRetries: this.config.request.maxRetries, signal });\n }\n catch (error) {\n if (error instanceof AbortError) {\n this.log('warn', 'Page request aborted');\n }\n else {\n requestPageError = error;\n }\n page = null;\n }\n if (!page) {\n if (resolveOnAbort && this.checkAbortSignal(signal, resolveOnAbort)) {\n throw Error();\n }\n this.log('error', `Error requesting page \"${url}\": `, requestPageError);\n this.emit('end', { aborted: false, error: requestPageError, message: 'Request error' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n const pageParser = new PageParser(this.logger);\n let initialData, parseInitialDataError;\n try {\n initialData = pageParser.parseInitialData(page, url);\n }\n catch (error) {\n parseInitialDataError = error;\n initialData = null;\n }\n if (!initialData) {\n this.log('error', `Failed to obtain initial page data from \"${url}\":`, parseInitialDataError);\n this.emit('end', { aborted: false, error: parseInitialDataError, message: 'Parse error' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n const campaignId = ObjectHelper.getProperty(initialData, 'pageBootstrap.campaign.data.id');\n const currentUserId = ObjectHelper.getProperty(initialData, 'commonBootstrap.currentUser.data.id');\n this.log('debug', `Initial data: campaign ID '${campaignId}'; current user ID '${currentUserId}'`);\n if (!campaignId) {\n const err = Error(`Campaign ID not found in initial data of \"${url}\"`);\n this.log('error', err);\n this.emit('end', { aborted: false, error: err, message: 'Data error (campaign ID not found)' });\n if (resolveOnError) {\n resolveOnError();\n }\n throw Error();\n }\n\n return { campaignId, currentUserId };\n }\n\n async __getCampaign(signal?: AbortSignal) {\n let url: string | null;\n const postFetch = this.config.postFetch;\n switch (postFetch.type) {\n case 'byUser':\n url = URLHelper.constructCampaignPageURL({ vanity: postFetch.vanity });\n break;\n case 'byUserId':\n url = URLHelper.constructCampaignPageURL({ userId: postFetch.userId });\n break;\n default:\n url = null;\n }\n if (!url) {\n throw Error('Internal error: invalid config');\n }\n const { campaignId } = await this.#getInitialData(url, signal);\n const postsParser = new PostParser(this.logger);\n const res = await this.fetchCampaign(campaignId);\n if (signal?.aborted) {\n throw new AbortError();\n }\n if (res.error) {\n throw res.error;\n }\n return postsParser.parseCampaignAPIResponse(res.json);\n }\n\n async #requestPosts(url: string, signal: AbortSignal | undefined, resolveOnAbort: () => void, resolveOnError: () => void) {\n const { json, error: requestAPIError } = await this.commonFetchAPI(url, signal);\n if (!json) {\n if (this.checkAbortSignal(signal, resolveOnAbort)) {\n throw Error();\n }\n this.log('error', 'Failed to fetch posts');\n this.log('warn', 'End with error');\n this.emit('end', { aborted: false, error: requestAPIError, message: 'API request error' });\n resolveOnError();\n throw Error();\n }\n return json;\n }\n\n #createDownloadTaskBatchForPost(post: Post, postDirs: ReturnType<typeof FSHelper['getPostDirs']>) {\n\n const incPreview = this.config.include.previewMedia;\n const incContent = this.config.include.contentMedia;\n\n const __incPreview = (mediaType: 'audio' | 'video' | 'image') => {\n if (typeof incPreview === 'boolean') {\n return incPreview;\n }\n return incPreview.includes(mediaType);\n };\n\n const __incContent = (mediaType: 'audio' | 'video' | 'image' | 'attachment') => {\n if (typeof incContent === 'boolean') {\n return incContent;\n }\n return incContent.includes(mediaType);\n };\n\n const batch = this.createDownloadTaskBatch(\n `Post #${post.id} (${post.title})`,\n\n __incPreview('audio') && post.audioPreview ? {\n target: [ post.audioPreview ],\n targetName: `post #${post.id} -> audio preview`,\n destDir: postDirs.audioPreview,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incPreview('video') && post.videoPreview ? {\n target: [ post.videoPreview ],\n targetName: `post #${post.id} -> video preview`,\n destDir: postDirs.videoPreview,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n /**\n * If post is not viewable by current user, its images will be\n * blurry and we should categorize them as image previews.\n */\n __incPreview('image') && post.images.length > 0 && !post.isViewable ? {\n target: post.images,\n targetName: `post #${post.id} -> image previews`,\n destDir: postDirs.imagePreviews,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('audio') && post.audio ? {\n target: [ post.audio ],\n targetName: `post #${post.id} -> audio`,\n destDir: postDirs.audio,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('video') && post.video ? {\n target: [ post.video ],\n targetName: `post #${post.id} -> video`,\n destDir: postDirs.video,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('image') && post.images.length > 0 && post.isViewable ? {\n target: post.images,\n targetName: `post #${post.id} -> images`,\n destDir: postDirs.images,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('attachment') && post.attachments.length > 0 ? {\n target: post.attachments,\n targetName: `post #${post.id} -> attachments`,\n destDir: postDirs.attachments,\n fileExistsAction: this.config.fileExistsAction.content\n } : null,\n\n __incContent('video') && post.embed &&\n (isYouTubeEmbed(post.embed) || DownloadTaskFactory.findEmbedDownloader(this.config.embedDownloaders, post.embed.provider)) ?\n {\n target: [ post.embed ],\n targetName: `post #${post.id} -> embedded ${post.embed.provider} video`,\n destDir: postDirs.embed,\n fileExistsAction: this.config.fileExistsAction.content\n } : null\n );\n\n return batch;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "patreon-dl",
3
- "version": "1.6.1",
3
+ "version": "1.6.2",
4
4
  "description": "Patreon Downloader",
5
5
  "type": "module",
6
6
  "exports": "./dist/index.js",