patreon-dl 3.8.0 → 3.9.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.
Files changed (44) hide show
  1. package/README.md +9 -209
  2. package/dist/browse/db/CampaignDBMixin.d.ts +3 -3
  3. package/dist/browse/db/ContentDBMixin.d.ts +13 -13
  4. package/dist/browse/db/ContentDBMixin.js +1 -1
  5. package/dist/browse/db/ContentDBMixin.js.map +1 -1
  6. package/dist/browse/db/MediaDBMixin.js +1 -1
  7. package/dist/browse/db/MediaDBMixin.js.map +1 -1
  8. package/dist/browse/db/index.d.ts +16 -16
  9. package/dist/browse/server/handler/CampaignAPIRequesthandler.js +5 -0
  10. package/dist/browse/server/handler/CampaignAPIRequesthandler.js.map +1 -1
  11. package/dist/browse/web/assets/index-CtjPL2rI.js +218 -0
  12. package/dist/browse/web/index.html +1 -1
  13. package/dist/cli/CLIOptions.js +6 -2
  14. package/dist/cli/CLIOptions.js.map +1 -1
  15. package/dist/cli/ConfigFileParser.js +1 -1
  16. package/dist/cli/ConfigFileParser.js.map +1 -1
  17. package/dist/downloaders/Downloader.js +1 -1
  18. package/dist/downloaders/Downloader.js.map +1 -1
  19. package/dist/downloaders/PostDownloader.js +5 -5
  20. package/dist/downloaders/PostDownloader.js.map +1 -1
  21. package/dist/downloaders/PostsFetcher.js +3 -3
  22. package/dist/downloaders/PostsFetcher.js.map +1 -1
  23. package/dist/downloaders/task/DownloadTask.js +11 -1
  24. package/dist/downloaders/task/DownloadTask.js.map +1 -1
  25. package/dist/entities/MediaItem.d.ts +1 -0
  26. package/dist/entities/MediaItem.js.map +1 -1
  27. package/dist/parsers/PageParser.js +4 -1
  28. package/dist/parsers/PageParser.js.map +1 -1
  29. package/dist/parsers/PostParser.d.ts +4 -1
  30. package/dist/parsers/PostParser.js +82 -5
  31. package/dist/parsers/PostParser.js.map +1 -1
  32. package/dist/utils/Fetcher.d.ts +1 -0
  33. package/dist/utils/Fetcher.js +5 -0
  34. package/dist/utils/Fetcher.js.map +1 -1
  35. package/dist/utils/FilenameFormatHelper.d.ts +1 -1
  36. package/dist/utils/FilenameFormatHelper.js +4 -1
  37. package/dist/utils/FilenameFormatHelper.js.map +1 -1
  38. package/dist/utils/Formatter.d.ts +1 -1
  39. package/dist/utils/Formatter.js +1 -1
  40. package/dist/utils/Formatter.js.map +1 -1
  41. package/dist/utils/logging/FileLogger.js +1 -0
  42. package/dist/utils/logging/FileLogger.js.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/browse/web/assets/index-CtZbx-Du.js +0 -218
package/README.md CHANGED
@@ -311,215 +311,15 @@ Note the URL shown in the output. Open this URL in a web browser to begin viewin
311
311
 
312
312
  ## Changelog
313
313
 
