patreon-dl 3.7.1 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +15 -0
  2. package/dist/browse/api/CampaignAPIMixin.d.ts +1 -1
  3. package/dist/browse/api/ContentAPIMixin.d.ts +3 -3
  4. package/dist/browse/api/FilterAPIMixin.d.ts +1 -1
  5. package/dist/browse/api/index.d.ts +10 -10
  6. package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
  7. package/dist/browse/db/ContentDBMixin.d.ts +13 -13
  8. package/dist/browse/db/ContentDBMixin.js +1 -1
  9. package/dist/browse/db/ContentDBMixin.js.map +1 -1
  10. package/dist/browse/db/MediaDBMixin.js +1 -1
  11. package/dist/browse/db/MediaDBMixin.js.map +1 -1
  12. package/dist/browse/db/index.d.ts +16 -16
  13. package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
  14. package/dist/browse/web/index.html +1 -1
  15. package/dist/cli/CommandLineParser.d.ts +4 -0
  16. package/dist/cli/CommandLineParser.js +65 -32
  17. package/dist/cli/CommandLineParser.js.map +1 -1
  18. package/dist/cli/helper/PostList.d.ts +6 -0
  19. package/dist/cli/helper/PostList.js +106 -0
  20. package/dist/cli/helper/PostList.js.map +1 -0
  21. package/dist/cli/index.js +73 -53
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/downloaders/Bootstrap.d.ts +5 -0
  24. package/dist/downloaders/Bootstrap.js +10 -0
  25. package/dist/downloaders/Bootstrap.js.map +1 -1
  26. package/dist/downloaders/Downloader.d.ts +4 -4
  27. package/dist/downloaders/Downloader.js +6 -59
  28. package/dist/downloaders/Downloader.js.map +1 -1
  29. package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
  30. package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
  31. package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
  32. package/dist/downloaders/InitialData.js +20 -6
  33. package/dist/downloaders/InitialData.js.map +1 -1
  34. package/dist/downloaders/PostDownloader.js +67 -103
  35. package/dist/downloaders/PostDownloader.js.map +1 -1
  36. package/dist/downloaders/PostsFetcher.js +7 -5
  37. package/dist/downloaders/PostsFetcher.js.map +1 -1
  38. package/dist/downloaders/ProductDownloader.js +31 -21
  39. package/dist/downloaders/ProductDownloader.js.map +1 -1
  40. package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
  41. package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
  42. package/dist/parsers/PageParser.js +7 -2
  43. package/dist/parsers/PageParser.js.map +1 -1
  44. package/dist/parsers/PostParser.d.ts +4 -1
  45. package/dist/parsers/PostParser.js +54 -5
  46. package/dist/parsers/PostParser.js.map +1 -1
  47. package/dist/utils/Fetcher.d.ts +1 -0
  48. package/dist/utils/Fetcher.js +5 -0
  49. package/dist/utils/Fetcher.js.map +1 -1
  50. package/dist/utils/URLHelper.d.ts +4 -0
  51. package/dist/utils/URLHelper.js +17 -0
  52. package/dist/utils/URLHelper.js.map +1 -1
  53. package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
  54. package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
  55. package/dist/utils/logging/ConsoleLogger.js +5 -0
  56. package/dist/utils/logging/ConsoleLogger.js.map +1 -1
  57. package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
  58. package/dist/utils/yt/InnertubeLoader.js +14 -14
  59. package/dist/utils/yt/InnertubeLoader.js.map +1 -1
  60. package/dist/utils/yt/PoToken.js +53 -27
  61. package/dist/utils/yt/PoToken.js.map +1 -1
  62. package/package.json +12 -8
  63. package/dist/browse/web/assets/index-B1h15ViZ.js +0 -218
