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,79 @@
1
+ import { NoTranscriptFound } from '../errors/index.js';
2
+ import { Transcript } from './Transcript.js';
3
+ /**
4
+ * Collection of all available transcript tracks for a video.
5
+ *
6
+ * Created via `YouTubeTranscriptApi.list(videoId)`. Use the `find*` helpers
7
+ * to pick a track, then call `.fetch()` on the result.
8
+ */
9
+ export class TranscriptList {
10
+ videoId;
11
+ manuallyCreatedTranscripts;
12
+ generatedTranscripts;
13
+ translationLanguages;
14
+ constructor(videoId, manuallyCreatedTranscripts, generatedTranscripts, translationLanguages) {
15
+ this.videoId = videoId;
16
+ this.manuallyCreatedTranscripts = manuallyCreatedTranscripts;
17
+ this.generatedTranscripts = generatedTranscripts;
18
+ this.translationLanguages = translationLanguages;
19
+ }
20
+ /**
21
+ * Find a transcript matching one of the given language codes.
22
+ * Manual tracks are preferred over generated ones.
23
+ */
24
+ findTranscript(languageCodes) {
25
+ return this.findInOrder(languageCodes, [this.manuallyCreatedTranscripts, this.generatedTranscripts]);
26
+ }
27
+ /**
28
+ * Find only an ASR-generated transcript.
29
+ */
30
+ findGeneratedTranscript(languageCodes) {
31
+ return this.findInOrder(languageCodes, [this.generatedTranscripts]);
32
+ }
33
+ /**
34
+ * Find only a manually uploaded transcript.
35
+ */
36
+ findManuallyCreatedTranscript(languageCodes) {
37
+ return this.findInOrder(languageCodes, [this.manuallyCreatedTranscripts]);
38
+ }
39
+ findInOrder(codes, pools) {
40
+ for (const code of codes) {
41
+ for (const pool of pools) {
42
+ const found = pool.find((t) => t.languageCode === code);
43
+ if (found)
44
+ return found;
45
+ }
46
+ }
47
+ throw new NoTranscriptFound({
48
+ videoId: this.videoId,
49
+ requestedLanguageCodes: codes,
50
+ transcriptData: this,
51
+ });
52
+ }
53
+ /**
54
+ * Iterate over all transcripts (manual first, then generated).
55
+ */
56
+ *[Symbol.iterator]() {
57
+ yield* this.manuallyCreatedTranscripts;
58
+ yield* this.generatedTranscripts;
59
+ }
60
+ }
61
+ /**
62
+ * Factory helper to build a TranscriptList from raw caption data.
63
+ *
64
+ * `httpClient` is propagated to each Transcript so they can fetch their
65
+ * own cues lazily.
66
+ */
67
+ export function buildTranscriptList(httpClient, videoId, captionTracks, translationLanguages) {
68
+ const manual = [];
69
+ const generated = [];
70
+ for (const track of captionTracks) {
71
+ const t = new Transcript(httpClient, videoId, track.baseUrl, track.name, track.languageCode, track.kind === 'asr', track.isTranslatable ? translationLanguages : []);
72
+ if (track.kind === 'asr')
73
+ generated.push(t);
74
+ else
75
+ manual.push(t);
76
+ }
77
+ return new TranscriptList(videoId, manual, generated, translationLanguages);
78
+ }
79
+ //# sourceMappingURL=TranscriptList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptList.js","sourceRoot":"","sources":["../../../src/models/TranscriptList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IAChB,OAAO,CAAS;IAChB,0BAA0B,CAAwB;IAClD,oBAAoB,CAAwB;IAC5C,oBAAoB,CAAiC;IAE9D,YACE,OAAe,EACf,0BAAiD,EACjD,oBAA2C,EAC3C,oBAAoD;QAEpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,0BAA0B,GAAG,0BAA0B,CAAC;QAC7D,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACjD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,aAAgC;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACvG,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,aAAgC;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,6BAA6B,CAAC,aAAgC;QAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEO,WAAW,CACjB,KAAwB,EACxB,KAAyC;QAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;gBACxD,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,sBAAsB,EAAE,KAAK;YAC7B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC;QACvC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAA2B,EAC3B,OAAe,EACf,aAME,EACF,oBAAoD;IAEpD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,SAAS,GAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,UAAU,CACtB,UAAU,EACV,OAAO,EACP,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,IAAI,KAAK,KAAK,EACpB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CACjD,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { TranslationLanguage } from './TranslationLanguage.js';
2
+ export interface TranscriptMetadata {
3
+ readonly videoId: string;
4
+ readonly languageName: string;
5
+ readonly languageCode: string;
6
+ readonly isGenerated: boolean;
7
+ readonly isTranslatable: boolean;
8
+ readonly translationLanguages: readonly TranslationLanguage[];
9
+ }
10
+ //# sourceMappingURL=TranscriptMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptMetadata.d.ts","sourceRoot":"","sources":["../../../src/models/TranscriptMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,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,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC/D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TranscriptMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptMetadata.js","sourceRoot":"","sources":["../../../src/models/TranscriptMetadata.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A target language available for translation on a given track.
3
+ */
4
+ export interface TranslationLanguage {
5
+ readonly languageCode: string;
6
+ readonly languageName: string;
7
+ }
8
+ //# sourceMappingURL=TranslationLanguage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslationLanguage.d.ts","sourceRoot":"","sources":["../../../src/models/TranslationLanguage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TranslationLanguage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslationLanguage.js","sourceRoot":"","sources":["../../../src/models/TranslationLanguage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export { FetchedTranscriptSnippet } from './FetchedTranscriptSnippet.js';
2
+ export { FetchedTranscript } from './FetchedTranscript.js';
3
+ export { Transcript } from './Transcript.js';
4
+ export { TranscriptList, buildTranscriptList } from './TranscriptList.js';
5
+ export type { TranslationLanguage } from './TranslationLanguage.js';
6
+ export type { TranscriptMetadata } from './TranscriptMetadata.js';
7
+ export type { FormattedTranscript } from './FormattedTranscript.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { FetchedTranscriptSnippet } from './FetchedTranscriptSnippet.js';
2
+ export { FetchedTranscript } from './FetchedTranscript.js';
3
+ export { Transcript } from './Transcript.js';
4
+ export { TranscriptList, buildTranscriptList } from './TranscriptList.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Parsed translation language entry.
3
+ */
4
+ export interface TranslationLanguageJson {
5
+ readonly languageCode: string;
6
+ readonly languageName: string;
7
+ }
8
+ /**
9
+ * One caption track as returned by InnerTube.
10
+ */
11
+ export interface CaptionTrackJson {
12
+ readonly baseUrl: string;
13
+ readonly languageCode: string;
14
+ readonly name: string;
15
+ readonly kind: '' | 'asr';
16
+ readonly isTranslatable: boolean;
17
+ readonly vssId: string;
18
+ }
19
+ /**
20
+ * The shape of `captions.playerCaptionsTracklistRenderer` we care about.
21
+ */
22
+ export interface CaptionTracklistJson {
23
+ readonly captionTracks: readonly CaptionTrackJson[];
24
+ readonly translationLanguages?: readonly TranslationLanguageJson[];
25
+ }
26
+ export declare function parseCaptionTrack(node: unknown): CaptionTrackJson | null;
27
+ export declare function parseTranslationLanguage(node: unknown): TranslationLanguageJson | null;
28
+ export declare function parseCaptionTracklist(node: unknown): CaptionTracklistJson | null;
29
+ //# sourceMappingURL=captionTrackParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captionTrackParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/captionTrackParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACpD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACpE;AA+BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAqBxE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CAStF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAuBhF"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Helpers to convert the InnerTube `playerCaptionsTracklistRenderer` JSON
3
+ * into clean JS values.
4
+ *
5
+ * Mirrors the Python library's `TranscriptList.build`.
6
+ */
7
+ function readNameRuns(nameField) {
8
+ if (typeof nameField !== 'object' || nameField === null) {
9
+ return '';
10
+ }
11
+ const rec = nameField;
12
+ const runs = rec['runs'];
13
+ if (Array.isArray(runs) && runs.length > 0) {
14
+ const first = runs[0];
15
+ if (typeof first === 'object' && first !== null) {
16
+ const text = first['text'];
17
+ if (typeof text === 'string') {
18
+ return text;
19
+ }
20
+ }
21
+ }
22
+ const simpleText = rec['simpleText'];
23
+ if (typeof simpleText === 'string') {
24
+ return simpleText;
25
+ }
26
+ return '';
27
+ }
28
+ export function parseCaptionTrack(node) {
29
+ if (typeof node !== 'object' || node === null)
30
+ return null;
31
+ const rec = node;
32
+ const baseUrl = rec['baseUrl'];
33
+ const languageCode = rec['languageCode'];
34
+ const vssId = rec['vssId'];
35
+ if (typeof baseUrl !== 'string' || typeof languageCode !== 'string' || typeof vssId !== 'string') {
36
+ return null;
37
+ }
38
+ // Strip the &fmt=srv3 flag so the response defaults to XML (mirrors Python).
39
+ const cleanBaseUrl = baseUrl.replace(/&fmt=srv3/g, '');
40
+ const kindRaw = rec['kind'];
41
+ const kind = kindRaw === 'asr' ? 'asr' : '';
42
+ return {
43
+ baseUrl: cleanBaseUrl,
44
+ languageCode,
45
+ name: readNameRuns(rec['name']),
46
+ kind,
47
+ isTranslatable: rec['isTranslatable'] === true,
48
+ vssId,
49
+ };
50
+ }
51
+ export function parseTranslationLanguage(node) {
52
+ if (typeof node !== 'object' || node === null)
53
+ return null;
54
+ const rec = node;
55
+ const languageCode = rec['languageCode'];
56
+ if (typeof languageCode !== 'string')
57
+ return null;
58
+ return {
59
+ languageCode,
60
+ languageName: readNameRuns(rec['languageName']),
61
+ };
62
+ }
63
+ export function parseCaptionTracklist(node) {
64
+ if (typeof node !== 'object' || node === null)
65
+ return null;
66
+ const rec = node;
67
+ const captionTracksRaw = rec['captionTracks'];
68
+ if (!Array.isArray(captionTracksRaw))
69
+ return null;
70
+ const captionTracks = [];
71
+ for (const ct of captionTracksRaw) {
72
+ const parsed = parseCaptionTrack(ct);
73
+ if (parsed)
74
+ captionTracks.push(parsed);
75
+ }
76
+ if (captionTracks.length === 0)
77
+ return null;
78
+ const translationLanguagesRaw = rec['translationLanguages'];
79
+ let translationLanguages = [];
80
+ if (Array.isArray(translationLanguagesRaw)) {
81
+ const list = [];
82
+ for (const tl of translationLanguagesRaw) {
83
+ const parsed = parseTranslationLanguage(tl);
84
+ if (parsed)
85
+ list.push(parsed);
86
+ }
87
+ translationLanguages = list;
88
+ }
89
+ return { captionTracks, translationLanguages };
90
+ }
91
+ //# sourceMappingURL=captionTrackParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captionTrackParser.js","sourceRoot":"","sources":["../../../src/parsers/captionTrackParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Try to extract a video id from `input`.
3
+ *
4
+ * @throws InvalidVideoId if `input` is not a valid YouTube id or URL.
5
+ */
6
+ export declare function extractVideoId(input: string): string;
7
+ /**
8
+ * Non-throwing variant of `extractVideoId`. Returns `null` on failure.
9
+ */
10
+ export declare function tryExtractVideoId(input: string): string | null;
11
+ //# sourceMappingURL=videoIdParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoIdParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/videoIdParser.ts"],"names":[],"mappings":"AAyBA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D"}
@@ -0,0 +1,61 @@
1
+ import { VIDEO_ID_REGEX } from '../config/constants.js';
2
+ import { InvalidVideoId } from '../errors/index.js';
3
+ /**
4
+ * Extract a YouTube video id from a string that is either:
5
+ * - a raw 11-character id
6
+ * - any common YouTube URL form (watch?v=, youtu.be/, /shorts/, /embed/, etc.)
7
+ *
8
+ * Mirrors the Python library's regex set (added in PR #282 by Tesla2000).
9
+ */
10
+ const URL_PATTERNS = [
11
+ // youtu.be/<id>
12
+ /(?:youtu\.be\/)([A-Za-z0-9_-]{11})/,
13
+ // youtube.com/shorts/<id>
14
+ /(?:youtube\.com\/shorts\/)([A-Za-z0-9_-]{11})/,
15
+ // youtube.com/embed/<id>
16
+ /(?:youtube\.com\/embed\/)([A-Za-z0-9_-]{11})/,
17
+ // youtube.com/v/<id>
18
+ /(?:youtube\.com\/v\/)([A-Za-z0-9_-]{11})/,
19
+ // music.youtube.com/watch?v=<id>
20
+ /(?:music\.youtube\.com\/watch\?v=)([A-Za-z0-9_-]{11})/,
21
+ // generic ?v=<id> or &v=<id>
22
+ /(?:\?v=|\&v=)([A-Za-z0-9_-]{11})/,
23
+ ];
24
+ /**
25
+ * Try to extract a video id from `input`.
26
+ *
27
+ * @throws InvalidVideoId if `input` is not a valid YouTube id or URL.
28
+ */
29
+ export function extractVideoId(input) {
30
+ if (typeof input !== 'string') {
31
+ throw new InvalidVideoId(String(input));
32
+ }
33
+ const trimmed = input.trim();
34
+ if (trimmed.length === 0) {
35
+ throw new InvalidVideoId(input);
36
+ }
37
+ // Fast path: already a canonical id.
38
+ if (VIDEO_ID_REGEX.test(trimmed)) {
39
+ return trimmed;
40
+ }
41
+ // Try URL patterns.
42
+ for (const re of URL_PATTERNS) {
43
+ const m = re.exec(trimmed);
44
+ if (m && m[1]) {
45
+ return m[1];
46
+ }
47
+ }
48
+ throw new InvalidVideoId(input);
49
+ }
50
+ /**
51
+ * Non-throwing variant of `extractVideoId`. Returns `null` on failure.
52
+ */
53
+ export function tryExtractVideoId(input) {
54
+ try {
55
+ return extractVideoId(input);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=videoIdParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoIdParser.js","sourceRoot":"","sources":["../../../src/parsers/videoIdParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,YAAY,GAAsB;IACtC,gBAAgB;IAChB,oCAAoC;IACpC,0BAA0B;IAC1B,+CAA+C;IAC/C,yBAAyB;IACzB,8CAA8C;IAC9C,qBAAqB;IACrB,0CAA0C;IAC1C,iCAAiC;IACjC,uDAAuD;IACvD,6BAA6B;IAC7B,kCAAkC;CACnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,qCAAqC;IACrC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,oBAAoB;IACpB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /** Marker that indicates the EU consent gate is present. */
2
+ export declare const CONSENT_GATE_MARKER = "action=\"https://consent.youtube.com/s\"";
3
+ /** Regex extracting the `v` form value used to mint the CONSENT cookie. */
4
+ export declare const CONSENT_FORM_VALUE_REGEX: RegExp;
5
+ /**
6
+ * Detect whether the watch HTML is the EU consent gate.
7
+ */
8
+ export declare function isConsentGate(html: string): boolean;
9
+ /**
10
+ * Detect whether the watch HTML is a CAPTCHA / bot-detect page.
11
+ *
12
+ * Python library checks for `class="g-recaptcha"`; we extend slightly.
13
+ */
14
+ export declare function isCaptchaGate(html: string): boolean;
15
+ /**
16
+ * Extract the `INNERTUBE_API_KEY` from watch HTML.
17
+ *
18
+ * @throws YouTubeDataUnparsable if no key is found.
19
+ * @throws IpBlocked (with statusCode undefined) if a CAPTCHA gate is detected.
20
+ */
21
+ export declare function extractInnertubeApiKey(html: string, videoId: string): string;
22
+ /**
23
+ * Extract the `v` parameter from the EU consent form.
24
+ *
25
+ * @returns the raw `v` value, or `null` if not found.
26
+ */
27
+ export declare function extractConsentFormValue(html: string): string | null;
28
+ /**
29
+ * Build a CONSENT cookie value in the format YouTube expects:
30
+ * `YES+<v>`
31
+ */
32
+ export declare function buildConsentCookieValue(v: string): string;
33
+ //# sourceMappingURL=watchHtmlParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchHtmlParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/watchHtmlParser.ts"],"names":[],"mappings":"AAoBA,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,6CAA2C,CAAC;AAE5E,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,QAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc5E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,70 @@
1
+ import { IpBlocked, YouTubeDataUnparsable } from '../errors/index.js';
2
+ /**
3
+ * Parse the YouTube watch HTML to extract the `INNERTUBE_API_KEY` and
4
+ * (optionally) the EU-consent gate parameters.
5
+ *
6
+ * Mirrors the Python library's `_extract_innertube_api_key`:
7
+ *
8
+ * pattern = r'"INNERTUBE_API_KEY":\s*"([a-zA-Z0-9_-]+)"'
9
+ *
10
+ * We also keep a couple of fallback patterns to make the parser resilient
11
+ * to YouTube's occasional A/B variations.
12
+ */
13
+ const API_KEY_PATTERNS = [
14
+ /"INNERTUBE_API_KEY":\s*"([A-Za-z0-9_-]+)"/,
15
+ /"innertubeApiKey":\s*"([A-Za-z0-9_-]+)"/,
16
+ /"key":\s*"([A-Za-z0-9_-]{20,})"/,
17
+ ];
18
+ /** Marker that indicates the EU consent gate is present. */
19
+ export const CONSENT_GATE_MARKER = 'action="https://consent.youtube.com/s"';
20
+ /** Regex extracting the `v` form value used to mint the CONSENT cookie. */
21
+ export const CONSENT_FORM_VALUE_REGEX = /name="v" value="([^"]+)"/;
22
+ /**
23
+ * Detect whether the watch HTML is the EU consent gate.
24
+ */
25
+ export function isConsentGate(html) {
26
+ return html.includes(CONSENT_GATE_MARKER);
27
+ }
28
+ /**
29
+ * Detect whether the watch HTML is a CAPTCHA / bot-detect page.
30
+ *
31
+ * Python library checks for `class="g-recaptcha"`; we extend slightly.
32
+ */
33
+ export function isCaptchaGate(html) {
34
+ return html.includes('class="g-recaptcha"') || html.includes('class="rc-imageselect"');
35
+ }
36
+ /**
37
+ * Extract the `INNERTUBE_API_KEY` from watch HTML.
38
+ *
39
+ * @throws YouTubeDataUnparsable if no key is found.
40
+ * @throws IpBlocked (with statusCode undefined) if a CAPTCHA gate is detected.
41
+ */
42
+ export function extractInnertubeApiKey(html, videoId) {
43
+ if (isCaptchaGate(html)) {
44
+ throw new IpBlocked(videoId);
45
+ }
46
+ for (const re of API_KEY_PATTERNS) {
47
+ const m = re.exec(html);
48
+ if (m && m[1]) {
49
+ return m[1];
50
+ }
51
+ }
52
+ throw new YouTubeDataUnparsable(videoId, 'INNERTUBE_API_KEY not found in watch HTML (YouTube may have changed the page format).');
53
+ }
54
+ /**
55
+ * Extract the `v` parameter from the EU consent form.
56
+ *
57
+ * @returns the raw `v` value, or `null` if not found.
58
+ */
59
+ export function extractConsentFormValue(html) {
60
+ const m = CONSENT_FORM_VALUE_REGEX.exec(html);
61
+ return m && m[1] ? m[1] : null;
62
+ }
63
+ /**
64
+ * Build a CONSENT cookie value in the format YouTube expects:
65
+ * `YES+<v>`
66
+ */
67
+ export function buildConsentCookieValue(v) {
68
+ return `YES+${v}`;
69
+ }
70
+ //# sourceMappingURL=watchHtmlParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchHtmlParser.js","sourceRoot":"","sources":["../../../src/parsers/watchHtmlParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;;;;;;GAUG;AAEH,MAAM,gBAAgB,GAAsB;IAC1C,2CAA2C;IAC3C,yCAAyC;IACzC,iCAAiC;CAClC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAAwC,CAAC;AAE5E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACzF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,OAAe;IAClE,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,qBAAqB,CAC7B,OAAO,EACP,uFAAuF,CACxF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAS;IAC/C,OAAO,OAAO,CAAC,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * One timedtext XML cue, in its parsed form.
3
+ */
4
+ export interface ParsedCue {
5
+ readonly text: string;
6
+ readonly start: number;
7
+ readonly duration: number;
8
+ }
9
+ /**
10
+ * Parse the timedtext XML response body.
11
+ *
12
+ * @throws Error if the input is not a string with at least one `<text>` element.
13
+ */
14
+ export declare function parseTranscriptXml(rawXml: string, opts?: {
15
+ preserveFormatting?: boolean;
16
+ }): readonly ParsedCue[];
17
+ //# sourceMappingURL=xmlTranscriptParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlTranscriptParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/xmlTranscriptParser.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAyBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,SAAS,SAAS,EAAE,CAmCtB"}
@@ -0,0 +1,81 @@
1
+ import { sanitizeTranscriptText } from '../util/htmlSanitizer.js';
2
+ /**
3
+ * Parse timedtext XML into a list of cues.
4
+ *
5
+ * Note on parsing strategy: timedtext XML uses HTML-like markup INSIDE
6
+ * the `<text>` element (e.g. `<text><b>bold</b></text>`). A strict XML
7
+ * parser would treat the inner `<b>` as a nested element and lose the
8
+ * mixed-content ordering. The Python library uses defusedxml, which has
9
+ * the same limitation; the sanitizer layer below strips tags afterward.
10
+ *
11
+ * To avoid that pitfall, we extract `<text>` elements with a regex,
12
+ * which preserves the inner HTML verbatim for the sanitizer to handle.
13
+ *
14
+ * Expected input shape:
15
+ *
16
+ * <transcript>
17
+ * <text start="0.0" dur="1.54">Hello</text>
18
+ * <text start="1.54" dur="2.0">With <b>bold</b></text>
19
+ * </transcript>
20
+ */
21
+ const TEXT_ELEMENT_REGEX = /<text\b([^>]*?)\/?>([\s\S]*?)<\/text>|<text\b([^>]*?)\/>/gi;
22
+ const ATTR_REGEX = /([a-zA-Z_][\w:-]*)\s*=\s*"([^"]*)"/g;
23
+ /**
24
+ * Parse the timedtext XML response body.
25
+ *
26
+ * @throws Error if the input is not a string with at least one `<text>` element.
27
+ */
28
+ export function parseTranscriptXml(rawXml, opts = {}) {
29
+ if (typeof rawXml !== 'string' || rawXml.length === 0) {
30
+ throw new Error('Empty transcript XML');
31
+ }
32
+ // Sanity: must contain at least one <text tag; otherwise we treat as malformed.
33
+ if (!/<text\b/i.test(rawXml)) {
34
+ throw new Error('Transcript XML contains no <text> elements');
35
+ }
36
+ const preserveFormatting = opts.preserveFormatting === true;
37
+ const cues = [];
38
+ // Reset lastIndex to be safe.
39
+ TEXT_ELEMENT_REGEX.lastIndex = 0;
40
+ let match;
41
+ while ((match = TEXT_ELEMENT_REGEX.exec(rawXml)) !== null) {
42
+ // The regex captures either:
43
+ // match[1] = attrs, match[2] = inner content (paired <text>...</text>)
44
+ // or:
45
+ // match[3] = attrs (self-closing <text ... />)
46
+ const attrs = match[1] ?? match[3] ?? '';
47
+ const innerHtml = match[2] ?? '';
48
+ if (innerHtml.length === 0)
49
+ continue;
50
+ const { start, duration } = parseAttributes(attrs);
51
+ if (!Number.isFinite(start))
52
+ continue;
53
+ cues.push({
54
+ text: sanitizeTranscriptText(innerHtml, preserveFormatting),
55
+ start,
56
+ duration,
57
+ });
58
+ }
59
+ return cues;
60
+ }
61
+ function parseAttributes(attrString) {
62
+ const map = {};
63
+ ATTR_REGEX.lastIndex = 0;
64
+ let m;
65
+ while ((m = ATTR_REGEX.exec(attrString)) !== null) {
66
+ const name = m[1];
67
+ const value = m[2];
68
+ if (name && value !== undefined) {
69
+ map[name] = value;
70
+ }
71
+ }
72
+ const startStr = map['start'];
73
+ const durStr = map['dur'];
74
+ const start = startStr !== undefined ? Number.parseFloat(startStr) : 0;
75
+ const duration = durStr !== undefined ? Number.parseFloat(durStr) : 0;
76
+ return {
77
+ start: Number.isFinite(start) ? start : 0,
78
+ duration: Number.isFinite(duration) ? duration : 0,
79
+ };
80
+ }
81
+ //# sourceMappingURL=xmlTranscriptParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlTranscriptParser.js","sourceRoot":"","sources":["../../../src/parsers/xmlTranscriptParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type PoTokenProvider, type TokenResult } from './types.js';
2
+ export interface AutoPoTokenProviderOptions {
3
+ /** Custom fetch implementation (for tests / SSR). */
4
+ fetchImpl?: typeof fetch;
5
+ /** Token TTL override (default 12h). */
6
+ ttlMs?: number;
7
+ /** Pre-set visitorData; otherwise the video id is used. */
8
+ visitorData?: string;
9
+ /** Cache TTL for the challenge script (default 5min). */
10
+ challengeTtlMs?: number;
11
+ }
12
+ export declare class AutoPoTokenProvider implements PoTokenProvider {
13
+ private readonly fetchImpl;
14
+ private readonly ttlMs;
15
+ private readonly challengeTtlMs;
16
+ private visitorData;
17
+ private cache;
18
+ constructor(opts?: AutoPoTokenProviderOptions);
19
+ setVisitorData(visitorData: string): void;
20
+ /**
21
+ * Whether bgutils-js is installed and the provider is usable.
22
+ */
23
+ isAvailable(): boolean;
24
+ generateForVideo(videoId: string): Promise<TokenResult>;
25
+ dispose(): Promise<void>;
26
+ private getOrLoadChallenge;
27
+ }
28
+ //# sourceMappingURL=AutoPoTokenProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoPoTokenProvider.d.ts","sourceRoot":"","sources":["../../../src/potoken/AutoPoTokenProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAmBlF,MAAM,WAAW,0BAA0B;IACzC,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkDD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,KAAK,CAAoC;gBAErC,IAAI,GAAE,0BAA+B;IAWjD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,WAAW,IAAI,OAAO;IAYhB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsDvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAWhB,kBAAkB;CAkDjC"}