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,88 @@
1
+ import type { FetchedTranscript, TranscriptList } from '../models/index.js';
2
+ import type { PoTokenProvider } from '../potoken/types.js';
3
+ import { mapHttpStatusToError } from './InnerTubeClient.js';
4
+ /**
5
+ * Public-facing configuration for {@link YouTubeTranscriptApi}.
6
+ */
7
+ export interface YouTubeTranscriptApiConfig {
8
+ /** HTTP proxy URL (http / https / socks5). Triggers undici dynamic import. */
9
+ proxyConfig?: {
10
+ url: string;
11
+ };
12
+ /** Extra cookies to set (e.g. CONSENT for EU). */
13
+ cookies?: Array<{
14
+ name: string;
15
+ value: string;
16
+ domain?: string;
17
+ path?: string;
18
+ }>;
19
+ /** Default headers added to every request. */
20
+ headers?: Record<string, string>;
21
+ /** PoToken provider. Defaults to {@link NoopPoTokenProvider}. */
22
+ poTokenProvider?: PoTokenProvider;
23
+ /** When true, ANDROID failures trigger a WEB + PoToken retry. */
24
+ poTokenFallback?: boolean;
25
+ /** Custom User-Agent. */
26
+ userAgent?: string;
27
+ /** Custom fetch implementation (mainly for tests). */
28
+ fetchImpl?: typeof fetch;
29
+ }
30
+ /**
31
+ * Public façade — the single entry-point most users will need.
32
+ *
33
+ * Mirrors `YouTubeTranscriptApi` from the Python library:
34
+ *
35
+ * const api = new YouTubeTranscriptApi();
36
+ * const t = await api.fetch(videoId);
37
+ * const list = await api.list(videoId);
38
+ * const translated = await api.translate(videoId, 'fr');
39
+ * const langs = await api.translationLanguages(videoId, 'en');
40
+ */
41
+ export declare class YouTubeTranscriptApi {
42
+ private readonly http;
43
+ private readonly innerTube;
44
+ private readonly jar;
45
+ private readonly poTokenProvider;
46
+ private readonly poTokenFallback;
47
+ private lastStrategy;
48
+ constructor(config?: YouTubeTranscriptApiConfig);
49
+ /**
50
+ * Replace the PoToken provider after construction.
51
+ */
52
+ setPoTokenProvider(provider: PoTokenProvider): void;
53
+ /**
54
+ * Fetch a transcript with language fallback.
55
+ *
56
+ * @param videoId YouTube video id (or full URL).
57
+ * @param opts `languages`: ordered language codes to try.
58
+ * `preserveFormatting`: keep `<i>`/`<b>` tags.
59
+ */
60
+ fetch(videoId: string, opts?: {
61
+ languages?: readonly string[];
62
+ preserveFormatting?: boolean;
63
+ }): Promise<FetchedTranscript>;
64
+ /**
65
+ * List all available transcript tracks for a video.
66
+ */
67
+ list(videoId: string): Promise<TranscriptList>;
68
+ /**
69
+ * Translate an available track into another language and return its cues.
70
+ */
71
+ translate(videoId: string, targetLang: string, opts?: {
72
+ sourceLanguage?: string;
73
+ preserveFormatting?: boolean;
74
+ }): Promise<FetchedTranscript>;
75
+ /**
76
+ * Returns the list of languages this video's `sourceLanguage` track can be
77
+ * translated into.
78
+ */
79
+ translationLanguages(videoId: string, sourceLanguage: string): Promise<readonly {
80
+ languageCode: string;
81
+ languageName: string;
82
+ }[]>;
83
+ private resolveApiKey;
84
+ private runStrategy;
85
+ private tryPlayer;
86
+ }
87
+ export { mapHttpStatusToError };
88
+ //# sourceMappingURL=YouTubeTranscriptApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeTranscriptApi.d.ts","sourceRoot":"","sources":["../../../src/api/YouTubeTranscriptApi.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAmB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,8EAA8E;IAC9E,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,kDAAkD;IAClD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iEAAiE;IACjE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,YAAY,CAA8D;gBAEtE,MAAM,GAAE,0BAA+B;IAmBnD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAKnD;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAO,GACzE,OAAO,CAAC,iBAAiB,CAAC;IAM7B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuBpD;;OAEG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAO,GACnE,OAAO,CAAC,iBAAiB,CAAC;IAO7B;;;OAGG;IACG,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,SAAS;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;YAMvD,aAAa;YAgBb,WAAW;YAgCX,SAAS;CAIxB;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,157 @@
1
+ import { ANDROID_INNERTUBE_CONTEXT, WEB_INNERTUBE_CONTEXT, } from '../config/innerTubeContext.js';
2
+ import { BotDetected, FailedToCreateConsentCookie, IpBlocked, TranscriptsDisabled, VideoUnavailable, VideoUnplayable, YouTubeRequestFailed, } from '../errors/index.js';
3
+ import { CookieJar } from '../http/cookieJar.js';
4
+ import { HttpClient } from '../http/httpClient.js';
5
+ import { buildTranscriptList } from '../models/index.js';
6
+ import { NoopPoTokenProvider } from '../potoken/NoopPoTokenProvider.js';
7
+ import { InnerTubeClient, mapHttpStatusToError } from './InnerTubeClient.js';
8
+ /**
9
+ * Public façade — the single entry-point most users will need.
10
+ *
11
+ * Mirrors `YouTubeTranscriptApi` from the Python library:
12
+ *
13
+ * const api = new YouTubeTranscriptApi();
14
+ * const t = await api.fetch(videoId);
15
+ * const list = await api.list(videoId);
16
+ * const translated = await api.translate(videoId, 'fr');
17
+ * const langs = await api.translationLanguages(videoId, 'en');
18
+ */
19
+ export class YouTubeTranscriptApi {
20
+ http;
21
+ innerTube;
22
+ jar;
23
+ poTokenProvider;
24
+ poTokenFallback;
25
+ lastStrategy = null;
26
+ constructor(config = {}) {
27
+ this.jar = new CookieJar();
28
+ if (config.cookies) {
29
+ for (const c of config.cookies) {
30
+ this.jar.set({ name: c.name, value: c.value, domain: c.domain, path: c.path });
31
+ }
32
+ }
33
+ this.http = new HttpClient({
34
+ userAgent: config.userAgent,
35
+ cookies: this.jar,
36
+ defaultHeaders: config.headers,
37
+ proxyUrl: config.proxyConfig?.url,
38
+ fetchImpl: config.fetchImpl,
39
+ });
40
+ this.innerTube = new InnerTubeClient({ http: this.http });
41
+ this.poTokenProvider = config.poTokenProvider ?? new NoopPoTokenProvider();
42
+ this.poTokenFallback = config.poTokenFallback === true;
43
+ }
44
+ /**
45
+ * Replace the PoToken provider after construction.
46
+ */
47
+ setPoTokenProvider(provider) {
48
+ this.lastStrategy = null; // force re-evaluation
49
+ this.poTokenProvider = provider;
50
+ }
51
+ /**
52
+ * Fetch a transcript with language fallback.
53
+ *
54
+ * @param videoId YouTube video id (or full URL).
55
+ * @param opts `languages`: ordered language codes to try.
56
+ * `preserveFormatting`: keep `<i>`/`<b>` tags.
57
+ */
58
+ async fetch(videoId, opts = {}) {
59
+ const list = await this.list(videoId);
60
+ const transcript = list.findTranscript(opts.languages ?? ['en']);
61
+ return transcript.fetch(opts.preserveFormatting ?? false);
62
+ }
63
+ /**
64
+ * List all available transcript tracks for a video.
65
+ */
66
+ async list(videoId) {
67
+ const apiKey = await this.resolveApiKey(videoId);
68
+ const strategy = await this.runStrategy(videoId, apiKey);
69
+ const playerJson = await this.innerTube.fetchPlayer(videoId, apiKey, strategy.context);
70
+ const { captionTracks, translationLanguages } = this.innerTube.extractCaptionTracks(playerJson, videoId);
71
+ this.lastStrategy = { context: strategy.context, apiKey };
72
+ return buildTranscriptList(this.innerTube, videoId, captionTracks.map((t) => ({
73
+ baseUrl: t.baseUrl,
74
+ languageCode: t.languageCode,
75
+ name: t.name,
76
+ kind: t.kind,
77
+ isTranslatable: t.isTranslatable,
78
+ })), translationLanguages);
79
+ }
80
+ /**
81
+ * Translate an available track into another language and return its cues.
82
+ */
83
+ async translate(videoId, targetLang, opts = {}) {
84
+ const list = await this.list(videoId);
85
+ const src = list.findTranscript(opts.sourceLanguage ? [opts.sourceLanguage] : ['en']);
86
+ const translated = src.translate(targetLang);
87
+ return translated.fetch(opts.preserveFormatting ?? false);
88
+ }
89
+ /**
90
+ * Returns the list of languages this video's `sourceLanguage` track can be
91
+ * translated into.
92
+ */
93
+ async translationLanguages(videoId, sourceLanguage) {
94
+ const list = await this.list(videoId);
95
+ const src = list.findTranscript([sourceLanguage]);
96
+ return src.translationLanguages;
97
+ }
98
+ async resolveApiKey(videoId) {
99
+ if (this.lastStrategy?.apiKey)
100
+ return this.lastStrategy.apiKey;
101
+ let html;
102
+ try {
103
+ html = await this.innerTube.fetchWatchHtml(videoId);
104
+ }
105
+ catch (err) {
106
+ if (err instanceof FailedToCreateConsentCookie)
107
+ throw err;
108
+ if (err instanceof IpBlocked)
109
+ throw err;
110
+ if (err instanceof VideoUnavailable)
111
+ throw err;
112
+ if (err instanceof VideoUnplayable)
113
+ throw err;
114
+ if (err instanceof TranscriptsDisabled)
115
+ throw err;
116
+ throw err;
117
+ }
118
+ return this.innerTube.extractApiKey(html, videoId);
119
+ }
120
+ async runStrategy(videoId, apiKey) {
121
+ // Layer 1: ANDROID
122
+ try {
123
+ await this.tryPlayer(videoId, apiKey, ANDROID_INNERTUBE_CONTEXT);
124
+ return { context: ANDROID_INNERTUBE_CONTEXT };
125
+ }
126
+ catch (err) {
127
+ const fallbackEligible = err instanceof BotDetected ||
128
+ err instanceof IpBlocked ||
129
+ err instanceof TranscriptsDisabled ||
130
+ err instanceof VideoUnplayable;
131
+ if (!fallbackEligible || !this.poTokenFallback || this.poTokenProvider instanceof NoopPoTokenProvider) {
132
+ throw err;
133
+ }
134
+ // Layer 2: WEB + PoToken
135
+ try {
136
+ await this.poTokenProvider.generateForVideo(videoId);
137
+ }
138
+ catch {
139
+ throw err; // Surface the original Layer 1 error.
140
+ }
141
+ try {
142
+ await this.tryPlayer(videoId, apiKey, WEB_INNERTUBE_CONTEXT);
143
+ return { context: WEB_INNERTUBE_CONTEXT };
144
+ }
145
+ catch (err2) {
146
+ throw err2 instanceof Error ? err2 : new YouTubeRequestFailed(videoId, 0, String(err2), '');
147
+ }
148
+ }
149
+ }
150
+ async tryPlayer(videoId, apiKey, ctx) {
151
+ const playerJson = await this.innerTube.fetchPlayer(videoId, apiKey, ctx);
152
+ this.innerTube.extractCaptionTracks(playerJson, videoId);
153
+ }
154
+ }
155
+ // Re-export for backward compat and convenience
156
+ export { mapHttpStatusToError };
157
+ //# sourceMappingURL=YouTubeTranscriptApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeTranscriptApi.js","sourceRoot":"","sources":["../../../src/api/YouTubeTranscriptApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type InnerTubeContext } from '../config/innerTubeContext.js';
2
+ import type { PoTokenProvider } from '../potoken/types.js';
3
+ import type { InnerTubeClient } from './InnerTubeClient.js';
4
+ /**
5
+ * Strategy result indicating which client succeeded.
6
+ */
7
+ export interface FetchStrategyResult {
8
+ readonly context: InnerTubeContext;
9
+ readonly poToken: string | undefined;
10
+ readonly visitorData: string | undefined;
11
+ }
12
+ /**
13
+ * Strategy: try ANDROID InnerTube first; on `BotDetected` / `IpBlocked`,
14
+ * optionally fall back to WEB + PoToken if the user has supplied a provider.
15
+ */
16
+ export declare function runFetchStrategy(client: InnerTubeClient, videoId: string, apiKey: string, opts?: {
17
+ poTokenProvider?: PoTokenProvider;
18
+ enableFallback?: boolean;
19
+ }): Promise<FetchStrategyResult>;
20
+ //# sourceMappingURL=fetchStrategies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchStrategies.d.ts","sourceRoot":"","sources":["../../../src/api/fetchStrategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAExH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IACJ,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,OAAO,CAAC,mBAAmB,CAAC,CAgC9B"}
@@ -0,0 +1,48 @@
1
+ import { ANDROID_INNERTUBE_CONTEXT, WEB_INNERTUBE_CONTEXT } from '../config/innerTubeContext.js';
2
+ import { BotDetected, IpBlocked } from '../errors/index.js';
3
+ /**
4
+ * Strategy: try ANDROID InnerTube first; on `BotDetected` / `IpBlocked`,
5
+ * optionally fall back to WEB + PoToken if the user has supplied a provider.
6
+ */
7
+ export async function runFetchStrategy(client, videoId, apiKey, opts = {}) {
8
+ // Layer 1: ANDROID
9
+ const androidResult = await tryClient(client, videoId, apiKey, ANDROID_INNERTUBE_CONTEXT);
10
+ if (androidResult.ok) {
11
+ return { context: ANDROID_INNERTUBE_CONTEXT, poToken: undefined, visitorData: undefined };
12
+ }
13
+ // Layer 2: WEB + PoToken (opt-in)
14
+ if (opts.enableFallback === true &&
15
+ opts.poTokenProvider !== undefined &&
16
+ isFallbackTrigger(androidResult.error)) {
17
+ const tokenResult = await opts.poTokenProvider.generateForVideo(videoId);
18
+ const webResult = await tryClient(client, videoId, apiKey, WEB_INNERTUBE_CONTEXT, { poToken: tokenResult.poToken, visitorData: tokenResult.visitorData });
19
+ if (webResult.ok) {
20
+ return {
21
+ context: WEB_INNERTUBE_CONTEXT,
22
+ poToken: tokenResult.poToken,
23
+ visitorData: tokenResult.visitorData,
24
+ };
25
+ }
26
+ throw webResult.error;
27
+ }
28
+ throw androidResult.error;
29
+ }
30
+ async function tryClient(client, videoId, apiKey, ctx,
31
+ // Reserved for future use (e.g. attaching PoToken body field in WEB path).
32
+ _token) {
33
+ try {
34
+ const data = await client.fetchPlayer(videoId, apiKey, ctx);
35
+ client.extractCaptionTracks(data, videoId);
36
+ return { ok: true, error: new Error('unreachable') };
37
+ }
38
+ catch (err) {
39
+ return {
40
+ ok: false,
41
+ error: err instanceof Error ? err : new Error(String(err)),
42
+ };
43
+ }
44
+ }
45
+ function isFallbackTrigger(err) {
46
+ return err instanceof BotDetected || err instanceof IpBlocked;
47
+ }
48
+ //# sourceMappingURL=fetchStrategies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchStrategies.js","sourceRoot":"","sources":["../../../src/api/fetchStrategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAyB,MAAM,+BAA+B,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAa5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAuB,EACvB,OAAe,EACf,MAAc,EACd,OAGI,EAAE;IAEN,mBAAmB;IACnB,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC1F,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC5F,CAAC;IAED,kCAAkC;IAClC,IACE,IAAI,CAAC,cAAc,KAAK,IAAI;QAC5B,IAAI,CAAC,eAAe,KAAK,SAAS;QAClC,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,EACtC,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,MAAM,EACN,OAAO,EACP,MAAM,EACN,qBAAqB,EACrB,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CACvE,CAAC;QACF,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;aACrC,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,CAAC,KAAK,CAAC;AAC5B,CAAC;AAOD,KAAK,UAAU,SAAS,CACtB,MAAuB,EACvB,OAAe,EACf,MAAc,EACd,GAAqB;AACrB,2EAA2E;AAC3E,MAAiD;IAEjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAU;IACnC,OAAO,GAAG,YAAY,WAAW,IAAI,GAAG,YAAY,SAAS,CAAC;AAChE,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * YouTube URL constants and default request settings.
3
+ *
4
+ * These mirror the values hardcoded in the Python `youtube-transcript-api`
5
+ * library (v1.2.4), with the addition of an explicit default User-Agent
6
+ * (the Python library used `python-requests/x.y.z`; we pick a stable UA
7
+ * matching a recent Android Chrome so PoToken challenges behave consistently).
8
+ */
9
+ export declare const WATCH_URL = "https://www.youtube.com/watch?v={video_id}";
10
+ /** InnerTube API endpoint. The `key` query parameter is the INNERTUBE_API_KEY. */
11
+ export declare const INNERTUBE_API_URL = "https://www.youtube.com/youtubei/v1/player?key={api_key}";
12
+ /** YouTube's CDN host for player JS (base.js). Used by the AutoPoTokenProvider. */
13
+ export declare const BASE_JS_HOST = "https://www.youtube.com";
14
+ /** Default request timeout for the inner fetch wrappers (Node global fetch). */
15
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
16
+ /** Default User-Agent: a recent Android Chrome — PoToken-friendly. */
17
+ export declare const DEFAULT_USER_AGENT: string;
18
+ /** Default Accept-Language header (matches Python library default). */
19
+ export declare const DEFAULT_ACCEPT_LANGUAGE = "en-US";
20
+ /** Cap on retries for IP-block responses. Mirrors Python's proxy_config default. */
21
+ export declare const DEFAULT_RETRIES_WHEN_BLOCKED = 3;
22
+ /** base.js refresh interval (5 minutes). YouTube re-rolls obfuscation frequently. */
23
+ export declare const BASE_JS_CACHE_TTL_MS: number;
24
+ /** PoToken TTL — slightly conservative (YouTube uses ~12-24h, we refresh at 12h). */
25
+ export declare const DEFAULT_POTOKEN_TTL_MS: number;
26
+ /** Maximum length of a valid YouTube video id. */
27
+ export declare const VIDEO_ID_LENGTH = 11;
28
+ /** Regex for the canonical 11-char video id (alphanumeric + `-_`). */
29
+ export declare const VIDEO_ID_REGEX: RegExp;
30
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,SAAS,+CAA+C,CAAC;AAEtE,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,6DAA6D,CAAC;AAE5F,mFAAmF;AACnF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AAEtD,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,QAE8B,CAAC;AAE9D,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,oFAAoF;AACpF,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,qFAAqF;AACrF,eAAO,MAAM,oBAAoB,QAAgB,CAAC;AAElD,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,QAAsB,CAAC;AAE1D,kDAAkD;AAClD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,sEAAsE;AACtE,eAAO,MAAM,cAAc,QAAwB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * YouTube URL constants and default request settings.
3
+ *
4
+ * These mirror the values hardcoded in the Python `youtube-transcript-api`
5
+ * library (v1.2.4), with the addition of an explicit default User-Agent
6
+ * (the Python library used `python-requests/x.y.z`; we pick a stable UA
7
+ * matching a recent Android Chrome so PoToken challenges behave consistently).
8
+ */
9
+ export const WATCH_URL = 'https://www.youtube.com/watch?v={video_id}';
10
+ /** InnerTube API endpoint. The `key` query parameter is the INNERTUBE_API_KEY. */
11
+ export const INNERTUBE_API_URL = 'https://www.youtube.com/youtubei/v1/player?key={api_key}';
12
+ /** YouTube's CDN host for player JS (base.js). Used by the AutoPoTokenProvider. */
13
+ export const BASE_JS_HOST = 'https://www.youtube.com';
14
+ /** Default request timeout for the inner fetch wrappers (Node global fetch). */
15
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
16
+ /** Default User-Agent: a recent Android Chrome — PoToken-friendly. */
17
+ export const DEFAULT_USER_AGENT = 'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 ' +
18
+ '(KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';
19
+ /** Default Accept-Language header (matches Python library default). */
20
+ export const DEFAULT_ACCEPT_LANGUAGE = 'en-US';
21
+ /** Cap on retries for IP-block responses. Mirrors Python's proxy_config default. */
22
+ export const DEFAULT_RETRIES_WHEN_BLOCKED = 3;
23
+ /** base.js refresh interval (5 minutes). YouTube re-rolls obfuscation frequently. */
24
+ export const BASE_JS_CACHE_TTL_MS = 5 * 60 * 1000;
25
+ /** PoToken TTL — slightly conservative (YouTube uses ~12-24h, we refresh at 12h). */
26
+ export const DEFAULT_POTOKEN_TTL_MS = 12 * 60 * 60 * 1000;
27
+ /** Maximum length of a valid YouTube video id. */
28
+ export const VIDEO_ID_LENGTH = 11;
29
+ /** Regex for the canonical 11-char video id (alphanumeric + `-_`). */
30
+ export const VIDEO_ID_REGEX = /^[A-Za-z0-9_-]{11}$/;
31
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAEtE,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,0DAA0D,CAAC;AAE5F,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAEtD,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEjD,sEAAsE;AACtE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,+DAA+D;IAC/D,2DAA2D,CAAC;AAE9D,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,oFAAoF;AACpF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,qFAAqF;AACrF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,qFAAqF;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,sEAAsE;AACtE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * InnerTube client contexts.
3
+ *
4
+ * Mirrors the Python library's hardcoded ANDROID context
5
+ * (`{"client":{"clientName":"ANDROID","clientVersion":"20.10.38"}}`)
6
+ * which sidesteps the web client's PoToken requirement. We also expose
7
+ * WEB + TVHTML5 contexts as escape hatches.
8
+ */
9
+ export interface InnerTubeContext {
10
+ readonly client: {
11
+ readonly clientName: string;
12
+ readonly clientVersion: string;
13
+ readonly hl?: string;
14
+ readonly gl?: string;
15
+ readonly userAgent?: string;
16
+ readonly androidSdkVersion?: number;
17
+ };
18
+ }
19
+ /**
20
+ * Android InnerTube client — the primary path. Matches Python 1.2.4.
21
+ *
22
+ * YouTube historically does NOT require PoToken from ANDROID clients when
23
+ * the request also carries `X-YouTube-Client-Name: 3` and the matching UA.
24
+ */
25
+ export declare const ANDROID_INNERTUBE_CONTEXT: InnerTubeContext;
26
+ /**
27
+ * Web InnerTube client — used as the fallback path with PoToken.
28
+ *
29
+ * Requires a valid PoToken + visitorData; otherwise InnerTube returns
30
+ * `LOGIN_REQUIRED` / BotGuard.
31
+ */
32
+ export declare const WEB_INNERTUBE_CONTEXT: InnerTubeContext;
33
+ /**
34
+ * TVHTML5_SIMPLY_EMBEDDED_PLAYER — used as a last-resort fallback. Generally
35
+ * less restrictive than WEB but more than ANDROID.
36
+ */
37
+ export declare const TVHTML5_EMBEDDED_PLAYER_CONTEXT: InnerTubeContext;
38
+ /**
39
+ * Returns the numeric `X-YouTube-Client-Name` header value for a given
40
+ * client context, used when issuing InnerTube requests.
41
+ */
42
+ export declare function clientNameHeader(ctx: InnerTubeContext): string;
43
+ /**
44
+ * Returns the `X-YouTube-Client-Version` header value.
45
+ */
46
+ export declare function clientVersionHeader(ctx: InnerTubeContext): string;
47
+ //# sourceMappingURL=innerTubeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"innerTubeContext.d.ts","sourceRoot":"","sources":["../../../src/config/innerTubeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;CACH;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAQvC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,gBAOnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,gBAO7C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAgB9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * InnerTube client contexts.
3
+ *
4
+ * Mirrors the Python library's hardcoded ANDROID context
5
+ * (`{"client":{"clientName":"ANDROID","clientVersion":"20.10.38"}}`)
6
+ * which sidesteps the web client's PoToken requirement. We also expose
7
+ * WEB + TVHTML5 contexts as escape hatches.
8
+ */
9
+ /**
10
+ * Android InnerTube client — the primary path. Matches Python 1.2.4.
11
+ *
12
+ * YouTube historically does NOT require PoToken from ANDROID clients when
13
+ * the request also carries `X-YouTube-Client-Name: 3` and the matching UA.
14
+ */
15
+ export const ANDROID_INNERTUBE_CONTEXT = {
16
+ client: {
17
+ clientName: 'ANDROID',
18
+ clientVersion: '20.10.38',
19
+ hl: 'en',
20
+ gl: 'US',
21
+ androidSdkVersion: 30,
22
+ },
23
+ };
24
+ /**
25
+ * Web InnerTube client — used as the fallback path with PoToken.
26
+ *
27
+ * Requires a valid PoToken + visitorData; otherwise InnerTube returns
28
+ * `LOGIN_REQUIRED` / BotGuard.
29
+ */
30
+ export const WEB_INNERTUBE_CONTEXT = {
31
+ client: {
32
+ clientName: 'WEB',
33
+ clientVersion: '2.20240101.00.00',
34
+ hl: 'en',
35
+ gl: 'US',
36
+ },
37
+ };
38
+ /**
39
+ * TVHTML5_SIMPLY_EMBEDDED_PLAYER — used as a last-resort fallback. Generally
40
+ * less restrictive than WEB but more than ANDROID.
41
+ */
42
+ export const TVHTML5_EMBEDDED_PLAYER_CONTEXT = {
43
+ client: {
44
+ clientName: 'TVHTML5_SIMPLY_EMBEDDED_PLAYER',
45
+ clientVersion: '2.0',
46
+ hl: 'en',
47
+ gl: 'US',
48
+ },
49
+ };
50
+ /**
51
+ * Returns the numeric `X-YouTube-Client-Name` header value for a given
52
+ * client context, used when issuing InnerTube requests.
53
+ */
54
+ export function clientNameHeader(ctx) {
55
+ switch (ctx.client.clientName) {
56
+ case 'ANDROID':
57
+ return '3';
58
+ case 'WEB':
59
+ return '1';
60
+ case 'TVHTML5':
61
+ case 'TVHTML5_SIMPLY_EMBEDDED_PLAYER':
62
+ return '85';
63
+ case 'IOS':
64
+ return '5';
65
+ case 'MWEB':
66
+ return '2';
67
+ default:
68
+ return '1';
69
+ }
70
+ }
71
+ /**
72
+ * Returns the `X-YouTube-Client-Version` header value.
73
+ */
74
+ export function clientVersionHeader(ctx) {
75
+ return ctx.client.clientVersion;
76
+ }
77
+ //# sourceMappingURL=innerTubeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"innerTubeContext.js","sourceRoot":"","sources":["../../../src/config/innerTubeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAqB;IACzD,MAAM,EAAE;QACN,UAAU,EAAE,SAAS;QACrB,aAAa,EAAE,UAAU;QACzB,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;QACR,iBAAiB,EAAE,EAAE;KACtB;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,MAAM,EAAE;QACN,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,kBAAkB;QACjC,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;KACT;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAqB;IAC/D,MAAM,EAAE;QACN,UAAU,EAAE,gCAAgC;QAC5C,aAAa,EAAE,KAAK;QACpB,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,IAAI;KACT;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAqB;IACpD,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9B,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,gCAAgC;YACnC,OAAO,IAAI,CAAC;QACd,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,OAAO,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;AAClC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { YouTubeTranscriptError } from './YouTubeTranscriptError.js';
2
+ /**
3
+ * Thrown when YouTube's InnerTube responds with LOGIN_REQUIRED + BotGuard reason
4
+ * (the bent-quote string `Sign in to confirm you're not a bot`).
5
+ *
6
+ * This is the canonical "PoToken required" signal in 1.2.4. Mirrors Python's
7
+ * `RequestBlocked` when triggered by BotGuard (mapped to `IpBlocked` there;
8
+ * we split it into a dedicated class for finer control).
9
+ */
10
+ export declare class BotDetected extends YouTubeTranscriptError {
11
+ constructor(videoId: string);
12
+ }
13
+ //# sourceMappingURL=BotDetected.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotDetected.d.ts","sourceRoot":"","sources":["../../../src/errors/BotDetected.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;GAOG;AACH,qBAAa,WAAY,SAAQ,sBAAsB;gBACzC,OAAO,EAAE,MAAM;CAM5B"}
@@ -0,0 +1,16 @@
1
+ import { YouTubeTranscriptError } from './YouTubeTranscriptError.js';
2
+ /**
3
+ * Thrown when YouTube's InnerTube responds with LOGIN_REQUIRED + BotGuard reason
4
+ * (the bent-quote string `Sign in to confirm you're not a bot`).
5
+ *
6
+ * This is the canonical "PoToken required" signal in 1.2.4. Mirrors Python's
7
+ * `RequestBlocked` when triggered by BotGuard (mapped to `IpBlocked` there;
8
+ * we split it into a dedicated class for finer control).
9
+ */
10
+ export class BotDetected extends YouTubeTranscriptError {
11
+ constructor(videoId) {
12
+ super(`YouTube BotGuard blocked the request for video "${videoId}". ` +
13
+ `Provide a PoToken provider (e.g. AutoPoTokenProvider) or use a proxy.`);
14
+ }
15
+ }
16
+ //# sourceMappingURL=BotDetected.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotDetected.js","sourceRoot":"","sources":["../../../src/errors/BotDetected.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,OAAO,WAAY,SAAQ,sBAAsB;IACrD,YAAY,OAAe;QACzB,KAAK,CACH,mDAAmD,OAAO,KAAK;YAC7D,uEAAuE,CAC1E,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { YouTubeTranscriptError } from './YouTubeTranscriptError.js';
2
+ /**
3
+ * Thrown when we hit the EU consent gate twice and cannot extract the `v`
4
+ * parameter from the form to set the CONSENT cookie. Mirrors Python's
5
+ * `FailedToCreateConsentCookie`.
6
+ */
7
+ export declare class FailedToCreateConsentCookie extends YouTubeTranscriptError {
8
+ constructor(videoId: string);
9
+ }
10
+ //# sourceMappingURL=FailedToCreateConsentCookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FailedToCreateConsentCookie.d.ts","sourceRoot":"","sources":["../../../src/errors/FailedToCreateConsentCookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,sBAAsB;gBACzD,OAAO,EAAE,MAAM;CAM5B"}
@@ -0,0 +1,13 @@
1
+ import { YouTubeTranscriptError } from './YouTubeTranscriptError.js';
2
+ /**
3
+ * Thrown when we hit the EU consent gate twice and cannot extract the `v`
4
+ * parameter from the form to set the CONSENT cookie. Mirrors Python's
5
+ * `FailedToCreateConsentCookie`.
6
+ */
7
+ export class FailedToCreateConsentCookie extends YouTubeTranscriptError {
8
+ constructor(videoId) {
9
+ super(`Failed to automatically give consent to YouTube for video "${videoId}". ` +
10
+ `Please set the CONSENT cookie manually and pass it via the \`cookies\` option.`);
11
+ }
12
+ }
13
+ //# sourceMappingURL=FailedToCreateConsentCookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FailedToCreateConsentCookie.js","sourceRoot":"","sources":["../../../src/errors/FailedToCreateConsentCookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;GAIG;AACH,MAAM,OAAO,2BAA4B,SAAQ,sBAAsB;IACrE,YAAY,OAAe;QACzB,KAAK,CACH,8DAA8D,OAAO,KAAK;YACxE,gFAAgF,CACnF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { YouTubeTranscriptError } from './YouTubeTranscriptError.js';
2
+ /**
3
+ * Thrown when the provided video id cannot be parsed or is invalid.
4
+ * Mirrors `InvalidVideoId` from the Python library.
5
+ */
6
+ export declare class InvalidVideoId extends YouTubeTranscriptError {
7
+ constructor(videoId: string);
8
+ }
9
+ //# sourceMappingURL=InvalidVideoId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidVideoId.d.ts","sourceRoot":"","sources":["../../../src/errors/InvalidVideoId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;GAGG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;gBAC5C,OAAO,EAAE,MAAM;CAM5B"}