patreon-dl 3.7.0 → 3.8.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 (68) hide show
  1. package/README.md +29 -1
  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/index.d.ts +16 -16
  9. package/dist/browse/web/assets/index-CQnQD2xz.css +1 -0
  10. package/dist/browse/web/assets/index-CtZbx-Du.js +218 -0
  11. package/dist/browse/web/index.html +2 -2
  12. package/dist/cli/CLIOptions.js +2 -0
  13. package/dist/cli/CLIOptions.js.map +1 -1
  14. package/dist/cli/CommandLineParser.d.ts +4 -0
  15. package/dist/cli/CommandLineParser.js +65 -32
  16. package/dist/cli/CommandLineParser.js.map +1 -1
  17. package/dist/cli/ConfigFileParser.js +2 -0
  18. package/dist/cli/ConfigFileParser.js.map +1 -1
  19. package/dist/cli/helper/PostList.d.ts +6 -0
  20. package/dist/cli/helper/PostList.js +106 -0
  21. package/dist/cli/helper/PostList.js.map +1 -0
  22. package/dist/cli/index.js +73 -53
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/downloaders/Bootstrap.d.ts +5 -0
  25. package/dist/downloaders/Bootstrap.js +10 -0
  26. package/dist/downloaders/Bootstrap.js.map +1 -1
  27. package/dist/downloaders/Downloader.d.ts +4 -4
  28. package/dist/downloaders/Downloader.js +5 -58
  29. package/dist/downloaders/Downloader.js.map +1 -1
  30. package/dist/downloaders/DownloaderOptions.d.ts +1 -0
  31. package/dist/downloaders/DownloaderOptions.js +2 -0
  32. package/dist/downloaders/DownloaderOptions.js.map +1 -1
  33. package/dist/downloaders/IncludeCriteriaHelper.d.ts +25 -0
  34. package/dist/downloaders/IncludeCriteriaHelper.js +160 -0
  35. package/dist/downloaders/IncludeCriteriaHelper.js.map +1 -0
  36. package/dist/downloaders/InitialData.js +20 -6
  37. package/dist/downloaders/InitialData.js.map +1 -1
  38. package/dist/downloaders/PostDownloader.js +62 -98
  39. package/dist/downloaders/PostDownloader.js.map +1 -1
  40. package/dist/downloaders/PostsFetcher.js +4 -2
  41. package/dist/downloaders/PostsFetcher.js.map +1 -1
  42. package/dist/downloaders/ProductDownloader.js +31 -21
  43. package/dist/downloaders/ProductDownloader.js.map +1 -1
  44. package/dist/downloaders/task/M3U8DownloadTask.d.ts +1 -0
  45. package/dist/downloaders/task/M3U8DownloadTask.js +137 -39
  46. package/dist/downloaders/task/M3U8DownloadTask.js.map +1 -1
  47. package/dist/downloaders/task/YouTubeDownloadTask.js +1 -3
  48. package/dist/downloaders/task/YouTubeDownloadTask.js.map +1 -1
  49. package/dist/parsers/PageParser.js +8 -3
  50. package/dist/parsers/PageParser.js.map +1 -1
  51. package/dist/utils/Fetcher.d.ts +4 -1
  52. package/dist/utils/Fetcher.js +6 -1
  53. package/dist/utils/Fetcher.js.map +1 -1
  54. package/dist/utils/URLHelper.d.ts +4 -0
  55. package/dist/utils/URLHelper.js +17 -0
  56. package/dist/utils/URLHelper.js.map +1 -1
  57. package/dist/utils/YouTubeCredentialsCapturer.js +1 -1
  58. package/dist/utils/YouTubeCredentialsCapturer.js.map +1 -1
  59. package/dist/utils/logging/ConsoleLogger.js +5 -0
  60. package/dist/utils/logging/ConsoleLogger.js.map +1 -1
  61. package/dist/utils/yt/InnertubeLoader.d.ts +4 -6
  62. package/dist/utils/yt/InnertubeLoader.js +14 -14
  63. package/dist/utils/yt/InnertubeLoader.js.map +1 -1
  64. package/dist/utils/yt/PoToken.js +53 -27
  65. package/dist/utils/yt/PoToken.js.map +1 -1
  66. package/package.json +12 -8
  67. package/dist/browse/web/assets/index-CW4CUoWl.css +0 -1
  68. package/dist/browse/web/assets/index-CziUWlSw.js +0 -218