314
- 3.8.0
315
- - Add support for custom URLs (creators hosting Patreon pages on their own domains) ([@lucasoskorep](https://github.com/lucasoskorep) - [PR #129](https://github.com/patrickkfkan/patreon-dl/pull/129)).
316
- - Fix YT download errors ([#132](https://github.com/patrickkfkan/patreon-dl/issues/132)).
317
- - Browse: set title tag based on content ([#127](https://github.com/patrickkfkan/patreon-dl/issues/127)).
318
- - CLI: add `--list-posts` / `--list-posts-uid` ([#126](https://github.com/patrickkfkan/patreon-dl/issues/126)).
319
-
320
- 3.7.1
321
- - Check and skip download of Patreon-hosted videos that are protected by DRM; add `include.protectedMedia` / `protected.media` option.
322
- - Fix campaign not found when targeting collections ([#124](https://github.com/patrickkfkan/patreon-dl/issues/124)).
323
-
324
- v3.7.0
325
- - Vimeo download script: fetch full player URL ([#118](https://github.com/patrickkfkan/patreon-dl/issues/118))
326
- - Fix downloaded posts missing content / teaser ([@Fabelwesen](https://github.com/Fabelwesen) - [#119](https://github.com/patrickkfkan/patreon-dl/issues/119))
327
- - Add "max content width" option to browse settings ([#122](https://github.com/patrickkfkan/patreon-dl/issues/122))
328
- - Map inline post links to local server routes (contrib by [@Fabelwesen](https://github.com/Fabelwesen) - [#121](https://github.com/patrickkfkan/patreon-dl/issues/121))
329
- - Support additional fields in `media.filename.format` ([patreon-dl-gui#51](https://github.com/patrickkfkan/patreon-dl-gui/issues/51))
330
- - YT downloader: fix error in n/sig decipher function extraction
331
-
332
- v3.6.1
333
- - Fix Embedly download script error on retrying with alternative URL.
334
-
335
- v3.6.0
336
- - Browse: affix nav links (previous / next post) to viewport bottom if post content overflows ([patreon-dl-gui#41](https://github.com/patrickkfkan/patreon-dl-gui/issues/41))
337
- - Fix error when Deno path contains spaces ([patreon-dl-gui#42](https://github.com/patrickkfkan/patreon-dl-gui/issues/42))
338
- - Add SproutVideo download script ([patreon-dl-gui#43](https://github.com/patrickkfkan/patreon-dl-gui/issues/43))
339
- - Fix YouTube download returning "auth required" error
340
-
341
- v3.5.0
342
- - Add support for downloading from "shop" URLs (e.g. `https://www.patreon.com/<creator>/shop`). This will download all products from a creator's shop.
343
- - Add `productsPublished` / `products.published.after` / `products.published.before` option to set publish date criteria of products included in download.
344
- - Since `stopOn` / `stop.on` option now also applies to products, the `postPreviouslyDownloaded` and `postPublishDateOutOfRange` values have been deprecated in favor of `previouslyDownloaded` and `publishDateOutOfRange`, respectively.
345
- - Add Collections support. Collection info is now saved when downloading posts. This means you can browse posts by collection. ([#107](https://github.com/patrickkfkan/patreon-dl/issues/107))
346
- - (Browse) Add search functionality ([#106](https://github.com/patrickkfkan/patreon-dl/issues/106))
347
- - Add Tags support. Tag info is now saved when downloading posts. This means you can filter posts by tag.
348
- - Add `include.mediaThumbnails` option
349
-
350
- v3.4.0
351
- - Fix "no posts found" on "cw" pages ([patreon-dl-gui#30](https://github.com/patrickkfkan/patreon-dl-gui/issues/30))
352
- - Fix YouTube streams returning 403 error ([patreon-dl-gui#31](https://github.com/patrickkfkan/patreon-dl-gui/issues/31))
353
- - Add `pathToDeno` / `--deno` / `path.to.deno` option (used by built-in YouTube downloader)
354
- - Merged PRs:
355
- - Allow directory to be a symlink ([@piperswe](https://github.com/piperswe) - [#101](https://github.com/patrickkfkan/patreon-dl/pull/101))
356
- - Add Github actions ([@piperswe](https://github.com/piperswe) - [#102](https://github.com/patrickkfkan/patreon-dl/pull/102))
357
- - Add `maxVideoResolution` / `max.video.resolution` option to limit video downloads to a maximum resolution (see [example.conf](./example.conf)) ([@eisenbruch](https://github.com/eisenbruch) - [#105](https://github.com/patrickkfkan/patreon-dl/pull/105)) - extended to include site-hosted videos
358
-
359
- v3.3.1
360
- - Fix bugs affecting library usage:
361
- - `DB.getInstance()` returning same instance despite different DB path
362
- - `API.getInstance()` returning same instance despite different DB instance
363
- - DB not closed when downloader ends or web server stops
364
-
365
- v3.3.0
366
- - Fix:
367
- - YouTube stream fetching error ([patreon-dl-gui#28](https://github.com/patrickkfkan/patreon-dl-gui/issues/28))
368
- - Unsupported option error with FFmpeg v7.1.0 ([#97](https://github.com/patrickkfkan/patreon-dl/issues/97))
369
- - Browse:
370
- - Add next / previous links to post page ([#93](https://github.com/patrickkfkan/patreon-dl/issues/93))
371
- - Fix media filter error when tier selected but not "Post"
372
- - Process linked attachments in body of posts ([patreon-dl-gui#27](https://github.com/patrickkfkan/patreon-dl-gui/issues/27))
373
- - Some DB optimizations (contrib by @[piperswe](https://github.com/piperswe) - PR #[95](https://github.com/patrickkfkan/patreon-dl/pull/95))
374
-
375
- v3.2.1
376
- - Fix log file path sometimes not sanitized properly on Windows
377
- - API: add support for passing request options to `getCampaign()`
378
- - CLI: add support for using request options from conf file when running with `--list-tiers` / `--list-tiers-uid`
379
-
380
- v3.2.0
381
- - Fix:
382
- - "Initial data not found" error in `patreon.com/cw` pages ([#85](https://github.com/patrickkfkan/patreon-dl/issues/85)) and custom-domain pages
383
- - FFmpeg v7.x compatibility issues ([#86](https://github.com/patrickkfkan/patreon-dl/issues/86))
384
- - Dry-run mode executing ops that should have been skipped
385
- - Wrong log file path returned in some cases
386
- - Various YouTube downloading issues
387
- - Add:
388
- - Support passing options to `yt-dlp` in Vimeo download script
389
- - Support case-sensitivity flag in `config.include.mediaByFilename` options
390
- - Browse:
391
- - Show inline images within post body
392
- - Show YouTube embed HTML content if video not downloaded ([#87](https://github.com/patrickkfkan/patreon-dl/issues/87))
393
- - Display "show more" toggle for long post bodies
394
- - API:
395
- - `Downloader.getCampaign(params)`: enable lookup by `params.campaignId`
396
-
397
- v3.1.0
398
- - Defer database initialization until downloader starts
399
- - UI: fix post column width possibly exceeding screen width
400
- - Add `request.userAgent` option
401
-
402
- v3.0.0
403
- - Add support for browsing downloaded content through integrated web server. Note: this feature will not work for downloads made with previous versions of `patreon-dl`.
404
-
405
- v2.4.3
406
- - Fix YouTube embeds failing to download due to YT changes
407
- - Add fallback download logic to Vimeo download script
408
- - Fix error when downloading video ([#75](https://github.com/patrickkfkan/patreon-dl/issues/75))
409
-
410
- v2.4.2
411
- - Fix YouTube embeds failing to download due to YT changes
412
- - Fix slow YouTube downloads ([#66](https://github.com/patrickkfkan/patreon-dl/issues/66))
413
- - Other minor fixes
414
-
415
- v2.4.1
416
- - Fix Vimeo download script obtaining and downloading from player URL in embed HTML ([#65](https://github.com/patrickkfkan/patreon-dl/issues/65))
417
- - Add `post-url` and `cookie` to available external downloader exec params
418
- - API changes (non-breaking):
419
- - Expose `cookie` in `DownloaderConfig`
420
-
421
-
422
- v2.4.0
423
- - Support additional URL format: `https://www.patreon.com/cw/<creator>/posts`
424
- - Add `stopOn` option ([#63](https://github.com/patrickkfkan/patreon-dl/issues/63))
425
- - Add `proxy` option ([#62](https://github.com/patrickkfkan/patreon-dl/issues/62))
426
- - Fix Vimeo download script
427
- - Fix YouTube embeds failing to download due to YT changes
428
- - API changes (non-breaking):
429
- - Expose `URLHelper`, `FetcherError`
430
- - Add `getDefaultDownloaderOptions()`
431
- - `ConsoleLogger` / `FileLogger`: add `getDefaultConfig()`
432
- - Required Node version bumped to v20.18.1 or higher
433
-
434
- v2.3.0
435
- - Add `podcast` type to `include.postsWithMediaType` option
436
- - Add `include.comments` option
437
- - Fix videos not downloaded in podcast-type posts ([#56](https://github.com/patrickkfkan/patreon-dl/issues/56))
438
-
439
- v2.2.0
440
- - Widen scope of external downloaders to any type of embed (previously only works for video embeds) ([#51](https://github.com/patrickkfkan/patreon-dl/issues/51))
441
- - YouTube downloading now covers embedded YT links
442
- - Fix attachment filenames sometimes have wrong extension
443
-
444
- v2.1.1
445
- - Fix multiple abort signal listeners triggering warning ([#48](https://github.com/patrickkfkan/patreon-dl/issues/48))
446
- - Fix YouTube embeds failing to download due to YT changes ([#50](https://github.com/patrickkfkan/patreon-dl/issues/50))
447
- - Fix inline images of posts sometimes missing from downloads
448
- - Fix status cache: target marked as downloaded without errors despite having errors at task creation stage
449
-
450
- v2.1.0
451
- - Fix attachment downloads following API changes ([#40](https://github.com/patrickkfkan/patreon-dl/issues/40))
452
- - Add support for URL format: `https://www.patreon.com/c/<creator>/posts`
453
- - Check and resolve conflicting destination paths ([#38](https://github.com/patrickkfkan/patreon-dl/issues/38))
454
- - Parse inline content media ([#40](https://github.com/patrickkfkan/patreon-dl/issues/40))
455
-
456
- v2.0.0
457
- - Replace [node-fetch](https://github.com/node-fetch/node-fetch) with Fetch API; required Node.js version bumped to v18 or higher.
458
- - Update dependencies and libraries
459
- - New `include` options:
460
- - `include.postsPublished` ([#29](https://github.com/patrickkfkan/patreon-dl/issues/29))
461
- - `include.mediaByFilename` ([#33](https://github.com/patrickkfkan/patreon-dl/issues/33))
462
- - Bug fixes:
463
- - 403 error when downloading YouTube embeds
464
- - Only first of multiple targets downloaded ([#26](https://github.com/patrickkfkan/patreon-dl/issues/26))
465
-
466
- v1.7.0
467
- - Download next batch of posts before expiry of 'next' URL (fixes [#22](https://github.com/patrickkfkan/patreon-dl/issues/22))
468
- - Add `--dry-run` / `dryRun` option
469
- - Support URL format `https://www.patreon.com/posts/<post_id>`
470
-
471
- v1.6.2
472
- - Fix 'campaign ID not found' error due to Patreon changes
473
-
474
- v1.6.1
475
- - Fix file extension sometimes missing ([#20](https://github.com/patrickkfkan/patreon-dl/issues/20))
476
-
477
- v1.6.0
478
- - Add external downloader support for embedded videos
479
-
480
- v1.5.0
481
- - Add support for fetching by user ID instead of creator vanity ([#18](https://github.com/patrickkfkan/patreon-dl/issues/18)):
482
- - Support URL format `https://www.patreon.com/user/posts?u=<user_id>`
483
- - Overload `PatreonDownloader.getCampaign()` to take `userId` arg
484
- - CLI: add `--list-tiers-uid`
485
-
486
- v1.4.0
487
- - Add ability to filter posts by tier ([#8](https://github.com/patrickkfkan/patreon-dl/issues/8))
488
- - CLI:
489
- - Add `--list-tiers`
490
- - Add support for target-specific `include` options
491
- - Print summary at the end for multiple target URLs ([#13](https://github.com/patrickkfkan/patreon-dl/issues/13))
492
-
493
- v1.3.0
494
- - Add support for multiple target URLs
495
- - Add `content.publishDate` field to the content dir name format ([PR #12](https://github.com/patrickkfkan/patreon-dl/pull/12) by [kazuoteramoto](https://github.com/kazuoteramoto))
496
- - Bug fixes
497
-
498
- v1.2.2
499
- - Fix wrong file extension for some content types
500
- - Fix YouTube API requests throwing errors due to YT changes
501
-
502
- v1.2.1
503
- - Bug fixes
504
-
505
- v1.2.0
506
- - Add support for granular control over:
507
- - posts to include in download based on type of media contained
508
- - the type of media to download
509
- - Bug fixes
510
-
511
- v1.1.1
512
- - Fix initial data parsing following Patreon changes
513
-
514
- v1.1.0
515
- - Add support for downloading embedded YouTube videos
516
-
517
- v1.0.1
518
- - Fix missing types when importing as library
519
- - Fix link in this README
520
-
521
- v1.0.0
522
- - Initial release
314
+ 3.9.0
315
+ - Fix "initial data not found" error for certain targets ([#134](https://github.com/patrickkfkan/patreon-dl/issues/134)).
316
+ - Fix order of images in post content ([patreon-dl-gui#60](https://github.com/patrickkfkan/patreon-dl-gui/issues/60)).
317
+ - Support `media.index` field in `media.filename.format`.
318
+ - Handle conditional separators properly in filename format patterns.
319
+ - Browse: use slugified links.
320
+ - Minor bug fixes.
321
+
322
+ See the [full changelog](./CHANGELOG.md) for older versions.
523
323
 
524
324
  ---
525
325
  This project is licensed under the MIT License and includes third-party software—see the [NOTICE](./NOTICE) file for attributions.
@@ -7,10 +7,10 @@ export declare function CampaignDBMixin<TBase extends UserDBConstructor>(Base: T
7
7
  new (...args: any[]): {
8
8
  saveCampaign(campaign: Campaign | null, downloadDate: Date, overwriteIfExists?: boolean): void;
9
9
  getCampaign(params: GetCampaignParams): Campaign | null;
10
- "__#169@#saveRewards"(campaign: Campaign): void;
11
- "__#169@#doSaveReward"(campaign: Campaign, reward: Reward): void;
10
+ "__#170@#saveRewards"(campaign: Campaign): void;
11
+ "__#170@#doSaveReward"(campaign: Campaign, reward: Reward): void;
12
12
  getCampaignList(params: GetCampaignListParams): CampaignList;
13
- "__#169@#getCampaignWithCounts"(params: GetCampaignParams): CampaignWithCounts | null;
13
+ "__#170@#getCampaignWithCounts"(params: GetCampaignParams): CampaignWithCounts | null;
14
14
  checkCampaignExists(id: string): boolean;
15
15
  saveUser(user: import("../../index.js").User | null): void;
16
16
  getUserByID(id: string): import("../../index.js").User | null;
@@ -5,13 +5,13 @@ import { type CampaignDBConstructor } from './CampaignDBMixin.js';
5
5
  export declare function ContentDBMixin<TBase extends CampaignDBConstructor>(Base: TBase): {
6
6
  new (...args: any[]): {
7
7
  saveContent(content: Post | Product): void;
8
- "__#170@#saveContentMedia"(content: Post | Product): void;
9
- "__#170@#savepostMedia"(post: Post): void;
10
- "__#170@#saveProductMedia"(product: Product): void;
11
- "__#170@#doSaveContentMedia"(content: Post | Product, media: Downloadable, mediaIndex: number, isPreview: boolean): void;
12
- "__#170@#publishedAtToTime"(publishedAt: string | null): number | null;
13
- "__#170@#savePostTiers"(post: Post): void;
14
- "__#170@#doSaveTier"(post: Post, tier: Tier): void;
8
+ "__#171@#saveContentMedia"(content: Post | Product): void;
9
+ "__#171@#savepostMedia"(post: Post): void;
10
+ "__#171@#saveProductMedia"(product: Product): void;
11
+ "__#171@#doSaveContentMedia"(content: Post | Product, media: Downloadable, mediaIndex: number, isPreview: boolean): void;
12
+ "__#171@#publishedAtToTime"(publishedAt: string | null): number | null;
13
+ "__#171@#savePostTiers"(post: Post): void;
14
+ "__#171@#doSaveTier"(post: Post, tier: Tier): void;
15
15
  savePostComments(post: Post, comments: Comment[]): void;
16
16
  checkPostCommentsExist(post: Post): boolean;
17
17
  getContent(id: string, contentType: "post"): PostWithComments | null;
@@ -26,7 +26,7 @@ export declare function ContentDBMixin<TBase extends CampaignDBConstructor>(Base
26
26
  * @param row Must have `details`, `comment_count` and `comments`
27
27
  * @returns
28
28
  */
29
- "__#170@#parseContentRowJoinedComments"(row: any): any;
29
+ "__#171@#parseContentRowJoinedComments"(row: any): any;
30
30
  getContentCountByDate(contentType: ContentType, groupBy: "year" | "month", filter?: {
31
31
  campaign?: Campaign | string | null;
32
32
  date?: Date | null;
@@ -50,19 +50,19 @@ export declare function ContentDBMixin<TBase extends CampaignDBConstructor>(Base
50
50
  collection: Collection;
51
51
  campaignId: string;
52
52
  } | null;
53
- "__#170@#savePostCollection"(post: Post): void;
53
+ "__#171@#savePostCollection"(post: Post): void;
54
54
  getCollectionList(params: GetCollectionListParams): CollectionList;
55
55
  checkCollectionExists(id: string): boolean;
56
56
  checkPostTagExists(id: string, campaign: Campaign | null): boolean;
57
57
  getPostComments(post: Post | string): Comment[] | null;
58
- "__#170@#savePostTags"(post: Post): void;
58
+ "__#171@#savePostTags"(post: Post): void;
59
59
  getPostTagList(params: GetPostTagListParams): PostTagList;
60
60
  saveCampaign(campaign: Campaign | null, downloadDate: Date, overwriteIfExists?: boolean): void;
61
61
  getCampaign(params: import("../types/Campaign").GetCampaignParams): Campaign | null;
62
- "__#169@#saveRewards"(campaign: Campaign): void;
63
- "__#169@#doSaveReward"(campaign: Campaign, reward: import("../../entities").Reward): void;
62
+ "__#170@#saveRewards"(campaign: Campaign): void;
63
+ "__#170@#doSaveReward"(campaign: Campaign, reward: import("../../entities").Reward): void;
64
64
  getCampaignList(params: import("../types/Campaign").GetCampaignListParams): import("../types/Campaign").CampaignList;
65
- "__#169@#getCampaignWithCounts"(params: import("../types/Campaign").GetCampaignParams): import("../types/Campaign").CampaignWithCounts | null;
65
+ "__#170@#getCampaignWithCounts"(params: import("../types/Campaign").GetCampaignParams): import("../types/Campaign").CampaignWithCounts | null;
66
66
  checkCampaignExists(id: string): boolean;
67
67
  saveUser(user: import("../../entities").User | null): void;
68
68
  getUserByID(id: string): import("../../entities").User | null;
@@ -448,7 +448,7 @@ export function ContentDBMixin(Base) {
448
448
  const value = groupBy === 'year' ?
449
449
  String(date.getUTCFullYear())
450
450
  : getYearMonthString(date);
451
- whereValues.push(String(value));
451
+ whereValues.push(value);
452
452
  }
453
453
  const whereClause = `WHERE ${whereClauseParts.join(' AND ')}`;
454
454
  const strftimeFormat = groupBy === 'year' ? '%Y' : '%Y-%m';