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.
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/dist/cjs/api/InnerTubeClient.js +236 -0
- package/dist/cjs/api/InnerTubeClient.js.map +1 -0
- package/dist/cjs/api/YouTubeTranscriptApi.js +160 -0
- package/dist/cjs/api/YouTubeTranscriptApi.js.map +1 -0
- package/dist/cjs/api/fetchStrategies.js +51 -0
- package/dist/cjs/api/fetchStrategies.js.map +1 -0
- package/dist/cjs/config/constants.js +34 -0
- package/dist/cjs/config/constants.js.map +1 -0
- package/dist/cjs/config/innerTubeContext.js +82 -0
- package/dist/cjs/config/innerTubeContext.js.map +1 -0
- package/dist/cjs/errors/BotDetected.js +20 -0
- package/dist/cjs/errors/BotDetected.js.map +1 -0
- package/dist/cjs/errors/FailedToCreateConsentCookie.js +17 -0
- package/dist/cjs/errors/FailedToCreateConsentCookie.js.map +1 -0
- package/dist/cjs/errors/InvalidVideoId.js +16 -0
- package/dist/cjs/errors/InvalidVideoId.js.map +1 -0
- package/dist/cjs/errors/IpBlocked.js +17 -0
- package/dist/cjs/errors/IpBlocked.js.map +1 -0
- package/dist/cjs/errors/NoTranscriptFound.js +23 -0
- package/dist/cjs/errors/NoTranscriptFound.js.map +1 -0
- package/dist/cjs/errors/NotTranslatable.js +15 -0
- package/dist/cjs/errors/NotTranslatable.js.map +1 -0
- package/dist/cjs/errors/PoTokenRequired.js +18 -0
- package/dist/cjs/errors/PoTokenRequired.js.map +1 -0
- package/dist/cjs/errors/TooManyRequests.js +19 -0
- package/dist/cjs/errors/TooManyRequests.js.map +1 -0
- package/dist/cjs/errors/TranscriptsDisabled.js +15 -0
- package/dist/cjs/errors/TranscriptsDisabled.js.map +1 -0
- package/dist/cjs/errors/TranslationLanguageNotAvailable.js +16 -0
- package/dist/cjs/errors/TranslationLanguageNotAvailable.js.map +1 -0
- package/dist/cjs/errors/VideoUnavailable.js +15 -0
- package/dist/cjs/errors/VideoUnavailable.js.map +1 -0
- package/dist/cjs/errors/VideoUnplayable.js +22 -0
- package/dist/cjs/errors/VideoUnplayable.js.map +1 -0
- package/dist/cjs/errors/YouTubeDataUnparsable.js +15 -0
- package/dist/cjs/errors/YouTubeDataUnparsable.js.map +1 -0
- package/dist/cjs/errors/YouTubeRequestFailed.js +18 -0
- package/dist/cjs/errors/YouTubeRequestFailed.js.map +1 -0
- package/dist/cjs/errors/YouTubeTranscriptError.js +19 -0
- package/dist/cjs/errors/YouTubeTranscriptError.js.map +1 -0
- package/dist/cjs/errors/index.js +34 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/formatters/Formatter.js +3 -0
- package/dist/cjs/formatters/Formatter.js.map +1 -0
- package/dist/cjs/formatters/JSONFormatter.js +24 -0
- package/dist/cjs/formatters/JSONFormatter.js.map +1 -0
- package/dist/cjs/formatters/PrettyPrintFormatter.js +26 -0
- package/dist/cjs/formatters/PrettyPrintFormatter.js.map +1 -0
- package/dist/cjs/formatters/SRTFormatter.js +39 -0
- package/dist/cjs/formatters/SRTFormatter.js.map +1 -0
- package/dist/cjs/formatters/TextFormatter.js +20 -0
- package/dist/cjs/formatters/TextFormatter.js.map +1 -0
- package/dist/cjs/formatters/WebVTTFormatter.js +39 -0
- package/dist/cjs/formatters/WebVTTFormatter.js.map +1 -0
- package/dist/cjs/formatters/base.js +61 -0
- package/dist/cjs/formatters/base.js.map +1 -0
- package/dist/cjs/formatters/index.js +19 -0
- package/dist/cjs/formatters/index.js.map +1 -0
- package/dist/cjs/http/cookieJar.js +91 -0
- package/dist/cjs/http/cookieJar.js.map +1 -0
- package/dist/cjs/http/httpClient.js +228 -0
- package/dist/cjs/http/httpClient.js.map +1 -0
- package/dist/cjs/index.js +50 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/models/FetchedTranscript.js +80 -0
- package/dist/cjs/models/FetchedTranscript.js.map +1 -0
- package/dist/cjs/models/FetchedTranscriptSnippet.js +29 -0
- package/dist/cjs/models/FetchedTranscriptSnippet.js.map +1 -0
- package/dist/cjs/models/FormattedTranscript.js +3 -0
- package/dist/cjs/models/FormattedTranscript.js.map +1 -0
- package/dist/cjs/models/Transcript.js +75 -0
- package/dist/cjs/models/Transcript.js.map +1 -0
- package/dist/cjs/models/TranscriptList.js +84 -0
- package/dist/cjs/models/TranscriptList.js.map +1 -0
- package/dist/cjs/models/TranscriptMetadata.js +3 -0
- package/dist/cjs/models/TranscriptMetadata.js.map +1 -0
- package/dist/cjs/models/TranslationLanguage.js +3 -0
- package/dist/cjs/models/TranslationLanguage.js.map +1 -0
- package/dist/cjs/models/index.js +13 -0
- package/dist/cjs/models/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/parsers/captionTrackParser.js +96 -0
- package/dist/cjs/parsers/captionTrackParser.js.map +1 -0
- package/dist/cjs/parsers/videoIdParser.js +65 -0
- package/dist/cjs/parsers/videoIdParser.js.map +1 -0
- package/dist/cjs/parsers/watchHtmlParser.js +78 -0
- package/dist/cjs/parsers/watchHtmlParser.js.map +1 -0
- package/dist/cjs/parsers/xmlTranscriptParser.js +84 -0
- package/dist/cjs/parsers/xmlTranscriptParser.js.map +1 -0
- package/dist/cjs/potoken/AutoPoTokenProvider.js +203 -0
- package/dist/cjs/potoken/AutoPoTokenProvider.js.map +1 -0
- package/dist/cjs/potoken/HttpPoTokenProvider.js +105 -0
- package/dist/cjs/potoken/HttpPoTokenProvider.js.map +1 -0
- package/dist/cjs/potoken/NoopPoTokenProvider.js +18 -0
- package/dist/cjs/potoken/NoopPoTokenProvider.js.map +1 -0
- package/dist/cjs/potoken/baseScriptCache.js +41 -0
- package/dist/cjs/potoken/baseScriptCache.js.map +1 -0
- package/dist/cjs/potoken/index.js +14 -0
- package/dist/cjs/potoken/index.js.map +1 -0
- package/dist/cjs/potoken/types.js +10 -0
- package/dist/cjs/potoken/types.js.map +1 -0
- package/dist/cjs/util/htmlSanitizer.js +77 -0
- package/dist/cjs/util/htmlSanitizer.js.map +1 -0
- package/dist/cjs/util/proxyUrl.js +42 -0
- package/dist/cjs/util/proxyUrl.js.map +1 -0
- package/dist/cjs/util/retry.js +65 -0
- package/dist/cjs/util/retry.js.map +1 -0
- package/dist/esm/api/InnerTubeClient.d.ts +61 -0
- package/dist/esm/api/InnerTubeClient.d.ts.map +1 -0
- package/dist/esm/api/InnerTubeClient.js +198 -0
- package/dist/esm/api/InnerTubeClient.js.map +1 -0
- package/dist/esm/api/YouTubeTranscriptApi.d.ts +88 -0
- package/dist/esm/api/YouTubeTranscriptApi.d.ts.map +1 -0
- package/dist/esm/api/YouTubeTranscriptApi.js +157 -0
- package/dist/esm/api/YouTubeTranscriptApi.js.map +1 -0
- package/dist/esm/api/fetchStrategies.d.ts +20 -0
- package/dist/esm/api/fetchStrategies.d.ts.map +1 -0
- package/dist/esm/api/fetchStrategies.js +48 -0
- package/dist/esm/api/fetchStrategies.js.map +1 -0
- package/dist/esm/config/constants.d.ts +30 -0
- package/dist/esm/config/constants.d.ts.map +1 -0
- package/dist/esm/config/constants.js +31 -0
- package/dist/esm/config/constants.js.map +1 -0
- package/dist/esm/config/innerTubeContext.d.ts +47 -0
- package/dist/esm/config/innerTubeContext.d.ts.map +1 -0
- package/dist/esm/config/innerTubeContext.js +77 -0
- package/dist/esm/config/innerTubeContext.js.map +1 -0
- package/dist/esm/errors/BotDetected.d.ts +13 -0
- package/dist/esm/errors/BotDetected.d.ts.map +1 -0
- package/dist/esm/errors/BotDetected.js +16 -0
- package/dist/esm/errors/BotDetected.js.map +1 -0
- package/dist/esm/errors/FailedToCreateConsentCookie.d.ts +10 -0
- package/dist/esm/errors/FailedToCreateConsentCookie.d.ts.map +1 -0
- package/dist/esm/errors/FailedToCreateConsentCookie.js +13 -0
- package/dist/esm/errors/FailedToCreateConsentCookie.js.map +1 -0
- package/dist/esm/errors/InvalidVideoId.d.ts +9 -0
- package/dist/esm/errors/InvalidVideoId.d.ts.map +1 -0
- package/dist/esm/errors/InvalidVideoId.js +12 -0
- package/dist/esm/errors/InvalidVideoId.js.map +1 -0
- package/dist/esm/errors/IpBlocked.d.ts +10 -0
- package/dist/esm/errors/IpBlocked.d.ts.map +1 -0
- package/dist/esm/errors/IpBlocked.js +13 -0
- package/dist/esm/errors/IpBlocked.js.map +1 -0
- package/dist/esm/errors/NoTranscriptFound.d.ts +19 -0
- package/dist/esm/errors/NoTranscriptFound.d.ts.map +1 -0
- package/dist/esm/errors/NoTranscriptFound.js +19 -0
- package/dist/esm/errors/NoTranscriptFound.js.map +1 -0
- package/dist/esm/errors/NotTranslatable.d.ts +9 -0
- package/dist/esm/errors/NotTranslatable.d.ts.map +1 -0
- package/dist/esm/errors/NotTranslatable.js +11 -0
- package/dist/esm/errors/NotTranslatable.js.map +1 -0
- package/dist/esm/errors/PoTokenRequired.d.ts +10 -0
- package/dist/esm/errors/PoTokenRequired.d.ts.map +1 -0
- package/dist/esm/errors/PoTokenRequired.js +14 -0
- package/dist/esm/errors/PoTokenRequired.js.map +1 -0
- package/dist/esm/errors/TooManyRequests.d.ts +12 -0
- package/dist/esm/errors/TooManyRequests.d.ts.map +1 -0
- package/dist/esm/errors/TooManyRequests.js +15 -0
- package/dist/esm/errors/TooManyRequests.js.map +1 -0
- package/dist/esm/errors/TranscriptsDisabled.d.ts +9 -0
- package/dist/esm/errors/TranscriptsDisabled.d.ts.map +1 -0
- package/dist/esm/errors/TranscriptsDisabled.js +11 -0
- package/dist/esm/errors/TranscriptsDisabled.js.map +1 -0
- package/dist/esm/errors/TranslationLanguageNotAvailable.d.ts +9 -0
- package/dist/esm/errors/TranslationLanguageNotAvailable.d.ts.map +1 -0
- package/dist/esm/errors/TranslationLanguageNotAvailable.js +12 -0
- package/dist/esm/errors/TranslationLanguageNotAvailable.js.map +1 -0
- package/dist/esm/errors/VideoUnavailable.d.ts +9 -0
- package/dist/esm/errors/VideoUnavailable.d.ts.map +1 -0
- package/dist/esm/errors/VideoUnavailable.js +11 -0
- package/dist/esm/errors/VideoUnavailable.js.map +1 -0
- package/dist/esm/errors/VideoUnplayable.d.ts +12 -0
- package/dist/esm/errors/VideoUnplayable.d.ts.map +1 -0
- package/dist/esm/errors/VideoUnplayable.js +18 -0
- package/dist/esm/errors/VideoUnplayable.js.map +1 -0
- package/dist/esm/errors/YouTubeDataUnparsable.d.ts +9 -0
- package/dist/esm/errors/YouTubeDataUnparsable.d.ts.map +1 -0
- package/dist/esm/errors/YouTubeDataUnparsable.js +11 -0
- package/dist/esm/errors/YouTubeDataUnparsable.js.map +1 -0
- package/dist/esm/errors/YouTubeRequestFailed.d.ts +10 -0
- package/dist/esm/errors/YouTubeRequestFailed.d.ts.map +1 -0
- package/dist/esm/errors/YouTubeRequestFailed.js +14 -0
- package/dist/esm/errors/YouTubeRequestFailed.js.map +1 -0
- package/dist/esm/errors/YouTubeTranscriptError.d.ts +10 -0
- package/dist/esm/errors/YouTubeTranscriptError.d.ts.map +1 -0
- package/dist/esm/errors/YouTubeTranscriptError.js +15 -0
- package/dist/esm/errors/YouTubeTranscriptError.js.map +1 -0
- package/dist/esm/errors/index.d.ts +17 -0
- package/dist/esm/errors/index.d.ts.map +1 -0
- package/dist/esm/errors/index.js +16 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/formatters/Formatter.d.ts +33 -0
- package/dist/esm/formatters/Formatter.d.ts.map +1 -0
- package/dist/esm/formatters/Formatter.js +2 -0
- package/dist/esm/formatters/Formatter.js.map +1 -0
- package/dist/esm/formatters/JSONFormatter.d.ts +10 -0
- package/dist/esm/formatters/JSONFormatter.d.ts.map +1 -0
- package/dist/esm/formatters/JSONFormatter.js +20 -0
- package/dist/esm/formatters/JSONFormatter.js.map +1 -0
- package/dist/esm/formatters/PrettyPrintFormatter.d.ts +15 -0
- package/dist/esm/formatters/PrettyPrintFormatter.d.ts.map +1 -0
- package/dist/esm/formatters/PrettyPrintFormatter.js +22 -0
- package/dist/esm/formatters/PrettyPrintFormatter.js.map +1 -0
- package/dist/esm/formatters/SRTFormatter.d.ts +22 -0
- package/dist/esm/formatters/SRTFormatter.d.ts.map +1 -0
- package/dist/esm/formatters/SRTFormatter.js +35 -0
- package/dist/esm/formatters/SRTFormatter.js.map +1 -0
- package/dist/esm/formatters/TextFormatter.d.ts +10 -0
- package/dist/esm/formatters/TextFormatter.d.ts.map +1 -0
- package/dist/esm/formatters/TextFormatter.js +16 -0
- package/dist/esm/formatters/TextFormatter.js.map +1 -0
- package/dist/esm/formatters/WebVTTFormatter.d.ts +22 -0
- package/dist/esm/formatters/WebVTTFormatter.d.ts.map +1 -0
- package/dist/esm/formatters/WebVTTFormatter.js +35 -0
- package/dist/esm/formatters/WebVTTFormatter.js.map +1 -0
- package/dist/esm/formatters/base.d.ts +25 -0
- package/dist/esm/formatters/base.d.ts.map +1 -0
- package/dist/esm/formatters/base.js +55 -0
- package/dist/esm/formatters/base.js.map +1 -0
- package/dist/esm/formatters/index.d.ts +8 -0
- package/dist/esm/formatters/index.d.ts.map +1 -0
- package/dist/esm/formatters/index.js +7 -0
- package/dist/esm/formatters/index.js.map +1 -0
- package/dist/esm/http/cookieJar.d.ts +39 -0
- package/dist/esm/http/cookieJar.d.ts.map +1 -0
- package/dist/esm/http/cookieJar.js +87 -0
- package/dist/esm/http/cookieJar.js.map +1 -0
- package/dist/esm/http/httpClient.d.ts +88 -0
- package/dist/esm/http/httpClient.d.ts.map +1 -0
- package/dist/esm/http/httpClient.js +191 -0
- package/dist/esm/http/httpClient.js.map +1 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/models/FetchedTranscript.d.ts +49 -0
- package/dist/esm/models/FetchedTranscript.d.ts.map +1 -0
- package/dist/esm/models/FetchedTranscript.js +76 -0
- package/dist/esm/models/FetchedTranscript.js.map +1 -0
- package/dist/esm/models/FetchedTranscriptSnippet.d.ts +15 -0
- package/dist/esm/models/FetchedTranscriptSnippet.d.ts.map +1 -0
- package/dist/esm/models/FetchedTranscriptSnippet.js +25 -0
- package/dist/esm/models/FetchedTranscriptSnippet.js.map +1 -0
- package/dist/esm/models/FormattedTranscript.d.ts +9 -0
- package/dist/esm/models/FormattedTranscript.d.ts.map +1 -0
- package/dist/esm/models/FormattedTranscript.js +2 -0
- package/dist/esm/models/FormattedTranscript.js.map +1 -0
- package/dist/esm/models/Transcript.d.ts +36 -0
- package/dist/esm/models/Transcript.d.ts.map +1 -0
- package/dist/esm/models/Transcript.js +71 -0
- package/dist/esm/models/Transcript.js.map +1 -0
- package/dist/esm/models/TranscriptList.d.ts +48 -0
- package/dist/esm/models/TranscriptList.d.ts.map +1 -0
- package/dist/esm/models/TranscriptList.js +79 -0
- package/dist/esm/models/TranscriptList.js.map +1 -0
- package/dist/esm/models/TranscriptMetadata.d.ts +10 -0
- package/dist/esm/models/TranscriptMetadata.d.ts.map +1 -0
- package/dist/esm/models/TranscriptMetadata.js +2 -0
- package/dist/esm/models/TranscriptMetadata.js.map +1 -0
- package/dist/esm/models/TranslationLanguage.d.ts +8 -0
- package/dist/esm/models/TranslationLanguage.d.ts.map +1 -0
- package/dist/esm/models/TranslationLanguage.js +2 -0
- package/dist/esm/models/TranslationLanguage.js.map +1 -0
- package/dist/esm/models/index.d.ts +8 -0
- package/dist/esm/models/index.d.ts.map +1 -0
- package/dist/esm/models/index.js +5 -0
- package/dist/esm/models/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/parsers/captionTrackParser.d.ts +29 -0
- package/dist/esm/parsers/captionTrackParser.d.ts.map +1 -0
- package/dist/esm/parsers/captionTrackParser.js +91 -0
- package/dist/esm/parsers/captionTrackParser.js.map +1 -0
- package/dist/esm/parsers/videoIdParser.d.ts +11 -0
- package/dist/esm/parsers/videoIdParser.d.ts.map +1 -0
- package/dist/esm/parsers/videoIdParser.js +61 -0
- package/dist/esm/parsers/videoIdParser.js.map +1 -0
- package/dist/esm/parsers/watchHtmlParser.d.ts +33 -0
- package/dist/esm/parsers/watchHtmlParser.d.ts.map +1 -0
- package/dist/esm/parsers/watchHtmlParser.js +70 -0
- package/dist/esm/parsers/watchHtmlParser.js.map +1 -0
- package/dist/esm/parsers/xmlTranscriptParser.d.ts +17 -0
- package/dist/esm/parsers/xmlTranscriptParser.d.ts.map +1 -0
- package/dist/esm/parsers/xmlTranscriptParser.js +81 -0
- package/dist/esm/parsers/xmlTranscriptParser.js.map +1 -0
- package/dist/esm/potoken/AutoPoTokenProvider.d.ts +28 -0
- package/dist/esm/potoken/AutoPoTokenProvider.d.ts.map +1 -0
- package/dist/esm/potoken/AutoPoTokenProvider.js +166 -0
- package/dist/esm/potoken/AutoPoTokenProvider.js.map +1 -0
- package/dist/esm/potoken/HttpPoTokenProvider.d.ts +41 -0
- package/dist/esm/potoken/HttpPoTokenProvider.d.ts.map +1 -0
- package/dist/esm/potoken/HttpPoTokenProvider.js +101 -0
- package/dist/esm/potoken/HttpPoTokenProvider.js.map +1 -0
- package/dist/esm/potoken/NoopPoTokenProvider.d.ts +12 -0
- package/dist/esm/potoken/NoopPoTokenProvider.d.ts.map +1 -0
- package/dist/esm/potoken/NoopPoTokenProvider.js +14 -0
- package/dist/esm/potoken/NoopPoTokenProvider.js.map +1 -0
- package/dist/esm/potoken/baseScriptCache.d.ts +28 -0
- package/dist/esm/potoken/baseScriptCache.d.ts.map +1 -0
- package/dist/esm/potoken/baseScriptCache.js +37 -0
- package/dist/esm/potoken/baseScriptCache.js.map +1 -0
- package/dist/esm/potoken/index.d.ts +10 -0
- package/dist/esm/potoken/index.d.ts.map +1 -0
- package/dist/esm/potoken/index.js +6 -0
- package/dist/esm/potoken/index.js.map +1 -0
- package/dist/esm/potoken/types.d.ts +40 -0
- package/dist/esm/potoken/types.d.ts.map +1 -0
- package/dist/esm/potoken/types.js +7 -0
- package/dist/esm/potoken/types.js.map +1 -0
- package/dist/esm/util/htmlSanitizer.d.ts +21 -0
- package/dist/esm/util/htmlSanitizer.d.ts.map +1 -0
- package/dist/esm/util/htmlSanitizer.js +69 -0
- package/dist/esm/util/htmlSanitizer.js.map +1 -0
- package/dist/esm/util/proxyUrl.d.ts +22 -0
- package/dist/esm/util/proxyUrl.d.ts.map +1 -0
- package/dist/esm/util/proxyUrl.js +39 -0
- package/dist/esm/util/proxyUrl.js.map +1 -0
- package/dist/esm/util/retry.d.ts +37 -0
- package/dist/esm/util/retry.d.ts.map +1 -0
- package/dist/esm/util/retry.js +60 -0
- package/dist/esm/util/retry.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapHttpStatusToError = exports.YouTubeTranscriptApi = void 0;
|
|
4
|
+
const innerTubeContext_js_1 = require("../config/innerTubeContext.js");
|
|
5
|
+
const index_js_1 = require("../errors/index.js");
|
|
6
|
+
const cookieJar_js_1 = require("../http/cookieJar.js");
|
|
7
|
+
const httpClient_js_1 = require("../http/httpClient.js");
|
|
8
|
+
const index_js_2 = require("../models/index.js");
|
|
9
|
+
const NoopPoTokenProvider_js_1 = require("../potoken/NoopPoTokenProvider.js");
|
|
10
|
+
const InnerTubeClient_js_1 = require("./InnerTubeClient.js");
|
|
11
|
+
Object.defineProperty(exports, "mapHttpStatusToError", { enumerable: true, get: function () { return InnerTubeClient_js_1.mapHttpStatusToError; } });
|
|
12
|
+
/**
|
|
13
|
+
* Public façade — the single entry-point most users will need.
|
|
14
|
+
*
|
|
15
|
+
* Mirrors `YouTubeTranscriptApi` from the Python library:
|
|
16
|
+
*
|
|
17
|
+
* const api = new YouTubeTranscriptApi();
|
|
18
|
+
* const t = await api.fetch(videoId);
|
|
19
|
+
* const list = await api.list(videoId);
|
|
20
|
+
* const translated = await api.translate(videoId, 'fr');
|
|
21
|
+
* const langs = await api.translationLanguages(videoId, 'en');
|
|
22
|
+
*/
|
|
23
|
+
class YouTubeTranscriptApi {
|
|
24
|
+
http;
|
|
25
|
+
innerTube;
|
|
26
|
+
jar;
|
|
27
|
+
poTokenProvider;
|
|
28
|
+
poTokenFallback;
|
|
29
|
+
lastStrategy = null;
|
|
30
|
+
constructor(config = {}) {
|
|
31
|
+
this.jar = new cookieJar_js_1.CookieJar();
|
|
32
|
+
if (config.cookies) {
|
|
33
|
+
for (const c of config.cookies) {
|
|
34
|
+
this.jar.set({ name: c.name, value: c.value, domain: c.domain, path: c.path });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.http = new httpClient_js_1.HttpClient({
|
|
38
|
+
userAgent: config.userAgent,
|
|
39
|
+
cookies: this.jar,
|
|
40
|
+
defaultHeaders: config.headers,
|
|
41
|
+
proxyUrl: config.proxyConfig?.url,
|
|
42
|
+
fetchImpl: config.fetchImpl,
|
|
43
|
+
});
|
|
44
|
+
this.innerTube = new InnerTubeClient_js_1.InnerTubeClient({ http: this.http });
|
|
45
|
+
this.poTokenProvider = config.poTokenProvider ?? new NoopPoTokenProvider_js_1.NoopPoTokenProvider();
|
|
46
|
+
this.poTokenFallback = config.poTokenFallback === true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Replace the PoToken provider after construction.
|
|
50
|
+
*/
|
|
51
|
+
setPoTokenProvider(provider) {
|
|
52
|
+
this.lastStrategy = null; // force re-evaluation
|
|
53
|
+
this.poTokenProvider = provider;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch a transcript with language fallback.
|
|
57
|
+
*
|
|
58
|
+
* @param videoId YouTube video id (or full URL).
|
|
59
|
+
* @param opts `languages`: ordered language codes to try.
|
|
60
|
+
* `preserveFormatting`: keep `<i>`/`<b>` tags.
|
|
61
|
+
*/
|
|
62
|
+
async fetch(videoId, opts = {}) {
|
|
63
|
+
const list = await this.list(videoId);
|
|
64
|
+
const transcript = list.findTranscript(opts.languages ?? ['en']);
|
|
65
|
+
return transcript.fetch(opts.preserveFormatting ?? false);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List all available transcript tracks for a video.
|
|
69
|
+
*/
|
|
70
|
+
async list(videoId) {
|
|
71
|
+
const apiKey = await this.resolveApiKey(videoId);
|
|
72
|
+
const strategy = await this.runStrategy(videoId, apiKey);
|
|
73
|
+
const playerJson = await this.innerTube.fetchPlayer(videoId, apiKey, strategy.context);
|
|
74
|
+
const { captionTracks, translationLanguages } = this.innerTube.extractCaptionTracks(playerJson, videoId);
|
|
75
|
+
this.lastStrategy = { context: strategy.context, apiKey };
|
|
76
|
+
return (0, index_js_2.buildTranscriptList)(this.innerTube, videoId, captionTracks.map((t) => ({
|
|
77
|
+
baseUrl: t.baseUrl,
|
|
78
|
+
languageCode: t.languageCode,
|
|
79
|
+
name: t.name,
|
|
80
|
+
kind: t.kind,
|
|
81
|
+
isTranslatable: t.isTranslatable,
|
|
82
|
+
})), translationLanguages);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Translate an available track into another language and return its cues.
|
|
86
|
+
*/
|
|
87
|
+
async translate(videoId, targetLang, opts = {}) {
|
|
88
|
+
const list = await this.list(videoId);
|
|
89
|
+
const src = list.findTranscript(opts.sourceLanguage ? [opts.sourceLanguage] : ['en']);
|
|
90
|
+
const translated = src.translate(targetLang);
|
|
91
|
+
return translated.fetch(opts.preserveFormatting ?? false);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns the list of languages this video's `sourceLanguage` track can be
|
|
95
|
+
* translated into.
|
|
96
|
+
*/
|
|
97
|
+
async translationLanguages(videoId, sourceLanguage) {
|
|
98
|
+
const list = await this.list(videoId);
|
|
99
|
+
const src = list.findTranscript([sourceLanguage]);
|
|
100
|
+
return src.translationLanguages;
|
|
101
|
+
}
|
|
102
|
+
async resolveApiKey(videoId) {
|
|
103
|
+
if (this.lastStrategy?.apiKey)
|
|
104
|
+
return this.lastStrategy.apiKey;
|
|
105
|
+
let html;
|
|
106
|
+
try {
|
|
107
|
+
html = await this.innerTube.fetchWatchHtml(videoId);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err instanceof index_js_1.FailedToCreateConsentCookie)
|
|
111
|
+
throw err;
|
|
112
|
+
if (err instanceof index_js_1.IpBlocked)
|
|
113
|
+
throw err;
|
|
114
|
+
if (err instanceof index_js_1.VideoUnavailable)
|
|
115
|
+
throw err;
|
|
116
|
+
if (err instanceof index_js_1.VideoUnplayable)
|
|
117
|
+
throw err;
|
|
118
|
+
if (err instanceof index_js_1.TranscriptsDisabled)
|
|
119
|
+
throw err;
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
return this.innerTube.extractApiKey(html, videoId);
|
|
123
|
+
}
|
|
124
|
+
async runStrategy(videoId, apiKey) {
|
|
125
|
+
// Layer 1: ANDROID
|
|
126
|
+
try {
|
|
127
|
+
await this.tryPlayer(videoId, apiKey, innerTubeContext_js_1.ANDROID_INNERTUBE_CONTEXT);
|
|
128
|
+
return { context: innerTubeContext_js_1.ANDROID_INNERTUBE_CONTEXT };
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const fallbackEligible = err instanceof index_js_1.BotDetected ||
|
|
132
|
+
err instanceof index_js_1.IpBlocked ||
|
|
133
|
+
err instanceof index_js_1.TranscriptsDisabled ||
|
|
134
|
+
err instanceof index_js_1.VideoUnplayable;
|
|
135
|
+
if (!fallbackEligible || !this.poTokenFallback || this.poTokenProvider instanceof NoopPoTokenProvider_js_1.NoopPoTokenProvider) {
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
// Layer 2: WEB + PoToken
|
|
139
|
+
try {
|
|
140
|
+
await this.poTokenProvider.generateForVideo(videoId);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw err; // Surface the original Layer 1 error.
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
await this.tryPlayer(videoId, apiKey, innerTubeContext_js_1.WEB_INNERTUBE_CONTEXT);
|
|
147
|
+
return { context: innerTubeContext_js_1.WEB_INNERTUBE_CONTEXT };
|
|
148
|
+
}
|
|
149
|
+
catch (err2) {
|
|
150
|
+
throw err2 instanceof Error ? err2 : new index_js_1.YouTubeRequestFailed(videoId, 0, String(err2), '');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async tryPlayer(videoId, apiKey, ctx) {
|
|
155
|
+
const playerJson = await this.innerTube.fetchPlayer(videoId, apiKey, ctx);
|
|
156
|
+
this.innerTube.extractCaptionTracks(playerJson, videoId);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.YouTubeTranscriptApi = YouTubeTranscriptApi;
|
|
160
|
+
//# 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,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runFetchStrategy = runFetchStrategy;
|
|
4
|
+
const innerTubeContext_js_1 = require("../config/innerTubeContext.js");
|
|
5
|
+
const index_js_1 = require("../errors/index.js");
|
|
6
|
+
/**
|
|
7
|
+
* Strategy: try ANDROID InnerTube first; on `BotDetected` / `IpBlocked`,
|
|
8
|
+
* optionally fall back to WEB + PoToken if the user has supplied a provider.
|
|
9
|
+
*/
|
|
10
|
+
async function runFetchStrategy(client, videoId, apiKey, opts = {}) {
|
|
11
|
+
// Layer 1: ANDROID
|
|
12
|
+
const androidResult = await tryClient(client, videoId, apiKey, innerTubeContext_js_1.ANDROID_INNERTUBE_CONTEXT);
|
|
13
|
+
if (androidResult.ok) {
|
|
14
|
+
return { context: innerTubeContext_js_1.ANDROID_INNERTUBE_CONTEXT, poToken: undefined, visitorData: undefined };
|
|
15
|
+
}
|
|
16
|
+
// Layer 2: WEB + PoToken (opt-in)
|
|
17
|
+
if (opts.enableFallback === true &&
|
|
18
|
+
opts.poTokenProvider !== undefined &&
|
|
19
|
+
isFallbackTrigger(androidResult.error)) {
|
|
20
|
+
const tokenResult = await opts.poTokenProvider.generateForVideo(videoId);
|
|
21
|
+
const webResult = await tryClient(client, videoId, apiKey, innerTubeContext_js_1.WEB_INNERTUBE_CONTEXT, { poToken: tokenResult.poToken, visitorData: tokenResult.visitorData });
|
|
22
|
+
if (webResult.ok) {
|
|
23
|
+
return {
|
|
24
|
+
context: innerTubeContext_js_1.WEB_INNERTUBE_CONTEXT,
|
|
25
|
+
poToken: tokenResult.poToken,
|
|
26
|
+
visitorData: tokenResult.visitorData,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
throw webResult.error;
|
|
30
|
+
}
|
|
31
|
+
throw androidResult.error;
|
|
32
|
+
}
|
|
33
|
+
async function tryClient(client, videoId, apiKey, ctx,
|
|
34
|
+
// Reserved for future use (e.g. attaching PoToken body field in WEB path).
|
|
35
|
+
_token) {
|
|
36
|
+
try {
|
|
37
|
+
const data = await client.fetchPlayer(videoId, apiKey, ctx);
|
|
38
|
+
client.extractCaptionTracks(data, videoId);
|
|
39
|
+
return { ok: true, error: new Error('unreachable') };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return {
|
|
43
|
+
ok: false,
|
|
44
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isFallbackTrigger(err) {
|
|
49
|
+
return err instanceof index_js_1.BotDetected || err instanceof index_js_1.IpBlocked;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=fetchStrategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchStrategies.js","sourceRoot":"","sources":["../../../src/api/fetchStrategies.ts"],"names":[],"mappings":";;AAkBA,4CAwCC;AA1DD,uEAAwH;AACxH,iDAA4D;AAa5D;;;GAGG;AACI,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,+CAAyB,CAAC,CAAC;IAC1F,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,+CAAyB,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,2CAAqB,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,2CAAqB;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,sBAAW,IAAI,GAAG,YAAY,oBAAS,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* YouTube URL constants and default request settings.
|
|
4
|
+
*
|
|
5
|
+
* These mirror the values hardcoded in the Python `youtube-transcript-api`
|
|
6
|
+
* library (v1.2.4), with the addition of an explicit default User-Agent
|
|
7
|
+
* (the Python library used `python-requests/x.y.z`; we pick a stable UA
|
|
8
|
+
* matching a recent Android Chrome so PoToken challenges behave consistently).
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.VIDEO_ID_REGEX = exports.VIDEO_ID_LENGTH = exports.DEFAULT_POTOKEN_TTL_MS = exports.BASE_JS_CACHE_TTL_MS = exports.DEFAULT_RETRIES_WHEN_BLOCKED = exports.DEFAULT_ACCEPT_LANGUAGE = exports.DEFAULT_USER_AGENT = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.BASE_JS_HOST = exports.INNERTUBE_API_URL = exports.WATCH_URL = void 0;
|
|
12
|
+
exports.WATCH_URL = 'https://www.youtube.com/watch?v={video_id}';
|
|
13
|
+
/** InnerTube API endpoint. The `key` query parameter is the INNERTUBE_API_KEY. */
|
|
14
|
+
exports.INNERTUBE_API_URL = 'https://www.youtube.com/youtubei/v1/player?key={api_key}';
|
|
15
|
+
/** YouTube's CDN host for player JS (base.js). Used by the AutoPoTokenProvider. */
|
|
16
|
+
exports.BASE_JS_HOST = 'https://www.youtube.com';
|
|
17
|
+
/** Default request timeout for the inner fetch wrappers (Node global fetch). */
|
|
18
|
+
exports.DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
19
|
+
/** Default User-Agent: a recent Android Chrome — PoToken-friendly. */
|
|
20
|
+
exports.DEFAULT_USER_AGENT = 'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 ' +
|
|
21
|
+
'(KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';
|
|
22
|
+
/** Default Accept-Language header (matches Python library default). */
|
|
23
|
+
exports.DEFAULT_ACCEPT_LANGUAGE = 'en-US';
|
|
24
|
+
/** Cap on retries for IP-block responses. Mirrors Python's proxy_config default. */
|
|
25
|
+
exports.DEFAULT_RETRIES_WHEN_BLOCKED = 3;
|
|
26
|
+
/** base.js refresh interval (5 minutes). YouTube re-rolls obfuscation frequently. */
|
|
27
|
+
exports.BASE_JS_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
28
|
+
/** PoToken TTL — slightly conservative (YouTube uses ~12-24h, we refresh at 12h). */
|
|
29
|
+
exports.DEFAULT_POTOKEN_TTL_MS = 12 * 60 * 60 * 1000;
|
|
30
|
+
/** Maximum length of a valid YouTube video id. */
|
|
31
|
+
exports.VIDEO_ID_LENGTH = 11;
|
|
32
|
+
/** Regex for the canonical 11-char video id (alphanumeric + `-_`). */
|
|
33
|
+
exports.VIDEO_ID_REGEX = /^[A-Za-z0-9_-]{11}$/;
|
|
34
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/config/constants.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEU,QAAA,SAAS,GAAG,4CAA4C,CAAC;AAEtE,kFAAkF;AACrE,QAAA,iBAAiB,GAAG,0DAA0D,CAAC;AAE5F,mFAAmF;AACtE,QAAA,YAAY,GAAG,yBAAyB,CAAC;AAEtD,gFAAgF;AACnE,QAAA,0BAA0B,GAAG,MAAM,CAAC;AAEjD,sEAAsE;AACzD,QAAA,kBAAkB,GAC7B,+DAA+D;IAC/D,2DAA2D,CAAC;AAE9D,uEAAuE;AAC1D,QAAA,uBAAuB,GAAG,OAAO,CAAC;AAE/C,oFAAoF;AACvE,QAAA,4BAA4B,GAAG,CAAC,CAAC;AAE9C,qFAAqF;AACxE,QAAA,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,qFAAqF;AACxE,QAAA,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,kDAAkD;AACrC,QAAA,eAAe,GAAG,EAAE,CAAC;AAElC,sEAAsE;AACzD,QAAA,cAAc,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* InnerTube client contexts.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the Python library's hardcoded ANDROID context
|
|
6
|
+
* (`{"client":{"clientName":"ANDROID","clientVersion":"20.10.38"}}`)
|
|
7
|
+
* which sidesteps the web client's PoToken requirement. We also expose
|
|
8
|
+
* WEB + TVHTML5 contexts as escape hatches.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.TVHTML5_EMBEDDED_PLAYER_CONTEXT = exports.WEB_INNERTUBE_CONTEXT = exports.ANDROID_INNERTUBE_CONTEXT = void 0;
|
|
12
|
+
exports.clientNameHeader = clientNameHeader;
|
|
13
|
+
exports.clientVersionHeader = clientVersionHeader;
|
|
14
|
+
/**
|
|
15
|
+
* Android InnerTube client — the primary path. Matches Python 1.2.4.
|
|
16
|
+
*
|
|
17
|
+
* YouTube historically does NOT require PoToken from ANDROID clients when
|
|
18
|
+
* the request also carries `X-YouTube-Client-Name: 3` and the matching UA.
|
|
19
|
+
*/
|
|
20
|
+
exports.ANDROID_INNERTUBE_CONTEXT = {
|
|
21
|
+
client: {
|
|
22
|
+
clientName: 'ANDROID',
|
|
23
|
+
clientVersion: '20.10.38',
|
|
24
|
+
hl: 'en',
|
|
25
|
+
gl: 'US',
|
|
26
|
+
androidSdkVersion: 30,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Web InnerTube client — used as the fallback path with PoToken.
|
|
31
|
+
*
|
|
32
|
+
* Requires a valid PoToken + visitorData; otherwise InnerTube returns
|
|
33
|
+
* `LOGIN_REQUIRED` / BotGuard.
|
|
34
|
+
*/
|
|
35
|
+
exports.WEB_INNERTUBE_CONTEXT = {
|
|
36
|
+
client: {
|
|
37
|
+
clientName: 'WEB',
|
|
38
|
+
clientVersion: '2.20240101.00.00',
|
|
39
|
+
hl: 'en',
|
|
40
|
+
gl: 'US',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* TVHTML5_SIMPLY_EMBEDDED_PLAYER — used as a last-resort fallback. Generally
|
|
45
|
+
* less restrictive than WEB but more than ANDROID.
|
|
46
|
+
*/
|
|
47
|
+
exports.TVHTML5_EMBEDDED_PLAYER_CONTEXT = {
|
|
48
|
+
client: {
|
|
49
|
+
clientName: 'TVHTML5_SIMPLY_EMBEDDED_PLAYER',
|
|
50
|
+
clientVersion: '2.0',
|
|
51
|
+
hl: 'en',
|
|
52
|
+
gl: 'US',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Returns the numeric `X-YouTube-Client-Name` header value for a given
|
|
57
|
+
* client context, used when issuing InnerTube requests.
|
|
58
|
+
*/
|
|
59
|
+
function clientNameHeader(ctx) {
|
|
60
|
+
switch (ctx.client.clientName) {
|
|
61
|
+
case 'ANDROID':
|
|
62
|
+
return '3';
|
|
63
|
+
case 'WEB':
|
|
64
|
+
return '1';
|
|
65
|
+
case 'TVHTML5':
|
|
66
|
+
case 'TVHTML5_SIMPLY_EMBEDDED_PLAYER':
|
|
67
|
+
return '85';
|
|
68
|
+
case 'IOS':
|
|
69
|
+
return '5';
|
|
70
|
+
case 'MWEB':
|
|
71
|
+
return '2';
|
|
72
|
+
default:
|
|
73
|
+
return '1';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns the `X-YouTube-Client-Version` header value.
|
|
78
|
+
*/
|
|
79
|
+
function clientVersionHeader(ctx) {
|
|
80
|
+
return ctx.client.clientVersion;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=innerTubeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"innerTubeContext.js","sourceRoot":"","sources":["../../../src/config/innerTubeContext.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA6DH,4CAgBC;AAKD,kDAEC;AAvED;;;;;GAKG;AACU,QAAA,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;AACU,QAAA,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;AACU,QAAA,+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,SAAgB,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,SAAgB,mBAAmB,CAAC,GAAqB;IACvD,OAAO,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BotDetected = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when YouTube's InnerTube responds with LOGIN_REQUIRED + BotGuard reason
|
|
7
|
+
* (the bent-quote string `Sign in to confirm you're not a bot`).
|
|
8
|
+
*
|
|
9
|
+
* This is the canonical "PoToken required" signal in 1.2.4. Mirrors Python's
|
|
10
|
+
* `RequestBlocked` when triggered by BotGuard (mapped to `IpBlocked` there;
|
|
11
|
+
* we split it into a dedicated class for finer control).
|
|
12
|
+
*/
|
|
13
|
+
class BotDetected extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
14
|
+
constructor(videoId) {
|
|
15
|
+
super(`YouTube BotGuard blocked the request for video "${videoId}". ` +
|
|
16
|
+
`Provide a PoToken provider (e.g. AutoPoTokenProvider) or use a proxy.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.BotDetected = BotDetected;
|
|
20
|
+
//# sourceMappingURL=BotDetected.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BotDetected.js","sourceRoot":"","sources":["../../../src/errors/BotDetected.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;;;;;GAOG;AACH,MAAa,WAAY,SAAQ,kDAAsB;IACrD,YAAY,OAAe;QACzB,KAAK,CACH,mDAAmD,OAAO,KAAK;YAC7D,uEAAuE,CAC1E,CAAC;IACJ,CAAC;CACF;AAPD,kCAOC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FailedToCreateConsentCookie = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when we hit the EU consent gate twice and cannot extract the `v`
|
|
7
|
+
* parameter from the form to set the CONSENT cookie. Mirrors Python's
|
|
8
|
+
* `FailedToCreateConsentCookie`.
|
|
9
|
+
*/
|
|
10
|
+
class FailedToCreateConsentCookie extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
11
|
+
constructor(videoId) {
|
|
12
|
+
super(`Failed to automatically give consent to YouTube for video "${videoId}". ` +
|
|
13
|
+
`Please set the CONSENT cookie manually and pass it via the \`cookies\` option.`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.FailedToCreateConsentCookie = FailedToCreateConsentCookie;
|
|
17
|
+
//# sourceMappingURL=FailedToCreateConsentCookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedToCreateConsentCookie.js","sourceRoot":"","sources":["../../../src/errors/FailedToCreateConsentCookie.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;;GAIG;AACH,MAAa,2BAA4B,SAAQ,kDAAsB;IACrE,YAAY,OAAe;QACzB,KAAK,CACH,8DAA8D,OAAO,KAAK;YACxE,gFAAgF,CACnF,CAAC;IACJ,CAAC;CACF;AAPD,kEAOC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidVideoId = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when the provided video id cannot be parsed or is invalid.
|
|
7
|
+
* Mirrors `InvalidVideoId` from the Python library.
|
|
8
|
+
*/
|
|
9
|
+
class InvalidVideoId extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
constructor(videoId) {
|
|
11
|
+
super(`You provided an invalid video ID: "${videoId}". ` +
|
|
12
|
+
`Video IDs must be 11 characters long or be a valid YouTube URL.`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.InvalidVideoId = InvalidVideoId;
|
|
16
|
+
//# sourceMappingURL=InvalidVideoId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvalidVideoId.js","sourceRoot":"","sources":["../../../src/errors/InvalidVideoId.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,cAAe,SAAQ,kDAAsB;IACxD,YAAY,OAAe;QACzB,KAAK,CACH,sCAAsC,OAAO,KAAK;YAChD,iEAAiE,CACpE,CAAC;IACJ,CAAC;CACF;AAPD,wCAOC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IpBlocked = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when YouTube blocks the request due to IP-level detection
|
|
7
|
+
* (CAPTCHA, rate limit, geo-block). Matches Python's `IpBlocked`.
|
|
8
|
+
*/
|
|
9
|
+
class IpBlocked extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
statusCode;
|
|
11
|
+
constructor(videoId, statusCode) {
|
|
12
|
+
super(`IP-blocked by YouTube while fetching video "${videoId}"${statusCode ? ` (status ${statusCode})` : ''}. ` + `Try a proxy, custom cookies, or a PoToken provider.`);
|
|
13
|
+
this.statusCode = statusCode;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.IpBlocked = IpBlocked;
|
|
17
|
+
//# sourceMappingURL=IpBlocked.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpBlocked.js","sourceRoot":"","sources":["../../../src/errors/IpBlocked.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,SAAU,SAAQ,kDAAsB;IAC1C,UAAU,CAAU;IAE7B,YAAY,OAAe,EAAE,UAAmB;QAC9C,KAAK,CACH,+CAA+C,OAAO,IACpD,UAAU,CAAC,CAAC,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC,CAAC,EAC3C,IAAI,GAAG,qDAAqD,CAC7D,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAXD,8BAWC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NoTranscriptFound = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when none of the requested language codes match any available
|
|
7
|
+
* caption track. Mirrors `NoTranscriptFound` from the Python library.
|
|
8
|
+
*/
|
|
9
|
+
class NoTranscriptFound extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
videoId;
|
|
11
|
+
requestedLanguageCodes;
|
|
12
|
+
transcriptData;
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
super(opts.customMessage ??
|
|
15
|
+
`No transcripts were found for video "${opts.videoId}" in any of the requested ` +
|
|
16
|
+
`language codes: [${opts.requestedLanguageCodes.join(', ')}].`);
|
|
17
|
+
this.videoId = opts.videoId;
|
|
18
|
+
this.requestedLanguageCodes = opts.requestedLanguageCodes;
|
|
19
|
+
this.transcriptData = opts.transcriptData;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.NoTranscriptFound = NoTranscriptFound;
|
|
23
|
+
//# sourceMappingURL=NoTranscriptFound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoTranscriptFound.js","sourceRoot":"","sources":["../../../src/errors/NoTranscriptFound.ts"],"names":[],"mappings":";;;AACA,2EAAqE;AASrE;;;GAGG;AACH,MAAa,iBAAkB,SAAQ,kDAAsB;IAClD,OAAO,CAAS;IAChB,sBAAsB,CAAoB;IAC1C,cAAc,CAA6B;IAEpD,YAAY,IAA8B;QACxC,KAAK,CACH,IAAI,CAAC,aAAa;YAChB,wCAAwC,IAAI,CAAC,OAAO,4BAA4B;gBAC9E,oBAAoB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACnE,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC5C,CAAC;CACF;AAfD,8CAeC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotTranslatable = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when the user asks to translate a transcript that is not translatable.
|
|
7
|
+
* Mirrors `NotTranslatable` from the Python library.
|
|
8
|
+
*/
|
|
9
|
+
class NotTranslatable extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
constructor(videoId) {
|
|
11
|
+
super(`The transcript for video "${videoId}" is not translatable.`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.NotTranslatable = NotTranslatable;
|
|
15
|
+
//# sourceMappingURL=NotTranslatable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotTranslatable.js","sourceRoot":"","sources":["../../../src/errors/NotTranslatable.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,eAAgB,SAAQ,kDAAsB;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,6BAA6B,OAAO,wBAAwB,CAAC,CAAC;IACtE,CAAC;CACF;AAJD,0CAIC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PoTokenRequired = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when the fetched caption baseUrl contains the sentinel `&exp=xpe`
|
|
7
|
+
* indicating that a PoToken is mandatory. This is the passive detection from
|
|
8
|
+
* the Python library (`PoTokenRequired`).
|
|
9
|
+
*/
|
|
10
|
+
class PoTokenRequired extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
11
|
+
constructor(videoId) {
|
|
12
|
+
super(`PoToken is required to fetch the transcript for video "${videoId}". ` +
|
|
13
|
+
`Please open an issue at https://github.com/jdepoix/youtube-transcript-api/issues ` +
|
|
14
|
+
`and provide this video ID.`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.PoTokenRequired = PoTokenRequired;
|
|
18
|
+
//# sourceMappingURL=PoTokenRequired.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PoTokenRequired.js","sourceRoot":"","sources":["../../../src/errors/PoTokenRequired.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;;GAIG;AACH,MAAa,eAAgB,SAAQ,kDAAsB;IACzD,YAAY,OAAe;QACzB,KAAK,CACH,0DAA0D,OAAO,KAAK;YACpE,mFAAmF;YACnF,4BAA4B,CAC/B,CAAC;IACJ,CAAC;CACF;AARD,0CAQC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TooManyRequests = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when YouTube returns HTTP 429.
|
|
7
|
+
*
|
|
8
|
+
* Note: the Python library actually maps 429 to `IpBlocked`; we keep both classes
|
|
9
|
+
* distinct for clarity, and the InnerTubeClient maps to IpBlocked by default.
|
|
10
|
+
* `TooManyRequests` is reserved for explicit rate-limit responses elsewhere.
|
|
11
|
+
*/
|
|
12
|
+
class TooManyRequests extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
13
|
+
constructor(videoId) {
|
|
14
|
+
super(`YouTube is receiving too many requests from your IP for video "${videoId}". ` +
|
|
15
|
+
`Please slow down or use a proxy.`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.TooManyRequests = TooManyRequests;
|
|
19
|
+
//# sourceMappingURL=TooManyRequests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TooManyRequests.js","sourceRoot":"","sources":["../../../src/errors/TooManyRequests.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;;;;GAMG;AACH,MAAa,eAAgB,SAAQ,kDAAsB;IACzD,YAAY,OAAe;QACzB,KAAK,CACH,kEAAkE,OAAO,KAAK;YAC5E,kCAAkC,CACrC,CAAC;IACJ,CAAC;CACF;AAPD,0CAOC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TranscriptsDisabled = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when InnerTube returns no caption tracks (the video has no subtitles).
|
|
7
|
+
* Mirrors `TranscriptsDisabled` from the Python library.
|
|
8
|
+
*/
|
|
9
|
+
class TranscriptsDisabled extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
constructor(videoId) {
|
|
11
|
+
super(`Subtitles are disabled for video "${videoId}".`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.TranscriptsDisabled = TranscriptsDisabled;
|
|
15
|
+
//# sourceMappingURL=TranscriptsDisabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranscriptsDisabled.js","sourceRoot":"","sources":["../../../src/errors/TranscriptsDisabled.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,kDAAsB;IAC7D,YAAY,OAAe;QACzB,KAAK,CAAC,qCAAqC,OAAO,IAAI,CAAC,CAAC;IAC1D,CAAC;CACF;AAJD,kDAIC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TranslationLanguageNotAvailable = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when the requested target language is not in the source track's
|
|
7
|
+
* `translationLanguages` list. Mirrors `TranslationLanguageNotAvailable`.
|
|
8
|
+
*/
|
|
9
|
+
class TranslationLanguageNotAvailable extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
constructor(videoId, requestedLang, available) {
|
|
11
|
+
super(`The requested translation language "${requestedLang}" is not available for video ` +
|
|
12
|
+
`"${videoId}". Available: [${available.join(', ')}].`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.TranslationLanguageNotAvailable = TranslationLanguageNotAvailable;
|
|
16
|
+
//# sourceMappingURL=TranslationLanguageNotAvailable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TranslationLanguageNotAvailable.js","sourceRoot":"","sources":["../../../src/errors/TranslationLanguageNotAvailable.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,+BAAgC,SAAQ,kDAAsB;IACzE,YAAY,OAAe,EAAE,aAAqB,EAAE,SAA4B;QAC9E,KAAK,CACH,uCAAuC,aAAa,+BAA+B;YACjF,IAAI,OAAO,kBAAkB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACxD,CAAC;IACJ,CAAC;CACF;AAPD,0EAOC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VideoUnavailable = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when the video itself is unavailable (deleted, private, region-locked).
|
|
7
|
+
* Mirrors `VideoUnavailable` from the Python library.
|
|
8
|
+
*/
|
|
9
|
+
class VideoUnavailable extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
10
|
+
constructor(videoId) {
|
|
11
|
+
super(`The video with ID "${videoId}" is no longer available.`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.VideoUnavailable = VideoUnavailable;
|
|
15
|
+
//# sourceMappingURL=VideoUnavailable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoUnavailable.js","sourceRoot":"","sources":["../../../src/errors/VideoUnavailable.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,kDAAsB;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,2BAA2B,CAAC,CAAC;IAClE,CAAC;CACF;AAJD,4CAIC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VideoUnplayable = void 0;
|
|
4
|
+
const YouTubeTranscriptError_js_1 = require("./YouTubeTranscriptError.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when InnerTube responds with playabilityStatus other than OK.
|
|
7
|
+
* Carries the reason and (when present) subreason text from YouTube.
|
|
8
|
+
* Mirrors `VideoUnplayable` from the Python library.
|
|
9
|
+
*/
|
|
10
|
+
class VideoUnplayable extends YouTubeTranscriptError_js_1.YouTubeTranscriptError {
|
|
11
|
+
reason;
|
|
12
|
+
subreason;
|
|
13
|
+
constructor(videoId, reason, subreason) {
|
|
14
|
+
const reasonPart = reason ? `: ${reason}` : '';
|
|
15
|
+
const subreasonPart = subreason.length > 0 ? ` (${subreason.join('; ')})` : '';
|
|
16
|
+
super(`The video with ID "${videoId}" is unplayable${reasonPart}${subreasonPart}.`);
|
|
17
|
+
this.reason = reason;
|
|
18
|
+
this.subreason = subreason;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.VideoUnplayable = VideoUnplayable;
|
|
22
|
+
//# sourceMappingURL=VideoUnplayable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoUnplayable.js","sourceRoot":"","sources":["../../../src/errors/VideoUnplayable.ts"],"names":[],"mappings":";;;AAAA,2EAAqE;AAErE;;;;GAIG;AACH,MAAa,eAAgB,SAAQ,kDAAsB;IAChD,MAAM,CAAqB;IAC3B,SAAS,CAAoB;IAEtC,YAAY,OAAe,EAAE,MAA0B,EAAE,SAA4B;QACnF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,KAAK,CAAC,sBAAsB,OAAO,kBAAkB,UAAU,GAAG,aAAa,GAAG,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAXD,0CAWC"}
|