@@ -1 +1 @@
1
- {"version":3,"file":"YouTubeDownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/YouTubeDownloadTask.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,YAAY,MAAM,aAAa,CAAC;AAG5C,OAAO,sBAAuF,MAAM,6BAA6B,CAAC;AAClI,OAAO,eAAe,MAAM,mCAAmC,CAAC;AAChE,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAGvE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAoB/B,qBAAqB;AACrB,yHAAyH;AACzH,MAAM,YAAY,GAA+B;IAC/C,oDAAoD;IACpD,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC9F,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC9F,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;IACvD,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC/F,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC/F,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IACjG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAChG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAEhG,+FAA+F;IAC/F,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;IACrE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAClG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAClG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;IACrG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAChG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IAEhG,YAAY;IACZ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC1H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC1H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC1H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC3H,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC9H,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC9H,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAE9H,4BAA4B;IAC5B,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC1H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC1H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC3H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC3H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC3H,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC5H,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAC3H,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;IAE1H,iBAAiB;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,uEAAuE;IAC7I,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IAC9F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IAEpF,iBAAiB;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;IACvG,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE;IACxG,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE;IACxG,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;IAC7F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;IAE7F,YAAY;IACZ,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACvH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtH,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxG,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IAEpF,qFAAqF;IACrF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC9F,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/F,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/F,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAE/F,kBAAkB;IAClB,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IACnF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAEnF,mCAAmC;IACnC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IAChF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IAChF,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;IAEjF,iBAAiB;IACjB,gCAAgC;IAEhC,iEAAiE;IACjE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC7F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC7F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;CAC9F,CAAA;AA8BA,CAAC;AAEF,MAAqB,mBAAoB,SAAQ,sBAAwC;IAYvF,YAAY,MAAiC;QAC3C,KAAK,CAAC,MAAM,CAAC,CAAC;;QAXhB,SAAI,GAAG,qBAAqB,CAAC;QAI7B,+CAAiB;QACjB,wDAAoC;QACpC,6CAA4B;QAC5B,2DAAwD;QACxD,+CAAkB;QAIhB,uBAAA,IAAI,gCAAY,MAAM,CAAC,OAAO,MAAA,CAAC;QAC/B,uBAAA,IAAI,yCAAqB,MAAM,CAAC,gBAAgB,MAAA,CAAC;QACjD,uBAAA,IAAI,8BAAU,IAAI,MAAA,CAAC;QACnB,uBAAA,IAAI,4CAAwB,IAAI,MAAA,CAAC;QACjC,uBAAA,IAAI,gCAAY,MAAM,CAAC,OAAO,MAAA,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,MAAoB;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAMS,KAAK,CAAC,OAAO;QACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAEzD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;QACzC,IAAI,uBAAA,IAAI,6CAAkB,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC;gBACd,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,4BAA4B,YAAY,GAAG;gBACpD,oBAAoB,EAAE,YAAY;aACnC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,sBAAsB,GAAG,CAAC,KAAuC,EAAE,OAAmD,EAAE,EAAE;YAC9H,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC,CAAA;QAED,MAAM,qBAAqB,GAAG,MAAM,IAAI,OAAO,CAA4B,CAAC,OAAO,EAAE,EAAE;YACrF,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAC5E,YAAY,CAAC,MAAM,CAAC,yBAAyB,EAAE;oBAC7C,YAAY,EAAE,MAAM;oBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS;oBACT,MAAM;oBACN,YAAY,EAAE,KAAK;oBACnB,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC;iBACvD,CAAC,CACH,CAAC,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,IAAI,qBAAqB,KAAK,UAAU,EAAG,CAAC;gBAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;oBAClD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,6DAA6D,CAAC,CAAC;oBACjF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,CAAC;qBACI,CAAC;oBACJ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,4EAA4E,CAAC,CAAC;oBAChG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,CAAC;gBACd,IAAI,EAAE,2BAA2B;gBACjC,OAAO,EAAE,8CAA8C;aACxD,CAAC,CAAC;QACL,CAAC;gBACO,CAAC;YACP,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,GAAG,CAAC,CAAC;wBACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,MAAoB;QACzD,IAAI,uBAAA,IAAI,gDAAqB,EAAE,CAAC;YAC9B,OAAO,uBAAA,IAAI,gDAAqB,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,0BAA0B,QAAQ,GAAG,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,uBAAA,IAAI,oEAAS,MAAb,IAAI,EAAU,OAAO,CAAC,CAAC;QAE3C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iDAAiD,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,uCAAuC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC;YACvF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,2CAA2C,KAAK,CAAC,kBAAkB,CAAC,MAAM,MAAM,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;YACvI,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAqC,EAAE,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CACb,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAChD,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CACjD,CAAC;QACJ,CAAC;aACI,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,gBAAgB,GAAG,MAAM,uBAAA,IAAI,iEAAM,MAAV,IAAI,EAAO,GAAG,EAAE,MAAM,CAAC,CAAC;YACrD,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,aAAa,KAAK,uBAAuB,gBAAgB,CAAC,MAAM,MAAM,gBAAgB,CAAC,UAAU,yBAAyB,CAAC,CAAC;gBACtK,MAAM,uBAAA,IAAI,kEAAO,MAAX,IAAI,EAAQ,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChC,KAAK,EAAE,CAAC;gBACR,gBAAgB,GAAG,MAAM,uBAAA,IAAI,iEAAM,MAAV,IAAI,EAAO,GAAG,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;YAC/C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,gCAAgC,KAAK,SAAS,GAAG,cAAc,KAAK,aAAa,SAAS,KAAK,CAAC,CAAC;YAC5I,CAAC;iBACI,CAAC;gBACJ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,aAAa,KAAK,iBAAiB,SAAS,IAAI,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,uBAAA,IAAI,8BAAU,KAAK,MAAA,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,WAAW,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,MAAM,aAAa,GAAyC,EAAE,CAAC;QAC/D,IAAI,GAAG,GAAG,EAAE,CAAC;QAEb,MAAM,kBAAkB,GAAG,CAAuB,MAAiB,EAAE,EAAE;YACrE,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAA,IAAI,oCAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,QAAQ,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;QACrG,CAAC,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,oEAAoE,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9G,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CACT;gBACE,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;gBACvC,MAAM,EAAE,MAAM,CAAC,KAAK;aACrB,EACD;gBACE,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;gBACvC,MAAM,EAAE,MAAM,CAAC,KAAK;aACrB,CACF,CAAC;YACF,aAAa,CAAC,IAAI,CAChB,UAAU,EAAE,6CAA6C;YACzD,UAAU,EAAE,6CAA6C;YACzD,QAAQ,EACR,sBAAsB,CAAC,4EAA4E;aACpG,CAAC;YACF,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iDAAiD,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3F,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe;gBAC9D,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe;oBAC7C,CAAC,CAAC,EAAE,eAAe,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxC,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,GAAG,GAAG,MAAM,CAAC;YACf,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAA,IAAI,oCAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAExH,uBAAA,IAAI,4CAAwB;YAC1B,MAAM;YACN,MAAM;YACN,aAAa;YACb,OAAO,EAAE,IAAI,CAAC,mEAAmE;SAClF,MAAA,CAAC;QAEF,OAAO,uBAAA,IAAI,gDAAqB,CAAC;IACnC,CAAC;IAES,iBAAiB;QACzB,OAAO,uBAAA,IAAI,kCAAO,EAAE,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC;IAClD,CAAC;;kWAxMD,KAAK,uCAAU,OAAe;IAC5B,OAAO,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAChF,CAAC,oCAwMD,KAAK,0CAAa,GAAW;IAC3B,IAAI,CAAC,uBAAA,EAAmB,uDAAwB,EAAE,CAAC;QACjD,uBAAA,EAAmB,MAA2B,MAAM,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC;YAChF,SAAS,EAAE,UAAU;SACtB,CAAC,mDAAA,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,uBAAA,EAAmB,uDAAwB,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACjD;;;;;OAKG;IACH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,CAAC,kCAAkC,GAAG,qBAAqB,CAAC,CAAC;AAC1E,CAAC,oCAED,KAAK,0CAAa,KAAmB;IACnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAE7D,gDAAgD;IAChD,IAAI,kBAAsC,CAAC;IAC3C,IAAI,SAA6B,CAAC;IAClC,IAAI,SAA6B,CAAC;IAElC,IAAI,CAAC;QACH,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAe,EAAE,CAAC;QACvB,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,qCAAqC;QACrC,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAe,EAAE,CAAC;QACvB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,4BAA4B;QAC5B,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAe,EAAE,CAAC;QACvB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,yEAAyE;IACzE,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAE,IAA6B,EAAsB,EAAE;YAC1G,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9B,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,iCAAiC;gBACjC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4EAA4E;YAC5E,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,MAAM,CAAC,MAAM,iBAAiB,aAAa,gCAAgC,CAAC,CAAC;YAEnH,MAAM,gBAAgB,GAAG,IAAI,KAAK,aAAa;gBAC7C,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC;gBACvC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAE5E,4EAA4E;YAC5E,MAAM,eAAe,GAAG,gBAAgB;iBACrC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,aAAa,CAAC;iBAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;YAErD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC;gBAC3E,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAED,gFAAgF;YAChF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,qCAAqC,aAAa,qBAAqB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1G,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;QAC1E,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,iCAAiC;IACnC,CAAC;IAED,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,EAAE,MAAmB,EAAE,EAAE;QAC/C,OAAO;YACL,GAAG,EAAE,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YACpD,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE;gBACnD,KAAK,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;aAClC;YACD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,MAAM,CAAC,cAAc;SACrC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,kBAAkB,IAAI,CACxB,CAAC,SAAS,IAAI,kBAAkB,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAE3F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE;gBACN,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,KAAK,CAAC,GAAG;aACf;SACF,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACnF,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAEnF,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;gBAClC,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;gBAClC,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf;SACF,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;gBAClC,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf;SACF,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK;gBAClC,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;gBACxC,GAAG,EAAE,WAAW,CAAC,GAAG;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,mEAEM,EAAU,EAAE,MAAoB;IACrC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,8BAED,KAAK,oCAAO,GAAW,EAAE,MAAoB;IAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,uBAAA,IAAI,oCAAS,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/F,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAtbM,uDAAyD,IAAI,EAAtC,CAAuC;eAJlD,mBAAmB","sourcesContent":["import path from 'path';\nimport * as InnertubeLib from 'youtubei.js';\nimport { type YT, type Misc } from 'youtubei.js';\nimport { type YouTubePostEmbed } from '../../entities/Post.js';\nimport FFmpegDownloadTaskBase, { type FFmpegCommandParams, type FFmpegDownloadTaskBaseParams } from './FFmpegDownloadTaskBase.js';\nimport InnertubeLoader from '../../utils/yt/InnertubeLoader.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport fs from 'fs';\nimport DownloadTask from './DownloadTask.js';\nimport YouTubeStreamDownloadTask from './YouTubeStreamDownloadTask.js';\nimport { type FileExistsAction } from '../DownloaderOptions.js';\nimport type Fetcher from '../../utils/Fetcher.js';\nimport { fetch } from 'undici';\n\nexport interface YouTubeDownloadTaskParams extends FFmpegDownloadTaskBaseParams<YouTubePostEmbed> {\n destDir: string;\n fetcher: Fetcher;\n}\n\ninterface ItagFormat {\n ext: string;\n width?: number;\n height?: number;\n acodec?: string;\n abr?: number;\n vcodec?: string;\n format_note?: string;\n preference?: number;\n container?: string;\n fps?: number;\n}\n\n// Taken from yt-dlp:\n// https://github.com/yt-dlp/yt-dlp/blob/349f36606fa7fb658216334a73ac7825c13503c2/yt_dlp/extractor/youtube/_video.py#L138\nconst ITAG_FORMATS: Record<number, ItagFormat> = {\n // NB: Used in YoutubeWebArchiveIE and GoogleDriveIE\n 5: { 'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 6: { 'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 13: { 'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v' },\n 17: { 'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'abr': 24, 'vcodec': 'mp4v' },\n 18: { 'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 96, 'vcodec': 'h264' },\n 22: { 'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 34: { 'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 35: { 'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well\n 36: { 'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v' },\n 37: { 'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 38: { 'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 43: { 'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 44: { 'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 45: { 'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 46: { 'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 59: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 78: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // 3D videos\n 82: { 'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 83: { 'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 84: { 'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 85: { 'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 100: { 'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8', 'preference': -20 },\n 101: { 'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n 102: { 'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n\n // Apple HTTP Live Streaming\n 91: { 'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 92: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 93: { 'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 94: { 'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 95: { 'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 96: { 'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 132: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 151: { 'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 24, 'vcodec': 'h264', 'preference': -10 },\n\n // DASH mp4 video\n 133: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 134: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 135: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 136: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 137: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 138: { 'ext': 'mp4', 'format_note': 'DASH video', 'vcodec': 'h264' }, // Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)\n 160: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 212: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 264: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 298: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 299: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 266: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'h264' },\n\n // Dash mp4 audio\n 139: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 48, 'container': 'm4a_dash' },\n 140: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 128, 'container': 'm4a_dash' },\n 141: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 256, 'container': 'm4a_dash' },\n 256: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 258: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 325: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'dtse', 'container': 'm4a_dash' },\n 328: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'ec-3', 'container': 'm4a_dash' },\n\n // Dash webm\n 167: { 'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 168: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 169: { 'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 170: { 'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 218: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 219: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 278: { 'ext': 'webm', 'height': 144, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp9' },\n 242: { 'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 243: { 'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 244: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 245: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 246: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 247: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 248: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 271: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n\n // itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)\n 272: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 302: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 303: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 308: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 313: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 315: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n\n // Dash webm audio\n 171: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 128 },\n 172: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 256 },\n\n // Dash webm audio with opus inside\n 249: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 50 },\n 250: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 70 },\n 251: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 160 },\n\n // RTMP (unnamed)\n //'_rtmp': {'protocol': 'rtmp'},\n\n // av01 video only formats sometimes served with \"unknown\" codecs\n 394: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 395: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 396: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'av01.0.01M.08' },\n 397: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'av01.0.04M.08' },\n 398: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'av01.0.05M.08' },\n 399: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'av01.0.08M.08' },\n 400: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n 401: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n}\n\ntype StreamType = 'video' | 'audio' | 'video+audio';\n\ntype Stream<T extends StreamType> = {\n type: T;\n url: string;\n quality: string;\n itag: number;\n contentLength?: number;\n cpn: string;\n};\n\ntype StreamBundle = {\n type: 'separateAV';\n video: Stream<'video'>;\n audio: Stream<'audio'>;\n} | {\n type: 'combinedAV';\n stream: Stream<'video+audio'>;\n} | {\n type: 'videoOnly';\n stream: Stream<'video'>;\n} | {\n type: 'audioOnly';\n stream: Stream<'audio'>;\n};\n\ninterface YouTubeFFmpegCommandParams extends FFmpegCommandParams {\n inputs: (FFmpegCommandParams['inputs'][number] & { stream: Stream<any> })[];\n};\n\nexport default class YouTubeDownloadTask extends FFmpegDownloadTaskBase<YouTubePostEmbed> {\n\n name = 'YouTubeDownloadTask';\n\n static #innertubeForResolveURL: InnertubeLib.Innertube | null = null;\n\n #destDir: string;\n #fileExistsAction: FileExistsAction;\n #video: YT.VideoInfo | null;\n #ffmpegCommandParams: YouTubeFFmpegCommandParams | null;\n #fetcher: Fetcher;\n\n constructor(params: YouTubeDownloadTaskParams) {\n super(params);\n this.#destDir = params.destDir;\n this.#fileExistsAction = params.fileExistsAction;\n this.#video = null;\n this.#ffmpegCommandParams = null;\n this.#fetcher = params.fetcher;\n }\n\n protected async resolveDestPath(signal?: AbortSignal) {\n const params = await this.getFFmpegCommandParams(signal);\n return params.output;\n }\n\n async getInnertube() {\n return (await InnertubeLoader.getInstance(this.config)).innertube;\n }\n\n async #getInfo(videoId: string) {\n return (await InnertubeLoader.getInstance(this.config)).getVideoInfo(videoId);\n }\n\n protected async doStart() {\n const innertube = await this.getInnertube();\n const ffmpegParams = await this.getFFmpegCommandParams();\n\n const destFilePath = ffmpegParams.output;\n if (this.#fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {\n await this.setDownloaded(destFilePath);\n this.notifySkip({\n name: 'destFileExists',\n message: `Destination file exists (${destFilePath})`,\n existingDestFilePath: destFilePath\n });\n return;\n }\n\n const __checkStreamDownloads = (tasks: YouTubeStreamDownloadTask<any>[], resolve: (value: 'complete' | 'incomplete') => void) => {\n if (tasks.every((task) => task.hasEnded())) {\n resolve(tasks.every((task) => task.status === 'completed') ? 'complete' : 'incomplete');\n }\n }\n\n const streamDownloadsResult = await new Promise<'complete' | 'incomplete'>((resolve) => {\n void (async () => {\n const tasks = await Promise.all(ffmpegParams.inputs.map(({ input, stream }) =>\n DownloadTask.create(YouTubeStreamDownloadTask, {\n downloadType: 'main',\n callbacks: this.callbacks,\n config: this.config,\n logger: this.logger,\n src: this.src,\n srcEntity: this.srcEntity,\n innertube,\n stream,\n destFilePath: input,\n callback: () => __checkStreamDownloads(tasks, resolve)\n })\n ));\n for (const task of tasks) {\n this.callbacks?.onSpawn(this, task);\n }\n })();\n });\n\n try {\n if (streamDownloadsResult === 'complete') {\n if (this.config.dryRun) {\n this.log('debug', 'YouTube stream(s) downloaded');\n this.log('debug', '(dry-run) -> Skip FFmpeg processing on downloaded stream(s)');\n this.notifyComplete();\n }\n else {\n this.log('debug', 'YouTube stream(s) downloaded - going to run FFmpeg on downloaded stream(s)');\n await super.doStart();\n }\n return;\n }\n \n this.notifySkip({\n name: 'dependentTaskNotCompleted',\n message: 'One or more dependent tasks did not complete'\n });\n }\n finally {\n for (const { input } of ffmpegParams.inputs) {\n try {\n if (this.config.dryRun || fs.existsSync(input)) {\n this.log('debug', `Clean up \"${input}\"`);\n this.fsHelper.unlink(input);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${input}\":`, error);\n }\n }\n }\n }\n\n protected async getFFmpegCommandParams(signal?: AbortSignal): Promise<YouTubeFFmpegCommandParams> {\n if (this.#ffmpegCommandParams) {\n return this.#ffmpegCommandParams;\n }\n\n const videoURL = this.src;\n\n this.log('debug', `Fetch video info from \"${videoURL}\"`);\n const videoId = await this.#resolveURL(videoURL);\n const video = await this.#getInfo(videoId);\n\n this.log('debug', `Choose best-quality stream for YouTube video #${video.basic_info.id}`);\n const stream = await this.#pickStream(video);\n if (!stream) {\n const errMsg = `Stream not found for YouTube video #${video.basic_info.id || videoId}`;\n this.log('error', errMsg);\n if (video.playability_status) {\n this.log('error', `The playability status of the video is: ${video.playability_status.status} - ${video.playability_status.reason}`);\n }\n throw Error(errMsg);\n }\n\n // Test streams - YT sometimes imposes a delay before the streams become accessible\n const streamURLs: {label: string; url: string; }[] = [];\n if (stream.type === 'separateAV') {\n streamURLs.push(\n { label: 'video stream', url: stream.video.url },\n { label: 'audio stream', url: stream.audio.url }\n );\n }\n else {\n streamURLs.push({ label: 'stream', url: stream.stream.url });\n }\n for (const { label, url } of streamURLs) {\n const startTime = new Date().getTime();\n let tries = 0;\n let testStreamResult = await this.#head(url, signal);\n while (!testStreamResult.ok && tries < 3) {\n if (signal?.aborted) {\n throw Error('Aborted');\n }\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validation failed (${testStreamResult.status} - ${testStreamResult.statusText}); retrying after 2s...`);\n await this.#sleep(2000, signal);\n tries++;\n testStreamResult = await this.#head(url, signal);\n }\n const endTime = new Date().getTime();\n const timeTaken = (endTime - startTime) / 1000;\n if (tries === 3) {\n this.log('warn', `(#${video.basic_info.id}) failed to validate YouTube ${label} URL \"${url}\" (retried ${tries} times in ${timeTaken}s).`);\n }\n else {\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validated in ${timeTaken}s.`);\n }\n }\n\n this.#video = video;\n const _quality = stream.type === 'separateAV' ? stream.video.quality : stream.stream.quality;\n const quality = _quality ? ` (${_quality})` : '';\n const basename = `youtube-${video.basic_info.id}${quality}`;\n const inputs: YouTubeFFmpegCommandParams['inputs'] = [];\n const outputOptions: FFmpegCommandParams['outputOptions'] = [];\n let ext = '';\n\n const __getInputFilePath = <T extends StreamType>(stream: Stream<T>) => {\n const _ext = ITAG_FORMATS[stream.itag]?.ext ? `.${ITAG_FORMATS[stream.itag].ext}` : '';\n return path.resolve(this.#destDir, FSHelper.sanitizeFilename(`${basename}.f${stream.itag}${_ext}`))\n };\n\n if (stream.type === 'separateAV') {\n this.log('debug', `Obtained separate video and audio stream URLs for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `Video stream URL: ${stream.video.url}`);\n this.log('debug', `Audio stream URL: ${stream.audio.url}`);\n inputs.push(\n {\n input: __getInputFilePath(stream.video),\n stream: stream.video\n },\n {\n input: __getInputFilePath(stream.audio),\n stream: stream.audio,\n }\n );\n outputOptions.push(\n '-map 0:v', // Copy all video streams from videoStreamURL\n '-map 1:a', // Copy all audio streams from audioStreamURL\n '-f mp4',\n '-strict experimental' // Required when muxing Opus audio into MP4 on older FFmpeg versions (< 4.3)\n );\n ext = '.mp4';\n }\n else {\n this.log('debug', `Obtained single stream URL for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `${stream.type === 'audioOnly' ? '(Audio only) '\n : stream.type === 'videoOnly' ? '(Video only) '\n : ''}Stream URL: ${stream.stream.url}`);\n inputs.push({\n input: __getInputFilePath(stream.stream),\n stream: stream.stream\n });\n if (stream.type === 'audioOnly') {\n outputOptions.push('-f m4a');\n ext = '.m4a';\n }\n }\n const output = path.resolve(this.#destDir, FSHelper.sanitizeFilename(`youtube-${video.basic_info.id}${quality}${ext}`));\n\n this.#ffmpegCommandParams = {\n inputs,\n output,\n outputOptions,\n noProxy: true // Inputs are going to be all local files, so should not use proxy.\n };\n\n return this.#ffmpegCommandParams;\n }\n\n protected getTargetDuration(): number | null {\n return this.#video?.basic_info.duration || null;\n }\n\n async #resolveURL(url: string): Promise<string> {\n if (!YouTubeDownloadTask.#innertubeForResolveURL) {\n YouTubeDownloadTask.#innertubeForResolveURL = await InnertubeLib.Innertube.create({\n player_id: '9f4cc5e4'\n });\n }\n const innertube = YouTubeDownloadTask.#innertubeForResolveURL;\n const endpoint = await innertube.resolveURL(url);\n /**\n * Endpoint MUST have `videoId` in its payload.\n * On first resolve of YT shared links ('https://youtu.be/...),\n * this returns `url` in the payload instead of `videoID`. We would\n * have to resolve it once more.\n */\n const payload = endpoint.payload && typeof endpoint.payload === 'object' ? endpoint.payload : null;\n if (payload && Reflect.has(payload, 'videoId')) {\n return payload.videoId;\n }\n if (payload && Reflect.has(payload, 'url')) {\n return this.#resolveURL(payload.url);\n }\n throw Error(`Failed to resolve YouTube URL \"${url}\": no videoId found`);\n }\n\n async #pickStream(video: YT.VideoInfo): Promise<StreamBundle | null> {\n const innertube = await this.getInnertube();\n const maxResolution = this.config.maxVideoResolution ?? null;\n\n // First, get the best streams without filtering\n let bestVideoWithAudio: Misc.Format | null;\n let bestVideo: Misc.Format | null;\n let bestAudio: Misc.Format | null;\n\n try {\n bestVideoWithAudio = video.chooseFormat({ quality: 'best', type: 'video+audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideoWithAudio = null;\n }\n try {\n // `bestVideo` may also contain audio\n bestVideo = video.chooseFormat({ quality: 'best', type: 'video', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideo = null;\n }\n try {\n // `bestAudio` is audio only\n bestAudio = video.chooseFormat({ quality: 'best', type: 'audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestAudio = null;\n }\n\n // If max resolution is set and video exceeds it, find a lower resolution\n if (maxResolution !== null && maxResolution > 0) {\n const checkAndDowngrade = (format: Misc.Format | null, type: 'video+audio' | 'video'): Misc.Format | null => {\n if (!format || !format.height) {\n return format;\n }\n\n if (format.height <= maxResolution) {\n // Current format is within limit\n return format;\n }\n\n // Current format exceeds limit, find best format at or below max resolution\n this.log('debug', `Video resolution ${format.height}p exceeds max ${maxResolution}p, finding lower resolution...`);\n\n const availableFormats = type === 'video+audio'\n ? (video.streaming_data?.formats || [])\n : (video.streaming_data?.adaptive_formats || []).filter(f => f.has_video);\n\n // Sort by height descending and find the best one at or below maxResolution\n const suitableFormats = availableFormats\n .filter(f => f.height && f.height <= maxResolution)\n .sort((a, b) => (b.height || 0) - (a.height || 0));\n\n if (suitableFormats.length > 0) {\n this.log('debug', `Selected ${suitableFormats[0].height}p as alternative`);\n return suitableFormats[0];\n }\n\n // No suitable format found, use original (better to have high res than nothing)\n this.log('warn', `No video format found at or below ${maxResolution}p, using original ${format.height}p`);\n return format;\n };\n\n bestVideoWithAudio = checkAndDowngrade(bestVideoWithAudio, 'video+audio');\n bestVideo = checkAndDowngrade(bestVideo, 'video');\n // Audio doesn't need downgrading\n }\n\n if (!bestVideoWithAudio && !bestVideo && !bestAudio) {\n return null;\n }\n\n const __decipher = async (format: Misc.Format) => {\n return {\n url: await format.decipher(innertube.session.player),\n quality: {\n video: format.quality_label || format.quality || '',\n audio: format.audio_quality || ''\n },\n itag: format.itag,\n contentLength: format.content_length\n };\n };\n\n if (bestVideoWithAudio && (\n (bestVideo && bestVideoWithAudio.itag === bestVideo.itag) || (!bestVideo && !bestAudio))) {\n\n const stream = await __decipher(bestVideoWithAudio);\n return {\n type: 'combinedAV',\n stream: {\n type: 'video+audio',\n quality: stream.quality.video,\n itag: stream.itag,\n contentLength: stream.contentLength,\n url: stream.url,\n cpn: video.cpn\n }\n };\n }\n\n const videoWithAudioStream = bestVideoWithAudio ? await __decipher(bestVideoWithAudio) : null;\n const videoStream = bestVideo ? await __decipher(bestVideo) : videoWithAudioStream;\n const audioStream = bestAudio ? await __decipher(bestAudio) : videoWithAudioStream;\n\n if (videoStream && audioStream) {\n return {\n type: 'separateAV',\n video: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n },\n audio: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (videoStream) {\n return {\n type: 'videoOnly',\n stream: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (audioStream) {\n return {\n type: 'audioOnly',\n stream: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n return null;\n }\n\n #sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new Error('Aborted'));\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error('Aborted'));\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n }\n\n async #head(url: string, signal?: AbortSignal) {\n const res = await fetch(url, { method: 'HEAD', signal, dispatcher: this.#fetcher.proxyAgent });\n return {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText\n };\n }\n}\n"]}
1
+ {"version":3,"file":"YouTubeDownloadTask.js","sourceRoot":"","sources":["../../../src/downloaders/task/YouTubeDownloadTask.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport * as InnertubeLib from 'youtubei.js';\nimport { type YT, type Misc } from 'youtubei.js';\nimport { type YouTubePostEmbed } from '../../entities/Post.js';\nimport FFmpegDownloadTaskBase, { type FFmpegCommandParams, type FFmpegDownloadTaskBaseParams } from './FFmpegDownloadTaskBase.js';\nimport InnertubeLoader from '../../utils/yt/InnertubeLoader.js';\nimport FSHelper from '../../utils/FSHelper.js';\nimport fs from 'fs';\nimport DownloadTask from './DownloadTask.js';\nimport YouTubeStreamDownloadTask from './YouTubeStreamDownloadTask.js';\nimport { type FileExistsAction } from '../DownloaderOptions.js';\nimport type Fetcher from '../../utils/Fetcher.js';\nimport { fetch } from 'undici';\n\nexport interface YouTubeDownloadTaskParams extends FFmpegDownloadTaskBaseParams<YouTubePostEmbed> {\n destDir: string;\n fetcher: Fetcher;\n}\n\ninterface ItagFormat {\n ext: string;\n width?: number;\n height?: number;\n acodec?: string;\n abr?: number;\n vcodec?: string;\n format_note?: string;\n preference?: number;\n container?: string;\n fps?: number;\n}\n\n// Taken from yt-dlp:\n// https://github.com/yt-dlp/yt-dlp/blob/349f36606fa7fb658216334a73ac7825c13503c2/yt_dlp/extractor/youtube/_video.py#L138\nconst ITAG_FORMATS: Record<number, ItagFormat> = {\n // NB: Used in YoutubeWebArchiveIE and GoogleDriveIE\n 5: { 'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 6: { 'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263' },\n 13: { 'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v' },\n 17: { 'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'abr': 24, 'vcodec': 'mp4v' },\n 18: { 'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 96, 'vcodec': 'h264' },\n 22: { 'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 34: { 'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 35: { 'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well\n 36: { 'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v' },\n 37: { 'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 38: { 'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264' },\n 43: { 'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 44: { 'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8' },\n 45: { 'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 46: { 'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8' },\n 59: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n 78: { 'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264' },\n\n // 3D videos\n 82: { 'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 83: { 'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20 },\n 84: { 'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 85: { 'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20 },\n 100: { 'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8', 'preference': -20 },\n 101: { 'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n 102: { 'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20 },\n\n // Apple HTTP Live Streaming\n 91: { 'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 92: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 93: { 'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 94: { 'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10 },\n 95: { 'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 96: { 'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10 },\n 132: { 'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10 },\n 151: { 'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 24, 'vcodec': 'h264', 'preference': -10 },\n\n // DASH mp4 video\n 133: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 134: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 135: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 136: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 137: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 138: { 'ext': 'mp4', 'format_note': 'DASH video', 'vcodec': 'h264' }, // Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559)\n 160: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 212: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 264: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'h264' },\n 298: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 299: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60 },\n 266: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'h264' },\n\n // Dash mp4 audio\n 139: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 48, 'container': 'm4a_dash' },\n 140: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 128, 'container': 'm4a_dash' },\n 141: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 256, 'container': 'm4a_dash' },\n 256: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 258: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash' },\n 325: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'dtse', 'container': 'm4a_dash' },\n 328: { 'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'ec-3', 'container': 'm4a_dash' },\n\n // Dash webm\n 167: { 'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 168: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 169: { 'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 170: { 'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 218: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 219: { 'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8' },\n 278: { 'ext': 'webm', 'height': 144, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp9' },\n 242: { 'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 243: { 'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 244: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 245: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 246: { 'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 247: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 248: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 271: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n\n // itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug)\n 272: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 302: { 'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 303: { 'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 308: { 'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n 313: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9' },\n 315: { 'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60 },\n\n // Dash webm audio\n 171: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 128 },\n 172: { 'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 256 },\n\n // Dash webm audio with opus inside\n 249: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 50 },\n 250: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 70 },\n 251: { 'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 160 },\n\n // RTMP (unnamed)\n //'_rtmp': {'protocol': 'rtmp'},\n\n // av01 video only formats sometimes served with \"unknown\" codecs\n 394: { 'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 395: { 'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08' },\n 396: { 'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'av01.0.01M.08' },\n 397: { 'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'av01.0.04M.08' },\n 398: { 'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'av01.0.05M.08' },\n 399: { 'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'av01.0.08M.08' },\n 400: { 'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n 401: { 'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08' },\n}\n\ntype StreamType = 'video' | 'audio' | 'video+audio';\n\ntype Stream<T extends StreamType> = {\n type: T;\n url: string;\n quality: string;\n itag: number;\n contentLength?: number;\n cpn: string;\n};\n\ntype StreamBundle = {\n type: 'separateAV';\n video: Stream<'video'>;\n audio: Stream<'audio'>;\n} | {\n type: 'combinedAV';\n stream: Stream<'video+audio'>;\n} | {\n type: 'videoOnly';\n stream: Stream<'video'>;\n} | {\n type: 'audioOnly';\n stream: Stream<'audio'>;\n};\n\ninterface YouTubeFFmpegCommandParams extends FFmpegCommandParams {\n inputs: (FFmpegCommandParams['inputs'][number] & { stream: Stream<any> })[];\n};\n\nexport default class YouTubeDownloadTask extends FFmpegDownloadTaskBase<YouTubePostEmbed> {\n\n name = 'YouTubeDownloadTask';\n\n static #innertubeForResolveURL: InnertubeLib.Innertube | null = null;\n\n #destDir: string;\n #fileExistsAction: FileExistsAction;\n #video: YT.VideoInfo | null;\n #ffmpegCommandParams: YouTubeFFmpegCommandParams | null;\n #fetcher: Fetcher;\n\n constructor(params: YouTubeDownloadTaskParams) {\n super(params);\n this.#destDir = params.destDir;\n this.#fileExistsAction = params.fileExistsAction;\n this.#video = null;\n this.#ffmpegCommandParams = null;\n this.#fetcher = params.fetcher;\n }\n\n protected async resolveDestPath(signal?: AbortSignal) {\n const params = await this.getFFmpegCommandParams(signal);\n return params.output;\n }\n\n async getInnertube() {\n return (await InnertubeLoader.getInstance(this.config)).innertube;\n }\n\n async #getInfo(videoId: string) {\n return (await InnertubeLoader.getInstance(this.config)).getVideoInfo(videoId);\n }\n\n protected async doStart() {\n const innertube = await this.getInnertube();\n const ffmpegParams = await this.getFFmpegCommandParams();\n\n const destFilePath = ffmpegParams.output;\n if (this.#fileExistsAction === 'skip' && fs.existsSync(destFilePath)) {\n await this.setDownloaded(destFilePath);\n this.notifySkip({\n name: 'destFileExists',\n message: `Destination file exists (${destFilePath})`,\n existingDestFilePath: destFilePath\n });\n return;\n }\n\n const __checkStreamDownloads = (tasks: YouTubeStreamDownloadTask<any>[], resolve: (value: 'complete' | 'incomplete') => void) => {\n if (tasks.every((task) => task.hasEnded())) {\n resolve(tasks.every((task) => task.status === 'completed') ? 'complete' : 'incomplete');\n }\n }\n\n const streamDownloadsResult = await new Promise<'complete' | 'incomplete'>((resolve) => {\n void (async () => {\n const tasks = await Promise.all(ffmpegParams.inputs.map(({ input, stream }) =>\n DownloadTask.create(YouTubeStreamDownloadTask, {\n downloadType: 'main',\n callbacks: this.callbacks,\n config: this.config,\n logger: this.logger,\n src: this.src,\n srcEntity: this.srcEntity,\n innertube,\n stream,\n destFilePath: input,\n callback: () => __checkStreamDownloads(tasks, resolve)\n })\n ));\n for (const task of tasks) {\n this.callbacks?.onSpawn(this, task);\n }\n })();\n });\n\n try {\n if (streamDownloadsResult === 'complete') {\n if (this.config.dryRun) {\n this.log('debug', 'YouTube stream(s) downloaded');\n this.log('debug', '(dry-run) -> Skip FFmpeg processing on downloaded stream(s)');\n this.notifyComplete();\n }\n else {\n this.log('debug', 'YouTube stream(s) downloaded - going to run FFmpeg on downloaded stream(s)');\n await super.doStart();\n }\n return;\n }\n \n this.notifySkip({\n name: 'dependentTaskNotCompleted',\n message: 'One or more dependent tasks did not complete'\n });\n }\n finally {\n for (const { input } of ffmpegParams.inputs) {\n try {\n if (this.config.dryRun || fs.existsSync(input)) {\n this.log('debug', `Clean up \"${input}\"`);\n this.fsHelper.unlink(input);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${input}\":`, error);\n }\n }\n }\n }\n\n protected async getFFmpegCommandParams(signal?: AbortSignal): Promise<YouTubeFFmpegCommandParams> {\n if (this.#ffmpegCommandParams) {\n return this.#ffmpegCommandParams;\n }\n\n const videoURL = this.src;\n\n this.log('debug', `Fetch video info from \"${videoURL}\"`);\n const videoId = await this.#resolveURL(videoURL);\n const video = await this.#getInfo(videoId);\n\n this.log('debug', `Choose best-quality stream for YouTube video #${video.basic_info.id}`);\n const stream = await this.#pickStream(video);\n if (!stream) {\n const errMsg = `Stream not found for YouTube video #${video.basic_info.id || videoId}`;\n this.log('error', errMsg);\n if (video.playability_status) {\n this.log('error', `The playability status of the video is: ${video.playability_status.status} - ${video.playability_status.reason}`);\n }\n throw Error(errMsg);\n }\n\n // Test streams - YT sometimes imposes a delay before the streams become accessible\n const streamURLs: {label: string; url: string; }[] = [];\n if (stream.type === 'separateAV') {\n streamURLs.push(\n { label: 'video stream', url: stream.video.url },\n { label: 'audio stream', url: stream.audio.url }\n );\n }\n else {\n streamURLs.push({ label: 'stream', url: stream.stream.url });\n }\n for (const { label, url } of streamURLs) {\n const startTime = new Date().getTime();\n let tries = 0;\n let testStreamResult = await this.#head(url, signal);\n while (!testStreamResult.ok && tries < 3) {\n if (signal?.aborted) {\n throw Error('Aborted');\n }\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validation failed (${testStreamResult.status} - ${testStreamResult.statusText}); retrying after 2s...`);\n await this.#sleep(2000, signal);\n tries++;\n testStreamResult = await this.#head(url, signal);\n }\n const endTime = new Date().getTime();\n const timeTaken = (endTime - startTime) / 1000;\n if (tries === 3) {\n this.log('warn', `(#${video.basic_info.id}) failed to validate YouTube ${label} URL \"${url}\" (retried ${tries} times in ${timeTaken}s).`);\n }\n else {\n this.log('debug', `(#${video.basic_info.id}) YouTube ${label} validated in ${timeTaken}s.`);\n }\n }\n\n this.#video = video;\n const _quality = stream.type === 'separateAV' ? stream.video.quality : stream.stream.quality;\n const quality = _quality ? ` (${_quality})` : '';\n const basename = `youtube-${video.basic_info.id}${quality}`;\n const inputs: YouTubeFFmpegCommandParams['inputs'] = [];\n const outputOptions: FFmpegCommandParams['outputOptions'] = [];\n let ext = '';\n\n const __getInputFilePath = <T extends StreamType>(stream: Stream<T>) => {\n const _ext = ITAG_FORMATS[stream.itag]?.ext ? `.${ITAG_FORMATS[stream.itag].ext}` : '';\n return path.resolve(this.#destDir, FSHelper.sanitizeFilename(`${basename}.f${stream.itag}${_ext}`))\n };\n\n if (stream.type === 'separateAV') {\n this.log('debug', `Obtained separate video and audio stream URLs for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `Video stream URL: ${stream.video.url}`);\n this.log('debug', `Audio stream URL: ${stream.audio.url}`);\n inputs.push(\n {\n input: __getInputFilePath(stream.video),\n stream: stream.video\n },\n {\n input: __getInputFilePath(stream.audio),\n stream: stream.audio,\n }\n );\n outputOptions.push(\n '-map 0:v', // Copy all video streams from videoStreamURL\n '-map 1:a', // Copy all audio streams from audioStreamURL\n '-f mp4',\n '-strict experimental' // Required when muxing Opus audio into MP4 on older FFmpeg versions (< 4.3)\n );\n ext = '.mp4';\n }\n else {\n this.log('debug', `Obtained single stream URL for YouTube video #${video.basic_info.id}:`);\n this.log('debug', `${stream.type === 'audioOnly' ? '(Audio only) '\n : stream.type === 'videoOnly' ? '(Video only) '\n : ''}Stream URL: ${stream.stream.url}`);\n inputs.push({\n input: __getInputFilePath(stream.stream),\n stream: stream.stream\n });\n if (stream.type === 'audioOnly') {\n outputOptions.push('-f m4a');\n ext = '.m4a';\n }\n }\n const output = path.resolve(this.#destDir, FSHelper.sanitizeFilename(`youtube-${video.basic_info.id}${quality}${ext}`));\n\n this.#ffmpegCommandParams = {\n inputs,\n output,\n outputOptions,\n noProxy: true // Inputs are going to be all local files, so should not use proxy.\n };\n\n return this.#ffmpegCommandParams;\n }\n\n protected getTargetDuration(): number | null {\n return this.#video?.basic_info.duration || null;\n }\n\n async #resolveURL(url: string): Promise<string> {\n if (!YouTubeDownloadTask.#innertubeForResolveURL) {\n YouTubeDownloadTask.#innertubeForResolveURL = await InnertubeLib.Innertube.create();\n }\n const innertube = YouTubeDownloadTask.#innertubeForResolveURL;\n const endpoint = await innertube.resolveURL(url);\n /**\n * Endpoint MUST have `videoId` in its payload.\n * On first resolve of YT shared links ('https://youtu.be/...),\n * this returns `url` in the payload instead of `videoID`. We would\n * have to resolve it once more.\n */\n const payload = endpoint.payload && typeof endpoint.payload === 'object' ? endpoint.payload : null;\n if (payload && Reflect.has(payload, 'videoId')) {\n return payload.videoId;\n }\n if (payload && Reflect.has(payload, 'url')) {\n return this.#resolveURL(payload.url);\n }\n throw Error(`Failed to resolve YouTube URL \"${url}\": no videoId found`);\n }\n\n async #pickStream(video: YT.VideoInfo): Promise<StreamBundle | null> {\n const innertube = await this.getInnertube();\n const maxResolution = this.config.maxVideoResolution ?? null;\n\n // First, get the best streams without filtering\n let bestVideoWithAudio: Misc.Format | null;\n let bestVideo: Misc.Format | null;\n let bestAudio: Misc.Format | null;\n\n try {\n bestVideoWithAudio = video.chooseFormat({ quality: 'best', type: 'video+audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideoWithAudio = null;\n }\n try {\n // `bestVideo` may also contain audio\n bestVideo = video.chooseFormat({ quality: 'best', type: 'video', format: 'any' });\n }\n catch (_error: unknown) {\n bestVideo = null;\n }\n try {\n // `bestAudio` is audio only\n bestAudio = video.chooseFormat({ quality: 'best', type: 'audio', format: 'any' });\n }\n catch (_error: unknown) {\n bestAudio = null;\n }\n\n // If max resolution is set and video exceeds it, find a lower resolution\n if (maxResolution !== null && maxResolution > 0) {\n const checkAndDowngrade = (format: Misc.Format | null, type: 'video+audio' | 'video'): Misc.Format | null => {\n if (!format || !format.height) {\n return format;\n }\n\n if (format.height <= maxResolution) {\n // Current format is within limit\n return format;\n }\n\n // Current format exceeds limit, find best format at or below max resolution\n this.log('debug', `Video resolution ${format.height}p exceeds max ${maxResolution}p, finding lower resolution...`);\n\n const availableFormats = type === 'video+audio'\n ? (video.streaming_data?.formats || [])\n : (video.streaming_data?.adaptive_formats || []).filter(f => f.has_video);\n\n // Sort by height descending and find the best one at or below maxResolution\n const suitableFormats = availableFormats\n .filter(f => f.height && f.height <= maxResolution)\n .sort((a, b) => (b.height || 0) - (a.height || 0));\n\n if (suitableFormats.length > 0) {\n this.log('debug', `Selected ${suitableFormats[0].height}p as alternative`);\n return suitableFormats[0];\n }\n\n // No suitable format found, use original (better to have high res than nothing)\n this.log('warn', `No video format found at or below ${maxResolution}p, using original ${format.height}p`);\n return format;\n };\n\n bestVideoWithAudio = checkAndDowngrade(bestVideoWithAudio, 'video+audio');\n bestVideo = checkAndDowngrade(bestVideo, 'video');\n // Audio doesn't need downgrading\n }\n\n if (!bestVideoWithAudio && !bestVideo && !bestAudio) {\n return null;\n }\n\n const __decipher = async (format: Misc.Format) => {\n return {\n url: await format.decipher(innertube.session.player),\n quality: {\n video: format.quality_label || format.quality || '',\n audio: format.audio_quality || ''\n },\n itag: format.itag,\n contentLength: format.content_length\n };\n };\n\n if (bestVideoWithAudio && (\n (bestVideo && bestVideoWithAudio.itag === bestVideo.itag) || (!bestVideo && !bestAudio))) {\n\n const stream = await __decipher(bestVideoWithAudio);\n return {\n type: 'combinedAV',\n stream: {\n type: 'video+audio',\n quality: stream.quality.video,\n itag: stream.itag,\n contentLength: stream.contentLength,\n url: stream.url,\n cpn: video.cpn\n }\n };\n }\n\n const videoWithAudioStream = bestVideoWithAudio ? await __decipher(bestVideoWithAudio) : null;\n const videoStream = bestVideo ? await __decipher(bestVideo) : videoWithAudioStream;\n const audioStream = bestAudio ? await __decipher(bestAudio) : videoWithAudioStream;\n\n if (videoStream && audioStream) {\n return {\n type: 'separateAV',\n video: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n },\n audio: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (videoStream) {\n return {\n type: 'videoOnly',\n stream: {\n type: 'video',\n quality: videoStream.quality.video,\n itag: videoStream.itag,\n contentLength: videoStream.contentLength,\n url: videoStream.url,\n cpn: video.cpn\n }\n };\n }\n\n if (audioStream) {\n return {\n type: 'audioOnly',\n stream: {\n type: 'audio',\n quality: audioStream.quality.audio,\n itag: audioStream.itag,\n contentLength: audioStream.contentLength,\n url: audioStream.url,\n cpn: video.cpn\n }\n };\n }\n\n return null;\n }\n\n #sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new Error('Aborted'));\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error('Aborted'));\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n }\n\n async #head(url: string, signal?: AbortSignal) {\n const res = await fetch(url, { method: 'HEAD', signal, dispatcher: this.#fetcher.proxyAgent });\n return {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText\n };\n }\n}\n"]}
@@ -59,11 +59,16 @@ class PageParser extends Parser {
59
59
  throw Error(`Failed to obtain initial data - "currentUserId" not found in Next.js streaming response`);
60
60
  }
