youtube-transcript-nodejs 0.1.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 (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/dist/cjs/api/InnerTubeClient.js +236 -0
  4. package/dist/cjs/api/InnerTubeClient.js.map +1 -0
  5. package/dist/cjs/api/YouTubeTranscriptApi.js +160 -0
  6. package/dist/cjs/api/YouTubeTranscriptApi.js.map +1 -0
  7. package/dist/cjs/api/fetchStrategies.js +51 -0
  8. package/dist/cjs/api/fetchStrategies.js.map +1 -0
  9. package/dist/cjs/config/constants.js +34 -0
  10. package/dist/cjs/config/constants.js.map +1 -0
  11. package/dist/cjs/config/innerTubeContext.js +82 -0
  12. package/dist/cjs/config/innerTubeContext.js.map +1 -0
  13. package/dist/cjs/errors/BotDetected.js +20 -0
  14. package/dist/cjs/errors/BotDetected.js.map +1 -0
  15. package/dist/cjs/errors/FailedToCreateConsentCookie.js +17 -0
  16. package/dist/cjs/errors/FailedToCreateConsentCookie.js.map +1 -0
  17. package/dist/cjs/errors/InvalidVideoId.js +16 -0
  18. package/dist/cjs/errors/InvalidVideoId.js.map +1 -0
  19. package/dist/cjs/errors/IpBlocked.js +17 -0
  20. package/dist/cjs/errors/IpBlocked.js.map +1 -0
  21. package/dist/cjs/errors/NoTranscriptFound.js +23 -0
  22. package/dist/cjs/errors/NoTranscriptFound.js.map +1 -0
  23. package/dist/cjs/errors/NotTranslatable.js +15 -0
  24. package/dist/cjs/errors/NotTranslatable.js.map +1 -0
  25. package/dist/cjs/errors/PoTokenRequired.js +18 -0
  26. package/dist/cjs/errors/PoTokenRequired.js.map +1 -0
  27. package/dist/cjs/errors/TooManyRequests.js +19 -0
  28. package/dist/cjs/errors/TooManyRequests.js.map +1 -0
  29. package/dist/cjs/errors/TranscriptsDisabled.js +15 -0
  30. package/dist/cjs/errors/TranscriptsDisabled.js.map +1 -0
  31. package/dist/cjs/errors/TranslationLanguageNotAvailable.js +16 -0
  32. package/dist/cjs/errors/TranslationLanguageNotAvailable.js.map +1 -0
  33. package/dist/cjs/errors/VideoUnavailable.js +15 -0
  34. package/dist/cjs/errors/VideoUnavailable.js.map +1 -0
  35. package/dist/cjs/errors/VideoUnplayable.js +22 -0
  36. package/dist/cjs/errors/VideoUnplayable.js.map +1 -0
  37. package/dist/cjs/errors/YouTubeDataUnparsable.js +15 -0
  38. package/dist/cjs/errors/YouTubeDataUnparsable.js.map +1 -0
  39. package/dist/cjs/errors/YouTubeRequestFailed.js +18 -0
  40. package/dist/cjs/errors/YouTubeRequestFailed.js.map +1 -0
  41. package/dist/cjs/errors/YouTubeTranscriptError.js +19 -0
  42. package/dist/cjs/errors/YouTubeTranscriptError.js.map +1 -0
  43. package/dist/cjs/errors/index.js +34 -0
  44. package/dist/cjs/errors/index.js.map +1 -0
  45. package/dist/cjs/formatters/Formatter.js +3 -0
  46. package/dist/cjs/formatters/Formatter.js.map +1 -0
  47. package/dist/cjs/formatters/JSONFormatter.js +24 -0
  48. package/dist/cjs/formatters/JSONFormatter.js.map +1 -0
  49. package/dist/cjs/formatters/PrettyPrintFormatter.js +26 -0
  50. package/dist/cjs/formatters/PrettyPrintFormatter.js.map +1 -0
  51. package/dist/cjs/formatters/SRTFormatter.js +39 -0
  52. package/dist/cjs/formatters/SRTFormatter.js.map +1 -0
  53. package/dist/cjs/formatters/TextFormatter.js +20 -0
  54. package/dist/cjs/formatters/TextFormatter.js.map +1 -0
  55. package/dist/cjs/formatters/WebVTTFormatter.js +39 -0
  56. package/dist/cjs/formatters/WebVTTFormatter.js.map +1 -0
  57. package/dist/cjs/formatters/base.js +61 -0
  58. package/dist/cjs/formatters/base.js.map +1 -0
  59. package/dist/cjs/formatters/index.js +19 -0
  60. package/dist/cjs/formatters/index.js.map +1 -0
  61. package/dist/cjs/http/cookieJar.js +91 -0
  62. package/dist/cjs/http/cookieJar.js.map +1 -0
  63. package/dist/cjs/http/httpClient.js +228 -0
  64. package/dist/cjs/http/httpClient.js.map +1 -0
  65. package/dist/cjs/index.js +50 -0
  66. package/dist/cjs/index.js.map +1 -0
  67. package/dist/cjs/models/FetchedTranscript.js +80 -0
  68. package/dist/cjs/models/FetchedTranscript.js.map +1 -0
  69. package/dist/cjs/models/FetchedTranscriptSnippet.js +29 -0
  70. package/dist/cjs/models/FetchedTranscriptSnippet.js.map +1 -0
  71. package/dist/cjs/models/FormattedTranscript.js +3 -0
  72. package/dist/cjs/models/FormattedTranscript.js.map +1 -0
  73. package/dist/cjs/models/Transcript.js +75 -0
  74. package/dist/cjs/models/Transcript.js.map +1 -0
  75. package/dist/cjs/models/TranscriptList.js +84 -0
  76. package/dist/cjs/models/TranscriptList.js.map +1 -0
  77. package/dist/cjs/models/TranscriptMetadata.js +3 -0
  78. package/dist/cjs/models/TranscriptMetadata.js.map +1 -0
  79. package/dist/cjs/models/TranslationLanguage.js +3 -0
  80. package/dist/cjs/models/TranslationLanguage.js.map +1 -0
  81. package/dist/cjs/models/index.js +13 -0
  82. package/dist/cjs/models/index.js.map +1 -0
  83. package/dist/cjs/package.json +1 -0
  84. package/dist/cjs/parsers/captionTrackParser.js +96 -0
  85. package/dist/cjs/parsers/captionTrackParser.js.map +1 -0
  86. package/dist/cjs/parsers/videoIdParser.js +65 -0
  87. package/dist/cjs/parsers/videoIdParser.js.map +1 -0
  88. package/dist/cjs/parsers/watchHtmlParser.js +78 -0
  89. package/dist/cjs/parsers/watchHtmlParser.js.map +1 -0
  90. package/dist/cjs/parsers/xmlTranscriptParser.js +84 -0
  91. package/dist/cjs/parsers/xmlTranscriptParser.js.map +1 -0
  92. package/dist/cjs/potoken/AutoPoTokenProvider.js +203 -0
  93. package/dist/cjs/potoken/AutoPoTokenProvider.js.map +1 -0
  94. package/dist/cjs/potoken/HttpPoTokenProvider.js +105 -0
  95. package/dist/cjs/potoken/HttpPoTokenProvider.js.map +1 -0
  96. package/dist/cjs/potoken/NoopPoTokenProvider.js +18 -0
  97. package/dist/cjs/potoken/NoopPoTokenProvider.js.map +1 -0
  98. package/dist/cjs/potoken/baseScriptCache.js +41 -0
  99. package/dist/cjs/potoken/baseScriptCache.js.map +1 -0
  100. package/dist/cjs/potoken/index.js +14 -0
  101. package/dist/cjs/potoken/index.js.map +1 -0
  102. package/dist/cjs/potoken/types.js +10 -0
  103. package/dist/cjs/potoken/types.js.map +1 -0
  104. package/dist/cjs/util/htmlSanitizer.js +77 -0
  105. package/dist/cjs/util/htmlSanitizer.js.map +1 -0
  106. package/dist/cjs/util/proxyUrl.js +42 -0
  107. package/dist/cjs/util/proxyUrl.js.map +1 -0
  108. package/dist/cjs/util/retry.js +65 -0
  109. package/dist/cjs/util/retry.js.map +1 -0
  110. package/dist/esm/api/InnerTubeClient.d.ts +61 -0
  111. package/dist/esm/api/InnerTubeClient.d.ts.map +1 -0
  112. package/dist/esm/api/InnerTubeClient.js +198 -0
  113. package/dist/esm/api/InnerTubeClient.js.map +1 -0
  114. package/dist/esm/api/YouTubeTranscriptApi.d.ts +88 -0
  115. package/dist/esm/api/YouTubeTranscriptApi.d.ts.map +1 -0
  116. package/dist/esm/api/YouTubeTranscriptApi.js +157 -0
  117. package/dist/esm/api/YouTubeTranscriptApi.js.map +1 -0
  118. package/dist/esm/api/fetchStrategies.d.ts +20 -0
  119. package/dist/esm/api/fetchStrategies.d.ts.map +1 -0
  120. package/dist/esm/api/fetchStrategies.js +48 -0
  121. package/dist/esm/api/fetchStrategies.js.map +1 -0
  122. package/dist/esm/config/constants.d.ts +30 -0
  123. package/dist/esm/config/constants.d.ts.map +1 -0
  124. package/dist/esm/config/constants.js +31 -0
  125. package/dist/esm/config/constants.js.map +1 -0
  126. package/dist/esm/config/innerTubeContext.d.ts +47 -0
  127. package/dist/esm/config/innerTubeContext.d.ts.map +1 -0
  128. package/dist/esm/config/innerTubeContext.js +77 -0
  129. package/dist/esm/config/innerTubeContext.js.map +1 -0
  130. package/dist/esm/errors/BotDetected.d.ts +13 -0
  131. package/dist/esm/errors/BotDetected.d.ts.map +1 -0
  132. package/dist/esm/errors/BotDetected.js +16 -0
  133. package/dist/esm/errors/BotDetected.js.map +1 -0
  134. package/dist/esm/errors/FailedToCreateConsentCookie.d.ts +10 -0
  135. package/dist/esm/errors/FailedToCreateConsentCookie.d.ts.map +1 -0
  136. package/dist/esm/errors/FailedToCreateConsentCookie.js +13 -0
  137. package/dist/esm/errors/FailedToCreateConsentCookie.js.map +1 -0
  138. package/dist/esm/errors/InvalidVideoId.d.ts +9 -0
  139. package/dist/esm/errors/InvalidVideoId.d.ts.map +1 -0
  140. package/dist/esm/errors/InvalidVideoId.js +12 -0
  141. package/dist/esm/errors/InvalidVideoId.js.map +1 -0
  142. package/dist/esm/errors/IpBlocked.d.ts +10 -0
  143. package/dist/esm/errors/IpBlocked.d.ts.map +1 -0
  144. package/dist/esm/errors/IpBlocked.js +13 -0
  145. package/dist/esm/errors/IpBlocked.js.map +1 -0
  146. package/dist/esm/errors/NoTranscriptFound.d.ts +19 -0
  147. package/dist/esm/errors/NoTranscriptFound.d.ts.map +1 -0
  148. package/dist/esm/errors/NoTranscriptFound.js +19 -0
  149. package/dist/esm/errors/NoTranscriptFound.js.map +1 -0
  150. package/dist/esm/errors/NotTranslatable.d.ts +9 -0
  151. package/dist/esm/errors/NotTranslatable.d.ts.map +1 -0
  152. package/dist/esm/errors/NotTranslatable.js +11 -0
  153. package/dist/esm/errors/NotTranslatable.js.map +1 -0
  154. package/dist/esm/errors/PoTokenRequired.d.ts +10 -0
  155. package/dist/esm/errors/PoTokenRequired.d.ts.map +1 -0
  156. package/dist/esm/errors/PoTokenRequired.js +14 -0
  157. package/dist/esm/errors/PoTokenRequired.js.map +1 -0
  158. package/dist/esm/errors/TooManyRequests.d.ts +12 -0
  159. package/dist/esm/errors/TooManyRequests.d.ts.map +1 -0
  160. package/dist/esm/errors/TooManyRequests.js +15 -0
  161. package/dist/esm/errors/TooManyRequests.js.map +1 -0
  162. package/dist/esm/errors/TranscriptsDisabled.d.ts +9 -0
  163. package/dist/esm/errors/TranscriptsDisabled.d.ts.map +1 -0
  164. package/dist/esm/errors/TranscriptsDisabled.js +11 -0
  165. package/dist/esm/errors/TranscriptsDisabled.js.map +1 -0
  166. package/dist/esm/errors/TranslationLanguageNotAvailable.d.ts +9 -0
  167. package/dist/esm/errors/TranslationLanguageNotAvailable.d.ts.map +1 -0
  168. package/dist/esm/errors/TranslationLanguageNotAvailable.js +12 -0
  169. package/dist/esm/errors/TranslationLanguageNotAvailable.js.map +1 -0
  170. package/dist/esm/errors/VideoUnavailable.d.ts +9 -0
  171. package/dist/esm/errors/VideoUnavailable.d.ts.map +1 -0
  172. package/dist/esm/errors/VideoUnavailable.js +11 -0
  173. package/dist/esm/errors/VideoUnavailable.js.map +1 -0
  174. package/dist/esm/errors/VideoUnplayable.d.ts +12 -0
  175. package/dist/esm/errors/VideoUnplayable.d.ts.map +1 -0
  176. package/dist/esm/errors/VideoUnplayable.js +18 -0
  177. package/dist/esm/errors/VideoUnplayable.js.map +1 -0
  178. package/dist/esm/errors/YouTubeDataUnparsable.d.ts +9 -0
  179. package/dist/esm/errors/YouTubeDataUnparsable.d.ts.map +1 -0
  180. package/dist/esm/errors/YouTubeDataUnparsable.js +11 -0
  181. package/dist/esm/errors/YouTubeDataUnparsable.js.map +1 -0
  182. package/dist/esm/errors/YouTubeRequestFailed.d.ts +10 -0
  183. package/dist/esm/errors/YouTubeRequestFailed.d.ts.map +1 -0
  184. package/dist/esm/errors/YouTubeRequestFailed.js +14 -0
  185. package/dist/esm/errors/YouTubeRequestFailed.js.map +1 -0
  186. package/dist/esm/errors/YouTubeTranscriptError.d.ts +10 -0
  187. package/dist/esm/errors/YouTubeTranscriptError.d.ts.map +1 -0
  188. package/dist/esm/errors/YouTubeTranscriptError.js +15 -0
  189. package/dist/esm/errors/YouTubeTranscriptError.js.map +1 -0
  190. package/dist/esm/errors/index.d.ts +17 -0
  191. package/dist/esm/errors/index.d.ts.map +1 -0
  192. package/dist/esm/errors/index.js +16 -0
  193. package/dist/esm/errors/index.js.map +1 -0
  194. package/dist/esm/formatters/Formatter.d.ts +33 -0
  195. package/dist/esm/formatters/Formatter.d.ts.map +1 -0
  196. package/dist/esm/formatters/Formatter.js +2 -0
  197. package/dist/esm/formatters/Formatter.js.map +1 -0
  198. package/dist/esm/formatters/JSONFormatter.d.ts +10 -0
  199. package/dist/esm/formatters/JSONFormatter.d.ts.map +1 -0
  200. package/dist/esm/formatters/JSONFormatter.js +20 -0
  201. package/dist/esm/formatters/JSONFormatter.js.map +1 -0
  202. package/dist/esm/formatters/PrettyPrintFormatter.d.ts +15 -0
  203. package/dist/esm/formatters/PrettyPrintFormatter.d.ts.map +1 -0
  204. package/dist/esm/formatters/PrettyPrintFormatter.js +22 -0
  205. package/dist/esm/formatters/PrettyPrintFormatter.js.map +1 -0
  206. package/dist/esm/formatters/SRTFormatter.d.ts +22 -0
  207. package/dist/esm/formatters/SRTFormatter.d.ts.map +1 -0
  208. package/dist/esm/formatters/SRTFormatter.js +35 -0
  209. package/dist/esm/formatters/SRTFormatter.js.map +1 -0
  210. package/dist/esm/formatters/TextFormatter.d.ts +10 -0
  211. package/dist/esm/formatters/TextFormatter.d.ts.map +1 -0
  212. package/dist/esm/formatters/TextFormatter.js +16 -0
  213. package/dist/esm/formatters/TextFormatter.js.map +1 -0
  214. package/dist/esm/formatters/WebVTTFormatter.d.ts +22 -0
  215. package/dist/esm/formatters/WebVTTFormatter.d.ts.map +1 -0
  216. package/dist/esm/formatters/WebVTTFormatter.js +35 -0
  217. package/dist/esm/formatters/WebVTTFormatter.js.map +1 -0
  218. package/dist/esm/formatters/base.d.ts +25 -0
  219. package/dist/esm/formatters/base.d.ts.map +1 -0
  220. package/dist/esm/formatters/base.js +55 -0
  221. package/dist/esm/formatters/base.js.map +1 -0
  222. package/dist/esm/formatters/index.d.ts +8 -0
  223. package/dist/esm/formatters/index.d.ts.map +1 -0
  224. package/dist/esm/formatters/index.js +7 -0
  225. package/dist/esm/formatters/index.js.map +1 -0
  226. package/dist/esm/http/cookieJar.d.ts +39 -0
  227. package/dist/esm/http/cookieJar.d.ts.map +1 -0
  228. package/dist/esm/http/cookieJar.js +87 -0
  229. package/dist/esm/http/cookieJar.js.map +1 -0
  230. package/dist/esm/http/httpClient.d.ts +88 -0
  231. package/dist/esm/http/httpClient.d.ts.map +1 -0
  232. package/dist/esm/http/httpClient.js +191 -0
  233. package/dist/esm/http/httpClient.js.map +1 -0
  234. package/dist/esm/index.d.ts +19 -0
  235. package/dist/esm/index.d.ts.map +1 -0
  236. package/dist/esm/index.js +14 -0
  237. package/dist/esm/index.js.map +1 -0
  238. package/dist/esm/models/FetchedTranscript.d.ts +49 -0
  239. package/dist/esm/models/FetchedTranscript.d.ts.map +1 -0
  240. package/dist/esm/models/FetchedTranscript.js +76 -0
  241. package/dist/esm/models/FetchedTranscript.js.map +1 -0
  242. package/dist/esm/models/FetchedTranscriptSnippet.d.ts +15 -0
  243. package/dist/esm/models/FetchedTranscriptSnippet.d.ts.map +1 -0
  244. package/dist/esm/models/FetchedTranscriptSnippet.js +25 -0
  245. package/dist/esm/models/FetchedTranscriptSnippet.js.map +1 -0
  246. package/dist/esm/models/FormattedTranscript.d.ts +9 -0
  247. package/dist/esm/models/FormattedTranscript.d.ts.map +1 -0
  248. package/dist/esm/models/FormattedTranscript.js +2 -0
  249. package/dist/esm/models/FormattedTranscript.js.map +1 -0
  250. package/dist/esm/models/Transcript.d.ts +36 -0
  251. package/dist/esm/models/Transcript.d.ts.map +1 -0
  252. package/dist/esm/models/Transcript.js +71 -0
  253. package/dist/esm/models/Transcript.js.map +1 -0
  254. package/dist/esm/models/TranscriptList.d.ts +48 -0
  255. package/dist/esm/models/TranscriptList.d.ts.map +1 -0
  256. package/dist/esm/models/TranscriptList.js +79 -0
  257. package/dist/esm/models/TranscriptList.js.map +1 -0
  258. package/dist/esm/models/TranscriptMetadata.d.ts +10 -0
  259. package/dist/esm/models/TranscriptMetadata.d.ts.map +1 -0
  260. package/dist/esm/models/TranscriptMetadata.js +2 -0
  261. package/dist/esm/models/TranscriptMetadata.js.map +1 -0
  262. package/dist/esm/models/TranslationLanguage.d.ts +8 -0
  263. package/dist/esm/models/TranslationLanguage.d.ts.map +1 -0
  264. package/dist/esm/models/TranslationLanguage.js +2 -0
  265. package/dist/esm/models/TranslationLanguage.js.map +1 -0
  266. package/dist/esm/models/index.d.ts +8 -0
  267. package/dist/esm/models/index.d.ts.map +1 -0
  268. package/dist/esm/models/index.js +5 -0
  269. package/dist/esm/models/index.js.map +1 -0
  270. package/dist/esm/package.json +1 -0
  271. package/dist/esm/parsers/captionTrackParser.d.ts +29 -0
  272. package/dist/esm/parsers/captionTrackParser.d.ts.map +1 -0
  273. package/dist/esm/parsers/captionTrackParser.js +91 -0
  274. package/dist/esm/parsers/captionTrackParser.js.map +1 -0
  275. package/dist/esm/parsers/videoIdParser.d.ts +11 -0
  276. package/dist/esm/parsers/videoIdParser.d.ts.map +1 -0
  277. package/dist/esm/parsers/videoIdParser.js +61 -0
  278. package/dist/esm/parsers/videoIdParser.js.map +1 -0
  279. package/dist/esm/parsers/watchHtmlParser.d.ts +33 -0
  280. package/dist/esm/parsers/watchHtmlParser.d.ts.map +1 -0
  281. package/dist/esm/parsers/watchHtmlParser.js +70 -0
  282. package/dist/esm/parsers/watchHtmlParser.js.map +1 -0
  283. package/dist/esm/parsers/xmlTranscriptParser.d.ts +17 -0
  284. package/dist/esm/parsers/xmlTranscriptParser.d.ts.map +1 -0
  285. package/dist/esm/parsers/xmlTranscriptParser.js +81 -0
  286. package/dist/esm/parsers/xmlTranscriptParser.js.map +1 -0
  287. package/dist/esm/potoken/AutoPoTokenProvider.d.ts +28 -0
  288. package/dist/esm/potoken/AutoPoTokenProvider.d.ts.map +1 -0
  289. package/dist/esm/potoken/AutoPoTokenProvider.js +166 -0
  290. package/dist/esm/potoken/AutoPoTokenProvider.js.map +1 -0
  291. package/dist/esm/potoken/HttpPoTokenProvider.d.ts +41 -0
  292. package/dist/esm/potoken/HttpPoTokenProvider.d.ts.map +1 -0
  293. package/dist/esm/potoken/HttpPoTokenProvider.js +101 -0
  294. package/dist/esm/potoken/HttpPoTokenProvider.js.map +1 -0
  295. package/dist/esm/potoken/NoopPoTokenProvider.d.ts +12 -0
  296. package/dist/esm/potoken/NoopPoTokenProvider.d.ts.map +1 -0
  297. package/dist/esm/potoken/NoopPoTokenProvider.js +14 -0
  298. package/dist/esm/potoken/NoopPoTokenProvider.js.map +1 -0
  299. package/dist/esm/potoken/baseScriptCache.d.ts +28 -0
  300. package/dist/esm/potoken/baseScriptCache.d.ts.map +1 -0
  301. package/dist/esm/potoken/baseScriptCache.js +37 -0
  302. package/dist/esm/potoken/baseScriptCache.js.map +1 -0
  303. package/dist/esm/potoken/index.d.ts +10 -0
  304. package/dist/esm/potoken/index.d.ts.map +1 -0
  305. package/dist/esm/potoken/index.js +6 -0
  306. package/dist/esm/potoken/index.js.map +1 -0
  307. package/dist/esm/potoken/types.d.ts +40 -0
  308. package/dist/esm/potoken/types.d.ts.map +1 -0
  309. package/dist/esm/potoken/types.js +7 -0
  310. package/dist/esm/potoken/types.js.map +1 -0
  311. package/dist/esm/util/htmlSanitizer.d.ts +21 -0
  312. package/dist/esm/util/htmlSanitizer.d.ts.map +1 -0
  313. package/dist/esm/util/htmlSanitizer.js +69 -0
  314. package/dist/esm/util/htmlSanitizer.js.map +1 -0
  315. package/dist/esm/util/proxyUrl.d.ts +22 -0
  316. package/dist/esm/util/proxyUrl.d.ts.map +1 -0
  317. package/dist/esm/util/proxyUrl.js +39 -0
  318. package/dist/esm/util/proxyUrl.js.map +1 -0
  319. package/dist/esm/util/retry.d.ts +37 -0
  320. package/dist/esm/util/retry.d.ts.map +1 -0
  321. package/dist/esm/util/retry.js +60 -0
  322. package/dist/esm/util/retry.js.map +1 -0
  323. package/package.json +111 -0
@@ -0,0 +1,22 @@
1
+ import { toVttTime } from './base.js';
2
+ /**
3
+ * Pretty-print formatter — human-readable debug output.
4
+ *
5
+ * Output format:
6
+ *
7
+ * [00:00:00.000] Hello world
8
+ * [00:00:01.540] Next line
9
+ */
10
+ export class PrettyPrintFormatter {
11
+ extension = 'txt';
12
+ mimeType = 'text/plain';
13
+ render(snippets) {
14
+ const lines = snippets.map((s) => `[${toVttTime(s.start)}] ${s.text}`);
15
+ return {
16
+ content: lines.join('\n') + '\n',
17
+ extension: this.extension,
18
+ mimeType: this.mimeType,
19
+ };
20
+ }
21
+ }
22
+ //# sourceMappingURL=PrettyPrintFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrettyPrintFormatter.js","sourceRoot":"","sources":["../../../src/formatters/PrettyPrintFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,YAAY,CAAC;IAEjC,MAAM,CAAC,QAAgC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
2
+ /**
3
+ * SRT subtitle formatter.
4
+ *
5
+ * Output format:
6
+ *
7
+ * 1
8
+ * 00:00:00,000 --> 00:00:01,540
9
+ * Hello world
10
+ *
11
+ * 2
12
+ * 00:00:01,540 --> 00:00:03,540
13
+ * Next line
14
+ *
15
+ * Mirrors `SRTFormatter` from the Python library.
16
+ */
17
+ export declare class SRTFormatter implements Formatter {
18
+ readonly extension = "srt";
19
+ readonly mimeType = "application/x-subrip";
20
+ render(snippets: readonly SnippetLike[]): FormattedOutput;
21
+ }
22
+ //# sourceMappingURL=SRTFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SRTFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/SRTFormatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,0BAA0B;IAE3C,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAc1D"}
@@ -0,0 +1,35 @@
1
+ import { computeEnd, toSrtTime } from './base.js';
2
+ /**
3
+ * SRT subtitle formatter.
4
+ *
5
+ * Output format:
6
+ *
7
+ * 1
8
+ * 00:00:00,000 --> 00:00:01,540
9
+ * Hello world
10
+ *
11
+ * 2
12
+ * 00:00:01,540 --> 00:00:03,540
13
+ * Next line
14
+ *
15
+ * Mirrors `SRTFormatter` from the Python library.
16
+ */
17
+ export class SRTFormatter {
18
+ extension = 'srt';
19
+ mimeType = 'application/x-subrip';
20
+ render(snippets) {
21
+ const blocks = [];
22
+ for (let i = 0; i < snippets.length; i++) {
23
+ const s = snippets[i];
24
+ const startStr = toSrtTime(s.start);
25
+ const endStr = toSrtTime(computeEnd(snippets, i));
26
+ blocks.push(`${i + 1}\n${startStr} --> ${endStr}\n${s.text}`);
27
+ }
28
+ return {
29
+ content: blocks.join('\n\n') + '\n',
30
+ extension: this.extension,
31
+ mimeType: this.mimeType,
32
+ };
33
+ }
34
+ }
35
+ //# sourceMappingURL=SRTFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SRTFormatter.js","sourceRoot":"","sources":["../../../src/formatters/SRTFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,YAAY;IACd,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,sBAAsB,CAAC;IAE3C,MAAM,CAAC,QAAgC;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
2
+ /**
3
+ * Plain text formatter — just concatenates the snippet text with newlines.
4
+ */
5
+ export declare class TextFormatter implements Formatter {
6
+ readonly extension = "txt";
7
+ readonly mimeType = "text/plain";
8
+ render(snippets: readonly SnippetLike[]): FormattedOutput;
9
+ }
10
+ //# sourceMappingURL=TextFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/TextFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;GAEG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,gBAAgB;IAEjC,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAQ1D"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Plain text formatter — just concatenates the snippet text with newlines.
3
+ */
4
+ export class TextFormatter {
5
+ extension = 'txt';
6
+ mimeType = 'text/plain';
7
+ render(snippets) {
8
+ const content = snippets.map((s) => s.text).join('\n');
9
+ return {
10
+ content: snippets.length > 0 ? content + '\n' : '',
11
+ extension: this.extension,
12
+ mimeType: this.mimeType,
13
+ };
14
+ }
15
+ }
16
+ //# sourceMappingURL=TextFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextFormatter.js","sourceRoot":"","sources":["../../../src/formatters/TextFormatter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,aAAa;IACf,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,YAAY,CAAC;IAEjC,MAAM,CAAC,QAAgC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
2
+ /**
3
+ * WebVTT subtitle formatter.
4
+ *
5
+ * Output format:
6
+ *
7
+ * WEBVTT
8
+ *
9
+ * 00:00:00.000 --> 00:00:01.540
10
+ * Hello world
11
+ *
12
+ * 00:00:01.540 --> 00:00:03.540
13
+ * Next line
14
+ *
15
+ * Mirrors `WebVTTFormatter` from the Python library.
16
+ */
17
+ export declare class WebVTTFormatter implements Formatter {
18
+ readonly extension = "vtt";
19
+ readonly mimeType = "text/vtt";
20
+ render(snippets: readonly SnippetLike[]): FormattedOutput;
21
+ }
22
+ //# sourceMappingURL=WebVTTFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebVTTFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/WebVTTFormatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,cAAc;IAE/B,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAc1D"}
@@ -0,0 +1,35 @@
1
+ import { computeEnd, toVttTime } from './base.js';
2
+ /**
3
+ * WebVTT subtitle formatter.
4
+ *
5
+ * Output format:
6
+ *
7
+ * WEBVTT
8
+ *
9
+ * 00:00:00.000 --> 00:00:01.540
10
+ * Hello world
11
+ *
12
+ * 00:00:01.540 --> 00:00:03.540
13
+ * Next line
14
+ *
15
+ * Mirrors `WebVTTFormatter` from the Python library.
16
+ */
17
+ export class WebVTTFormatter {
18
+ extension = 'vtt';
19
+ mimeType = 'text/vtt';
20
+ render(snippets) {
21
+ const blocks = [];
22
+ for (let i = 0; i < snippets.length; i++) {
23
+ const s = snippets[i];
24
+ const startStr = toVttTime(s.start);
25
+ const endStr = toVttTime(computeEnd(snippets, i));
26
+ blocks.push(`${startStr} --> ${endStr}\n${s.text}`);
27
+ }
28
+ return {
29
+ content: 'WEBVTT\n\n' + blocks.join('\n\n') + '\n',
30
+ extension: this.extension,
31
+ mimeType: this.mimeType,
32
+ };
33
+ }
34
+ }
35
+ //# sourceMappingURL=WebVTTFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebVTTFormatter.js","sourceRoot":"","sources":["../../../src/formatters/WebVTTFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,eAAe;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,UAAU,CAAC;IAE/B,MAAM,CAAC,QAAgC;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { SnippetLike } from './Formatter.js';
2
+ /**
3
+ * Shared helpers for SRT/WebVTT formatters.
4
+ */
5
+ /**
6
+ * Compute the end timestamp for a snippet.
7
+ *
8
+ * End = min(next.start, this.start + this.duration) when a next snippet
9
+ * exists AND starts before this one ends (avoid overlap). Otherwise use
10
+ * start + duration. Mirrors Python library's `_TextBasedFormatter`.
11
+ */
12
+ export declare function computeEnd(snippets: readonly SnippetLike[], index: number): number;
13
+ /**
14
+ * Format seconds into `HH:MM:SS,mmm` (SRT style).
15
+ */
16
+ export declare function toSrtTime(seconds: number): string;
17
+ /**
18
+ * Format seconds into `HH:MM:SS.mmm` (WebVTT style).
19
+ */
20
+ export declare function toVttTime(seconds: number): string;
21
+ /**
22
+ * Format seconds into `[HH:MM:SS.mmm]` pretty-print style.
23
+ */
24
+ export declare function toPrettyTime(seconds: number): string;
25
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/formatters/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared helpers for SRT/WebVTT formatters.
3
+ */
4
+ /**
5
+ * Compute the end timestamp for a snippet.
6
+ *
7
+ * End = min(next.start, this.start + this.duration) when a next snippet
8
+ * exists AND starts before this one ends (avoid overlap). Otherwise use
9
+ * start + duration. Mirrors Python library's `_TextBasedFormatter`.
10
+ */
11
+ export function computeEnd(snippets, index) {
12
+ const cur = snippets[index];
13
+ const end = cur.start + cur.duration;
14
+ const next = snippets[index + 1];
15
+ if (next && next.start < end) {
16
+ return next.start;
17
+ }
18
+ return end;
19
+ }
20
+ /**
21
+ * Format seconds into `HH:MM:SS,mmm` (SRT style).
22
+ */
23
+ export function toSrtTime(seconds) {
24
+ return toDelimitedTime(seconds, ',');
25
+ }
26
+ /**
27
+ * Format seconds into `HH:MM:SS.mmm` (WebVTT style).
28
+ */
29
+ export function toVttTime(seconds) {
30
+ return toDelimitedTime(seconds, '.');
31
+ }
32
+ function toDelimitedTime(seconds, msDelim) {
33
+ const ms = Math.round(seconds * 1000);
34
+ const h = Math.floor(ms / 3_600_000);
35
+ const m = Math.floor((ms % 3_600_000) / 60_000);
36
+ const s = Math.floor((ms % 60_000) / 1000);
37
+ const milli = ms % 1000;
38
+ return (pad(h) +
39
+ ':' +
40
+ pad(m) +
41
+ ':' +
42
+ pad(s) +
43
+ msDelim +
44
+ pad(milli, 3));
45
+ }
46
+ function pad(n, len = 2) {
47
+ return n.toString().padStart(len, '0');
48
+ }
49
+ /**
50
+ * Format seconds into `[HH:MM:SS.mmm]` pretty-print style.
51
+ */
52
+ export function toPrettyTime(seconds) {
53
+ return '[' + toVttTime(seconds) + ']';
54
+ }
55
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/formatters/base.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgC,EAAE,KAAa;IACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,OAAkB;IAC1D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;IACxB,OAAO,CACL,GAAG,CAAC,CAAC,CAAC;QACN,GAAG;QACH,GAAG,CAAC,CAAC,CAAC;QACN,GAAG;QACH,GAAG,CAAC,CAAC,CAAC;QACN,OAAO;QACP,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CACd,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,MAAc,CAAC;IACrC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;AACxC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { SRTFormatter } from './SRTFormatter.js';
2
+ export { WebVTTFormatter } from './WebVTTFormatter.js';
3
+ export { PrettyPrintFormatter } from './PrettyPrintFormatter.js';
4
+ export { TextFormatter } from './TextFormatter.js';
5
+ export { JSONFormatter } from './JSONFormatter.js';
6
+ export { computeEnd, toSrtTime, toVttTime, toPrettyTime } from './base.js';
7
+ export type { Formatter, FormattedOutput, SnippetLike } from './Formatter.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { SRTFormatter } from './SRTFormatter.js';
2
+ export { WebVTTFormatter } from './WebVTTFormatter.js';
3
+ export { PrettyPrintFormatter } from './PrettyPrintFormatter.js';
4
+ export { TextFormatter } from './TextFormatter.js';
5
+ export { JSONFormatter } from './JSONFormatter.js';
6
+ export { computeEnd, toSrtTime, toVttTime, toPrettyTime } from './base.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Minimal in-memory cookie jar.
3
+ *
4
+ * Tracks `name -> value` per domain; matches cookies by request URL host.
5
+ * Sufficient for YouTube's needs (CONSENT, VISITOR_INFO1_LIVE, etc.).
6
+ */
7
+ export interface CookieEntry {
8
+ readonly name: string;
9
+ readonly value: string;
10
+ readonly domain: string;
11
+ readonly path: string;
12
+ }
13
+ export interface SetCookieOptions {
14
+ name: string;
15
+ value: string;
16
+ domain?: string;
17
+ path?: string;
18
+ }
19
+ export declare class CookieJar {
20
+ private readonly cookies;
21
+ private key;
22
+ set(opts: SetCookieOptions): void;
23
+ /**
24
+ * Get all cookies that apply to a URL.
25
+ *
26
+ * Matches by:
27
+ * - exact domain match
28
+ * - parent-domain match (cookie with leading `.`)
29
+ * - path prefix
30
+ */
31
+ getForUrl(url: string): CookieEntry[];
32
+ /** Build the value for the `Cookie:` request header. */
33
+ headerForUrl(url: string): string;
34
+ /** Inspect a `Set-Cookie` response header and store it (best-effort). */
35
+ ingestSetCookie(setCookieValue: string, requestUrl: string): void;
36
+ clear(): void;
37
+ size(): number;
38
+ }
39
+ //# sourceMappingURL=cookieJar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookieJar.d.ts","sourceRoot":"","sources":["../../../src/http/cookieJar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,GAAG;IAIX,GAAG,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAOjC;;;;;;;OAOG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE;IAiBrC,wDAAwD;IACxD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKjC,yEAAyE;IACzE,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA2BjE,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Minimal in-memory cookie jar.
3
+ *
4
+ * Tracks `name -> value` per domain; matches cookies by request URL host.
5
+ * Sufficient for YouTube's needs (CONSENT, VISITOR_INFO1_LIVE, etc.).
6
+ */
7
+ export class CookieJar {
8
+ cookies = new Map();
9
+ key(domain, name) {
10
+ return `${domain}::${name}`;
11
+ }
12
+ set(opts) {
13
+ const domain = (opts.domain ?? '.youtube.com').toLowerCase();
14
+ const path = opts.path ?? '/';
15
+ const k = this.key(domain, opts.name);
16
+ this.cookies.set(k, { name: opts.name, value: opts.value, domain, path });
17
+ }
18
+ /**
19
+ * Get all cookies that apply to a URL.
20
+ *
21
+ * Matches by:
22
+ * - exact domain match
23
+ * - parent-domain match (cookie with leading `.`)
24
+ * - path prefix
25
+ */
26
+ getForUrl(url) {
27
+ let host;
28
+ try {
29
+ host = new URL(url).hostname.toLowerCase();
30
+ }
31
+ catch {
32
+ return [];
33
+ }
34
+ const out = [];
35
+ for (const c of this.cookies.values()) {
36
+ const d = c.domain.replace(/^\.+/, '').toLowerCase();
37
+ if (host === d || host.endsWith('.' + d)) {
38
+ out.push(c);
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ /** Build the value for the `Cookie:` request header. */
44
+ headerForUrl(url) {
45
+ const cookies = this.getForUrl(url);
46
+ return cookies.map((c) => `${c.name}=${c.value}`).join('; ');
47
+ }
48
+ /** Inspect a `Set-Cookie` response header and store it (best-effort). */
49
+ ingestSetCookie(setCookieValue, requestUrl) {
50
+ // Simple parser: "name=value; Domain=.x; Path=/"
51
+ const parts = setCookieValue.split(';').map((s) => s.trim());
52
+ const first = parts[0];
53
+ if (!first)
54
+ return;
55
+ const eq = first.indexOf('=');
56
+ if (eq <= 0)
57
+ return;
58
+ const name = first.slice(0, eq).trim();
59
+ const value = first.slice(eq + 1).trim();
60
+ let domain = '';
61
+ let path = '/';
62
+ for (const part of parts.slice(1)) {
63
+ const [rawK, v] = part.split('=').map((s) => s.trim());
64
+ const lk = (rawK ?? '').toLowerCase();
65
+ if (lk === 'domain' && v)
66
+ domain = v;
67
+ else if (lk === 'path' && v)
68
+ path = v;
69
+ }
70
+ if (!domain) {
71
+ try {
72
+ domain = new URL(requestUrl).hostname;
73
+ }
74
+ catch {
75
+ return;
76
+ }
77
+ }
78
+ this.set({ name, value, domain, path });
79
+ }
80
+ clear() {
81
+ this.cookies.clear();
82
+ }
83
+ size() {
84
+ return this.cookies.size;
85
+ }
86
+ }
87
+ //# sourceMappingURL=cookieJar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookieJar.js","sourceRoot":"","sources":["../../../src/http/cookieJar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import type { CookieJar } from './cookieJar.js';
2
+ /**
3
+ * Configuration for the HTTP client.
4
+ */
5
+ export interface HttpClientConfig {
6
+ /** Default User-Agent header. */
7
+ userAgent?: string;
8
+ /** Default Accept-Language header. */
9
+ acceptLanguage?: string;
10
+ /** Default request timeout in ms. */
11
+ timeoutMs?: number;
12
+ /** Cookie jar (shared). */
13
+ cookies?: CookieJar;
14
+ /** Default headers to add to every request. */
15
+ defaultHeaders?: Record<string, string>;
16
+ /** Proxy URL (http / https / socks5). Triggers undici dynamic import. */
17
+ proxyUrl?: string;
18
+ /** Optional fetch implementation (for testing / SSR). */
19
+ fetchImpl?: typeof fetch;
20
+ /** Maximum retries on 429. */
21
+ retriesOn429?: number;
22
+ }
23
+ export interface RequestOptions {
24
+ method?: 'GET' | 'POST';
25
+ headers?: Record<string, string>;
26
+ body?: string;
27
+ /** Request timeout in ms (overrides default). */
28
+ timeoutMs?: number;
29
+ /** AbortSignal. */
30
+ signal?: AbortSignal;
31
+ }
32
+ export interface ResponseLike {
33
+ status: number;
34
+ statusText: string;
35
+ ok: boolean;
36
+ text(): Promise<string>;
37
+ json(): Promise<unknown>;
38
+ }
39
+ /**
40
+ * Thin HTTP client wrapper around global fetch.
41
+ *
42
+ * - Injects default User-Agent, Accept-Language, cookie headers
43
+ * - Honors a CookieJar (mutates it from `Set-Cookie` responses)
44
+ * - Supports proxy URLs via dynamic undici import (only loaded when needed)
45
+ * - Retries on 429
46
+ *
47
+ * Designed to be small and easily mockable for tests.
48
+ */
49
+ export declare class HttpClient {
50
+ private readonly userAgent;
51
+ private readonly acceptLanguage;
52
+ private readonly defaultTimeoutMs;
53
+ private readonly cookies;
54
+ private readonly defaultHeaders;
55
+ private readonly proxyUrl;
56
+ private readonly fetchImpl;
57
+ private readonly retriesOn429;
58
+ private proxyDispatcher;
59
+ constructor(config?: HttpClientConfig);
60
+ /**
61
+ * Build full headers for a request, merging defaults + per-request + cookies.
62
+ */
63
+ private buildHeaders;
64
+ /**
65
+ * GET request.
66
+ */
67
+ get(url: string, opts?: RequestOptions): Promise<ResponseLike>;
68
+ /**
69
+ * POST request with a JSON body.
70
+ */
71
+ postJson(url: string, body: unknown, opts?: RequestOptions): Promise<ResponseLike>;
72
+ /**
73
+ * Perform an HTTP request with retries on 429.
74
+ */
75
+ request(url: string, opts?: RequestOptions): Promise<ResponseLike>;
76
+ /**
77
+ * Wrap a raw `Response` so that `.json()` returns `unknown` and re-throwing
78
+ * makes the type usable in tests.
79
+ */
80
+ private normalizeResponse;
81
+ private extractSetCookies;
82
+ /**
83
+ * Lazily load undici and create a ProxyAgent when a proxy URL is configured.
84
+ * Returns `undefined` if no proxy is set.
85
+ */
86
+ private maybeProxyDispatcher;
87
+ }
88
+ //# sourceMappingURL=httpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/http/httpClient.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,eAAe,CAAsB;gBAEjC,MAAM,GAAE,gBAAqB;IAczC;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxE;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5F;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqD5E;;;OAGG;YACW,iBAAiB;IAkB/B,OAAO,CAAC,iBAAiB;IAczB;;;OAGG;YACW,oBAAoB;CAiBnC"}