patreon-dl 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +23 -0
- package/README.md +16 -5
- package/bin/EmbedlyDownloader.js +1 -1
- package/bin/patreon-dl-vimeo.js +7 -4
- package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
- package/dist/browse/api/ContentAPIMixin.d.ts +4 -1
- package/dist/browse/api/ContentAPIMixin.js +44 -11
- package/dist/browse/api/ContentAPIMixin.js.map +1 -1
- package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
- package/dist/browse/api/SettingsAPIMixin.d.ts +1 -0
- package/dist/browse/api/SettingsAPIMixin.js +4 -2
- package/dist/browse/api/SettingsAPIMixin.js.map +1 -1
- package/dist/browse/api/index.d.ts +12 -6
- package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
- package/dist/browse/db/ContentDBMixin.d.ts +14 -14
- package/dist/browse/db/ContentDBMixin.js +12 -5
- package/dist/browse/db/ContentDBMixin.js.map +1 -1
- package/dist/browse/db/index.d.ts +17 -17
- package/dist/browse/server/handler/SettingsAPIRequestHandler.js +2 -1
- package/dist/browse/server/handler/SettingsAPIRequestHandler.js.map +1 -1
- package/dist/browse/types/Settings.d.ts +3 -0
- package/dist/browse/types/Settings.js.map +1 -1
- package/dist/browse/web/assets/index-CW4CUoWl.css +1 -0
- package/dist/browse/web/assets/{index-Dw_64hkR.js → index-CziUWlSw.js} +31 -31
- package/dist/browse/web/index.html +2 -2
- package/dist/cli/CLIOptions.js +10 -1
- package/dist/cli/CLIOptions.js.map +1 -1
- package/dist/cli/CommandLineParser.d.ts +1 -0
- package/dist/cli/CommandLineParser.js +11 -3
- package/dist/cli/CommandLineParser.js.map +1 -1
- package/dist/downloaders/Bootstrap.d.ts +6 -0
- package/dist/downloaders/Bootstrap.js +26 -0
- package/dist/downloaders/Bootstrap.js.map +1 -1
- package/dist/downloaders/Downloader.d.ts +5 -4
- package/dist/downloaders/Downloader.js +3 -1
- package/dist/downloaders/Downloader.js.map +1 -1
- package/dist/downloaders/InitialData.js +1 -0
- package/dist/downloaders/InitialData.js.map +1 -1
- package/dist/downloaders/PostDownloader.js +16 -0
- package/dist/downloaders/PostDownloader.js.map +1 -1
- package/dist/downloaders/PostsFetcher.js +29 -12
- package/dist/downloaders/PostsFetcher.js.map +1 -1
- package/dist/downloaders/ProductDownloader.js +8 -0
- package/dist/downloaders/ProductDownloader.js.map +1 -1
- package/dist/downloaders/ProductsFetcher.js +32 -15
- package/dist/downloaders/ProductsFetcher.js.map +1 -1
- package/dist/downloaders/task/DownloadTaskFactory.d.ts +4 -0
- package/dist/downloaders/task/DownloadTaskFactory.js +3 -2
- package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -1
- package/dist/downloaders/task/YouTubeDownloadTask.js +7 -2
- package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
- package/dist/entities/Post.d.ts +1 -1
- package/dist/entities/Post.js.map +1 -1
- package/dist/entities/Product.d.ts +1 -1
- package/dist/entities/Product.js.map +1 -1
- package/dist/parsers/PostParser.d.ts +1 -1
- package/dist/parsers/PostParser.js +69 -13
- package/dist/parsers/PostParser.js.map +1 -1
- package/dist/parsers/ProductParser.d.ts +1 -1
- package/dist/parsers/ProductParser.js +5 -6
- package/dist/parsers/ProductParser.js.map +1 -1
- package/dist/utils/FilenameFormatHelper.d.ts +2 -2
- package/dist/utils/FilenameFormatHelper.js +45 -2
- package/dist/utils/FilenameFormatHelper.js.map +1 -1
- package/dist/utils/MediaFilenameResolver.d.ts +4 -1
- package/dist/utils/MediaFilenameResolver.js +6 -4
- package/dist/utils/MediaFilenameResolver.js.map +1 -1
- package/dist/utils/URLHelper.js +8 -8
- 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/yt/InnertubeLoader.d.ts +19 -1
- package/dist/utils/yt/InnertubeLoader.js +55 -15
- package/dist/utils/yt/InnertubeLoader.js.map +1 -1
- package/package.json +2 -1
- package/dist/browse/web/assets/index-DjOKbT1U.css +0 -1
|
@@ -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}`;\n this.log('error', errMsg);\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"]}
|
|
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"]}
|
package/dist/entities/Post.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { type List } from './List.js';
|
|
|
3
3
|
import { type Downloadable } from './Downloadable.js';
|
|
4
4
|
import { type AttachmentMediaItem, type AudioMediaItem, type DefaultImageMediaItem, type VideoMediaItem, type PostCoverImageMediaItem, type PostThumbnailMediaItem, type CollectionThumbnailMediaItem } from './MediaItem.js';
|
|
5
5
|
import { type Tier } from './Reward.js';
|
|
6
|
-
export type PostList = List<Post>;
|
|
6
|
+
export type PostList = Omit<List<Post>, 'url'>;
|
|
7
7
|
export declare const PostType: {
|
|
8
8
|
readonly Image: "image_file";
|
|
9
9
|
readonly Video: "video_external_file";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Post.js","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"AAQA,wBAAwB;AACxB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,aAAa;IACzB,OAAO,EAAE,SAAS;CACV,CAAC","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type List } from './List.js';\nimport { type Downloadable } from './Downloadable.js';\nimport { type AttachmentMediaItem, type AudioMediaItem, type DefaultImageMediaItem, type VideoMediaItem, type PostCoverImageMediaItem, type PostThumbnailMediaItem, type CollectionThumbnailMediaItem } from './MediaItem.js';\nimport { type Tier } from './Reward.js';\n\nexport type PostList = List<Post>;\n\n// Known postType values\nexport const PostType = {\n Image: 'image_file',\n Video: 'video_external_file',\n Audio: 'audio_file',\n Text: 'text_only',\n Poll: 'poll',\n Link: 'link',\n VideoEmbed: 'video_embed',\n Podcast: 'podcast'\n} as const;\n\nexport interface Post {\n type: 'post';\n id: string;\n /**\n * @privateRemarks\n *\n * `data.attibutes.post_type`\n *\n * Known types:\n * - image_file\n * - video_external_file\n * - audio_file\n * - text_only\n * - poll\n * - link\n * - only embedded link info is saved. Link is not followed / downloaded (except YouTube).\n * - video_embed\n * - only embedded video info is saved. Video itself is not downloaded (except YouTube or\n * Vimeo through patreon-dl-vimeo.js).\n * - podcast\n */\n postType: string;\n isViewable: boolean;\n url: string | null;\n title: string | null;\n content: string | null;\n /**\n * `content` converted to plain text.\n * Used by FTS.\n * @since 3.5.0\n */\n contentText?: string | null;\n teaserText: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n commentCount: number;\n coverImage: Downloadable<PostCoverImageMediaItem> | null;\n thumbnail: Downloadable<PostThumbnailMediaItem> | null;\n tiers: Tier[];\n\n /**\n * @since 3.5.0\n */\n collections?: Collection[];\n\n /**\n * @since 3.5.0\n */\n tags?: PostTag[];\n\n /**\n * @privateRemarks\n * `data.attibutes.embed`\n */\n embed: Downloadable<PostEmbed> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.attachments`\n */\n attachments: Downloadable<AttachmentMediaItem>[];\n\n /**\n * @privateRemarks\n * Obtained from parsing links found in post content.\n * See Parser#parseInlineMedia()\n */\n linkedAttachments?: LinkedAttachment[];\n\n /**\n * @privateRemarks\n * `data.relationships.audio`\n */\n audio: Downloadable<AudioMediaItem> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.audio_prevew`\n */\n audioPreview: Downloadable<AudioMediaItem> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.images`\n */\n images: Downloadable<DefaultImageMediaItem>[];\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.video_preview`\n */\n videoPreview: Downloadable<VideoMediaItem> | null;\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.post_file` with\n * `data.attributes.post_type` matching 'video_external_file' / 'podcast'\n */\n video: Downloadable<VideoMediaItem> | null;\n\n campaign: Campaign | null;\n\n raw: object;\n}\n\nexport interface PostEmbed {\n id: `${string}-embed`;\n postId: string;\n postURL: string | null;\n type: 'videoEmbed' | 'linkEmbed' | 'unknownEmbed';\n description: string | null;\n html: string | null;\n provider: string | null;\n providerURL: string | null;\n subject: string | null;\n url: string | null;\n thumbnailURL: string | null;\n}\n\nexport type LinkedAttachment = {\n type: 'linkedAttachment';\n url: string;\n postId: string;\n mediaId: string;\n downloadable?: Downloadable<AttachmentMediaItem>;\n}\n\nexport type YouTubePostEmbed = PostEmbed & { provider: 'YouTube' };\n\nexport interface Collection {\n id: string;\n type: 'collection';\n title: string | null;\n description: string | null;\n createdAt: string | null;\n editedAt: string | null;\n numPosts: number | null;\n postIds: string[] | null;\n thumbnail: Downloadable<CollectionThumbnailMediaItem> | null;\n raw: object;\n}\n\nexport interface PostTag {\n id: string;\n type: 'postTag';\n value: string;\n}"]}
|
|
1
|
+
{"version":3,"file":"Post.js","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"AAQA,wBAAwB;AACxB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,aAAa;IACzB,OAAO,EAAE,SAAS;CACV,CAAC","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type List } from './List.js';\nimport { type Downloadable } from './Downloadable.js';\nimport { type AttachmentMediaItem, type AudioMediaItem, type DefaultImageMediaItem, type VideoMediaItem, type PostCoverImageMediaItem, type PostThumbnailMediaItem, type CollectionThumbnailMediaItem } from './MediaItem.js';\nimport { type Tier } from './Reward.js';\n\nexport type PostList = Omit<List<Post>, 'url'>;\n\n// Known postType values\nexport const PostType = {\n Image: 'image_file',\n Video: 'video_external_file',\n Audio: 'audio_file',\n Text: 'text_only',\n Poll: 'poll',\n Link: 'link',\n VideoEmbed: 'video_embed',\n Podcast: 'podcast'\n} as const;\n\nexport interface Post {\n type: 'post';\n id: string;\n /**\n * @privateRemarks\n *\n * `data.attibutes.post_type`\n *\n * Known types:\n * - image_file\n * - video_external_file\n * - audio_file\n * - text_only\n * - poll\n * - link\n * - only embedded link info is saved. Link is not followed / downloaded (except YouTube).\n * - video_embed\n * - only embedded video info is saved. Video itself is not downloaded (except YouTube or\n * Vimeo through patreon-dl-vimeo.js).\n * - podcast\n */\n postType: string;\n isViewable: boolean;\n url: string | null;\n title: string | null;\n content: string | null;\n /**\n * `content` converted to plain text.\n * Used by FTS.\n * @since 3.5.0\n */\n contentText?: string | null;\n teaserText: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n commentCount: number;\n coverImage: Downloadable<PostCoverImageMediaItem> | null;\n thumbnail: Downloadable<PostThumbnailMediaItem> | null;\n tiers: Tier[];\n\n /**\n * @since 3.5.0\n */\n collections?: Collection[];\n\n /**\n * @since 3.5.0\n */\n tags?: PostTag[];\n\n /**\n * @privateRemarks\n * `data.attibutes.embed`\n */\n embed: Downloadable<PostEmbed> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.attachments`\n */\n attachments: Downloadable<AttachmentMediaItem>[];\n\n /**\n * @privateRemarks\n * Obtained from parsing links found in post content.\n * See Parser#parseInlineMedia()\n */\n linkedAttachments?: LinkedAttachment[];\n\n /**\n * @privateRemarks\n * `data.relationships.audio`\n */\n audio: Downloadable<AudioMediaItem> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.audio_prevew`\n */\n audioPreview: Downloadable<AudioMediaItem> | null;\n\n /**\n * @privateRemarks\n * `data.relationships.images`\n */\n images: Downloadable<DefaultImageMediaItem>[];\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.video_preview`\n */\n videoPreview: Downloadable<VideoMediaItem> | null;\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.post_file` with\n * `data.attributes.post_type` matching 'video_external_file' / 'podcast'\n */\n video: Downloadable<VideoMediaItem> | null;\n\n campaign: Campaign | null;\n\n raw: object;\n}\n\nexport interface PostEmbed {\n id: `${string}-embed`;\n postId: string;\n postURL: string | null;\n type: 'videoEmbed' | 'linkEmbed' | 'unknownEmbed';\n description: string | null;\n html: string | null;\n provider: string | null;\n providerURL: string | null;\n subject: string | null;\n url: string | null;\n thumbnailURL: string | null;\n}\n\nexport type LinkedAttachment = {\n type: 'linkedAttachment';\n url: string;\n postId: string;\n mediaId: string;\n downloadable?: Downloadable<AttachmentMediaItem>;\n}\n\nexport type YouTubePostEmbed = PostEmbed & { provider: 'YouTube' };\n\nexport interface Collection {\n id: string;\n type: 'collection';\n title: string | null;\n description: string | null;\n createdAt: string | null;\n editedAt: string | null;\n numPosts: number | null;\n postIds: string[] | null;\n thumbnail: Downloadable<CollectionThumbnailMediaItem> | null;\n raw: object;\n}\n\nexport interface PostTag {\n id: string;\n type: 'postTag';\n value: string;\n}"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Campaign } from './Campaign.js';
|
|
2
2
|
import { type List } from './List.js';
|
|
3
3
|
import { type Downloadable } from './Downloadable.js';
|
|
4
|
-
export type ProductList = List<Product>;
|
|
4
|
+
export type ProductList = Omit<List<Product>, 'url'>;
|
|
5
5
|
export declare const ProductType: {
|
|
6
6
|
readonly DigitalCommerce: "digital_commerce";
|
|
7
7
|
readonly Post: "post";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Product.js","sourceRoot":"","sources":["../../src/entities/Product.ts"],"names":[],"mappings":"AAMA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type List } from './List.js';\nimport { type Downloadable } from './Downloadable.js';\n\nexport type ProductList = List<Product>;\n\n// Known productType values\nexport const ProductType = {\n DigitalCommerce: 'digital_commerce',\n Post: 'post',\n Collection: 'collection'\n} as const;\n\nexport interface Product {\n type: 'product';\n id: string;\n /**\n * If `undefined`, assume `ProductType.DigitalCommerce`.\n * \n * @since 3.5.0\n */\n productType?: string;\n /**\n * ID of entity referenced according to `productType` (post or collection)\n * \n * @since 3.5.0\n */\n referencedEntityId?: string;\n isAccessible: boolean;\n name: string | null;\n description: string | null;\n /**\n * `description` converted to plain text.\n * Used by FTS.\n * @since 3.5.0\n */\n descriptionText?: string | null;\n price: string | null;\n publishedAt: string | null;\n // The URL depends on `productType`:\n // `ProductType.Post`: post URL.\n // `ProductType.Collection`: collection URL.\n // `ProductType.DigitalCommerce`: product URL.\n url: string;\n previewMedia: Downloadable[];\n contentMedia: Downloadable[];\n campaign: Campaign | null;\n raw: object;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Product.js","sourceRoot":"","sources":["../../src/entities/Product.ts"],"names":[],"mappings":"AAMA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC","sourcesContent":["import { type Campaign } from './Campaign.js';\nimport { type List } from './List.js';\nimport { type Downloadable } from './Downloadable.js';\n\nexport type ProductList = Omit<List<Product>, 'url'>;\n\n// Known productType values\nexport const ProductType = {\n DigitalCommerce: 'digital_commerce',\n Post: 'post',\n Collection: 'collection'\n} as const;\n\nexport interface Product {\n type: 'product';\n id: string;\n /**\n * If `undefined`, assume `ProductType.DigitalCommerce`.\n * \n * @since 3.5.0\n */\n productType?: string;\n /**\n * ID of entity referenced according to `productType` (post or collection)\n * \n * @since 3.5.0\n */\n referencedEntityId?: string;\n isAccessible: boolean;\n name: string | null;\n description: string | null;\n /**\n * `description` converted to plain text.\n * Used by FTS.\n * @since 3.5.0\n */\n descriptionText?: string | null;\n price: string | null;\n publishedAt: string | null;\n // The URL depends on `productType`:\n // `ProductType.Post`: post URL.\n // `ProductType.Collection`: collection URL.\n // `ProductType.DigitalCommerce`: product URL.\n url: string;\n previewMedia: Downloadable[];\n contentMedia: Downloadable[];\n campaign: Campaign | null;\n raw: object;\n}\n"]}
|
|
@@ -3,20 +3,21 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
3
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
|
-
var _PostParser_instances, _PostParser_getVideoMediaItemFromAttr;
|
|
6
|
+
var _PostParser_instances, _PostParser_parseContent, _PostParser_getVideoMediaItemFromAttr;
|
|
7
7
|
import { stripHtml } from 'string-strip-html';
|
|
8
8
|
import { PostType } from '../entities/Post.js';
|
|
9
9
|
import { pickDefined } from '../utils/Misc.js';
|
|
10
10
|
import ObjectHelper from '../utils/ObjectHelper.js';
|
|
11
11
|
import Parser from './Parser.js';
|
|
12
|
+
import URLHelper from '../utils/URLHelper.js';
|
|
12
13
|
class PostParser extends Parser {
|
|
13
14
|
constructor() {
|
|
14
15
|
super(...arguments);
|
|
15
16
|
_PostParser_instances.add(this);
|
|
16
17
|
this.name = 'PostParser';
|
|
17
18
|
}
|
|
18
|
-
parsePostsAPIResponse(json,
|
|
19
|
-
this.log('debug', `Parse API
|
|
19
|
+
parsePostsAPIResponse(json, src) {
|
|
20
|
+
this.log('debug', `Parse API data obtained from "${src}"`);
|
|
20
21
|
/*If (json.errors) {
|
|
21
22
|
this.log('error', `API response error:`, json.errors);
|
|
22
23
|
return null;
|
|
@@ -38,18 +39,18 @@ class PostParser extends Parser {
|
|
|
38
39
|
postsJSONArray = [];
|
|
39
40
|
}
|
|
40
41
|
const collection = {
|
|
41
|
-
url: _url,
|
|
42
42
|
items: [],
|
|
43
43
|
total: ObjectHelper.getProperty(json, 'meta.pagination.total') || null,
|
|
44
|
-
|
|
44
|
+
// src could be a file, in which case there'll be no nextURL.
|
|
45
|
+
nextURL: URLHelper.validateURL(src) ? this.parseCollectionNextURL(json, src) : null
|
|
45
46
|
};
|
|
46
47
|
let hasIncludedJSON = true;
|
|
47
48
|
if (!includedJSON || !Array.isArray(includedJSON)) {
|
|
48
|
-
this.log('warn', `'included' field missing in API
|
|
49
|
+
this.log('warn', `'included' field missing in API data obtained from "${src}" or has incorrect type - no media items and campaign info will be returned`);
|
|
49
50
|
hasIncludedJSON = false;
|
|
50
51
|
}
|
|
51
52
|
if (postsJSONArray.length === 0) {
|
|
52
|
-
this.log('warn', `No posts found in API
|
|
53
|
+
this.log('warn', `No posts found in API data obtained from "${src}"`);
|
|
53
54
|
return collection;
|
|
54
55
|
}
|
|
55
56
|
if (postsJSONArray.length > 1) {
|
|
@@ -107,10 +108,17 @@ class PostParser extends Parser {
|
|
|
107
108
|
images = downloadables.images || [];
|
|
108
109
|
attachments = downloadables.attachments_media || [];
|
|
109
110
|
}
|
|
111
|
+
// Post content and teaser
|
|
112
|
+
const content = __classPrivateFieldGet(this, _PostParser_instances, "m", _PostParser_parseContent).call(this, attributes);
|
|
113
|
+
const teaserText = __classPrivateFieldGet(this, _PostParser_instances, "m", _PostParser_parseContent).call(this, {
|
|
114
|
+
content: attributes.teaser_text,
|
|
115
|
+
content_json_string: attributes.teaser_text_json_string
|
|
116
|
+
});
|
|
110
117
|
// Get inline media from content (currently only images and linked attachments supported)
|
|
111
118
|
const linkedAttachments = [];
|
|
112
|
-
|
|
113
|
-
|
|
119
|
+
const inlineMediaBody = content || teaserText;
|
|
120
|
+
if (hasIncludedJSON && inlineMediaBody) {
|
|
121
|
+
const inlineMedia = this.parseInlineMedia(id, inlineMediaBody, includedJSON);
|
|
114
122
|
images.push(...inlineMedia.images);
|
|
115
123
|
linkedAttachments.push(...inlineMedia.linkedAttachments);
|
|
116
124
|
}
|
|
@@ -273,9 +281,9 @@ class PostParser extends Parser {
|
|
|
273
281
|
isViewable,
|
|
274
282
|
url: attributes.url || null,
|
|
275
283
|
title: attributes.title || null,
|
|
276
|
-
content
|
|
277
|
-
contentText: stripHtml(
|
|
278
|
-
teaserText
|
|
284
|
+
content,
|
|
285
|
+
contentText: stripHtml(content || '').result,
|
|
286
|
+
teaserText,
|
|
279
287
|
publishedAt: attributes.published_at || null,
|
|
280
288
|
editedAt: attributes.edited_at || null,
|
|
281
289
|
commentCount: attributes.comment_count || 0,
|
|
@@ -312,7 +320,55 @@ class PostParser extends Parser {
|
|
|
312
320
|
}
|
|
313
321
|
;
|
|
314
322
|
}
|
|
315
|
-
_PostParser_instances = new WeakSet(),
|
|
323
|
+
_PostParser_instances = new WeakSet(), _PostParser_parseContent = function _PostParser_parseContent(data) {
|
|
324
|
+
const { content, content_json_string } = data;
|
|
325
|
+
if (typeof content === 'string' && content.trim()) {
|
|
326
|
+
return content;
|
|
327
|
+
}
|
|
328
|
+
if (!content_json_string) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const doc = JSON.parse(content_json_string);
|
|
333
|
+
let parsedHTML = '';
|
|
334
|
+
function extractHTML(node) {
|
|
335
|
+
if (!node)
|
|
336
|
+
return;
|
|
337
|
+
if (node.type === 'text') {
|
|
338
|
+
if (node.marks && node.marks.find((m) => m.type === 'link')) {
|
|
339
|
+
const linkMark = node.marks.find((m) => m.type === 'link');
|
|
340
|
+
parsedHTML += `<a href="${linkMark.attrs.href}" target="_blank">${node.text || ''}</a>`;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// You can expand this to handle bold, italic, etc.
|
|
344
|
+
parsedHTML += (String(node.text) || '');
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else if (node.type === 'paragraph' || node.type === 'heading' || node.type === 'listItem') {
|
|
348
|
+
parsedHTML += '<p>';
|
|
349
|
+
if (node.content && Array.isArray(node.content)) {
|
|
350
|
+
node.content.forEach(extractHTML);
|
|
351
|
+
}
|
|
352
|
+
parsedHTML += '</p>';
|
|
353
|
+
}
|
|
354
|
+
else if (node.type === 'image') {
|
|
355
|
+
// Ensure media_id is passed so the local web server can link downloaded assets
|
|
356
|
+
const mediaIdAttr = (node.attrs && node.attrs.media_id) ? `data-media-id="${node.attrs.media_id}" ` : '';
|
|
357
|
+
const srcAttr = (node.attrs && node.attrs.src) ? node.attrs.src : '';
|
|
358
|
+
parsedHTML += `<img ${mediaIdAttr}src="${srcAttr}" />`;
|
|
359
|
+
}
|
|
360
|
+
else if (node.content && Array.isArray(node.content)) {
|
|
361
|
+
node.content.forEach(extractHTML);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
extractHTML(doc);
|
|
365
|
+
return parsedHTML;
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
this.log('warn', 'Failed to parse content_json_string:', e);
|
|
369
|
+
}
|
|
370
|
+
return null;
|
|
371
|
+
}, _PostParser_getVideoMediaItemFromAttr = function _PostParser_getVideoMediaItemFromAttr(attrJSON, includedJSON, postId, strict = false) {
|
|
316
372
|
let miFromIncluded = null;
|
|
317
373
|
const _mediaId = attrJSON.media_id !== undefined ? attrJSON.media_id.toString() : null;
|
|
318
374
|
const hasIncludedJSON = includedJSON && Array.isArray(includedJSON);
|