61
61
  }
62
- const campaignIdRegex = /campaign_id\\",\\"unit_id\\":\\"(.+?)\\"/gm;
62
+ const campaignIdRegex = /{\\"self\\":\\"https:\/\/www\.patreon\.com\/api\/campaigns\/(.+?)\\"}/gm;
63
63
  this.log('debug', `Trying pattern in Next.js streaming response: ${campaignIdRegex}`);
64
- const campaignIdMatch = campaignIdRegex.exec(html);
64
+ let campaignIdMatch = campaignIdRegex.exec(html);
65
65
  if (!campaignIdMatch || !campaignIdMatch[1]) {
66
- throw Error(`Initial data not found - no match for pattern in Next.js streaming response: ${campaignIdRegex}`);
66
+ const campaignIdRegexSimple = /{\\"self\\":\\"https:\/\/[^"]+\/api\/campaigns\/(.+?)\\"}/gm;
67
+ this.log('debug', `Trying fallback pattern: ${campaignIdRegexSimple}`);
68
+ campaignIdMatch = campaignIdRegexSimple.exec(html);
69
+ }
70
+ if (!campaignIdMatch || !campaignIdMatch[1]) {
71
+ throw Error(`Initial data not found - campaign ID not found in Next.js streaming response`);
67
72
  }
