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,191 @@
1
+ import { DEFAULT_ACCEPT_LANGUAGE, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_USER_AGENT, } from '../config/constants.js';
2
+ import { YouTubeRequestFailed } from '../errors/index.js';
3
+ import { parseProxyUrl } from '../util/proxyUrl.js';
4
+ /**
5
+ * Thin HTTP client wrapper around global fetch.
6
+ *
7
+ * - Injects default User-Agent, Accept-Language, cookie headers
8
+ * - Honors a CookieJar (mutates it from `Set-Cookie` responses)
9
+ * - Supports proxy URLs via dynamic undici import (only loaded when needed)
10
+ * - Retries on 429
11
+ *
12
+ * Designed to be small and easily mockable for tests.
13
+ */
14
+ export class HttpClient {
15
+ userAgent;
16
+ acceptLanguage;
17
+ defaultTimeoutMs;
18
+ cookies;
19
+ defaultHeaders;
20
+ proxyUrl;
21
+ fetchImpl;
22
+ retriesOn429;
23
+ proxyDispatcher;
24
+ constructor(config = {}) {
25
+ this.userAgent = config.userAgent ?? DEFAULT_USER_AGENT;
26
+ this.acceptLanguage = config.acceptLanguage ?? DEFAULT_ACCEPT_LANGUAGE;
27
+ this.defaultTimeoutMs = config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
28
+ this.cookies = config.cookies;
29
+ this.defaultHeaders = { ...config.defaultHeaders };
30
+ this.proxyUrl = config.proxyUrl;
31
+ this.fetchImpl = config.fetchImpl ?? globalThis.fetch.bind(globalThis);
32
+ this.retriesOn429 = config.retriesOn429 ?? 3;
33
+ if (!this.fetchImpl) {
34
+ throw new Error('No fetch implementation available; pass fetchImpl or run on Node 18+');
35
+ }
36
+ }
37
+ /**
38
+ * Build full headers for a request, merging defaults + per-request + cookies.
39
+ */
40
+ buildHeaders(url, perRequest) {
41
+ const headers = new Headers();
42
+ headers.set('User-Agent', this.userAgent);
43
+ headers.set('Accept-Language', this.acceptLanguage);
44
+ for (const [k, v] of Object.entries(this.defaultHeaders)) {
45
+ headers.set(k, v);
46
+ }
47
+ if (perRequest) {
48
+ for (const [k, v] of Object.entries(perRequest)) {
49
+ headers.set(k, v);
50
+ }
51
+ }
52
+ if (this.cookies) {
53
+ const cookieHeader = this.cookies.headerForUrl(url);
54
+ if (cookieHeader)
55
+ headers.set('Cookie', cookieHeader);
56
+ }
57
+ return headers;
58
+ }
59
+ /**
60
+ * GET request.
61
+ */
62
+ async get(url, opts = {}) {
63
+ return this.request(url, { ...opts, method: 'GET' });
64
+ }
65
+ /**
66
+ * POST request with a JSON body.
67
+ */
68
+ async postJson(url, body, opts = {}) {
69
+ const headers = { ...(opts.headers ?? {}), 'Content-Type': 'application/json' };
70
+ return this.request(url, {
71
+ ...opts,
72
+ method: 'POST',
73
+ headers,
74
+ body: JSON.stringify(body),
75
+ });
76
+ }
77
+ /**
78
+ * Perform an HTTP request with retries on 429.
79
+ */
80
+ async request(url, opts = {}) {
81
+ const method = opts.method ?? 'GET';
82
+ const timeoutMs = opts.timeoutMs ?? this.defaultTimeoutMs;
83
+ const headers = this.buildHeaders(url, opts.headers);
84
+ const dispatcher = await this.maybeProxyDispatcher();
85
+ let lastErr;
86
+ const attempts = Math.max(1, this.retriesOn429);
87
+ for (let attempt = 1; attempt <= attempts; attempt++) {
88
+ const controller = new AbortController();
89
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
90
+ const onUserAbort = () => controller.abort();
91
+ opts.signal?.addEventListener('abort', onUserAbort, { once: true });
92
+ try {
93
+ const fetchOpts = {
94
+ method,
95
+ headers,
96
+ signal: controller.signal,
97
+ };
98
+ if (opts.body !== undefined)
99
+ fetchOpts.body = opts.body;
100
+ if (dispatcher)
101
+ fetchOpts.dispatcher = dispatcher;
102
+ const rawResponse = await this.fetchImpl(url, fetchOpts);
103
+ const response = await this.normalizeResponse(rawResponse);
104
+ // Capture Set-Cookie headers
105
+ if (this.cookies) {
106
+ const setCookies = this.extractSetCookies(rawResponse);
107
+ for (const sc of setCookies) {
108
+ this.cookies.ingestSetCookie(sc, url);
109
+ }
110
+ }
111
+ if (response.status === 429 && attempt < attempts) {
112
+ // Exponential backoff
113
+ await new Promise((r) => setTimeout(r, 200 * 2 ** (attempt - 1)));
114
+ continue;
115
+ }
116
+ return response;
117
+ }
118
+ catch (err) {
119
+ lastErr = err;
120
+ if (attempt >= attempts) {
121
+ if (err instanceof Error && err.name === 'AbortError') {
122
+ throw new YouTubeRequestFailed(url, 0, 'Request aborted (timeout)', url);
123
+ }
124
+ throw err;
125
+ }
126
+ await new Promise((r) => setTimeout(r, 200 * 2 ** (attempt - 1)));
127
+ }
128
+ finally {
129
+ clearTimeout(timeoutId);
130
+ opts.signal?.removeEventListener('abort', onUserAbort);
131
+ }
132
+ }
133
+ throw lastErr;
134
+ }
135
+ /**
136
+ * Wrap a raw `Response` so that `.json()` returns `unknown` and re-throwing
137
+ * makes the type usable in tests.
138
+ */
139
+ async normalizeResponse(raw) {
140
+ return {
141
+ status: raw.status,
142
+ statusText: raw.statusText,
143
+ ok: raw.ok,
144
+ text: () => raw.text(),
145
+ json: async () => {
146
+ try {
147
+ return await raw.json();
148
+ }
149
+ catch (err) {
150
+ throw new Error(`Failed to parse JSON response: ${err instanceof Error ? err.message : String(err)}`);
151
+ }
152
+ },
153
+ };
154
+ }
155
+ extractSetCookies(raw) {
156
+ // Response.headers.getSetCookie is Node 18.14+ / 19.7+
157
+ const fn = raw.headers.getSetCookie;
158
+ if (typeof fn === 'function') {
159
+ try {
160
+ return fn.call(raw.headers);
161
+ }
162
+ catch {
163
+ // ignore
164
+ }
165
+ }
166
+ const single = raw.headers.get('set-cookie');
167
+ return single ? [single] : [];
168
+ }
169
+ /**
170
+ * Lazily load undici and create a ProxyAgent when a proxy URL is configured.
171
+ * Returns `undefined` if no proxy is set.
172
+ */
173
+ async maybeProxyDispatcher() {
174
+ if (!this.proxyUrl)
175
+ return undefined;
176
+ if (this.proxyDispatcher)
177
+ return this.proxyDispatcher;
178
+ const parsed = parseProxyUrl(this.proxyUrl);
179
+ if (!parsed) {
180
+ throw new Error(`Invalid proxy URL: ${this.proxyUrl}`);
181
+ }
182
+ // Dynamic import so `undici` stays optional.
183
+ const undici = (await import('undici'));
184
+ const agentUrl = this.proxyUrl.startsWith('http')
185
+ ? this.proxyUrl
186
+ : `${parsed.protocol}://${parsed.host}${parsed.port ? `:${parsed.port}` : ''}`;
187
+ this.proxyDispatcher = new undici.ProxyAgent(agentUrl);
188
+ return this.proxyDispatcher;
189
+ }
190
+ }
191
+ //# sourceMappingURL=httpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../../src/http/httpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * youtube-transcript-nodejs — public API entry point.
3
+ */
4
+ export { YouTubeTranscriptApi } from './api/YouTubeTranscriptApi.js';
5
+ export type { YouTubeTranscriptApiConfig } from './api/YouTubeTranscriptApi.js';
6
+ export { FetchedTranscript } from './models/FetchedTranscript.js';
7
+ export { FetchedTranscriptSnippet } from './models/FetchedTranscriptSnippet.js';
8
+ export { Transcript } from './models/Transcript.js';
9
+ export { TranscriptList } from './models/TranscriptList.js';
10
+ export type { TranslationLanguage } from './models/TranslationLanguage.js';
11
+ export type { TranscriptMetadata } from './models/TranscriptMetadata.js';
12
+ export type { FormattedTranscript } from './models/FormattedTranscript.js';
13
+ export * from './errors/index.js';
14
+ export { SRTFormatter, WebVTTFormatter, TextFormatter, JSONFormatter, PrettyPrintFormatter, computeEnd, toSrtTime, toVttTime, toPrettyTime, } from './formatters/index.js';
15
+ export type { Formatter, FormattedOutput, SnippetLike } from './formatters/index.js';
16
+ export type { PoTokenProvider, TokenResult } from './potoken/types.js';
17
+ export { NoopPoTokenProvider, HttpPoTokenProvider, AutoPoTokenProvider, BaseScriptCache, isTokenFresh, } from './potoken/index.js';
18
+ export type { HttpPoTokenProviderOptions, AutoPoTokenProviderOptions, BaseScriptCacheOptions, } from './potoken/index.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,YAAY,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAG3E,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGrF,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * youtube-transcript-nodejs — public API entry point.
3
+ */
4
+ export { YouTubeTranscriptApi } from './api/YouTubeTranscriptApi.js';
5
+ export { FetchedTranscript } from './models/FetchedTranscript.js';
6
+ export { FetchedTranscriptSnippet } from './models/FetchedTranscriptSnippet.js';
7
+ export { Transcript } from './models/Transcript.js';
8
+ export { TranscriptList } from './models/TranscriptList.js';
9
+ // Re-export error classes for `instanceof` checks in user code.
10
+ export * from './errors/index.js';
11
+ // Re-export formatters so users can compose their own.
12
+ export { SRTFormatter, WebVTTFormatter, TextFormatter, JSONFormatter, PrettyPrintFormatter, computeEnd, toSrtTime, toVttTime, toPrettyTime, } from './formatters/index.js';
13
+ export { NoopPoTokenProvider, HttpPoTokenProvider, AutoPoTokenProvider, BaseScriptCache, isTokenFresh, } from './potoken/index.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM5D,gEAAgE;AAChE,cAAc,mBAAmB,CAAC;AAElC,uDAAuD;AACvD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,GACb,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type Formatter } from '../formatters/index.js';
2
+ import { FetchedTranscriptSnippet } from './FetchedTranscriptSnippet.js';
3
+ import type { FormattedTranscript } from './FormattedTranscript.js';
4
+ import type { TranscriptMetadata } from './TranscriptMetadata.js';
5
+ /**
6
+ * Concrete transcript with all its cues loaded.
7
+ *
8
+ * Iterable and indexable. Provides formatting helpers that delegate
9
+ * to the formatter classes in `../formatters`.
10
+ */
11
+ export declare class FetchedTranscript implements Iterable<FetchedTranscriptSnippet> {
12
+ readonly snippets: readonly FetchedTranscriptSnippet[];
13
+ readonly videoId: string;
14
+ readonly language: string;
15
+ readonly languageCode: string;
16
+ readonly isGenerated: boolean;
17
+ readonly translationLanguages: readonly {
18
+ languageCode: string;
19
+ languageName: string;
20
+ }[];
21
+ constructor(snippets: ReadonlyArray<{
22
+ text: string;
23
+ start: number;
24
+ duration: number;
25
+ }>, meta: TranscriptMetadata);
26
+ [Symbol.iterator](): IterableIterator<FetchedTranscriptSnippet>;
27
+ get length(): number;
28
+ /** Format using an arbitrary formatter. */
29
+ format(formatter: Formatter): FormattedTranscript;
30
+ /** Raw array form (matches Python `to_raw_data()`). */
31
+ toRaw(): FormattedTranscript;
32
+ /** Plain text — one snippet per line. */
33
+ toText(): FormattedTranscript;
34
+ /** SRT subtitle format. */
35
+ toSRT(): FormattedTranscript;
36
+ /** WebVTT subtitle format. */
37
+ toVTT(): FormattedTranscript;
38
+ /** Pretty-print human-readable. */
39
+ toPretty(): FormattedTranscript;
40
+ /** Serialize the entire transcript as a plain object. */
41
+ toJSON(): FormattedTranscript;
42
+ forEach(fn: (s: FetchedTranscriptSnippet, i: number) => void): void;
43
+ map<T>(fn: (s: FetchedTranscriptSnippet, i: number) => T): readonly T[];
44
+ filter(fn: (s: FetchedTranscriptSnippet, i: number) => boolean): readonly FetchedTranscriptSnippet[];
45
+ find(fn: (s: FetchedTranscriptSnippet, i: number) => boolean): FetchedTranscriptSnippet | undefined;
46
+ /** Pick a subset of snippets by 1-based line range (inclusive). */
47
+ slice(start: number, end?: number): readonly FetchedTranscriptSnippet[];
48
+ }
49
+ //# sourceMappingURL=FetchedTranscript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchedTranscript.d.ts","sourceRoot":"","sources":["../../../src/models/FetchedTranscript.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,QAAQ,CAAC,wBAAwB,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,SAAS;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;gBAGvF,QAAQ,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAC1E,IAAI,EAAE,kBAAkB;IAY1B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,wBAAwB,CAAC;IAI/D,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,2CAA2C;IAC3C,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,mBAAmB;IAKjD,uDAAuD;IACvD,KAAK,IAAI,mBAAmB;IAI5B,yCAAyC;IACzC,MAAM,IAAI,mBAAmB;IAI7B,2BAA2B;IAC3B,KAAK,IAAI,mBAAmB;IAI5B,8BAA8B;IAC9B,KAAK,IAAI,mBAAmB;IAI5B,mCAAmC;IACnC,QAAQ,IAAI,mBAAmB;IAI/B,yDAAyD;IACzD,MAAM,IAAI,mBAAmB;IAI7B,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAInE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC,EAAE;IAIvE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,wBAAwB,EAAE;IAIpG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,wBAAwB,GAAG,SAAS;IAInG,mEAAmE;IACnE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,wBAAwB,EAAE;CAGxE"}
@@ -0,0 +1,76 @@
1
+ import { JSONFormatter, PrettyPrintFormatter, SRTFormatter, TextFormatter, WebVTTFormatter, } from '../formatters/index.js';
2
+ import { FetchedTranscriptSnippet } from './FetchedTranscriptSnippet.js';
3
+ /**
4
+ * Concrete transcript with all its cues loaded.
5
+ *
6
+ * Iterable and indexable. Provides formatting helpers that delegate
7
+ * to the formatter classes in `../formatters`.
8
+ */
9
+ export class FetchedTranscript {
10
+ snippets;
11
+ videoId;
12
+ language;
13
+ languageCode;
14
+ isGenerated;
15
+ translationLanguages;
16
+ constructor(snippets, meta) {
17
+ this.snippets = Object.freeze(snippets.map((s) => new FetchedTranscriptSnippet(s.text, s.start, s.duration)));
18
+ this.videoId = meta.videoId;
19
+ this.language = meta.languageName;
20
+ this.languageCode = meta.languageCode;
21
+ this.isGenerated = meta.isGenerated;
22
+ this.translationLanguages = meta.translationLanguages;
23
+ }
24
+ [Symbol.iterator]() {
25
+ return this.snippets[Symbol.iterator]();
26
+ }
27
+ get length() {
28
+ return this.snippets.length;
29
+ }
30
+ /** Format using an arbitrary formatter. */
31
+ format(formatter) {
32
+ const out = formatter.render(this.snippets);
33
+ return { content: out.content, extension: out.extension, mimeType: out.mimeType };
34
+ }
35
+ /** Raw array form (matches Python `to_raw_data()`). */
36
+ toRaw() {
37
+ return this.format(new JSONFormatter());
38
+ }
39
+ /** Plain text — one snippet per line. */
40
+ toText() {
41
+ return this.format(new TextFormatter());
42
+ }
43
+ /** SRT subtitle format. */
44
+ toSRT() {
45
+ return this.format(new SRTFormatter());
46
+ }
47
+ /** WebVTT subtitle format. */
48
+ toVTT() {
49
+ return this.format(new WebVTTFormatter());
50
+ }
51
+ /** Pretty-print human-readable. */
52
+ toPretty() {
53
+ return this.format(new PrettyPrintFormatter());
54
+ }
55
+ /** Serialize the entire transcript as a plain object. */
56
+ toJSON() {
57
+ return this.format(new JSONFormatter());
58
+ }
59
+ forEach(fn) {
60
+ this.snippets.forEach((s, i) => fn(s, i));
61
+ }
62
+ map(fn) {
63
+ return this.snippets.map(fn);
64
+ }
65
+ filter(fn) {
66
+ return this.snippets.filter(fn);
67
+ }
68
+ find(fn) {
69
+ return this.snippets.find(fn);
70
+ }
71
+ /** Pick a subset of snippets by 1-based line range (inclusive). */
72
+ slice(start, end) {
73
+ return this.snippets.slice(start, end);
74
+ }
75
+ }
76
+ //# sourceMappingURL=FetchedTranscript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchedTranscript.js","sourceRoot":"","sources":["../../../src/models/FetchedTranscript.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,eAAe,GAGhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIzE;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACnB,QAAQ,CAAsC;IAC9C,OAAO,CAAS;IAChB,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,WAAW,CAAU;IACrB,oBAAoB,CAA4D;IAEzF,YACE,QAA0E,EAC1E,IAAwB;QAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC3B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC/E,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;IACxD,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,2CAA2C;IAC3C,MAAM,CAAC,SAAoB;QACzB,MAAM,GAAG,GAAoB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACpF,CAAC;IAED,uDAAuD;IACvD,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,yCAAyC;IACzC,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,2BAA2B;IAC3B,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,yDAAyD;IACzD,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAoD;QAC1D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAI,EAAiD;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,EAAuD;QAC5D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,EAAuD;QAC1D,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,KAAa,EAAE,GAAY;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * One snippet in a fetched transcript.
3
+ */
4
+ export declare class FetchedTranscriptSnippet {
5
+ readonly text: string;
6
+ readonly start: number;
7
+ readonly duration: number;
8
+ constructor(text: string, start: number, duration: number);
9
+ /**
10
+ * End timestamp = start + duration (or earlier if the next snippet starts first).
11
+ * Lazily computed and cached.
12
+ */
13
+ endFor(_index: number, nextStart: number | undefined): number;
14
+ }
15
+ //# sourceMappingURL=FetchedTranscriptSnippet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchedTranscriptSnippet.d.ts","sourceRoot":"","sources":["../../../src/models/FetchedTranscriptSnippet.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,wBAAwB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMzD;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;CAO9D"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * One snippet in a fetched transcript.
3
+ */
4
+ export class FetchedTranscriptSnippet {
5
+ text;
6
+ start;
7
+ duration;
8
+ constructor(text, start, duration) {
9
+ this.text = text;
10
+ this.start = start;
11
+ this.duration = duration;
12
+ }
13
+ /**
14
+ * End timestamp = start + duration (or earlier if the next snippet starts first).
15
+ * Lazily computed and cached.
16
+ */
17
+ endFor(_index, nextStart) {
18
+ const end = this.start + this.duration;
19
+ if (nextStart !== undefined && nextStart < end) {
20
+ return nextStart;
21
+ }
22
+ return end;
23
+ }
24
+ }
25
+ //# sourceMappingURL=FetchedTranscriptSnippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchedTranscriptSnippet.js","sourceRoot":"","sources":["../../../src/models/FetchedTranscriptSnippet.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC1B,IAAI,CAAS;IACb,KAAK,CAAS;IACd,QAAQ,CAAS;IAE1B,YAAY,IAAY,EAAE,KAAa,EAAE,QAAgB;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAc,EAAE,SAA6B;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Result of formatting a transcript.
3
+ */
4
+ export interface FormattedTranscript {
5
+ readonly content: string;
6
+ readonly extension: string;
7
+ readonly mimeType: string;
8
+ }
9
+ //# sourceMappingURL=FormattedTranscript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormattedTranscript.d.ts","sourceRoot":"","sources":["../../../src/models/FormattedTranscript.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FormattedTranscript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormattedTranscript.js","sourceRoot":"","sources":["../../../src/models/FormattedTranscript.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import type { InnerTubeClient } from '../api/InnerTubeClient.js';
2
+ import type { TranslationLanguage } from './TranslationLanguage.js';
3
+ import type { TranscriptMetadata } from './TranscriptMetadata.js';
4
+ import { FetchedTranscript } from './FetchedTranscript.js';
5
+ /**
6
+ * A handle to a single caption track.
7
+ *
8
+ * Created via `TranscriptList.findTranscript` (or `.findGeneratedTranscript`,
9
+ * `.findManuallyCreatedTranscript`). To obtain the actual cues, call
10
+ * `.fetch()` or chain `.translate(targetLang).fetch()`.
11
+ */
12
+ export declare class Transcript implements TranscriptMetadata {
13
+ readonly videoId: string;
14
+ readonly languageName: string;
15
+ readonly languageCode: string;
16
+ readonly isGenerated: boolean;
17
+ readonly translationLanguages: readonly TranslationLanguage[];
18
+ private readonly _baseUrl;
19
+ private readonly _httpClient;
20
+ private readonly _translationLanguageCodes;
21
+ constructor(httpClient: InnerTubeClient, videoId: string, baseUrl: string, languageName: string, languageCode: string, isGenerated: boolean, translationLanguages: readonly TranslationLanguage[]);
22
+ get isTranslatable(): boolean;
23
+ /**
24
+ * Fetch this transcript's cues.
25
+ */
26
+ fetch(preserveFormatting?: boolean): Promise<FetchedTranscript>;
27
+ /**
28
+ * Translate this transcript to `targetLang`.
29
+ *
30
+ * Returns a new (un-fetched) Transcript whose `.fetch()` returns the
31
+ * translated cues. The translated track is not itself translatable.
32
+ */
33
+ translate(targetLang: string): Transcript;
34
+ toMetadata(): TranscriptMetadata;
35
+ }
36
+ //# sourceMappingURL=Transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transcript.d.ts","sourceRoot":"","sources":["../../../src/models/Transcript.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;GAMG;AACH,qBAAa,UAAW,YAAW,kBAAkB;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAE9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAsB;gBAG9D,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,OAAO,EACpB,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;IAYtD,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACG,KAAK,CAAC,kBAAkB,GAAE,OAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAS5E;;;;;OAKG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAsBzC,UAAU,IAAI,kBAAkB;CAUjC"}
@@ -0,0 +1,71 @@
1
+ import { NotTranslatable, TranslationLanguageNotAvailable, } from '../errors/index.js';
2
+ import { parseTranscriptXml } from '../parsers/xmlTranscriptParser.js';
3
+ import { FetchedTranscript } from './FetchedTranscript.js';
4
+ /**
5
+ * A handle to a single caption track.
6
+ *
7
+ * Created via `TranscriptList.findTranscript` (or `.findGeneratedTranscript`,
8
+ * `.findManuallyCreatedTranscript`). To obtain the actual cues, call
9
+ * `.fetch()` or chain `.translate(targetLang).fetch()`.
10
+ */
11
+ export class Transcript {
12
+ videoId;
13
+ languageName;
14
+ languageCode;
15
+ isGenerated;
16
+ translationLanguages;
17
+ _baseUrl;
18
+ _httpClient;
19
+ _translationLanguageCodes;
20
+ constructor(httpClient, videoId, baseUrl, languageName, languageCode, isGenerated, translationLanguages) {
21
+ this._httpClient = httpClient;
22
+ this.videoId = videoId;
23
+ this._baseUrl = baseUrl;
24
+ this.languageName = languageName;
25
+ this.languageCode = languageCode;
26
+ this.isGenerated = isGenerated;
27
+ this.translationLanguages = translationLanguages;
28
+ this._translationLanguageCodes = new Set(translationLanguages.map((l) => l.languageCode));
29
+ }
30
+ get isTranslatable() {
31
+ return this.translationLanguages.length > 0;
32
+ }
33
+ /**
34
+ * Fetch this transcript's cues.
35
+ */
36
+ async fetch(preserveFormatting = false) {
37
+ const xml = await this._httpClient.fetchTranscriptXml(this._baseUrl, this.videoId);
38
+ const cues = parseTranscriptXml(xml, { preserveFormatting });
39
+ return new FetchedTranscript(cues.map((c) => ({ text: c.text, start: c.start, duration: c.duration })), this.toMetadata());
40
+ }
41
+ /**
42
+ * Translate this transcript to `targetLang`.
43
+ *
44
+ * Returns a new (un-fetched) Transcript whose `.fetch()` returns the
45
+ * translated cues. The translated track is not itself translatable.
46
+ */
47
+ translate(targetLang) {
48
+ if (!this.isTranslatable) {
49
+ throw new NotTranslatable(this.videoId);
50
+ }
51
+ if (!this._translationLanguageCodes.has(targetLang)) {
52
+ throw new TranslationLanguageNotAvailable(this.videoId, targetLang, [
53
+ ...this._translationLanguageCodes,
54
+ ]);
55
+ }
56
+ const newUrl = this._httpClient.buildTranslateUrl(this._baseUrl, targetLang);
57
+ const name = this.translationLanguages.find((l) => l.languageCode === targetLang);
58
+ return new Transcript(this._httpClient, this.videoId, newUrl, name?.languageName ?? targetLang, targetLang, true, []);
59
+ }
60
+ toMetadata() {
61
+ return {
62
+ videoId: this.videoId,
63
+ languageName: this.languageName,
64
+ languageCode: this.languageCode,
65
+ isGenerated: this.isGenerated,
66
+ isTranslatable: this.isTranslatable,
67
+ translationLanguages: this.translationLanguages,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=Transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transcript.js","sourceRoot":"","sources":["../../../src/models/Transcript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { InnerTubeClient } from '../api/InnerTubeClient.js';
2
+ import { Transcript } from './Transcript.js';
3
+ import type { TranslationLanguage } from './TranslationLanguage.js';
4
+ /**
5
+ * Collection of all available transcript tracks for a video.
6
+ *
7
+ * Created via `YouTubeTranscriptApi.list(videoId)`. Use the `find*` helpers
8
+ * to pick a track, then call `.fetch()` on the result.
9
+ */
10
+ export declare class TranscriptList {
11
+ readonly videoId: string;
12
+ readonly manuallyCreatedTranscripts: readonly Transcript[];
13
+ readonly generatedTranscripts: readonly Transcript[];
14
+ readonly translationLanguages: readonly TranslationLanguage[];
15
+ constructor(videoId: string, manuallyCreatedTranscripts: readonly Transcript[], generatedTranscripts: readonly Transcript[], translationLanguages: readonly TranslationLanguage[]);
16
+ /**
17
+ * Find a transcript matching one of the given language codes.
18
+ * Manual tracks are preferred over generated ones.
19
+ */
20
+ findTranscript(languageCodes: readonly string[]): Transcript;
21
+ /**
22
+ * Find only an ASR-generated transcript.
23
+ */
24
+ findGeneratedTranscript(languageCodes: readonly string[]): Transcript;
25
+ /**
26
+ * Find only a manually uploaded transcript.
27
+ */
28
+ findManuallyCreatedTranscript(languageCodes: readonly string[]): Transcript;
29
+ private findInOrder;
30
+ /**
31
+ * Iterate over all transcripts (manual first, then generated).
32
+ */
33
+ [Symbol.iterator](): IterableIterator<Transcript>;
34
+ }
35
+ /**
36
+ * Factory helper to build a TranscriptList from raw caption data.
37
+ *
38
+ * `httpClient` is propagated to each Transcript so they can fetch their
39
+ * own cues lazily.
40
+ */
41
+ export declare function buildTranscriptList(httpClient: InnerTubeClient, videoId: string, captionTracks: ReadonlyArray<{
42
+ baseUrl: string;
43
+ languageCode: string;
44
+ name: string;
45
+ kind: '' | 'asr';
46
+ isTranslatable: boolean;
47
+ }>, translationLanguages: readonly TranslationLanguage[]): TranscriptList;
48
+ //# sourceMappingURL=TranscriptList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptList.d.ts","sourceRoot":"","sources":["../../../src/models/TranscriptList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,0BAA0B,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3D,QAAQ,CAAC,oBAAoB,EAAE,SAAS,UAAU,EAAE,CAAC;IACrD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,mBAAmB,EAAE,CAAC;gBAG5D,OAAO,EAAE,MAAM,EACf,0BAA0B,EAAE,SAAS,UAAU,EAAE,EACjD,oBAAoB,EAAE,SAAS,UAAU,EAAE,EAC3C,oBAAoB,EAAE,SAAS,mBAAmB,EAAE;IAQtD;;;OAGG;IACH,cAAc,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU;IAI5D;;OAEG;IACH,uBAAuB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU;IAIrE;;OAEG;IACH,6BAA6B,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU;IAI3E,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACF,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC;CAInD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC,EACF,oBAAoB,EAAE,SAAS,mBAAmB,EAAE,GACnD,cAAc,CAiBhB"}