@@ -1 +1 @@
1
- {"version":3,"file":"MediaDBMixin.js","sourceRoot":"","sources":["../../../src/browse/db/MediaDBMixin.ts"],"names":[],"mappings":"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","sourcesContent":["import { type DBConstructor } from '.';\nimport { type Downloadable, type Downloaded, type Post, type Campaign, type Product } from '../../entities';\nimport { PostType } from '../../entities/Post.js';\nimport { getYearMonthString } from '../../utils/Misc.js';\nimport { type ContentType } from '../types/Content.js';\nimport { type GetMediaListParams, type MediaList, type MediaListItem } from '../types/Media.js';\n\nexport type MediaDBConstructor = new (\n ...args: any[]\n) => InstanceType<ReturnType<typeof MediaDBMixin<DBConstructor>>>;\n\ntype DBMediaType = 'image' | 'video' | 'audio' | 'other';\n\nexport function MediaDBMixin<TBase extends DBConstructor>(Base: TBase) {\n return class MediaDB extends Base {\n saveMedia(\n media: Downloadable\n ) {\n if (!media.downloaded || !media.downloaded.path) {\n return;\n }\n let mediaType: DBMediaType;\n const mimeType = media.downloaded.mimeType || '';\n if (mimeType.startsWith('image/')) {\n mediaType = 'image';\n }\n else if (mimeType.startsWith('video/')) {\n mediaType = 'video';\n }\n else if (mimeType.startsWith('audio/')) {\n mediaType = 'audio';\n }\n else {\n mediaType = 'other';\n }\n this.log('debug', `Save media #${media.id} to DB`);\n try {\n const mediaExists = this.checkMediaExists(media);\n if (!mediaExists) {\n this.run(\n `\n INSERT INTO media (\n media_id,\n media_type,\n mime_type,\n thumbnail_mime_type,\n download_path,\n thumbnail_download_path,\n thumbnail_width,\n thumbnail_height\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n media.id,\n mediaType,\n media.downloaded.mimeType,\n media.downloaded.thumbnail?.mimeType || null,\n media.downloaded.path,\n media.downloaded.thumbnail?.path || null,\n media.downloaded.thumbnail?.width ?? null,\n media.downloaded.thumbnail?.height ?? null\n ]\n );\n }\n else {\n this.log('debug', `Media #${media.id} already exists in DB - update record`);\n this.run(\n `\n UPDATE media\n SET\n media_type = ?,\n mime_type = ?,\n thumbnail_mime_type = ?,\n download_path = ?,\n thumbnail_download_path = ?,\n thumbnail_width = ?,\n thumbnail_height = ?\n WHERE\n media_id = ?\n `,\n [\n mediaType,\n media.downloaded.mimeType,\n media.downloaded.thumbnail?.mimeType || null,\n media.downloaded.path,\n media.downloaded.thumbnail?.path || null,\n media.downloaded.thumbnail?.width ?? null,\n media.downloaded.thumbnail?.height ?? null,\n media.id,\n ]\n );\n }\n }\n catch (error) {\n this.log(\n 'error',\n `Failed to save media (media_id: ${media.id}) to DB:`,\n error\n );\n throw error;\n }\n }\n\n checkMediaExists(media: Downloadable) {\n this.log('debug', `Check if media #${media.id} exists in DB`);\n try {\n const result = this.get(\n `SELECT COUNT(*) as count FROM media WHERE media_id = ?`,\n [ media.id ]\n );\n return result.count > 0;\n } catch (error) {\n this.log(\n 'error',\n `Failed to check if media #${media.id} exists in DB:`,\n error\n );\n return false;\n }\n }\n\n checkContentMediaExists(content: Post | Product, media: Downloadable) {\n this.log(\n 'debug',\n `Check if content media exists in DB`,\n `(media ID: ${media.id})`,\n );\n try {\n const result = this.get(\n `\n SELECT COUNT(*) as count\n FROM content_media\n WHERE\n media_id = ? AND\n campaign_id = ?\n `,\n [\n media.id,\n content.campaign?.id || '-1'\n ]\n );\n return result.count > 0;\n } catch (error) {\n this.log(\n 'error',\n `Failed to check if content media exists in DB:`,\n `(media ID: ${media.id})`,\n error\n );\n return false;\n }\n }\n\n getMediaByID(id: string): Downloaded | null {\n this.log('debug', `Get media #${id} from DB`);\n const result = this.get(\n `\n SELECT \n mime_type,\n thumbnail_mime_type,\n download_path,\n thumbnail_download_path,\n thumbnail_width,\n thumbnail_height\n FROM\n media\n WHERE\n media_id = ?\n `,\n [id]\n );\n return result ? {\n mimeType: result.mime_type,\n path: result.download_path,\n thumbnail: {\n mimeType: result.thumbnail_mime_type,\n path: result.thumbnail_download_path,\n width: result.thumbnail_width,\n height: result.thumbnail_height\n }\n } : null;\n }\n\n getMediaList<T extends ContentType>(params: GetMediaListParams<T>): MediaList<T> {\n const { campaign, sourceType, isViewable, datePublished, sortBy, limit, offset } = params;\n const campaignId = !campaign ? null : (typeof campaign === 'string' ? campaign : campaign.id );\n const tiers = params.sourceType === 'post' ? (params as GetMediaListParams<'post'>).tiers : null;\n const tierIds = tiers && tiers.length > 0 ? tiers.map((tier) => typeof tier === 'string' ? tier : tier.id) : null;\n this.log('debug', 'Get media list from DB:', {\n campaign: campaignId,\n sourceType,\n isViewable,\n tierIds,\n datePublished,\n sortBy,\n limit,\n offset\n });\n if (tierIds && !campaign) {\n throw Error('Invalid params: \"tiers\" must be used with \"campaign\"');\n }\n const join = tiers && tiers.length > 0 ? 'LEFT JOIN post_tier ON post_tier.post_id = content.content_id' : '';\n const whereEquals: { column: string; value: string | number; }[] = [];\n if (campaignId) {\n whereEquals.push({ column: 'content.campaign_id', value: campaignId });\n }\n if (sourceType) {\n whereEquals.push({ column: 'content.content_type', value: sourceType });\n }\n if (isViewable !== undefined) {\n whereEquals.push({ column: 'is_viewable', value: isViewable ? 1 : 0});\n }\n if (datePublished) {\n const strftimeFormat =\n /^\\d{4}$/.test(datePublished) ? '%Y' :\n /^\\d{4}-\\d{2}$/.test(datePublished) ? '%Y-%m'\n : null;\n if (!strftimeFormat) {\n throw Error('Invalid params: \"datePublished\" must be in format \"YYYY\" or \"YYYY-MM\" (e.g. \"2025-06\")');\n }\n whereEquals.push({\n column: `strftime('${strftimeFormat}', datetime(published_at / 1000, 'unixepoch'))`,\n value: datePublished\n });\n }\n const whereIns: { column: string; values: (string | number)[] }[] = [];\n if (tierIds) {\n whereIns.push({ column: 'tier_id', values: tierIds });\n }\n const whereClauseParts: string[] = [];\n if (whereEquals.length > 0) {\n whereClauseParts.push(...whereEquals.map(({column: field}) => `${field} = ?` ));\n }\n if (whereIns.length > 0) {\n whereClauseParts.push(...whereIns.map((wi) => `${wi.column} IN (${wi.values.map(() => '?').join(', ')})`));\n }\n const whereClause = whereClauseParts.join(' AND ');\n const whereValues = [\n ...whereEquals.map(({value}) => value),\n ...whereIns.reduce<(string | number)[]>((result, {values}) => {\n result.push(...values);\n return result;\n }, [])\n ];\n const orderByParts: string[] = []\n switch (sortBy) {\n case 'latest':\n orderByParts.push('published_at DESC');\n break;\n case 'oldest':\n orderByParts.push('published_at ASC');\n break;\n }\n orderByParts.push('media_index ASC');\n const orderByClause = orderByParts.join(', ');\n let limitOffsetClause = '';\n const limitOffsetValues: number[] = [];\n if (limit !== undefined && offset !== undefined) {\n limitOffsetClause = 'LIMIT ? OFFSET ?';\n limitOffsetValues.push(limit, offset);\n }\n else if (limit !== undefined) {\n limitOffsetClause = 'LIMIT ?';\n limitOffsetValues.push(limit);\n }\n const sql = this.getMediaListSQL({\n select: `DISTINCT\n media.media_id,\n media.media_type,\n media.mime_type,\n media.thumbnail_width,\n media.thumbnail_height,\n media.thumbnail_download_path,\n content.details`,\n join,\n where: whereClause,\n orderBy: orderByClause,\n limitOffset: limitOffsetClause\n });\n const rows = this.all(\n sql,\n [ ...whereValues, ...limitOffsetValues ]\n );\n const items = rows.map<MediaListItem<T>>((row) => ({\n id: row.media_id,\n mediaType: row.media_type,\n mimeType: row.mime_type ?? null,\n thumbnail: row.thumbnail_download_path ? {\n path: row.thumbnail_download_path,\n width: row.thumbnail_width || null,\n height: row.thumbnail_height || null\n } : null,\n source: JSON.parse(row.details)\n }));\n const totalSql = this.getMediaListSQL({\n select: 'COUNT(DISTINCT media.media_id) AS media_count',\n join,\n where: whereClause,\n });\n const totalResult = this.get(totalSql, whereValues);\n const total = totalResult ? (totalResult.media_count as number) : 0;\n return {\n items,\n total\n };\n }\n\n getMediaCountByDate(\n groupBy: 'year' | 'month',\n filter?: {\n campaign?: Campaign | string | null,\n date?: Date | null}\n ) {\n const campaign = filter?.campaign || null;\n const campaignId = !campaign ? null : (typeof campaign === 'string' ? campaign : campaign.id);\n this.log('debug', `Get media count by date:`, {\n groupBy,\n filter: !filter ? null : {\n campaign: campaignId,\n date: filter.date\n }\n });\n const date = filter?.date || null;\n const whereClauseParts = [];\n const whereValues: string[] = [];\n if (campaignId) {\n whereClauseParts.push('content_media.campaign_id = ?');\n whereValues.push(campaignId);\n }\n if (date) {\n whereClauseParts.push(`dt = ?`);\n const value = groupBy === 'year' ?\n String(date.getUTCFullYear())\n : getYearMonthString(date);\n whereValues.push(String(value));\n }\n const whereClause = whereClauseParts.join(' AND ');\n const strftimeFormat = groupBy === 'year' ? '%Y' : '%Y-%m'\n const sql = this.getMediaListSQL({\n select: `COUNT(media.media_id) AS media_count, strftime('${strftimeFormat}', datetime(published_at / 1000, 'unixepoch')) AS dt`,\n where: whereClause,\n groupBy: 'dt',\n orderBy: 'dt DESC'\n })\n const rows = this.all(sql, whereValues);\n return rows.map((row) => ({\n dt: row.dt as string,\n count: row.media_count as number\n }));\n }\n\n getMediaCountByContentType(campaign?: Campaign | string | null) {\n const campaignId = typeof campaign === 'string' ? campaign : campaign?.id;\n this.log('debug', `Get media count by content type for campaign #${campaignId}`);\n const whereClauseParts: string[] = [];\n const whereValues: string[] = [];\n if (campaignId) {\n whereClauseParts.push('content_media.campaign_id = ?');\n whereValues.push(campaignId);\n }\n const whereClause = whereClauseParts.join(' AND ');\n const sql = this.getMediaListSQL({\n select: 'COUNT(media.media_id) AS media_count, content.content_type',\n where: whereClause,\n groupBy: 'content.content_type',\n orderBy: 'content.content_type DESC'\n });\n const rows = this.all(sql, whereValues);\n return rows.map((row) => ({\n contentType: row.content_type as 'post' | 'product',\n count: row.media_count as number\n }));\n }\n\n getMediaCountByTier(campaign: Campaign | string) {\n const campaignId = typeof campaign === 'string' ? campaign : campaign.id;\n this.log('debug', `Get media count by tier for campaign #${campaignId}`);\n const sql = this.getMediaListSQL({\n select: 'COUNT(media.media_id) as media_count, tier_id, reward.title',\n join: `LEFT JOIN post_tier ON post_tier.campaign_id = content_media.campaign_id AND post_tier.post_id = content_media.content_id\n RIGHT JOIN reward ON reward.reward_id = post_tier.tier_id AND reward.campaign_id = post_tier.campaign_id`,\n where: `content.content_type = 'post' AND\n post_tier.campaign_id = ?`,\n groupBy: 'post_tier.campaign_id, tier_id'\n })\n const rows = this.all(sql, [campaignId]);\n return rows.map((row) => ({\n tierId: row.tier_id as string,\n title: row.title as string,\n count: row.media_count as number\n }));\n }\n\n getMediaListSQL(params: {\n select: string;\n join?: string;\n where?: string;\n groupBy?: string;\n orderBy?: string;\n limitOffset?: string;\n }) {\n const finalJoin = `\n LEFT JOIN content_media ON content_media.media_id = media.media_id\n LEFT JOIN content ON content.content_id = content_media.content_id AND content.campaign_id = content_media.campaign_id\n ${params.join || ''}\n `;\n const finalWhere = `\n WHERE\n content_media.is_preview != content.is_viewable AND\n content.content_id IS NOT NULL AND\n (\n (\n content.content_type = 'product' AND\n (\n media_type IN ('image', 'video', 'audio')\n OR\n mime_type = 'application/pdf'\n )\n )\n OR\n (\n content.content_type = 'post' AND \n (\n (content.content_subtype IN ('${PostType.Audio}', '${PostType.Podcast}', '${PostType.Link}') AND media_type = 'audio') OR \n (content.content_subtype IN ('${PostType.Video}', '${PostType.VideoEmbed}', '${PostType.Podcast}', '${PostType.Link}') AND media_type = 'video') OR \n (content.content_subtype NOT IN ('${PostType.Audio}', '${PostType.Podcast}', '${PostType.Video}', '${PostType.VideoEmbed}', '${PostType.Link}') AND media_type IN ('image', 'video', 'audio'))\n )\n )\n )\n ${params.where ? `AND ${params.where}` : ''}\n `;\n return `\n SELECT ${params.select}\n FROM\n media\n ${finalJoin}\n ${finalWhere}\n ${params.groupBy ? `GROUP BY ${params.groupBy}` : ''}\n ${params.orderBy ? `ORDER BY ${params.orderBy}` : ''}\n ${params.limitOffset || ''}\n `;\n }\n };\n}\n"]}
1
+ {"version":3,"file":"MediaDBMixin.js","sourceRoot":"","sources":["../../../src/browse/db/MediaDBMixin.ts"],"names":[],"mappings":"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","sourcesContent":["import { type DBConstructor } from '.';\nimport { type Downloadable, type Downloaded, type Post, type Campaign, type Product } from '../../entities';\nimport { PostType } from '../../entities/Post.js';\nimport { getYearMonthString } from '../../utils/Misc.js';\nimport { type ContentType } from '../types/Content.js';\nimport { type GetMediaListParams, type MediaList, type MediaListItem } from '../types/Media.js';\n\nexport type MediaDBConstructor = new (\n ...args: any[]\n) => InstanceType<ReturnType<typeof MediaDBMixin<DBConstructor>>>;\n\ntype DBMediaType = 'image' | 'video' | 'audio' | 'other';\n\nexport function MediaDBMixin<TBase extends DBConstructor>(Base: TBase) {\n return class MediaDB extends Base {\n saveMedia(\n media: Downloadable\n ) {\n if (!media.downloaded || !media.downloaded.path) {\n return;\n }\n let mediaType: DBMediaType;\n const mimeType = media.downloaded.mimeType || '';\n if (mimeType.startsWith('image/')) {\n mediaType = 'image';\n }\n else if (mimeType.startsWith('video/')) {\n mediaType = 'video';\n }\n else if (mimeType.startsWith('audio/')) {\n mediaType = 'audio';\n }\n else {\n mediaType = 'other';\n }\n this.log('debug', `Save media #${media.id} to DB`);\n try {\n const mediaExists = this.checkMediaExists(media);\n if (!mediaExists) {\n this.run(\n `\n INSERT INTO media (\n media_id,\n media_type,\n mime_type,\n thumbnail_mime_type,\n download_path,\n thumbnail_download_path,\n thumbnail_width,\n thumbnail_height\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `,\n [\n media.id,\n mediaType,\n media.downloaded.mimeType,\n media.downloaded.thumbnail?.mimeType || null,\n media.downloaded.path,\n media.downloaded.thumbnail?.path || null,\n media.downloaded.thumbnail?.width ?? null,\n media.downloaded.thumbnail?.height ?? null\n ]\n );\n }\n else {\n this.log('debug', `Media #${media.id} already exists in DB - update record`);\n this.run(\n `\n UPDATE media\n SET\n media_type = ?,\n mime_type = ?,\n thumbnail_mime_type = ?,\n download_path = ?,\n thumbnail_download_path = ?,\n thumbnail_width = ?,\n thumbnail_height = ?\n WHERE\n media_id = ?\n `,\n [\n mediaType,\n media.downloaded.mimeType,\n media.downloaded.thumbnail?.mimeType || null,\n media.downloaded.path,\n media.downloaded.thumbnail?.path || null,\n media.downloaded.thumbnail?.width ?? null,\n media.downloaded.thumbnail?.height ?? null,\n media.id,\n ]\n );\n }\n }\n catch (error) {\n this.log(\n 'error',\n `Failed to save media (media_id: ${media.id}) to DB:`,\n error\n );\n throw error;\n }\n }\n\n checkMediaExists(media: Downloadable) {\n this.log('debug', `Check if media #${media.id} exists in DB`);\n try {\n const result = this.get(\n `SELECT COUNT(*) as count FROM media WHERE media_id = ?`,\n [ media.id ]\n );\n return result.count > 0;\n } catch (error) {\n this.log(\n 'error',\n `Failed to check if media #${media.id} exists in DB:`,\n error\n );\n return false;\n }\n }\n\n checkContentMediaExists(content: Post | Product, media: Downloadable) {\n this.log(\n 'debug',\n `Check if content media exists in DB`,\n `(media ID: ${media.id})`,\n );\n try {\n const result = this.get(\n `\n SELECT COUNT(*) as count\n FROM content_media\n WHERE\n media_id = ? AND\n campaign_id = ?\n `,\n [\n media.id,\n content.campaign?.id || '-1'\n ]\n );\n return result.count > 0;\n } catch (error) {\n this.log(\n 'error',\n `Failed to check if content media exists in DB:`,\n `(media ID: ${media.id})`,\n error\n );\n return false;\n }\n }\n\n getMediaByID(id: string): Downloaded | null {\n this.log('debug', `Get media #${id} from DB`);\n const result = this.get(\n `\n SELECT \n mime_type,\n thumbnail_mime_type,\n download_path,\n thumbnail_download_path,\n thumbnail_width,\n thumbnail_height\n FROM\n media\n WHERE\n media_id = ?\n `,\n [id]\n );\n return result ? {\n mimeType: result.mime_type,\n path: result.download_path,\n thumbnail: {\n mimeType: result.thumbnail_mime_type,\n path: result.thumbnail_download_path,\n width: result.thumbnail_width,\n height: result.thumbnail_height\n }\n } : null;\n }\n\n getMediaList<T extends ContentType>(params: GetMediaListParams<T>): MediaList<T> {\n const { campaign, sourceType, isViewable, datePublished, sortBy, limit, offset } = params;\n const campaignId = !campaign ? null : (typeof campaign === 'string' ? campaign : campaign.id );\n const tiers = params.sourceType === 'post' ? (params as GetMediaListParams<'post'>).tiers : null;\n const tierIds = tiers && tiers.length > 0 ? tiers.map((tier) => typeof tier === 'string' ? tier : tier.id) : null;\n this.log('debug', 'Get media list from DB:', {\n campaign: campaignId,\n sourceType,\n isViewable,\n tierIds,\n datePublished,\n sortBy,\n limit,\n offset\n });\n if (tierIds && !campaign) {\n throw Error('Invalid params: \"tiers\" must be used with \"campaign\"');\n }\n const join = tiers && tiers.length > 0 ? 'LEFT JOIN post_tier ON post_tier.post_id = content.content_id' : '';\n const whereEquals: { column: string; value: string | number; }[] = [];\n if (campaignId) {\n whereEquals.push({ column: 'content.campaign_id', value: campaignId });\n }\n if (sourceType) {\n whereEquals.push({ column: 'content.content_type', value: sourceType });\n }\n if (isViewable !== undefined) {\n whereEquals.push({ column: 'is_viewable', value: isViewable ? 1 : 0});\n }\n if (datePublished) {\n const strftimeFormat =\n /^\\d{4}$/.test(datePublished) ? '%Y' :\n /^\\d{4}-\\d{2}$/.test(datePublished) ? '%Y-%m'\n : null;\n if (!strftimeFormat) {\n throw Error('Invalid params: \"datePublished\" must be in format \"YYYY\" or \"YYYY-MM\" (e.g. \"2025-06\")');\n }\n whereEquals.push({\n column: `strftime('${strftimeFormat}', datetime(published_at / 1000, 'unixepoch'))`,\n value: datePublished\n });\n }\n const whereIns: { column: string; values: (string | number)[] }[] = [];\n if (tierIds) {\n whereIns.push({ column: 'tier_id', values: tierIds });\n }\n const whereClauseParts: string[] = [];\n if (whereEquals.length > 0) {\n whereClauseParts.push(...whereEquals.map(({column: field}) => `${field} = ?` ));\n }\n if (whereIns.length > 0) {\n whereClauseParts.push(...whereIns.map((wi) => `${wi.column} IN (${wi.values.map(() => '?').join(', ')})`));\n }\n const whereClause = whereClauseParts.join(' AND ');\n const whereValues = [\n ...whereEquals.map(({value}) => value),\n ...whereIns.reduce<(string | number)[]>((result, {values}) => {\n result.push(...values);\n return result;\n }, [])\n ];\n const orderByParts: string[] = []\n switch (sortBy) {\n case 'latest':\n orderByParts.push('published_at DESC');\n break;\n case 'oldest':\n orderByParts.push('published_at ASC');\n break;\n }\n orderByParts.push('media_index ASC');\n const orderByClause = orderByParts.join(', ');\n let limitOffsetClause = '';\n const limitOffsetValues: number[] = [];\n if (limit !== undefined && offset !== undefined) {\n limitOffsetClause = 'LIMIT ? OFFSET ?';\n limitOffsetValues.push(limit, offset);\n }\n else if (limit !== undefined) {\n limitOffsetClause = 'LIMIT ?';\n limitOffsetValues.push(limit);\n }\n const sql = this.getMediaListSQL({\n select: `DISTINCT\n media.media_id,\n media.media_type,\n media.mime_type,\n media.thumbnail_width,\n media.thumbnail_height,\n media.thumbnail_download_path,\n content.details`,\n join,\n where: whereClause,\n orderBy: orderByClause,\n limitOffset: limitOffsetClause\n });\n const rows = this.all(\n sql,\n [ ...whereValues, ...limitOffsetValues ]\n );\n const items = rows.map<MediaListItem<T>>((row) => ({\n id: row.media_id,\n mediaType: row.media_type,\n mimeType: row.mime_type ?? null,\n thumbnail: row.thumbnail_download_path ? {\n path: row.thumbnail_download_path,\n width: row.thumbnail_width || null,\n height: row.thumbnail_height || null\n } : null,\n source: JSON.parse(row.details)\n }));\n const totalSql = this.getMediaListSQL({\n select: 'COUNT(DISTINCT media.media_id) AS media_count',\n join,\n where: whereClause,\n });\n const totalResult = this.get(totalSql, whereValues);\n const total = totalResult ? (totalResult.media_count as number) : 0;\n return {\n items,\n total\n };\n }\n\n getMediaCountByDate(\n groupBy: 'year' | 'month',\n filter?: {\n campaign?: Campaign | string | null,\n date?: Date | null}\n ) {\n const campaign = filter?.campaign || null;\n const campaignId = !campaign ? null : (typeof campaign === 'string' ? campaign : campaign.id);\n this.log('debug', `Get media count by date:`, {\n groupBy,\n filter: !filter ? null : {\n campaign: campaignId,\n date: filter.date\n }\n });\n const date = filter?.date || null;\n const whereClauseParts = [];\n const whereValues: string[] = [];\n if (campaignId) {\n whereClauseParts.push('content_media.campaign_id = ?');\n whereValues.push(campaignId);\n }\n if (date) {\n whereClauseParts.push(`dt = ?`);\n const value = groupBy === 'year' ?\n String(date.getUTCFullYear())\n : getYearMonthString(date);\n whereValues.push(value);\n }\n const whereClause = whereClauseParts.join(' AND ');\n const strftimeFormat = groupBy === 'year' ? '%Y' : '%Y-%m'\n const sql = this.getMediaListSQL({\n select: `COUNT(media.media_id) AS media_count, strftime('${strftimeFormat}', datetime(published_at / 1000, 'unixepoch')) AS dt`,\n where: whereClause,\n groupBy: 'dt',\n orderBy: 'dt DESC'\n })\n const rows = this.all(sql, whereValues);\n return rows.map((row) => ({\n dt: row.dt as string,\n count: row.media_count as number\n }));\n }\n\n getMediaCountByContentType(campaign?: Campaign | string | null) {\n const campaignId = typeof campaign === 'string' ? campaign : campaign?.id;\n this.log('debug', `Get media count by content type for campaign #${campaignId}`);\n const whereClauseParts: string[] = [];\n const whereValues: string[] = [];\n if (campaignId) {\n whereClauseParts.push('content_media.campaign_id = ?');\n whereValues.push(campaignId);\n }\n const whereClause = whereClauseParts.join(' AND ');\n const sql = this.getMediaListSQL({\n select: 'COUNT(media.media_id) AS media_count, content.content_type',\n where: whereClause,\n groupBy: 'content.content_type',\n orderBy: 'content.content_type DESC'\n });\n const rows = this.all(sql, whereValues);\n return rows.map((row) => ({\n contentType: row.content_type as 'post' | 'product',\n count: row.media_count as number\n }));\n }\n\n getMediaCountByTier(campaign: Campaign | string) {\n const campaignId = typeof campaign === 'string' ? campaign : campaign.id;\n this.log('debug', `Get media count by tier for campaign #${campaignId}`);\n const sql = this.getMediaListSQL({\n select: 'COUNT(media.media_id) as media_count, tier_id, reward.title',\n join: `LEFT JOIN post_tier ON post_tier.campaign_id = content_media.campaign_id AND post_tier.post_id = content_media.content_id\n RIGHT JOIN reward ON reward.reward_id = post_tier.tier_id AND reward.campaign_id = post_tier.campaign_id`,\n where: `content.content_type = 'post' AND\n post_tier.campaign_id = ?`,\n groupBy: 'post_tier.campaign_id, tier_id'\n })\n const rows = this.all(sql, [campaignId]);\n return rows.map((row) => ({\n tierId: row.tier_id as string,\n title: row.title as string,\n count: row.media_count as number\n }));\n }\n\n getMediaListSQL(params: {\n select: string;\n join?: string;\n where?: string;\n groupBy?: string;\n orderBy?: string;\n limitOffset?: string;\n }) {\n const finalJoin = `\n LEFT JOIN content_media ON content_media.media_id = media.media_id\n LEFT JOIN content ON content.content_id = content_media.content_id AND content.campaign_id = content_media.campaign_id\n ${params.join || ''}\n `;\n const finalWhere = `\n WHERE\n content_media.is_preview != content.is_viewable AND\n content.content_id IS NOT NULL AND\n (\n (\n content.content_type = 'product' AND\n (\n media_type IN ('image', 'video', 'audio')\n OR\n mime_type = 'application/pdf'\n )\n )\n OR\n (\n content.content_type = 'post' AND \n (\n (content.content_subtype IN ('${PostType.Audio}', '${PostType.Podcast}', '${PostType.Link}') AND media_type = 'audio') OR \n (content.content_subtype IN ('${PostType.Video}', '${PostType.VideoEmbed}', '${PostType.Podcast}', '${PostType.Link}') AND media_type = 'video') OR \n (content.content_subtype NOT IN ('${PostType.Audio}', '${PostType.Podcast}', '${PostType.Video}', '${PostType.VideoEmbed}', '${PostType.Link}') AND media_type IN ('image', 'video', 'audio'))\n )\n )\n )\n ${params.where ? `AND ${params.where}` : ''}\n `;\n return `\n SELECT ${params.select}\n FROM\n media\n ${finalJoin}\n ${finalWhere}\n ${params.groupBy ? `GROUP BY ${params.groupBy}` : ''}\n ${params.orderBy ? `ORDER BY ${params.orderBy}` : ''}\n ${params.limitOffset || ''}\n `;\n }\n };\n}\n"]}
@@ -45,13 +45,13 @@ declare const DB: {
45
45
  } & {
46
46
  new (...args: any[]): {
47
47
  saveContent(content: import("../../index.js").Post | import("../../index.js").Product): void;
48
- "__#115@#saveContentMedia"(content: import("../../index.js").Post | import("../../index.js").Product): void;
49
- "__#115@#savepostMedia"(post: import("../../index.js").Post): void;
50
- "__#115@#saveProductMedia"(product: import("../../index.js").Product): void;
51
- "__#115@#doSaveContentMedia"(content: import("../../index.js").Post | import("../../index.js").Product, media: import("../../index.js").Downloadable, mediaIndex: number, isPreview: boolean): void;
52
- "__#115@#publishedAtToTime"(publishedAt: string | null): number | null;
53
- "__#115@#savePostTiers"(post: import("../../index.js").Post): void;
54
- "__#115@#doSaveTier"(post: import("../../index.js").Post, tier: import("../../index.js").Tier): void;
48
+ "__#170@#saveContentMedia"(content: import("../../index.js").Post | import("../../index.js").Product): void;
49
+ "__#170@#savepostMedia"(post: import("../../index.js").Post): void;
50
+ "__#170@#saveProductMedia"(product: import("../../index.js").Product): void;
51
+ "__#170@#doSaveContentMedia"(content: import("../../index.js").Post | import("../../index.js").Product, media: import("../../index.js").Downloadable, mediaIndex: number, isPreview: boolean): void;
52
+ "__#170@#publishedAtToTime"(publishedAt: string | null): number | null;
53
+ "__#170@#savePostTiers"(post: import("../../index.js").Post): void;
54
+ "__#170@#doSaveTier"(post: import("../../index.js").Post, tier: import("../../index.js").Tier): void;
55
55
  savePostComments(post: import("../../index.js").Post, comments: import("../../index.js").Comment[]): void;
56
56
  checkPostCommentsExist(post: import("../../index.js").Post): boolean;
57
57
  getContent(id: string, contentType: "post"): import("../types/Content.js").PostWithComments | null;
@@ -61,7 +61,7 @@ declare const DB: {
61
61
  whereClauses: string[];
62
62
  whereValues: any[];
63
63
  } | undefined, includeTotal?: boolean): import("../types/Content.js").ContentList<T>;
64
- "__#115@#parseContentRowJoinedComments"(row: any): any;
64
+ "__#170@#parseContentRowJoinedComments"(row: any): any;
65
65
  getContentCountByDate(contentType: import("../types/Content.js").ContentType, groupBy: "year" | "month", filter?: {
66
66
  campaign?: import("../../index.js").Campaign | string | null;
67
67
  date?: Date | null;
@@ -85,19 +85,19 @@ declare const DB: {
85
85
  collection: import("../../index.js").Collection;
86
86
  campaignId: string;
87
87
  } | null;
88
- "__#115@#savePostCollection"(post: import("../../index.js").Post): void;
88
+ "__#170@#savePostCollection"(post: import("../../index.js").Post): void;
89
89
  getCollectionList(params: import("../types/Content.js").GetCollectionListParams): import("../types/Content.js").CollectionList;
90
90
  checkCollectionExists(id: string): boolean;
91
91
  checkPostTagExists(id: string, campaign: import("../../index.js").Campaign | null): boolean;
92
92
  getPostComments(post: import("../../index.js").Post | string): import("../../index.js").Comment[] | null;
93
- "__#115@#savePostTags"(post: import("../../index.js").Post): void;
93
+ "__#170@#savePostTags"(post: import("../../index.js").Post): void;
94
94
  getPostTagList(params: import("../types/Content.js").GetPostTagListParams): import("../types/Content.js").PostTagList;
95
95
  saveCampaign(campaign: import("../../index.js").Campaign | null, downloadDate: Date, overwriteIfExists?: boolean): void;
96
96
  getCampaign(params: import("../types/Campaign.js").GetCampaignParams): import("../../index.js").Campaign | null;
97
- "__#114@#saveRewards"(campaign: import("../../index.js").Campaign): void;
98
- "__#114@#doSaveReward"(campaign: import("../../index.js").Campaign, reward: import("../../index.js").Reward): void;
97
+ "__#169@#saveRewards"(campaign: import("../../index.js").Campaign): void;
98
+ "__#169@#doSaveReward"(campaign: import("../../index.js").Campaign, reward: import("../../index.js").Reward): void;
99
99
  getCampaignList(params: import("../types/Campaign.js").GetCampaignListParams): import("../types/Campaign.js").CampaignList;
100
- "__#114@#getCampaignWithCounts"(params: import("../types/Campaign.js").GetCampaignParams): import("../types/Campaign.js").CampaignWithCounts | null;
100
+ "__#169@#getCampaignWithCounts"(params: import("../types/Campaign.js").GetCampaignParams): import("../types/Campaign.js").CampaignWithCounts | null;
101
101
  checkCampaignExists(id: string): boolean;
102
102
  saveUser(user: import("../../index.js").User | null): void;
103
103
  getUserByID(id: string): import("../../index.js").User | null;
@@ -147,10 +147,10 @@ declare const DB: {
147
147
  new (...args: any[]): {
148
148
  saveCampaign(campaign: import("../../index.js").Campaign | null, downloadDate: Date, overwriteIfExists?: boolean): void;
149
149
  getCampaign(params: import("../types/Campaign.js").GetCampaignParams): import("../../index.js").Campaign | null;
150
- "__#114@#saveRewards"(campaign: import("../../index.js").Campaign): void;
151
- "__#114@#doSaveReward"(campaign: import("../../index.js").Campaign, reward: import("../../index.js").Reward): void;
150
+ "__#169@#saveRewards"(campaign: import("../../index.js").Campaign): void;
151
+ "__#169@#doSaveReward"(campaign: import("../../index.js").Campaign, reward: import("../../index.js").Reward): void;
152
152
  getCampaignList(params: import("../types/Campaign.js").GetCampaignListParams): import("../types/Campaign.js").CampaignList;
153
- "__#114@#getCampaignWithCounts"(params: import("../types/Campaign.js").GetCampaignParams): import("../types/Campaign.js").CampaignWithCounts | null;
153
+ "__#169@#getCampaignWithCounts"(params: import("../types/Campaign.js").GetCampaignParams): import("../types/Campaign.js").CampaignWithCounts | null;
154
154
  checkCampaignExists(id: string): boolean;
155
155
  saveUser(user: import("../../index.js").User | null): void;
156
156
  getUserByID(id: string): import("../../index.js").User | null;