68
73
  const campaignId = campaignIdMatch ? campaignIdMatch[1] : undefined;
69
74
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"PageParser.js","sourceRoot":"","sources":["../../src/parsers/PageParser.ts"],"names":[],"mappings":"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","sourcesContent":["import ObjectHelper from '../utils/ObjectHelper.js';\nimport Parser from './Parser.js';\n\nexport default class PageParser extends Parser {\n\n protected name = 'PageParser';\n\n parseInitialData(html: string, _url: string) {\n this.log('debug', `Parse initial data from ${_url}`);\n\n const initialDataRegex = /window\\.patreon\\s*?=\\s*?({.+?});/gm;\n const initialDataRegex2 = /<script id=\"__NEXT_DATA__\" type=\"application\\/json\">(.+)<\\/script>/gm;\n\n this.log('debug', `Trying pattern: ${initialDataRegex}`);\n const match = initialDataRegex.exec(html);\n if (match && match[1]) {\n try {\n return JSON.parse(match[1]);\n }\n catch (error: any) {\n throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);\n }\n }\n this.log('debug', `No match for pattern: ${initialDataRegex}`);\n\n this.log('debug', `Trying pattern: ${initialDataRegex2}`);\n const match2 = initialDataRegex2.exec(html);\n if (match2 && match2[1]) {\n try {\n const parsed = JSON.parse(match2[1]);\n return ObjectHelper.getProperty(parsed, 'props.pageProps.bootstrapEnvelope');\n }\n catch (error: any) {\n throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);\n }\n }\n this.log('debug', `No match for pattern: ${initialDataRegex2}`);\n\n this.log('debug', 'Check Next.js streaming response');\n const isNextJSStreamingResponse = html.includes('self.__next_f.push');\n if (isNextJSStreamingResponse) {\n this.log('debug', 'Detected Next.js streaming response');\n\n let currentUserId: string | null = null;\n for (const { data: currentUser } of this.#extractJsonFromKey(html, 'currentUser')) {\n if (currentUser) {\n currentUserId = ObjectHelper.getProperty(currentUser, 'data.id');\n if (currentUserId) {\n break;\n }\n }\n }\n if (!currentUserId) {\n const matchCurrentUserNullRegex = /\\\\\"currentUser\\\\\"\\s*:\\s*null/g;\n const matchCurrentUserNull = matchCurrentUserNullRegex.exec(html);\n if (!matchCurrentUserNull) {\n throw Error(`Failed to obtain initial data - \"currentUserId\" not found in Next.js streaming response`);\n }\n }\n\n const campaignIdRegex = /campaign_id\\\\\",\\\\\"unit_id\\\\\":\\\\\"(.+?)\\\\\"/gm;\n this.log('debug', `Trying pattern in Next.js streaming response: ${campaignIdRegex}`);\n const campaignIdMatch = campaignIdRegex.exec(html);\n if (!campaignIdMatch || !campaignIdMatch[1]) {\n throw Error(`Initial data not found - no match for pattern in Next.js streaming response: ${campaignIdRegex}`);\n }\n\n const campaignId = campaignIdMatch ? campaignIdMatch[1] : undefined;\n return {\n pageBootstrap: {\n campaign: {\n data: {\n id: campaignId\n }\n }\n },\n commonBootstrap: {\n currentUser: {\n data: {\n id: currentUserId === null || currentUserId === 'null' ? undefined : currentUserId\n }\n }\n }\n };\n }\n\n throw Error('Initial data not found - no regex matches');\n }\n\n *#extractJsonFromKey(input: string, key: string) {\n const keyPattern = `\\\\\\\\\"${key}\\\\\\\\\"\\\\s*:\\\\s*{`;\n const keyRegex = new RegExp(keyPattern, 'g');\n\n let match;\n while ((match = keyRegex.exec(input)) !== null) {\n const start = match.index + match[0].length - 1; // position of opening {\n let end = start;\n let braceCount = 1;\n\n while (end < input.length && braceCount > 0) {\n end++;\n if (input[end] === '{') braceCount++;\n if (input[end] === '}') braceCount--;\n }\n\n const jsonFragment = input.slice(start, end + 1).replaceAll('\\\\', '');\n try {\n yield {\n data: JSON.parse(jsonFragment)\n };\n } catch (error) {\n this.log('debug', 'Error parsing JSON fragment:', error);\n yield {\n data: null,\n };\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PageParser.js","sourceRoot":"","sources":["../../src/parsers/PageParser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAqB,UAAW,SAAQ,MAAM;IAA9C;;;QAEY,SAAI,GAAG,YAAY,CAAC;IAwHhC,CAAC;IAtHC,gBAAgB,CAAC,IAAY,EAAE,IAAY;QACzC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,2BAA2B,IAAI,EAAE,CAAC,CAAC;QAErD,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;QAC9D,MAAM,iBAAiB,GAAG,sEAAsE,CAAC;QAEjG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,gBAAgB,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,KAAK,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,yBAAyB,gBAAgB,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,iBAAiB,EAAE,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,OAAO,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,KAAK,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;QAEhE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,kCAAkC,CAAC,CAAC;QACtD,MAAM,yBAAyB,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QACtE,IAAI,yBAAyB,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qCAAqC,CAAC,CAAC;YAEzD,IAAI,aAAa,GAAkB,IAAI,CAAC;YACxC,KAAK,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,uBAAA,IAAI,6DAAoB,MAAxB,IAAI,EAAqB,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;gBAClF,IAAI,WAAW,EAAE,CAAC;oBAChB,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;oBACjE,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;gBAClE,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClE,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,MAAM,KAAK,CAAC,yFAAyF,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,yEAAyE,CAAC;YAClG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,iDAAiD,eAAe,EAAE,CAAC,CAAC;YACtF,IAAI,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,qBAAqB,GAAG,6DAA6D,CAAC;gBAC5F,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,4BAA4B,qBAAqB,EAAE,CAAC,CAAC;gBACvE,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,KAAK,CAAC,8EAA8E,CAAC,CAAC;YAC9F,CAAC;YAED,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,OAAO;gBACL,aAAa,EAAE;oBACb,QAAQ,EAAE;wBACR,IAAI,EAAE;4BACJ,EAAE,EAAE,UAAU;yBACf;qBACF;iBACF;gBACD,eAAe,EAAE;oBACf,WAAW,EAAE;wBACX,IAAI,EAAE;4BACJ,EAAE,EAAE,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;yBACnF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;CA+BF;gFA7BC,CAAC,gCAAoB,KAAa,EAAE,GAAW;IAC7C,MAAM,UAAU,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAE7C,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,wBAAwB;QACzE,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC5C,GAAG,EAAE,CAAC;YACN,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,UAAU,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,UAAU,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM;gBACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM;gBACJ,IAAI,EAAE,IAAI;aACX,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;eAzHkB,UAAU","sourcesContent":["import ObjectHelper from '../utils/ObjectHelper.js';\nimport Parser from './Parser.js';\n\nexport default class PageParser extends Parser {\n\n protected name = 'PageParser';\n\n parseInitialData(html: string, _url: string) {\n this.log('debug', `Parse initial data from ${_url}`);\n\n const initialDataRegex = /window\\.patreon\\s*?=\\s*?({.+?});/gm;\n const initialDataRegex2 = /<script id=\"__NEXT_DATA__\" type=\"application\\/json\">(.+)<\\/script>/gm;\n\n this.log('debug', `Trying pattern: ${initialDataRegex}`);\n const match = initialDataRegex.exec(html);\n if (match && match[1]) {\n try {\n return JSON.parse(match[1]);\n }\n catch (error: any) {\n throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);\n }\n }\n this.log('debug', `No match for pattern: ${initialDataRegex}`);\n\n this.log('debug', `Trying pattern: ${initialDataRegex2}`);\n const match2 = initialDataRegex2.exec(html);\n if (match2 && match2[1]) {\n try {\n const parsed = JSON.parse(match2[1]);\n return ObjectHelper.getProperty(parsed, 'props.pageProps.bootstrapEnvelope');\n }\n catch (error: any) {\n throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);\n }\n }\n this.log('debug', `No match for pattern: ${initialDataRegex2}`);\n\n this.log('debug', 'Check Next.js streaming response');\n const isNextJSStreamingResponse = html.includes('self.__next_f.push');\n if (isNextJSStreamingResponse) {\n this.log('debug', 'Detected Next.js streaming response');\n\n let currentUserId: string | null = null;\n for (const { data: currentUser } of this.#extractJsonFromKey(html, 'currentUser')) {\n if (currentUser) {\n currentUserId = ObjectHelper.getProperty(currentUser, 'data.id');\n if (currentUserId) {\n break;\n }\n }\n }\n if (!currentUserId) {\n const matchCurrentUserNullRegex = /\\\\\"currentUser\\\\\"\\s*:\\s*null/g;\n const matchCurrentUserNull = matchCurrentUserNullRegex.exec(html);\n if (!matchCurrentUserNull) {\n throw Error(`Failed to obtain initial data - \"currentUserId\" not found in Next.js streaming response`);\n }\n }\n\n const campaignIdRegex = /{\\\\\"self\\\\\":\\\\\"https:\\/\\/www\\.patreon\\.com\\/api\\/campaigns\\/(.+?)\\\\\"}/gm;\n this.log('debug', `Trying pattern in Next.js streaming response: ${campaignIdRegex}`);\n let campaignIdMatch = campaignIdRegex.exec(html);\n\n if (!campaignIdMatch || !campaignIdMatch[1]) {\n const campaignIdRegexSimple = /{\\\\\"self\\\\\":\\\\\"https:\\/\\/[^\"]+\\/api\\/campaigns\\/(.+?)\\\\\"}/gm;\n this.log('debug', `Trying fallback pattern: ${campaignIdRegexSimple}`);\n campaignIdMatch = campaignIdRegexSimple.exec(html);\n }\n\n if (!campaignIdMatch || !campaignIdMatch[1]) {\n throw Error(`Initial data not found - campaign ID not found in Next.js streaming response`);\n }\n\n const campaignId = campaignIdMatch ? campaignIdMatch[1] : undefined;\n return {\n pageBootstrap: {\n campaign: {\n data: {\n id: campaignId\n }\n }\n },\n commonBootstrap: {\n currentUser: {\n data: {\n id: currentUserId === null || currentUserId === 'null' ? undefined : currentUserId\n }\n }\n }\n };\n }\n\n throw Error('Initial data not found - no regex matches');\n }\n\n *#extractJsonFromKey(input: string, key: string) {\n const keyPattern = `\\\\\\\\\"${key}\\\\\\\\\"\\\\s*:\\\\s*{`;\n const keyRegex = new RegExp(keyPattern, 'g');\n\n let match;\n while ((match = keyRegex.exec(input)) !== null) {\n const start = match.index + match[0].length - 1; // position of opening {\n let end = start;\n let braceCount = 1;\n\n while (end < input.length && braceCount > 0) {\n end++;\n if (input[end] === '{') braceCount++;\n if (input[end] === '}') braceCount--;\n }\n\n const jsonFragment = input.slice(start, end + 1).replaceAll('\\\\', '');\n try {\n yield {\n data: JSON.parse(jsonFragment)\n };\n } catch (error) {\n this.log('debug', 'Error parsing JSON fragment:', error);\n yield {\n data: null,\n };\n }\n }\n }\n}\n"]}
@@ -21,10 +21,13 @@ export declare class FetcherError extends Error {
21
21
  method: string;
22
22
  constructor(message: string, url: string, method: string);
23
23
  }
24
- export type FetcherGetType = 'html' | 'json';
24
+ export type FetcherGetType = 'html' | 'm3u8' | 'json';
25
25
  export type FetcherGetResultOf<T extends FetcherGetType> = T extends 'html' ? {
26
26
  html: string;
27
27
  lastUrl: string;
28
+ } : T extends 'm3u8' ? {
29
+ contents: string;
30
+ lastUrl: string;
28
31
  } : T extends 'json' ? {
29
32
  json: any;
30
33
  lastUrl: string;
@@ -56,7 +56,7 @@ class Fetcher {
56
56
  }
57
57
  }
58
58
  const request = new Request(urlObj, { method: 'GET' });
59
- __classPrivateFieldGet(this, _Fetcher_instances, "m", _Fetcher_setHeaders).call(this, request, type);
59
+ __classPrivateFieldGet(this, _Fetcher_instances, "m", _Fetcher_setHeaders).call(this, request, type, type === 'm3u8' ? { setReferer: true } : {});
60
60
  const internalAbortController = new AbortController();
61
61
  let removeAbortHandler = undefined;
62
62
  if (signal) {
@@ -73,6 +73,11 @@ class Fetcher {
73
73
  html: await res.text(),
74
74
  lastUrl
75
75
  };
76
+ case 'm3u8':
77
+ return {
78
+ contents: await res.text(),
79
+ lastUrl
80
+ };
76
81
  case 'json':
77
82
  return {
78
83
  json: await res.json(),
@@ -1 +1 @@
1
- {"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAiB,MAAM,QAAQ,CAAC;AACvD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAe1C,MAAM,OAAO,YAAa,SAAQ,KAAK;IAKrC,YAAY,OAAe,EAAE,GAAW,EAAE,MAAc;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAQD,MAAqB,OAAO;IAW1B,YAAY,MAA6B,EAAE,MAAsB;;QATjE,SAAI,GAAG,SAAS,CAAC;QAEjB,kCAAiB;QACjB,kCAAwB;QACxB,kCAAiB;QACjB,oCAAoB;QACpB,sCAAyB;QACzB,qCAAmB;QAGjB,uBAAA,IAAI,mBAAW,MAAM,CAAC,MAAM,MAAA,CAAC;QAC7B,uBAAA,IAAI,mBAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,mBAAW,MAAM,CAAC,MAAM,MAAA,CAAC;QAC7B,uBAAA,IAAI,qBAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAA,CAAC;QAC9C,uBAAA,IAAI,uBAAe,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,SAAS,MAAA,CAAC;QAChE,uBAAA,IAAI,sBAAc,MAAM,CAAC,OAAO,CAAC,SAAS,MAAA,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG,CAA2B,IAMnC,EAAE,EAAE,GAAG,CAAC;QAEP,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAExD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAE,CAAC,EAAE,CAAC,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,uBAAA,IAAI,+CAAY,MAAhB,IAAI,EAAa,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAC;QACtD,IAAI,kBAAkB,GAA6B,SAAS,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;YAC3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;YAC7D,kBAAkB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAA,IAAI,2BAAY,EAAE,CAAC,CAAC;YAC3G,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC;YACxB,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,MAAM;oBACT,OAAO;wBACL,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE;wBACtB,OAAO;qBACiB,CAAC;gBAC7B,KAAK,MAAM;oBACT,OAAO;wBACL,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE;wBACtB,OAAO;qBACiB,CAAC;gBAC7B;oBACE,OAAO,SAAkB,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC;gBACpB,IAAI,kBAAkB;oBAAE,kBAAkB,EAAE,CAAC;gBAC7C,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,MAAM,CAAC;YACX,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;gBACvB,OAAO,IAAI,EAAE,CAAC;oBACZ,WAAW,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC9E,IAAI,GAAG,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnD,CAAC;gBACD,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;iBACI,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,UAAU,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,YAAY,CAAC,GAAG,MAAM,GAAG,UAAU,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC;gBACO,CAAC;YACP,IAAI,kBAAkB;gBAAE,kBAAkB,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAyB,MAMjD;QACC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,uBAAA,IAAI,+CAAY,MAAhB,IAAI,EAAa,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACpF,MAAM,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAA,IAAI,2BAAY,EAAE,CAAC,CAAC;YAE3G,IAAI,uBAAA,IAAI,qDAAkB,MAAtB,IAAI,EAAmB,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACzD,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;gBACO,CAAC;YACP,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,SAAkB,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,eAAe,CAAyB,MAAgC;QAC5E,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,uBAAA,IAAI,+CAAY,MAAhB,IAAI,EAAa,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACpF,MAAM,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAC;QACtD,IAAI,kBAAkB,GAA6B,SAAS,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;YAC3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;YAC7D,kBAAkB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,CAAC;YACH,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAA,IAAI,2BAAY,EAAE,CAAC,CAAC;YAEzG,kCAAkC;YAClC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;gBACnF,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5D,uBAAA,IAAI,+CAAY,MAAhB,IAAI,EAAa,WAAW,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5E,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAA,IAAI,2BAAY,EAAE,CAAC,CAAC;YAC3G,CAAC;YAED,IAAI,uBAAA,IAAI,qDAAkB,MAAtB,IAAI,EAAmB,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;gBACnD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE;oBACjC,cAAc,EAAE,GAAG;iBACpB,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;gBAEjF,MAAM,IAAI,GAAG,GAAG,CAAC;gBACjB,MAAM,KAAK,GAAG,CAAC,SAAkC,EAAE,EAAE;oBACnD,MAAM,aAAa,GAAG,SAAS,EAAE,YAAY,IAAI,YAAY,CAAC;oBAC9D,MAAM,YAAY,GAAG,SAAS,EAAE,WAAW,IAAI,QAAQ,CAAC,iBAAiB,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;oBACvG,OAAO,uBAAA,IAAI,kDAAe,MAAnB,IAAI,EAAgB,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAA;gBAC7F,CAAC,CAAC;gBACF,MAAM,KAAK,GAAG,GAAG,EAAE;oBACjB,IAAI,kBAAkB;wBAAE,kBAAkB,EAAE,CAAC;oBAC7C,uBAAuB,CAAC,KAAK,EAAE,CAAC;gBAClC,CAAC,CAAC;gBAEF,OAAO;oBACL,OAAO;oBACP,KAAK;oBACL,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,kBAAkB;gBAAE,kBAAkB,EAAE,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,SAAkB,CAAC;IAC5B,CAAC;IAiHD,KAAK,CAAC,oBAAoB,CAAC,GAAW;QACpC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,uBAAA,IAAI,0BAAW,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAES,GAAG,CAAC,KAAe,EAAE,GAAG,GAAe;QAC/C,SAAS,CAAC,uBAAA,IAAI,uBAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,2BAAY,CAAC;IAC1B,CAAC;CACF;4QAjIC,KAAK,iCACH,QAAoD,EACpD,WAAmB,EACnB,YAAoB,EACpB,QAAkB,EAClB,OAAoB;IAEpB,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,uBAAA,IAAI,uBAAQ,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,IAAI,IAAI,KAAK,CAAC,MAAgB,CAAC;gBACjC,CAAC;YACH,CAAC;YACD,OAAO,MAAe,EAAE,CAAC;gBACvB,aAAa;YACf,CAAC;QACH,CAAC;aACI,CAAC;YACJ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,GAAG,SAAS,WAAW,GAAG,CAAC,CAAC;YAChE,MAAM,QAAQ,CACZ,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,MAAM,EACf,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAClC,CAAC;YACF,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,uBAAA,IAAI,mDAAgB,MAApB,IAAI,EAAiB,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,uBAAA,IAAI,oDAAiB,MAArB,IAAI,EAAkB,WAAW,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,OAAO;YACL,WAAW;YACX,MAAM;YACN,OAAO;SACR,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACb,uBAAA,IAAI,oDAAiB,MAArB,IAAI,EAAkB,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,6DAEe,WAAmB,EAAE,YAAoB,EAAE,IAAY,EAAE,OAAoB;IAC3F,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,WAAW,SAAS,YAAY,eAAe,IAAI,QAAQ,CAAC,CAAC;QAC1F,uBAAA,IAAI,yBAAU,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;YACO,CAAC;QACP,uBAAA,IAAI,oDAAiB,MAArB,IAAI,EAAkB,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC,+DAEgB,WAAmB,EAAE,KAAkB;IACtD,IAAI,CAAC;QACH,IAAI,uBAAA,IAAI,uBAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,WAAW,GAAG,CAAC,CAAC;YAC/C,uBAAA,IAAI,yBAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,sBAAsB,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;YACO,CAAC;QACP,IAAI,KAAK;YAAE,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,qDAEW,OAAgB,EAAE,IAAqB,EAAE,IAAwE;IAC3H,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,uBAAA,IAAI,uBAAQ,IAAI,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,uBAAA,IAAI,uBAAQ,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,uBAAA,IAAI,0BAAW,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAClE,CAAC;SACI,CAAC;QACJ,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,uFAAuF,CAAC,CAAC;IACzH,CAAC;AACH,CAAC,iEAIiB,QAAyB,EAAE,SAAiB,EAAE,MAAc,EAAE,WAAW,GAAG,IAAI;IAChG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CAAC,GAAG,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;eAlSkB,OAAO","sourcesContent":["import * as fs from 'fs';\nimport { pipeline } from 'stream/promises';\nimport { fetch, Request, type Response } from 'undici';\nimport path from 'path';\nimport { type Dispatcher } from 'undici';\nimport puppeteer from 'puppeteer';\nimport FetcherProgressMonitor from './FetcherProgressMonitor.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport type FilenameResolver from './FllenameResolver.js';\nimport { pickDefined } from './Misc.js';\nimport {type LogLevel} from './logging/Logger.js';\nimport type Logger from './logging/Logger.js';\nimport { commonLog } from './logging/Logger.js';\nimport FSHelper from './FSHelper.js';\nimport { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport Progress from './Progress.js';\nimport { createProxyAgent } from './Proxy.js';\nimport { SITE_URL } from './URLHelper.js';\n\nexport interface PrepareDownloadParams<T extends Downloadable> {\n url: string;\n srcEntity: T;\n destFilePath: string;\n setReferer?: boolean;\n signal: AbortSignal;\n}\n\nexport interface StartDownloadOverrides {\n destFilePath?: string;\n tmpFilePath?: string;\n}\n\nexport class FetcherError extends Error {\n\n url: string;\n method: string;\n\n constructor(message: string, url: string, method: string) {\n super(message);\n this.name = 'FetcherError';\n this.url = url;\n this.method = method;\n }\n}\n\nexport type FetcherGetType = 'html' | 'json';\nexport type FetcherGetResultOf<T extends FetcherGetType> =\n T extends 'html' ? { html: string; lastUrl: string; }:\n T extends 'json' ? { json: any; lastUrl: string; } :\n never;\n\nexport default class Fetcher {\n\n name = 'Fetcher';\n\n #cookie?: string;\n #logger?: Logger | null;\n #dryRun: boolean;\n #fsHelper: FSHelper;\n #proxyAgent?: Dispatcher;\n #userAgent: string;\n\n constructor(config: DownloaderConfig<any>, logger?: Logger | null) {\n this.#cookie = config.cookie;\n this.#logger = logger;\n this.#dryRun = config.dryRun;\n this.#fsHelper = new FSHelper(config, logger);\n this.#proxyAgent = createProxyAgent(config)?.agent || undefined;\n this.#userAgent = config.request.userAgent;\n }\n\n async get<T extends FetcherGetType>(args: {\n url: string,\n type: T,\n payload?: Record<string, any>,\n maxRetries: number,\n signal?: AbortSignal\n }, rt = 0): Promise<FetcherGetResultOf<T>> {\n\n const { url, type, payload, maxRetries, signal } = args;\n\n const urlObj = new URL(url);\n if (payload) {\n for (const [ p, v ] of Object.entries(payload)) {\n urlObj.searchParams.set(p, v);\n }\n }\n const request = new Request(urlObj, { method: 'GET' });\n this.#setHeaders(request, type);\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n const lastUrl = res.url;\n switch (type) {\n case 'html':\n return {\n html: await res.text(),\n lastUrl\n } as FetcherGetResultOf<T>;\n case 'json':\n return {\n json: await res.json(),\n lastUrl\n } as FetcherGetResultOf<T>;\n default:\n return undefined as never;\n }\n }\n catch (error: any) {\n if (signal?.aborted) {\n throw error;\n }\n if (rt < maxRetries) {\n if (removeAbortHandler) removeAbortHandler();\n return await this.get({ url, type, payload, maxRetries, signal }, rt + 1);\n }\n let errMsg;\n if (error instanceof Error) {\n const errMsgParts = [error.message];\n let _err = error.cause;\n while (_err) {\n errMsgParts.push(_err instanceof Error ? _err.message : JSON.stringify(_err));\n _err = _err instanceof Error ? _err.cause : null;\n }\n errMsg = errMsgParts.join(': ');\n }\n else {\n errMsg = String(error);\n }\n const retriedMsg = rt > 0 ? ` (retried ${rt} times)` : '';\n throw new FetcherError(`${errMsg}${retriedMsg}`, urlObj.toString(), request.method);\n }\n finally {\n if (removeAbortHandler) removeAbortHandler();\n }\n }\n\n async resolveDestFilePath<T extends Downloadable>(params: {\n url: string;\n destDir: string;\n destFilenameResolver: FilenameResolver<T>;\n setReferer?: boolean;\n signal?: AbortSignal;\n }) {\n const { url, destDir, destFilenameResolver, setReferer = false, signal } = params;\n const request = new Request(url, { method: 'HEAD' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false, setReferer });\n const internalAbortController = new AbortController();\n const abortHandler = () => internalAbortController.abort();\n if (signal) {\n signal.addEventListener('abort', abortHandler, {once: true});\n }\n\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n if (this.#assertResponseOK(res, url, request.method, false)) {\n const destFilename = destFilenameResolver.resolve(res);\n const destFilePath = path.resolve(destDir, destFilename);\n return destFilePath;\n }\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n return undefined as never;\n }\n\n async prepareDownload<T extends Downloadable>(params: PrepareDownloadParams<T>) {\n const { url, srcEntity, destFilePath, setReferer = false, signal } = params;\n const request = new Request(url, { method: 'GET' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false, setReferer });\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n\n try {\n let res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n // Special handling for attachment\n if (params.srcEntity.type === 'attachment' && !res.ok && res.redirected && res.url) {\n const redirectReq = new Request(res.url, { method: 'GET' });\n this.#setHeaders(redirectReq, 'html', { setCookie: false, setHost: false });\n res = await fetch(redirectReq, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n }\n\n if (this.#assertResponseOK(res, url, request.method)) {\n const destFilename = path.parse(destFilePath).base;\n const progress = new Progress(res, {\n reportInterval: 300\n });\n const monitor = new FetcherProgressMonitor(progress, destFilename, destFilePath);\n\n const _res = res;\n const start = (overrides?: StartDownloadOverrides) => {\n const _destFilePath = overrides?.destFilePath || destFilePath;\n const _tmpFilePath = overrides?.tmpFilePath || FSHelper.createTmpFilePath(_destFilePath, srcEntity.id);\n return this.#startDownload(_res, _tmpFilePath, _destFilePath, progress, removeAbortHandler)\n };\n const abort = () => {\n if (removeAbortHandler) removeAbortHandler();\n internalAbortController.abort();\n };\n\n return {\n monitor,\n start,\n abort\n };\n }\n }\n catch (error: unknown) {\n if (removeAbortHandler) removeAbortHandler();\n throw error;\n }\n\n return undefined as never;\n }\n\n async #startDownload(\n response: Response & { body: NodeJS.ReadableStream },\n tmpFilePath: string,\n destFilePath: string,\n progress: Progress,\n cleanup?: () => void) {\n\n try {\n let size = 0;\n if (this.#dryRun) {\n try {\n for await (const chunk of response.body) {\n size += chunk.length as number;\n }\n }\n catch (_error: unknown) {\n // Do nothing\n }\n }\n else {\n this.log('debug', `Pipe \"${response.url}\" to \"${tmpFilePath}\"`);\n await pipeline(\n response.body,\n progress.stream,\n fs.createWriteStream(tmpFilePath)\n );\n size = fs.lstatSync(tmpFilePath).size;\n }\n\n const commit = () => {\n this.#commitDownload(tmpFilePath, destFilePath, size, cleanup);\n };\n\n const discard = () => {\n this.#cleanupDownload(tmpFilePath, cleanup);\n };\n\n return {\n tmpFilePath,\n commit,\n discard\n };\n }\n catch (error) {\n this.#cleanupDownload(tmpFilePath, cleanup);\n throw error;\n }\n }\n\n #commitDownload(tmpFilePath: string, destFilePath: string, size: number, cleanup?: () => void) {\n try {\n this.log('debug', `Commit \"${tmpFilePath}\" to \"${destFilePath}; filesize: ${size} bytes`);\n this.#fsHelper.rename(tmpFilePath, destFilePath);\n }\n finally {\n this.#cleanupDownload(tmpFilePath, cleanup);\n }\n }\n\n #cleanupDownload(tmpFilePath: string, extra?: () => void) {\n try {\n if (this.#dryRun || fs.existsSync(tmpFilePath)) {\n this.log('debug', `Clean up \"${tmpFilePath}\"`);\n this.#fsHelper.unlink(tmpFilePath);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${tmpFilePath}:`, error);\n }\n finally {\n if (extra) extra();\n }\n }\n\n #setHeaders(request: Request, type: 'html' | 'json', opts?: { setCookie?: boolean; setHost?: boolean; setReferer?: boolean; }) {\n const setCookie = pickDefined(opts?.setCookie, true);\n const setHost = pickDefined(opts?.setHost, true);\n const setReferer = pickDefined(opts?.setReferer, false);\n if (this.#cookie && setCookie) {\n request.headers.set('Cookie', this.#cookie);\n }\n if (setHost) {\n request.headers.set('Host', 'www.patreon.com');\n }\n if (setReferer) {\n request.headers.set('referer', SITE_URL);\n }\n request.headers.set('User-Agent', this.#userAgent);\n if (type === 'json') {\n request.headers.set('Content-Type', 'application/vnd.api+json');\n }\n else {\n request.headers.set('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8');\n }\n }\n\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody: false): response is Response;\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody?: true): response is Response & { body: NodeJS.ReadableStream };\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody = true) {\n if (!response) {\n throw new FetcherError('No response', originURL, method);\n }\n if (!response.ok) {\n throw new FetcherError(`${response.status} - ${response.statusText}`, originURL, method);\n }\n if (requireBody && !response.body) {\n throw new FetcherError('Empty response body', originURL, method);\n }\n return true;\n }\n\n async getPageWithPuppeteer(url: string) {\n this.log('debug', `Fetch \"${url}\" with Puppeteer`);\n const browser = await puppeteer.launch({ headless: true });\n const page = await browser.newPage();\n await page.setUserAgent({ userAgent: this.#userAgent });\n await page.goto(url, { waitUntil: 'networkidle2' });\n const html = await page.evaluate(() => document.documentElement.innerHTML);\n await browser.close();\n return html;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n\n get proxyAgent() {\n return this.#proxyAgent;\n }\n}\n"]}
1
+ {"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../../src/utils/Fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport { pipeline } from 'stream/promises';\nimport { fetch, Request, type Response } from 'undici';\nimport path from 'path';\nimport { type Dispatcher } from 'undici';\nimport puppeteer from 'puppeteer';\nimport FetcherProgressMonitor from './FetcherProgressMonitor.js';\nimport { type Downloadable } from '../entities/Downloadable.js';\nimport type FilenameResolver from './FllenameResolver.js';\nimport { pickDefined } from './Misc.js';\nimport {type LogLevel} from './logging/Logger.js';\nimport type Logger from './logging/Logger.js';\nimport { commonLog } from './logging/Logger.js';\nimport FSHelper from './FSHelper.js';\nimport { type DownloaderConfig } from '../downloaders/Downloader.js';\nimport Progress from './Progress.js';\nimport { createProxyAgent } from './Proxy.js';\nimport { SITE_URL } from './URLHelper.js';\n\nexport interface PrepareDownloadParams<T extends Downloadable> {\n url: string;\n srcEntity: T;\n destFilePath: string;\n setReferer?: boolean;\n signal: AbortSignal;\n}\n\nexport interface StartDownloadOverrides {\n destFilePath?: string;\n tmpFilePath?: string;\n}\n\nexport class FetcherError extends Error {\n\n url: string;\n method: string;\n\n constructor(message: string, url: string, method: string) {\n super(message);\n this.name = 'FetcherError';\n this.url = url;\n this.method = method;\n }\n}\n\nexport type FetcherGetType = 'html' | 'm3u8' | 'json';\nexport type FetcherGetResultOf<T extends FetcherGetType> =\n T extends 'html' ? { html: string; lastUrl: string; }:\n T extends 'm3u8' ? { contents: string; lastUrl: string; }:\n T extends 'json' ? { json: any; lastUrl: string; } :\n never;\n\nexport default class Fetcher {\n\n name = 'Fetcher';\n\n #cookie?: string;\n #logger?: Logger | null;\n #dryRun: boolean;\n #fsHelper: FSHelper;\n #proxyAgent?: Dispatcher;\n #userAgent: string;\n\n constructor(config: DownloaderConfig<any>, logger?: Logger | null) {\n this.#cookie = config.cookie;\n this.#logger = logger;\n this.#dryRun = config.dryRun;\n this.#fsHelper = new FSHelper(config, logger);\n this.#proxyAgent = createProxyAgent(config)?.agent || undefined;\n this.#userAgent = config.request.userAgent;\n }\n\n async get<T extends FetcherGetType>(args: {\n url: string,\n type: T,\n payload?: Record<string, any>,\n maxRetries: number,\n signal?: AbortSignal\n }, rt = 0): Promise<FetcherGetResultOf<T>> {\n\n const { url, type, payload, maxRetries, signal } = args;\n\n const urlObj = new URL(url);\n if (payload) {\n for (const [ p, v ] of Object.entries(payload)) {\n urlObj.searchParams.set(p, v);\n }\n }\n const request = new Request(urlObj, { method: 'GET' });\n this.#setHeaders(request, type, type === 'm3u8' ? { setReferer: true } : {});\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n const lastUrl = res.url;\n switch (type) {\n case 'html':\n return {\n html: await res.text(),\n lastUrl\n } as FetcherGetResultOf<T>;\n case 'm3u8':\n return {\n contents: await res.text(),\n lastUrl\n } as FetcherGetResultOf<T>;\n case 'json':\n return {\n json: await res.json(),\n lastUrl\n } as FetcherGetResultOf<T>;\n default:\n return undefined as never;\n }\n }\n catch (error: any) {\n if (signal?.aborted) {\n throw error;\n }\n if (rt < maxRetries) {\n if (removeAbortHandler) removeAbortHandler();\n return await this.get({ url, type, payload, maxRetries, signal }, rt + 1);\n }\n let errMsg;\n if (error instanceof Error) {\n const errMsgParts = [error.message];\n let _err = error.cause;\n while (_err) {\n errMsgParts.push(_err instanceof Error ? _err.message : JSON.stringify(_err));\n _err = _err instanceof Error ? _err.cause : null;\n }\n errMsg = errMsgParts.join(': ');\n }\n else {\n errMsg = String(error);\n }\n const retriedMsg = rt > 0 ? ` (retried ${rt} times)` : '';\n throw new FetcherError(`${errMsg}${retriedMsg}`, urlObj.toString(), request.method);\n }\n finally {\n if (removeAbortHandler) removeAbortHandler();\n }\n }\n\n async resolveDestFilePath<T extends Downloadable>(params: {\n url: string;\n destDir: string;\n destFilenameResolver: FilenameResolver<T>;\n setReferer?: boolean;\n signal?: AbortSignal;\n }) {\n const { url, destDir, destFilenameResolver, setReferer = false, signal } = params;\n const request = new Request(url, { method: 'HEAD' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false, setReferer });\n const internalAbortController = new AbortController();\n const abortHandler = () => internalAbortController.abort();\n if (signal) {\n signal.addEventListener('abort', abortHandler, {once: true});\n }\n\n try {\n const res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n if (this.#assertResponseOK(res, url, request.method, false)) {\n const destFilename = destFilenameResolver.resolve(res);\n const destFilePath = path.resolve(destDir, destFilename);\n return destFilePath;\n }\n }\n finally {\n if (signal) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n\n return undefined as never;\n }\n\n async prepareDownload<T extends Downloadable>(params: PrepareDownloadParams<T>) {\n const { url, srcEntity, destFilePath, setReferer = false, signal } = params;\n const request = new Request(url, { method: 'GET' });\n this.#setHeaders(request, 'html', { setCookie: false, setHost: false, setReferer });\n const internalAbortController = new AbortController();\n let removeAbortHandler: undefined | (() => void) = undefined;\n if (signal) {\n const abortHandler = () => internalAbortController.abort();\n signal.addEventListener('abort', abortHandler, {once: true});\n removeAbortHandler = () => signal.removeEventListener('abort', abortHandler);\n }\n\n try {\n let res = await fetch(request, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n\n // Special handling for attachment\n if (params.srcEntity.type === 'attachment' && !res.ok && res.redirected && res.url) {\n const redirectReq = new Request(res.url, { method: 'GET' });\n this.#setHeaders(redirectReq, 'html', { setCookie: false, setHost: false });\n res = await fetch(redirectReq, { signal: internalAbortController.signal, dispatcher: this.#proxyAgent });\n }\n\n if (this.#assertResponseOK(res, url, request.method)) {\n const destFilename = path.parse(destFilePath).base;\n const progress = new Progress(res, {\n reportInterval: 300\n });\n const monitor = new FetcherProgressMonitor(progress, destFilename, destFilePath);\n\n const _res = res;\n const start = (overrides?: StartDownloadOverrides) => {\n const _destFilePath = overrides?.destFilePath || destFilePath;\n const _tmpFilePath = overrides?.tmpFilePath || FSHelper.createTmpFilePath(_destFilePath, srcEntity.id);\n return this.#startDownload(_res, _tmpFilePath, _destFilePath, progress, removeAbortHandler)\n };\n const abort = () => {\n if (removeAbortHandler) removeAbortHandler();\n internalAbortController.abort();\n };\n\n return {\n monitor,\n start,\n abort\n };\n }\n }\n catch (error: unknown) {\n if (removeAbortHandler) removeAbortHandler();\n throw error;\n }\n\n return undefined as never;\n }\n\n async #startDownload(\n response: Response & { body: NodeJS.ReadableStream },\n tmpFilePath: string,\n destFilePath: string,\n progress: Progress,\n cleanup?: () => void) {\n\n try {\n let size = 0;\n if (this.#dryRun) {\n try {\n for await (const chunk of response.body) {\n size += chunk.length as number;\n }\n }\n catch (_error: unknown) {\n // Do nothing\n }\n }\n else {\n this.log('debug', `Pipe \"${response.url}\" to \"${tmpFilePath}\"`);\n await pipeline(\n response.body,\n progress.stream,\n fs.createWriteStream(tmpFilePath)\n );\n size = fs.lstatSync(tmpFilePath).size;\n }\n\n const commit = () => {\n this.#commitDownload(tmpFilePath, destFilePath, size, cleanup);\n };\n\n const discard = () => {\n this.#cleanupDownload(tmpFilePath, cleanup);\n };\n\n return {\n tmpFilePath,\n commit,\n discard\n };\n }\n catch (error) {\n this.#cleanupDownload(tmpFilePath, cleanup);\n throw error;\n }\n }\n\n #commitDownload(tmpFilePath: string, destFilePath: string, size: number, cleanup?: () => void) {\n try {\n this.log('debug', `Commit \"${tmpFilePath}\" to \"${destFilePath}; filesize: ${size} bytes`);\n this.#fsHelper.rename(tmpFilePath, destFilePath);\n }\n finally {\n this.#cleanupDownload(tmpFilePath, cleanup);\n }\n }\n\n #cleanupDownload(tmpFilePath: string, extra?: () => void) {\n try {\n if (this.#dryRun || fs.existsSync(tmpFilePath)) {\n this.log('debug', `Clean up \"${tmpFilePath}\"`);\n this.#fsHelper.unlink(tmpFilePath);\n }\n }\n catch (error) {\n this.log('error', `Error cleaning up \"${tmpFilePath}:`, error);\n }\n finally {\n if (extra) extra();\n }\n }\n\n #setHeaders(request: Request, type: FetcherGetType, opts?: { setCookie?: boolean; setHost?: boolean; setReferer?: boolean; }) {\n const setCookie = pickDefined(opts?.setCookie, true);\n const setHost = pickDefined(opts?.setHost, true);\n const setReferer = pickDefined(opts?.setReferer, false);\n if (this.#cookie && setCookie) {\n request.headers.set('Cookie', this.#cookie);\n }\n if (setHost) {\n request.headers.set('Host', 'www.patreon.com');\n }\n if (setReferer) {\n request.headers.set('referer', SITE_URL);\n }\n request.headers.set('User-Agent', this.#userAgent);\n if (type === 'json') {\n request.headers.set('Content-Type', 'application/vnd.api+json');\n }\n else {\n request.headers.set('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8');\n }\n }\n\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody: false): response is Response;\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody?: true): response is Response & { body: NodeJS.ReadableStream };\n #assertResponseOK(response: Response | null, originURL: string, method: string, requireBody = true) {\n if (!response) {\n throw new FetcherError('No response', originURL, method);\n }\n if (!response.ok) {\n throw new FetcherError(`${response.status} - ${response.statusText}`, originURL, method);\n }\n if (requireBody && !response.body) {\n throw new FetcherError('Empty response body', originURL, method);\n }\n return true;\n }\n\n async getPageWithPuppeteer(url: string) {\n this.log('debug', `Fetch \"${url}\" with Puppeteer`);\n const browser = await puppeteer.launch({ headless: true });\n const page = await browser.newPage();\n await page.setUserAgent({ userAgent: this.#userAgent });\n await page.goto(url, { waitUntil: 'networkidle2' });\n const html = await page.evaluate(() => document.documentElement.innerHTML);\n await browser.close();\n return html;\n }\n\n protected log(level: LogLevel, ...msg: Array<any>) {\n commonLog(this.#logger, level, this.name, ...msg);\n }\n\n get proxyAgent() {\n return this.#proxyAgent;\n }\n}\n"]}
@@ -28,6 +28,9 @@ export type URLAnalysis = {
28
28
  } | {
29
29
  type: 'shop';
30
30
  vanity: string;
31
+ } | {
32
+ type: 'customURL';
33
+ url: string;
31
34
  };
32
35
  export default class URLHelper {
33
36
  static constructCurrentUserAPIURL(): string;
@@ -60,6 +63,7 @@ export default class URLHelper {
60
63
  static analyzeURL(url: string): URLAnalysis | null;
61
64
  static stripSearchParamsFromURL(url: string): string;
62
65
  static getExtensionFromURL(url: string): string;
66
+ static isPatreonURL(url: string): boolean;
63
67
  static validateURL(url: any): boolean;
64
68
  static isAttachmentLink(url: string): {
65
69
  validated: true;
@@ -484,6 +484,14 @@ export default class URLHelper {
484
484
  vanity: shopURLMatchVanity
485
485
  };
486
486
  }
487
+ // Fallback: treat valid HTTPS URLs with non-patreon.com hostnames as custom Patreon domains
488
+ // Note: `base` is already a valid URL (came from stripSearchParamsFromURL), no need to re-validate
489
+ if (!this.isPatreonURL(base)) {
490
+ return {
491
+ type: 'customURL',
492
+ url: base
493
+ };
494
+ }
487
495
  return null;
488
496
  }
489
497
  static stripSearchParamsFromURL(url) {
@@ -498,6 +506,15 @@ export default class URLHelper {
498
506
  const urlObj = new URL(url);
499
507
  return path.extname(urlObj.pathname.split('/').pop() || '');
500
508
  }
509
+ static isPatreonURL(url) {
510
+ try {
511
+ const { protocol, hostname } = new URL(url);
512
+ return protocol === 'https:' && (hostname === 'www.patreon.com' || hostname === 'patreon.com');
513
+ }
514
+ catch {
515
+ return false;
516
+ }
517
+ }
501
518
  static validateURL(url) {
502
519
  let urlObj;
503
520
  try {