offcourse 0.0.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +255 -20
  2. package/dist/cli/commands/config.d.ts +13 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +66 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/inspect.d.ts +11 -0
  7. package/dist/cli/commands/inspect.d.ts.map +1 -0
  8. package/dist/cli/commands/inspect.js +365 -0
  9. package/dist/cli/commands/inspect.js.map +1 -0
  10. package/dist/cli/commands/login.d.ts +12 -0
  11. package/dist/cli/commands/login.d.ts.map +1 -0
  12. package/dist/cli/commands/login.js +55 -0
  13. package/dist/cli/commands/login.js.map +1 -0
  14. package/dist/cli/commands/status.d.ts +15 -0
  15. package/dist/cli/commands/status.d.ts.map +1 -0
  16. package/dist/cli/commands/status.js +118 -0
  17. package/dist/cli/commands/status.js.map +1 -0
  18. package/dist/cli/commands/sync.d.ts +15 -0
  19. package/dist/cli/commands/sync.d.ts.map +1 -0
  20. package/dist/cli/commands/sync.js +921 -0
  21. package/dist/cli/commands/sync.js.map +1 -0
  22. package/dist/cli/commands/syncHighLevel.d.ts +23 -0
  23. package/dist/cli/commands/syncHighLevel.d.ts.map +1 -0
  24. package/dist/cli/commands/syncHighLevel.js +479 -0
  25. package/dist/cli/commands/syncHighLevel.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +106 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/config/configManager.d.ts +31 -0
  31. package/dist/config/configManager.d.ts.map +1 -0
  32. package/dist/config/configManager.js +68 -0
  33. package/dist/config/configManager.js.map +1 -0
  34. package/dist/config/paths.d.ts +21 -0
  35. package/dist/config/paths.d.ts.map +1 -0
  36. package/dist/config/paths.js +33 -0
  37. package/dist/config/paths.js.map +1 -0
  38. package/dist/config/schema.d.ts +60 -0
  39. package/dist/config/schema.d.ts.map +1 -0
  40. package/dist/config/schema.js +50 -0
  41. package/dist/config/schema.js.map +1 -0
  42. package/dist/downloader/hlsDownloader.d.ts +58 -0
  43. package/dist/downloader/hlsDownloader.d.ts.map +1 -0
  44. package/dist/downloader/hlsDownloader.js +263 -0
  45. package/dist/downloader/hlsDownloader.js.map +1 -0
  46. package/dist/downloader/hlsValidator.d.ts +35 -0
  47. package/dist/downloader/hlsValidator.d.ts.map +1 -0
  48. package/dist/downloader/hlsValidator.js +152 -0
  49. package/dist/downloader/hlsValidator.js.map +1 -0
  50. package/dist/downloader/index.d.ts +29 -0
  51. package/dist/downloader/index.d.ts.map +1 -0
  52. package/dist/downloader/index.js +55 -0
  53. package/dist/downloader/index.js.map +1 -0
  54. package/dist/downloader/loomDownloader.d.ts +56 -0
  55. package/dist/downloader/loomDownloader.d.ts.map +1 -0
  56. package/dist/downloader/loomDownloader.js +562 -0
  57. package/dist/downloader/loomDownloader.js.map +1 -0
  58. package/dist/downloader/queue.d.ts +56 -0
  59. package/dist/downloader/queue.d.ts.map +1 -0
  60. package/dist/downloader/queue.js +88 -0
  61. package/dist/downloader/queue.js.map +1 -0
  62. package/dist/downloader/vimeoDownloader.d.ts +52 -0
  63. package/dist/downloader/vimeoDownloader.d.ts.map +1 -0
  64. package/dist/downloader/vimeoDownloader.js +569 -0
  65. package/dist/downloader/vimeoDownloader.js.map +1 -0
  66. package/dist/scraper/extractor.d.ts +53 -0
  67. package/dist/scraper/extractor.d.ts.map +1 -0
  68. package/dist/scraper/extractor.js +627 -0
  69. package/dist/scraper/extractor.js.map +1 -0
  70. package/dist/scraper/highlevel/extractor.d.ts +89 -0
  71. package/dist/scraper/highlevel/extractor.d.ts.map +1 -0
  72. package/dist/scraper/highlevel/extractor.js +373 -0
  73. package/dist/scraper/highlevel/extractor.js.map +1 -0
  74. package/dist/scraper/highlevel/index.d.ts +3 -0
  75. package/dist/scraper/highlevel/index.d.ts.map +1 -0
  76. package/dist/scraper/highlevel/index.js +3 -0
  77. package/dist/scraper/highlevel/index.js.map +1 -0
  78. package/dist/scraper/highlevel/navigator.d.ts +86 -0
  79. package/dist/scraper/highlevel/navigator.d.ts.map +1 -0
  80. package/dist/scraper/highlevel/navigator.js +505 -0
  81. package/dist/scraper/highlevel/navigator.js.map +1 -0
  82. package/dist/scraper/highlevel/schemas.d.ts +188 -0
  83. package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
  84. package/dist/scraper/highlevel/schemas.js +139 -0
  85. package/dist/scraper/highlevel/schemas.js.map +1 -0
  86. package/dist/scraper/navigator.d.ts +68 -0
  87. package/dist/scraper/navigator.d.ts.map +1 -0
  88. package/dist/scraper/navigator.js +257 -0
  89. package/dist/scraper/navigator.js.map +1 -0
  90. package/dist/scraper/schemas.d.ts +57 -0
  91. package/dist/scraper/schemas.d.ts.map +1 -0
  92. package/dist/scraper/schemas.js +135 -0
  93. package/dist/scraper/schemas.js.map +1 -0
  94. package/dist/scraper/videoInterceptor.d.ts +23 -0
  95. package/dist/scraper/videoInterceptor.d.ts.map +1 -0
  96. package/dist/scraper/videoInterceptor.js +330 -0
  97. package/dist/scraper/videoInterceptor.js.map +1 -0
  98. package/dist/shared/auth.d.ts +58 -0
  99. package/dist/shared/auth.d.ts.map +1 -0
  100. package/dist/shared/auth.js +197 -0
  101. package/dist/shared/auth.js.map +1 -0
  102. package/dist/shared/firebase.d.ts +60 -0
  103. package/dist/shared/firebase.d.ts.map +1 -0
  104. package/dist/shared/firebase.js +102 -0
  105. package/dist/shared/firebase.js.map +1 -0
  106. package/dist/shared/fs.d.ts +31 -0
  107. package/dist/shared/fs.d.ts.map +1 -0
  108. package/dist/shared/fs.js +77 -0
  109. package/dist/shared/fs.js.map +1 -0
  110. package/dist/shared/http.d.ts +15 -0
  111. package/dist/shared/http.d.ts.map +1 -0
  112. package/dist/shared/http.js +31 -0
  113. package/dist/shared/http.js.map +1 -0
  114. package/dist/shared/index.d.ts +7 -0
  115. package/dist/shared/index.d.ts.map +1 -0
  116. package/dist/shared/index.js +7 -0
  117. package/dist/shared/index.js.map +1 -0
  118. package/dist/shared/slug.d.ts +11 -0
  119. package/dist/shared/slug.d.ts.map +1 -0
  120. package/dist/shared/slug.js +25 -0
  121. package/dist/shared/slug.js.map +1 -0
  122. package/dist/shared/url.d.ts +43 -0
  123. package/dist/shared/url.d.ts.map +1 -0
  124. package/dist/shared/url.js +54 -0
  125. package/dist/shared/url.js.map +1 -0
  126. package/dist/state/database.d.ts +246 -0
  127. package/dist/state/database.d.ts.map +1 -0
  128. package/dist/state/database.js +679 -0
  129. package/dist/state/database.js.map +1 -0
  130. package/dist/state/index.d.ts +2 -0
  131. package/dist/state/index.d.ts.map +1 -0
  132. package/dist/state/index.js +2 -0
  133. package/dist/state/index.js.map +1 -0
  134. package/dist/storage/fileSystem.d.ts +56 -0
  135. package/dist/storage/fileSystem.d.ts.map +1 -0
  136. package/dist/storage/fileSystem.js +129 -0
  137. package/dist/storage/fileSystem.js.map +1 -0
  138. package/package.json +71 -11
  139. package/cli.js +0 -45
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigator.js","sourceRoot":"","sources":["../../src/scraper/navigator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,cAAc,CAAC;AAuBtB,2CAA2C;AAC3C,qBAAqB;AAErB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU;IAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACjC,6CAA6C;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,gBAAgB,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAU;IACrD,iCAAiC;IACjC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAChE,OAAO,cAAc,EAAE,WAAW,IAAI,IAAI,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,EAAE,CAAC,CAAC,KAAK;oBACb,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,GAAG,EAAE,GAAG,OAAO,cAAc,CAAC,CAAC,IAAI,EAAE;oBACrC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;iBACvB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;YAEzC,2CAA2C;YAC3C,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,aAAa,GAAG,6DAA6D,CAAC;YACpF,IAAI,KAAK,CAAC;YAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEvB,wBAAwB;gBACxB,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBAC3D,6CAA6C;oBAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAC7E,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CACxC,CAAC;oBAEF,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,YAAY;wBAClB,IAAI;wBACJ,GAAG,EAAE,EAAE,EAAE,oBAAoB;wBAC7B,QAAQ,EAAE,KAAK;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG,MAAM;QACT,GAAG,EAAE,GAAG,OAAO,cAAc,MAAM,CAAC,IAAI,EAAE;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAU,EAAE,SAAiB;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE9B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAChE,OAAO,cAAc,EAAE,WAAW,IAAI,IAAI,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,IAAI,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAmD,EAAE,CAAC;QAEnE,qEAAqE;QACrE,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;QAE1E,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,IAAyB,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,UAAU,KAAK,GAAG,CAAC,EAAE,CAAC;YAEjE,uCAAuC;YACvC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;YAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAE3C,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,sCAAsC;QACtC,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,IAAI;YAChB,KAAK;YACL,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAU;IACrD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvC,wEAAwE;QACxE,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;QACxE,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAyB,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAEzB,iDAAiD;YACjD,MAAM,SAAS,GAAG,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO;YAE5B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEf,kDAAkD;YAClD,MAAM,OAAO,GACX,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC;gBAChE,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,UAAU,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAE5E,sBAAsB;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,kCAAkC,CAAC,KAAK,IAAI,CAAC;YAEjF,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI;gBACJ,GAAG,EAAE,IAAI;gBACT,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,oBAAoB;AAEpB;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,oCAAoC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,KAAK;QACjB,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,sCAAsC;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC;AAeD,qBAAqB;AACrB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,YAAoB,EACpB,UAA6C;IAE7C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE3D,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAErF,wDAAwD;IACxD,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAE5C,wEAAwE;IACxE,IAAI,OAAO,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAChE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,MAAM,kBAAkB,GAA+B,EAAE,CAAC;IAE1D,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,UAAU,EAAE,CAAC;gBACX,KAAK,EAAE,SAAS;gBAChB,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC1B,kBAAkB,EAAE,CAAC;gBACrB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,UAAU,EAAE,CAAC;YACX,KAAK,EAAE,SAAS;YAChB,aAAa,EAAE,MAAM,CAAC,IAAI;YAC1B,kBAAkB,EAAE,CAAC;SACtB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAEvD,UAAU,EAAE,CAAC;gBACX,KAAK,EAAE,SAAS;gBAChB,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC1B,kBAAkB,EAAE,CAAC;gBACrB,YAAY,EAAE,OAAO,CAAC,MAAM;aAC7B,CAAC,CAAC;YAEH,kBAAkB,CAAC,IAAI,CAAC;gBACtB,GAAG,MAAM;gBACT,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAEhC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,kBAAkB;KAC5B,CAAC;AACJ,CAAC;AACD,oBAAoB;AAEpB,yDAAyD;AACzD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Zod schemas for Skool/Next.js __NEXT_DATA__ responses.
3
+ * These validate only the fields we actually use, ignoring everything else.
4
+ */
5
+ import { z } from "zod";
6
+ export declare const SkoolNextDataSchema: z.ZodObject<{
7
+ props: z.ZodOptional<z.ZodObject<{
8
+ pageProps: z.ZodOptional<z.ZodObject<{
9
+ course: z.ZodOptional<z.ZodObject<{
10
+ children: z.ZodOptional<z.ZodArray<z.ZodObject<{
11
+ course: z.ZodOptional<z.ZodObject<{
12
+ id: z.ZodOptional<z.ZodString>;
13
+ name: z.ZodOptional<z.ZodString>;
14
+ metadata: z.ZodOptional<z.ZodObject<{
15
+ title: z.ZodOptional<z.ZodString>;
16
+ videoLink: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$loose>>;
18
+ }, z.core.$loose>>;
19
+ hasAccess: z.ZodOptional<z.ZodBoolean>;
20
+ }, z.core.$loose>>>;
21
+ }, z.core.$loose>>;
22
+ selectedModule: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$loose>>;
24
+ }, z.core.$loose>>;
25
+ }, z.core.$loose>;
26
+ export type SkoolNextData = z.infer<typeof SkoolNextDataSchema>;
27
+ export interface SkoolModule {
28
+ slug: string;
29
+ title: string;
30
+ hasAccess: boolean;
31
+ }
32
+ export interface SkoolLesson {
33
+ id: string;
34
+ hasAccess: boolean;
35
+ }
36
+ export interface SkoolVideoInfo {
37
+ url: string;
38
+ type: "loom" | "vimeo" | "youtube" | "wistia" | "unknown";
39
+ }
40
+ /**
41
+ * Safely parses __NEXT_DATA__ JSON from a script element.
42
+ * Returns null if parsing fails.
43
+ */
44
+ export declare function parseNextData(json: string): SkoolNextData | null;
45
+ /**
46
+ * Extracts modules from parsed __NEXT_DATA__.
47
+ */
48
+ export declare function extractModulesFromNextData(data: SkoolNextData): SkoolModule[];
49
+ /**
50
+ * Extracts lesson access info from parsed __NEXT_DATA__.
51
+ */
52
+ export declare function extractLessonAccessFromNextData(data: SkoolNextData): Map<string, boolean>;
53
+ /**
54
+ * Extracts video URL from parsed __NEXT_DATA__ for a specific module.
55
+ */
56
+ export declare function extractVideoFromNextData(data: SkoolNextData, selectedModuleId: string): SkoolVideoInfo | null;
57
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/scraper/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmCxB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;iBAM9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAMhE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC3D;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAYhE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,EAAE,CAyB7E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAezF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,EACnB,gBAAgB,EAAE,MAAM,GACvB,cAAc,GAAG,IAAI,CA4BvB"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Zod schemas for Skool/Next.js __NEXT_DATA__ responses.
3
+ * These validate only the fields we actually use, ignoring everything else.
4
+ */
5
+ import { z } from "zod";
6
+ // ============================================================================
7
+ // Skool Course Child (Module/Lesson)
8
+ // ============================================================================
9
+ const CourseMetadataSchema = z.looseObject({
10
+ title: z.string().optional(),
11
+ videoLink: z.string().optional(),
12
+ });
13
+ const CourseInfoSchema = z.looseObject({
14
+ id: z.string().optional(),
15
+ name: z.string().optional(), // 8-char hex slug
16
+ metadata: CourseMetadataSchema.optional(),
17
+ });
18
+ const CourseChildSchema = z.looseObject({
19
+ course: CourseInfoSchema.optional(),
20
+ hasAccess: z.boolean().optional(),
21
+ });
22
+ // ============================================================================
23
+ // Skool __NEXT_DATA__ PageProps
24
+ // ============================================================================
25
+ const SkoolCourseSchema = z.looseObject({
26
+ children: z.array(CourseChildSchema).optional(),
27
+ });
28
+ const SkoolPagePropsSchema = z.looseObject({
29
+ course: SkoolCourseSchema.optional(),
30
+ selectedModule: z.string().optional(),
31
+ });
32
+ export const SkoolNextDataSchema = z.looseObject({
33
+ props: z
34
+ .looseObject({
35
+ pageProps: SkoolPagePropsSchema.optional(),
36
+ })
37
+ .optional(),
38
+ });
39
+ // ============================================================================
40
+ // Helper Functions
41
+ // ============================================================================
42
+ /**
43
+ * Safely parses __NEXT_DATA__ JSON from a script element.
44
+ * Returns null if parsing fails.
45
+ */
46
+ export function parseNextData(json) {
47
+ try {
48
+ const data = JSON.parse(json);
49
+ const result = SkoolNextDataSchema.safeParse(data);
50
+ if (result.success) {
51
+ return result.data;
52
+ }
53
+ console.warn("[parseNextData] Validation failed:", z.treeifyError(result.error));
54
+ return null;
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Extracts modules from parsed __NEXT_DATA__.
62
+ */
63
+ export function extractModulesFromNextData(data) {
64
+ const children = data.props?.pageProps?.course?.children;
65
+ if (!Array.isArray(children))
66
+ return [];
67
+ const modules = [];
68
+ const seen = new Set();
69
+ for (const child of children) {
70
+ const course = child.course;
71
+ if (!course?.name)
72
+ continue;
73
+ // Skool module slugs are 8-char hex strings
74
+ if (!/^[a-f0-9]{8}$/.test(course.name))
75
+ continue;
76
+ if (seen.has(course.name))
77
+ continue;
78
+ seen.add(course.name);
79
+ modules.push({
80
+ slug: course.name,
81
+ title: course.metadata?.title ?? `Module ${modules.length + 1}`,
82
+ hasAccess: child.hasAccess !== false,
83
+ });
84
+ }
85
+ return modules;
86
+ }
87
+ /**
88
+ * Extracts lesson access info from parsed __NEXT_DATA__.
89
+ */
90
+ export function extractLessonAccessFromNextData(data) {
91
+ const accessMap = new Map();
92
+ const children = data.props?.pageProps?.course?.children;
93
+ if (!Array.isArray(children))
94
+ return accessMap;
95
+ for (const child of children) {
96
+ const id = child.course?.id;
97
+ const hasAccess = child.hasAccess;
98
+ if (id && typeof hasAccess === "boolean") {
99
+ accessMap.set(id, hasAccess);
100
+ }
101
+ }
102
+ return accessMap;
103
+ }
104
+ /**
105
+ * Extracts video URL from parsed __NEXT_DATA__ for a specific module.
106
+ */
107
+ export function extractVideoFromNextData(data, selectedModuleId) {
108
+ const children = data.props?.pageProps?.course?.children;
109
+ if (!Array.isArray(children))
110
+ return null;
111
+ for (const child of children) {
112
+ if (child.course?.id === selectedModuleId) {
113
+ const videoLink = child.course.metadata?.videoLink;
114
+ if (!videoLink)
115
+ return null;
116
+ // Determine video type
117
+ if (videoLink.includes("loom.com")) {
118
+ const embedUrl = videoLink.replace("/share/", "/embed/").split("?")[0];
119
+ return { url: embedUrl ?? videoLink, type: "loom" };
120
+ }
121
+ if (videoLink.includes("vimeo.com")) {
122
+ return { url: videoLink, type: "vimeo" };
123
+ }
124
+ if (videoLink.includes("youtube.com") || videoLink.includes("youtu.be")) {
125
+ return { url: videoLink, type: "youtube" };
126
+ }
127
+ if (videoLink.includes("wistia")) {
128
+ return { url: videoLink, type: "wistia" };
129
+ }
130
+ return { url: videoLink, type: "unknown" };
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/scraper/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Browser-based video URL interception - requires Playwright.
3
+ * Excluded from coverage via vitest.config.ts.
4
+ */
5
+ import type { Page } from "playwright";
6
+ /**
7
+ * Captures Vimeo video URL by extracting it from the running player.
8
+ * The key insight: the video is ALREADY playing in the iframe - we just need to get the URL.
9
+ */
10
+ export declare function captureVimeoConfig(page: Page, _videoId: string, timeoutMs?: number): Promise<{
11
+ hlsUrl: string | null;
12
+ progressiveUrl: string | null;
13
+ error?: string;
14
+ }>;
15
+ /**
16
+ * Captures Loom HLS URL by navigating directly to the embed page.
17
+ * This works better than CDP because we can intercept all requests on that page.
18
+ */
19
+ export declare function captureLoomHls(page: Page, videoId: string, timeoutMs?: number): Promise<{
20
+ hlsUrl: string | null;
21
+ error?: string;
22
+ }>;
23
+ //# sourceMappingURL=videoInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoInterceptor.d.ts","sourceRoot":"","sources":["../../src/scraper/videoInterceptor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAsDvC;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,SAAS,SAAQ,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqNnF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,SAAS,SAAQ,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiJpD"}
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Captures Vimeo video URL by extracting it from the running player.
3
+ * The key insight: the video is ALREADY playing in the iframe - we just need to get the URL.
4
+ */
5
+ export async function captureVimeoConfig(page, _videoId, timeoutMs = 20000) {
6
+ try {
7
+ // Step 1: Make sure we have a Vimeo iframe or video wrapper
8
+ // Skool wraps videos in a VideoPlayerWrapper - click it to ensure video loads
9
+ const videoWrapper = await page.$('[class*="VideoPlayerWrapper"], [class*="video-wrapper"], [class*="VideoPlayer"]');
10
+ if (videoWrapper) {
11
+ await videoWrapper.click().catch(() => { });
12
+ await page.waitForTimeout(1000);
13
+ }
14
+ // Step 2: Wait for Vimeo iframe to appear
15
+ let vimeoFrame = null;
16
+ const startTime = Date.now();
17
+ while (!vimeoFrame && Date.now() - startTime < timeoutMs) {
18
+ // Try to find the iframe
19
+ const iframe = await page.$('iframe[src*="vimeo.com"], iframe[src*="player.vimeo"]');
20
+ if (iframe) {
21
+ vimeoFrame = await iframe.contentFrame();
22
+ if (vimeoFrame)
23
+ break;
24
+ }
25
+ await page.waitForTimeout(500);
26
+ }
27
+ if (!vimeoFrame) {
28
+ return { hlsUrl: null, progressiveUrl: null, error: "Vimeo iframe not found after waiting" };
29
+ }
30
+ // Step 3: Mute the video before playing (we don't want audio!)
31
+ await vimeoFrame
32
+ .evaluate(() => {
33
+ const video = document.querySelector("video");
34
+ if (video) {
35
+ video.muted = true;
36
+ video.volume = 0;
37
+ }
38
+ })
39
+ .catch(() => { });
40
+ // Step 4: Click play button in the iframe to start video
41
+ try {
42
+ // Multiple selectors for Vimeo's play button
43
+ await vimeoFrame
44
+ .click('.vp-controls button, .play-icon, [aria-label="Play"], .vp-big-play-button, button', {
45
+ timeout: 2000,
46
+ })
47
+ .catch(() => { });
48
+ }
49
+ catch {
50
+ // Video might auto-play
51
+ }
52
+ // Ensure video stays muted
53
+ await vimeoFrame
54
+ .evaluate(() => {
55
+ const video = document.querySelector("video");
56
+ if (video) {
57
+ video.muted = true;
58
+ video.volume = 0;
59
+ }
60
+ })
61
+ .catch(() => { });
62
+ // Step 4: Wait for video to actually start playing and get the URL
63
+ let hlsUrl = null;
64
+ let progressiveUrl = null;
65
+ const extractionStart = Date.now();
66
+ while (!hlsUrl && !progressiveUrl && Date.now() - extractionStart < timeoutMs - 5000) {
67
+ const urls = await vimeoFrame.evaluate(() => {
68
+ const result = {
69
+ hlsUrl: null,
70
+ progressiveUrl: null,
71
+ debug: [],
72
+ };
73
+ // Method 1: Get URL directly from video element
74
+ const video = document.querySelector("video");
75
+ if (video) {
76
+ result.debug.push(`Video element found, src length: ${video.src?.length ?? 0}`);
77
+ // Check currentSrc (what's actually playing)
78
+ if (video.currentSrc) {
79
+ result.debug.push(`currentSrc: ${video.currentSrc.substring(0, 80)}`);
80
+ if (video.currentSrc.includes(".m3u8")) {
81
+ result.hlsUrl = video.currentSrc;
82
+ }
83
+ else if (video.currentSrc.includes(".mp4")) {
84
+ result.progressiveUrl = video.currentSrc;
85
+ }
86
+ }
87
+ // Also check src attribute
88
+ if (!result.hlsUrl && !result.progressiveUrl && video.src) {
89
+ if (video.src.includes(".m3u8")) {
90
+ result.hlsUrl = video.src;
91
+ }
92
+ else if (video.src.includes(".mp4")) {
93
+ result.progressiveUrl = video.src;
94
+ }
95
+ }
96
+ }
97
+ // Method 2: Check source elements
98
+ if (!result.hlsUrl && !result.progressiveUrl) {
99
+ const sources = document.querySelectorAll("video source");
100
+ result.debug.push(`Found ${sources.length} source elements`);
101
+ for (const source of Array.from(sources)) {
102
+ const src = source.src;
103
+ if (src?.includes(".m3u8")) {
104
+ result.hlsUrl = src;
105
+ break;
106
+ }
107
+ else if (src?.includes(".mp4") && !result.progressiveUrl) {
108
+ result.progressiveUrl = src;
109
+ }
110
+ }
111
+ }
112
+ // Method 3: Extract from Vimeo's internal player state
113
+ if (!result.hlsUrl && !result.progressiveUrl) {
114
+ try {
115
+ const win = window;
116
+ // Try various Vimeo internal variables
117
+ const configPaths = [
118
+ win.playerConfig?.request?.files,
119
+ win.vimeo?.config?.request?.files,
120
+ win.__vimeo_player__?.config?.request?.files,
121
+ ];
122
+ for (const files of configPaths) {
123
+ if (!files)
124
+ continue;
125
+ // HLS
126
+ if (files.hls?.cdns) {
127
+ const cdns = files.hls.cdns;
128
+ for (const cdn of Object.keys(cdns)) {
129
+ const cdnEntry = cdns[cdn];
130
+ if (cdnEntry?.url) {
131
+ result.hlsUrl = cdnEntry.url;
132
+ result.debug.push(`Found HLS in playerConfig.${cdn}`);
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ // Progressive MP4
138
+ if (!result.progressiveUrl && files.progressive && files.progressive.length > 0) {
139
+ const sorted = [...files.progressive].sort((a, b) => (b.height ?? 0) - (a.height ?? 0));
140
+ result.progressiveUrl = sorted[0]?.url ?? null;
141
+ if (result.progressiveUrl) {
142
+ result.debug.push("Found progressive in playerConfig");
143
+ }
144
+ }
145
+ if (result.hlsUrl || result.progressiveUrl)
146
+ break;
147
+ }
148
+ }
149
+ catch (e) {
150
+ result.debug.push(`Config extraction error: ${e instanceof Error ? e.message : String(e)}`);
151
+ }
152
+ }
153
+ // Method 4: Network request URLs might be in DOM attributes
154
+ if (!result.hlsUrl && !result.progressiveUrl) {
155
+ const allElements = document.querySelectorAll("*");
156
+ for (const el of Array.from(allElements)) {
157
+ for (const attr of Array.from(el.attributes)) {
158
+ if (attr.value.includes("vimeocdn.com") && attr.value.includes(".m3u8")) {
159
+ result.hlsUrl = /https:\/\/[^\s"']+\.m3u8[^\s"']*/.exec(attr.value)?.[0] ?? null;
160
+ if (result.hlsUrl) {
161
+ result.debug.push("Found HLS in element attribute");
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ if (result.hlsUrl)
167
+ break;
168
+ }
169
+ }
170
+ return result;
171
+ });
172
+ hlsUrl = urls.hlsUrl;
173
+ progressiveUrl = urls.progressiveUrl;
174
+ if (!hlsUrl && !progressiveUrl) {
175
+ // Wait and try again
176
+ await new Promise((r) => setTimeout(r, 1000));
177
+ }
178
+ }
179
+ if (hlsUrl || progressiveUrl) {
180
+ return { hlsUrl, progressiveUrl };
181
+ }
182
+ return {
183
+ hlsUrl: null,
184
+ progressiveUrl: null,
185
+ error: "Could not extract video URL from Vimeo player",
186
+ };
187
+ }
188
+ catch (error) {
189
+ return {
190
+ hlsUrl: null,
191
+ progressiveUrl: null,
192
+ error: `Vimeo extraction failed: ${error instanceof Error ? error.message : String(error)}`,
193
+ };
194
+ }
195
+ }
196
+ /**
197
+ * Captures Loom HLS URL by navigating directly to the embed page.
198
+ * This works better than CDP because we can intercept all requests on that page.
199
+ */
200
+ export async function captureLoomHls(page, videoId, timeoutMs = 15000) {
201
+ let capturedUrl = null;
202
+ const originalUrl = page.url();
203
+ try {
204
+ // Use CDP to intercept network responses
205
+ const client = await page.context().newCDPSession(page);
206
+ await client.send("Network.enable");
207
+ // Match HLS playlists from Loom's CDN
208
+ // Prefer master playlist (playlist.m3u8) over media playlists (mediaplaylist-*.m3u8)
209
+ const masterPattern = /luna\.loom\.com.*\/playlist\.m3u8/;
210
+ const anyHlsPattern = /luna\.loom\.com.*\.m3u8/;
211
+ // Set up listener before navigation
212
+ const responsePromise = new Promise((resolve) => {
213
+ const timeout = setTimeout(() => {
214
+ resolve();
215
+ }, timeoutMs);
216
+ let hasMasterPlaylist = false;
217
+ client.on("Network.responseReceived", (event) => {
218
+ const url = event.response.url;
219
+ // Always prefer master playlist
220
+ if (masterPattern.test(url)) {
221
+ capturedUrl = url;
222
+ hasMasterPlaylist = true;
223
+ clearTimeout(timeout);
224
+ resolve();
225
+ }
226
+ else if (!hasMasterPlaylist && anyHlsPattern.test(url)) {
227
+ // Capture any HLS as fallback, but keep listening for master
228
+ capturedUrl = url;
229
+ }
230
+ });
231
+ });
232
+ // Navigate directly to Loom embed with autoplay (muted)
233
+ const embedUrl = `https://www.loom.com/embed/${videoId}?autoplay=1`;
234
+ await page.goto(embedUrl, { waitUntil: "domcontentloaded", timeout: 10000 });
235
+ // Mute the video immediately
236
+ await page
237
+ .evaluate(() => {
238
+ const video = document.querySelector("video");
239
+ if (video) {
240
+ video.muted = true;
241
+ video.volume = 0;
242
+ }
243
+ })
244
+ .catch(() => { });
245
+ // Try to click play button if video doesn't autoplay
246
+ try {
247
+ await page.waitForTimeout(2000);
248
+ const playButton = await page.$('[data-testid="play-button"], .PlayButton, [aria-label="Play"], button[class*="play"]');
249
+ if (playButton) {
250
+ // Mute again before clicking play
251
+ await page
252
+ .evaluate(() => {
253
+ const video = document.querySelector("video");
254
+ if (video) {
255
+ video.muted = true;
256
+ video.volume = 0;
257
+ }
258
+ })
259
+ .catch(() => { });
260
+ await playButton.click();
261
+ }
262
+ }
263
+ catch {
264
+ // No play button or click failed
265
+ }
266
+ // Ensure video stays muted after play
267
+ await page
268
+ .evaluate(() => {
269
+ const video = document.querySelector("video");
270
+ if (video) {
271
+ video.muted = true;
272
+ video.volume = 0;
273
+ }
274
+ })
275
+ .catch(() => { });
276
+ // Wait for HLS to be captured
277
+ await responsePromise;
278
+ // Also try to extract from page JS if not found via network
279
+ if (!capturedUrl) {
280
+ const jsUrl = await page.evaluate(() => {
281
+ const win = window;
282
+ // Check __LOOM_SSR_STATE__
283
+ if (win.__LOOM_SSR_STATE__?.video?.asset_urls?.hls_url) {
284
+ return win.__LOOM_SSR_STATE__.video.asset_urls.hls_url;
285
+ }
286
+ // Check for Next.js data
287
+ const nextData = document.getElementById("__NEXT_DATA__");
288
+ if (nextData?.textContent) {
289
+ try {
290
+ const data = JSON.parse(nextData.textContent);
291
+ const hlsUrl = data?.props?.pageProps?.video?.asset_urls?.hls_url;
292
+ if (hlsUrl)
293
+ return hlsUrl;
294
+ // Try regex match in full data
295
+ const videoData = /hls_url['":\s]+['"]([^'"]+)['"]/.exec(JSON.stringify(data));
296
+ if (videoData?.[1])
297
+ return videoData[1];
298
+ }
299
+ catch {
300
+ /* ignore parse errors */
301
+ }
302
+ }
303
+ // Scan scripts for HLS URL
304
+ const scripts = Array.from(document.querySelectorAll("script"));
305
+ for (const script of scripts) {
306
+ const match = /https:\/\/luna\.loom\.com[^"'\s]+\.m3u8[^"'\s]*/.exec(script.textContent ?? "");
307
+ if (match)
308
+ return match[0];
309
+ }
310
+ return null;
311
+ });
312
+ if (jsUrl) {
313
+ capturedUrl = jsUrl;
314
+ }
315
+ }
316
+ await client.detach();
317
+ }
318
+ catch {
319
+ // Error during capture
320
+ }
321
+ // Navigate back to original page
322
+ try {
323
+ await page.goto(originalUrl, { waitUntil: "domcontentloaded", timeout: 10000 });
324
+ }
325
+ catch {
326
+ // Failed to navigate back
327
+ }
328
+ return capturedUrl ? { hlsUrl: capturedUrl } : { hlsUrl: null, error: "HLS URL not captured" };
329
+ }
330
+ //# sourceMappingURL=videoInterceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoInterceptor.js","sourceRoot":"","sources":["../../src/scraper/videoInterceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Browser, BrowserContext, Page } from "playwright";
2
+ export interface AuthSession {
3
+ context: BrowserContext;
4
+ page: Page;
5
+ }
6
+ export interface AuthConfig {
7
+ /** Domain to store session under */
8
+ domain: string;
9
+ /** URL to navigate to for login */
10
+ loginUrl: string;
11
+ /** Function to check if current URL is a login page */
12
+ isLoginPage: (url: string) => boolean;
13
+ /** Optional: Function to verify session is valid after navigation */
14
+ verifySession?: (page: Page) => Promise<boolean>;
15
+ /** Login timeout in ms (default: 5 minutes) */
16
+ loginTimeout?: number;
17
+ }
18
+ /**
19
+ * Creates a login page checker from patterns.
20
+ */
21
+ export declare function createLoginChecker(patterns?: RegExp[]): (url: string) => boolean;
22
+ /**
23
+ * Skool-specific login page checker.
24
+ */
25
+ export declare const isSkoolLoginPage: (url: string) => boolean;
26
+ /**
27
+ * HighLevel-specific login page checker.
28
+ */
29
+ export declare const isHighLevelLoginPage: (url: string) => boolean;
30
+ /**
31
+ * Checks if a valid session exists for the given domain.
32
+ */
33
+ export declare function hasValidSession(domain: string): Promise<boolean>;
34
+ /**
35
+ * Performs interactive login by opening a browser window.
36
+ * The user logs in manually, and we capture the session.
37
+ */
38
+ export declare function performInteractiveLogin(config: AuthConfig): Promise<AuthSession>;
39
+ /**
40
+ * Gets an authenticated session, either from cache or via interactive login.
41
+ */
42
+ export declare function getAuthenticatedSession(config: AuthConfig, options?: {
43
+ forceLogin?: boolean;
44
+ headless?: boolean;
45
+ }): Promise<{
46
+ browser: Browser;
47
+ session: AuthSession;
48
+ }>;
49
+ /**
50
+ * Clears the session for a domain.
51
+ */
52
+ export declare function clearSession(domain: string): Promise<boolean>;
53
+ /**
54
+ * Checks if the page has a valid Firebase auth token.
55
+ * Used by HighLevel/GoHighLevel portals.
56
+ */
57
+ export { hasValidFirebaseToken } from "./firebase.js";
58
+ //# sourceMappingURL=auth.d.ts.map