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,22 @@
|
|
|
1
|
+
import { toVttTime } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pretty-print formatter — human-readable debug output.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
*
|
|
7
|
+
* [00:00:00.000] Hello world
|
|
8
|
+
* [00:00:01.540] Next line
|
|
9
|
+
*/
|
|
10
|
+
export class PrettyPrintFormatter {
|
|
11
|
+
extension = 'txt';
|
|
12
|
+
mimeType = 'text/plain';
|
|
13
|
+
render(snippets) {
|
|
14
|
+
const lines = snippets.map((s) => `[${toVttTime(s.start)}] ${s.text}`);
|
|
15
|
+
return {
|
|
16
|
+
content: lines.join('\n') + '\n',
|
|
17
|
+
extension: this.extension,
|
|
18
|
+
mimeType: this.mimeType,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=PrettyPrintFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrettyPrintFormatter.js","sourceRoot":"","sources":["../../../src/formatters/PrettyPrintFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,YAAY,CAAC;IAEjC,MAAM,CAAC,QAAgC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* SRT subtitle formatter.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
*
|
|
7
|
+
* 1
|
|
8
|
+
* 00:00:00,000 --> 00:00:01,540
|
|
9
|
+
* Hello world
|
|
10
|
+
*
|
|
11
|
+
* 2
|
|
12
|
+
* 00:00:01,540 --> 00:00:03,540
|
|
13
|
+
* Next line
|
|
14
|
+
*
|
|
15
|
+
* Mirrors `SRTFormatter` from the Python library.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SRTFormatter implements Formatter {
|
|
18
|
+
readonly extension = "srt";
|
|
19
|
+
readonly mimeType = "application/x-subrip";
|
|
20
|
+
render(snippets: readonly SnippetLike[]): FormattedOutput;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=SRTFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SRTFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/SRTFormatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,0BAA0B;IAE3C,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAc1D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { computeEnd, toSrtTime } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* SRT subtitle formatter.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
*
|
|
7
|
+
* 1
|
|
8
|
+
* 00:00:00,000 --> 00:00:01,540
|
|
9
|
+
* Hello world
|
|
10
|
+
*
|
|
11
|
+
* 2
|
|
12
|
+
* 00:00:01,540 --> 00:00:03,540
|
|
13
|
+
* Next line
|
|
14
|
+
*
|
|
15
|
+
* Mirrors `SRTFormatter` from the Python library.
|
|
16
|
+
*/
|
|
17
|
+
export class SRTFormatter {
|
|
18
|
+
extension = 'srt';
|
|
19
|
+
mimeType = 'application/x-subrip';
|
|
20
|
+
render(snippets) {
|
|
21
|
+
const blocks = [];
|
|
22
|
+
for (let i = 0; i < snippets.length; i++) {
|
|
23
|
+
const s = snippets[i];
|
|
24
|
+
const startStr = toSrtTime(s.start);
|
|
25
|
+
const endStr = toSrtTime(computeEnd(snippets, i));
|
|
26
|
+
blocks.push(`${i + 1}\n${startStr} --> ${endStr}\n${s.text}`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
content: blocks.join('\n\n') + '\n',
|
|
30
|
+
extension: this.extension,
|
|
31
|
+
mimeType: this.mimeType,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=SRTFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SRTFormatter.js","sourceRoot":"","sources":["../../../src/formatters/SRTFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,YAAY;IACd,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,sBAAsB,CAAC;IAE3C,MAAM,CAAC,QAAgC;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Plain text formatter — just concatenates the snippet text with newlines.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TextFormatter implements Formatter {
|
|
6
|
+
readonly extension = "txt";
|
|
7
|
+
readonly mimeType = "text/plain";
|
|
8
|
+
render(snippets: readonly SnippetLike[]): FormattedOutput;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=TextFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/TextFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;GAEG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,gBAAgB;IAEjC,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAQ1D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain text formatter — just concatenates the snippet text with newlines.
|
|
3
|
+
*/
|
|
4
|
+
export class TextFormatter {
|
|
5
|
+
extension = 'txt';
|
|
6
|
+
mimeType = 'text/plain';
|
|
7
|
+
render(snippets) {
|
|
8
|
+
const content = snippets.map((s) => s.text).join('\n');
|
|
9
|
+
return {
|
|
10
|
+
content: snippets.length > 0 ? content + '\n' : '',
|
|
11
|
+
extension: this.extension,
|
|
12
|
+
mimeType: this.mimeType,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=TextFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextFormatter.js","sourceRoot":"","sources":["../../../src/formatters/TextFormatter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,aAAa;IACf,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,YAAY,CAAC;IAEjC,MAAM,CAAC,QAAgC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FormattedOutput, Formatter, SnippetLike } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* WebVTT subtitle formatter.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
*
|
|
7
|
+
* WEBVTT
|
|
8
|
+
*
|
|
9
|
+
* 00:00:00.000 --> 00:00:01.540
|
|
10
|
+
* Hello world
|
|
11
|
+
*
|
|
12
|
+
* 00:00:01.540 --> 00:00:03.540
|
|
13
|
+
* Next line
|
|
14
|
+
*
|
|
15
|
+
* Mirrors `WebVTTFormatter` from the Python library.
|
|
16
|
+
*/
|
|
17
|
+
export declare class WebVTTFormatter implements Formatter {
|
|
18
|
+
readonly extension = "vtt";
|
|
19
|
+
readonly mimeType = "text/vtt";
|
|
20
|
+
render(snippets: readonly SnippetLike[]): FormattedOutput;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=WebVTTFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebVTTFormatter.d.ts","sourceRoot":"","sources":["../../../src/formatters/WebVTTFormatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,cAAc;IAE/B,MAAM,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe;CAc1D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { computeEnd, toVttTime } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* WebVTT subtitle formatter.
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
*
|
|
7
|
+
* WEBVTT
|
|
8
|
+
*
|
|
9
|
+
* 00:00:00.000 --> 00:00:01.540
|
|
10
|
+
* Hello world
|
|
11
|
+
*
|
|
12
|
+
* 00:00:01.540 --> 00:00:03.540
|
|
13
|
+
* Next line
|
|
14
|
+
*
|
|
15
|
+
* Mirrors `WebVTTFormatter` from the Python library.
|
|
16
|
+
*/
|
|
17
|
+
export class WebVTTFormatter {
|
|
18
|
+
extension = 'vtt';
|
|
19
|
+
mimeType = 'text/vtt';
|
|
20
|
+
render(snippets) {
|
|
21
|
+
const blocks = [];
|
|
22
|
+
for (let i = 0; i < snippets.length; i++) {
|
|
23
|
+
const s = snippets[i];
|
|
24
|
+
const startStr = toVttTime(s.start);
|
|
25
|
+
const endStr = toVttTime(computeEnd(snippets, i));
|
|
26
|
+
blocks.push(`${startStr} --> ${endStr}\n${s.text}`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
content: 'WEBVTT\n\n' + blocks.join('\n\n') + '\n',
|
|
30
|
+
extension: this.extension,
|
|
31
|
+
mimeType: this.mimeType,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=WebVTTFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebVTTFormatter.js","sourceRoot":"","sources":["../../../src/formatters/WebVTTFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,eAAe;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,UAAU,CAAC;IAE/B,MAAM,CAAC,QAAgC;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SnippetLike } from './Formatter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared helpers for SRT/WebVTT formatters.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Compute the end timestamp for a snippet.
|
|
7
|
+
*
|
|
8
|
+
* End = min(next.start, this.start + this.duration) when a next snippet
|
|
9
|
+
* exists AND starts before this one ends (avoid overlap). Otherwise use
|
|
10
|
+
* start + duration. Mirrors Python library's `_TextBasedFormatter`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function computeEnd(snippets: readonly SnippetLike[], index: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Format seconds into `HH:MM:SS,mmm` (SRT style).
|
|
15
|
+
*/
|
|
16
|
+
export declare function toSrtTime(seconds: number): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format seconds into `HH:MM:SS.mmm` (WebVTT style).
|
|
19
|
+
*/
|
|
20
|
+
export declare function toVttTime(seconds: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format seconds into `[HH:MM:SS.mmm]` pretty-print style.
|
|
23
|
+
*/
|
|
24
|
+
export declare function toPrettyTime(seconds: number): string;
|
|
25
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/formatters/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for SRT/WebVTT formatters.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute the end timestamp for a snippet.
|
|
6
|
+
*
|
|
7
|
+
* End = min(next.start, this.start + this.duration) when a next snippet
|
|
8
|
+
* exists AND starts before this one ends (avoid overlap). Otherwise use
|
|
9
|
+
* start + duration. Mirrors Python library's `_TextBasedFormatter`.
|
|
10
|
+
*/
|
|
11
|
+
export function computeEnd(snippets, index) {
|
|
12
|
+
const cur = snippets[index];
|
|
13
|
+
const end = cur.start + cur.duration;
|
|
14
|
+
const next = snippets[index + 1];
|
|
15
|
+
if (next && next.start < end) {
|
|
16
|
+
return next.start;
|
|
17
|
+
}
|
|
18
|
+
return end;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Format seconds into `HH:MM:SS,mmm` (SRT style).
|
|
22
|
+
*/
|
|
23
|
+
export function toSrtTime(seconds) {
|
|
24
|
+
return toDelimitedTime(seconds, ',');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format seconds into `HH:MM:SS.mmm` (WebVTT style).
|
|
28
|
+
*/
|
|
29
|
+
export function toVttTime(seconds) {
|
|
30
|
+
return toDelimitedTime(seconds, '.');
|
|
31
|
+
}
|
|
32
|
+
function toDelimitedTime(seconds, msDelim) {
|
|
33
|
+
const ms = Math.round(seconds * 1000);
|
|
34
|
+
const h = Math.floor(ms / 3_600_000);
|
|
35
|
+
const m = Math.floor((ms % 3_600_000) / 60_000);
|
|
36
|
+
const s = Math.floor((ms % 60_000) / 1000);
|
|
37
|
+
const milli = ms % 1000;
|
|
38
|
+
return (pad(h) +
|
|
39
|
+
':' +
|
|
40
|
+
pad(m) +
|
|
41
|
+
':' +
|
|
42
|
+
pad(s) +
|
|
43
|
+
msDelim +
|
|
44
|
+
pad(milli, 3));
|
|
45
|
+
}
|
|
46
|
+
function pad(n, len = 2) {
|
|
47
|
+
return n.toString().padStart(len, '0');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format seconds into `[HH:MM:SS.mmm]` pretty-print style.
|
|
51
|
+
*/
|
|
52
|
+
export function toPrettyTime(seconds) {
|
|
53
|
+
return '[' + toVttTime(seconds) + ']';
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/formatters/base.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgC,EAAE,KAAa;IACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,OAAkB;IAC1D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;IACxB,OAAO,CACL,GAAG,CAAC,CAAC,CAAC;QACN,GAAG;QACH,GAAG,CAAC,CAAC,CAAC;QACN,GAAG;QACH,GAAG,CAAC,CAAC,CAAC;QACN,OAAO;QACP,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CACd,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,CAAS,EAAE,MAAc,CAAC;IACrC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { SRTFormatter } from './SRTFormatter.js';
|
|
2
|
+
export { WebVTTFormatter } from './WebVTTFormatter.js';
|
|
3
|
+
export { PrettyPrintFormatter } from './PrettyPrintFormatter.js';
|
|
4
|
+
export { TextFormatter } from './TextFormatter.js';
|
|
5
|
+
export { JSONFormatter } from './JSONFormatter.js';
|
|
6
|
+
export { computeEnd, toSrtTime, toVttTime, toPrettyTime } from './base.js';
|
|
7
|
+
export type { Formatter, FormattedOutput, SnippetLike } from './Formatter.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { SRTFormatter } from './SRTFormatter.js';
|
|
2
|
+
export { WebVTTFormatter } from './WebVTTFormatter.js';
|
|
3
|
+
export { PrettyPrintFormatter } from './PrettyPrintFormatter.js';
|
|
4
|
+
export { TextFormatter } from './TextFormatter.js';
|
|
5
|
+
export { JSONFormatter } from './JSONFormatter.js';
|
|
6
|
+
export { computeEnd, toSrtTime, toVttTime, toPrettyTime } from './base.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formatters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal in-memory cookie jar.
|
|
3
|
+
*
|
|
4
|
+
* Tracks `name -> value` per domain; matches cookies by request URL host.
|
|
5
|
+
* Sufficient for YouTube's needs (CONSENT, VISITOR_INFO1_LIVE, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export interface CookieEntry {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly value: string;
|
|
10
|
+
readonly domain: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SetCookieOptions {
|
|
14
|
+
name: string;
|
|
15
|
+
value: string;
|
|
16
|
+
domain?: string;
|
|
17
|
+
path?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class CookieJar {
|
|
20
|
+
private readonly cookies;
|
|
21
|
+
private key;
|
|
22
|
+
set(opts: SetCookieOptions): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get all cookies that apply to a URL.
|
|
25
|
+
*
|
|
26
|
+
* Matches by:
|
|
27
|
+
* - exact domain match
|
|
28
|
+
* - parent-domain match (cookie with leading `.`)
|
|
29
|
+
* - path prefix
|
|
30
|
+
*/
|
|
31
|
+
getForUrl(url: string): CookieEntry[];
|
|
32
|
+
/** Build the value for the `Cookie:` request header. */
|
|
33
|
+
headerForUrl(url: string): string;
|
|
34
|
+
/** Inspect a `Set-Cookie` response header and store it (best-effort). */
|
|
35
|
+
ingestSetCookie(setCookieValue: string, requestUrl: string): void;
|
|
36
|
+
clear(): void;
|
|
37
|
+
size(): number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cookieJar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookieJar.d.ts","sourceRoot":"","sources":["../../../src/http/cookieJar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,GAAG;IAIX,GAAG,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAOjC;;;;;;;OAOG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE;IAiBrC,wDAAwD;IACxD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKjC,yEAAyE;IACzE,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA2BjE,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal in-memory cookie jar.
|
|
3
|
+
*
|
|
4
|
+
* Tracks `name -> value` per domain; matches cookies by request URL host.
|
|
5
|
+
* Sufficient for YouTube's needs (CONSENT, VISITOR_INFO1_LIVE, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export class CookieJar {
|
|
8
|
+
cookies = new Map();
|
|
9
|
+
key(domain, name) {
|
|
10
|
+
return `${domain}::${name}`;
|
|
11
|
+
}
|
|
12
|
+
set(opts) {
|
|
13
|
+
const domain = (opts.domain ?? '.youtube.com').toLowerCase();
|
|
14
|
+
const path = opts.path ?? '/';
|
|
15
|
+
const k = this.key(domain, opts.name);
|
|
16
|
+
this.cookies.set(k, { name: opts.name, value: opts.value, domain, path });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get all cookies that apply to a URL.
|
|
20
|
+
*
|
|
21
|
+
* Matches by:
|
|
22
|
+
* - exact domain match
|
|
23
|
+
* - parent-domain match (cookie with leading `.`)
|
|
24
|
+
* - path prefix
|
|
25
|
+
*/
|
|
26
|
+
getForUrl(url) {
|
|
27
|
+
let host;
|
|
28
|
+
try {
|
|
29
|
+
host = new URL(url).hostname.toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const c of this.cookies.values()) {
|
|
36
|
+
const d = c.domain.replace(/^\.+/, '').toLowerCase();
|
|
37
|
+
if (host === d || host.endsWith('.' + d)) {
|
|
38
|
+
out.push(c);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** Build the value for the `Cookie:` request header. */
|
|
44
|
+
headerForUrl(url) {
|
|
45
|
+
const cookies = this.getForUrl(url);
|
|
46
|
+
return cookies.map((c) => `${c.name}=${c.value}`).join('; ');
|
|
47
|
+
}
|
|
48
|
+
/** Inspect a `Set-Cookie` response header and store it (best-effort). */
|
|
49
|
+
ingestSetCookie(setCookieValue, requestUrl) {
|
|
50
|
+
// Simple parser: "name=value; Domain=.x; Path=/"
|
|
51
|
+
const parts = setCookieValue.split(';').map((s) => s.trim());
|
|
52
|
+
const first = parts[0];
|
|
53
|
+
if (!first)
|
|
54
|
+
return;
|
|
55
|
+
const eq = first.indexOf('=');
|
|
56
|
+
if (eq <= 0)
|
|
57
|
+
return;
|
|
58
|
+
const name = first.slice(0, eq).trim();
|
|
59
|
+
const value = first.slice(eq + 1).trim();
|
|
60
|
+
let domain = '';
|
|
61
|
+
let path = '/';
|
|
62
|
+
for (const part of parts.slice(1)) {
|
|
63
|
+
const [rawK, v] = part.split('=').map((s) => s.trim());
|
|
64
|
+
const lk = (rawK ?? '').toLowerCase();
|
|
65
|
+
if (lk === 'domain' && v)
|
|
66
|
+
domain = v;
|
|
67
|
+
else if (lk === 'path' && v)
|
|
68
|
+
path = v;
|
|
69
|
+
}
|
|
70
|
+
if (!domain) {
|
|
71
|
+
try {
|
|
72
|
+
domain = new URL(requestUrl).hostname;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.set({ name, value, domain, path });
|
|
79
|
+
}
|
|
80
|
+
clear() {
|
|
81
|
+
this.cookies.clear();
|
|
82
|
+
}
|
|
83
|
+
size() {
|
|
84
|
+
return this.cookies.size;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cookieJar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookieJar.js","sourceRoot":"","sources":["../../../src/http/cookieJar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { CookieJar } from './cookieJar.js';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for the HTTP client.
|
|
4
|
+
*/
|
|
5
|
+
export interface HttpClientConfig {
|
|
6
|
+
/** Default User-Agent header. */
|
|
7
|
+
userAgent?: string;
|
|
8
|
+
/** Default Accept-Language header. */
|
|
9
|
+
acceptLanguage?: string;
|
|
10
|
+
/** Default request timeout in ms. */
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
/** Cookie jar (shared). */
|
|
13
|
+
cookies?: CookieJar;
|
|
14
|
+
/** Default headers to add to every request. */
|
|
15
|
+
defaultHeaders?: Record<string, string>;
|
|
16
|
+
/** Proxy URL (http / https / socks5). Triggers undici dynamic import. */
|
|
17
|
+
proxyUrl?: string;
|
|
18
|
+
/** Optional fetch implementation (for testing / SSR). */
|
|
19
|
+
fetchImpl?: typeof fetch;
|
|
20
|
+
/** Maximum retries on 429. */
|
|
21
|
+
retriesOn429?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface RequestOptions {
|
|
24
|
+
method?: 'GET' | 'POST';
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
body?: string;
|
|
27
|
+
/** Request timeout in ms (overrides default). */
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
/** AbortSignal. */
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface ResponseLike {
|
|
33
|
+
status: number;
|
|
34
|
+
statusText: string;
|
|
35
|
+
ok: boolean;
|
|
36
|
+
text(): Promise<string>;
|
|
37
|
+
json(): Promise<unknown>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Thin HTTP client wrapper around global fetch.
|
|
41
|
+
*
|
|
42
|
+
* - Injects default User-Agent, Accept-Language, cookie headers
|
|
43
|
+
* - Honors a CookieJar (mutates it from `Set-Cookie` responses)
|
|
44
|
+
* - Supports proxy URLs via dynamic undici import (only loaded when needed)
|
|
45
|
+
* - Retries on 429
|
|
46
|
+
*
|
|
47
|
+
* Designed to be small and easily mockable for tests.
|
|
48
|
+
*/
|
|
49
|
+
export declare class HttpClient {
|
|
50
|
+
private readonly userAgent;
|
|
51
|
+
private readonly acceptLanguage;
|
|
52
|
+
private readonly defaultTimeoutMs;
|
|
53
|
+
private readonly cookies;
|
|
54
|
+
private readonly defaultHeaders;
|
|
55
|
+
private readonly proxyUrl;
|
|
56
|
+
private readonly fetchImpl;
|
|
57
|
+
private readonly retriesOn429;
|
|
58
|
+
private proxyDispatcher;
|
|
59
|
+
constructor(config?: HttpClientConfig);
|
|
60
|
+
/**
|
|
61
|
+
* Build full headers for a request, merging defaults + per-request + cookies.
|
|
62
|
+
*/
|
|
63
|
+
private buildHeaders;
|
|
64
|
+
/**
|
|
65
|
+
* GET request.
|
|
66
|
+
*/
|
|
67
|
+
get(url: string, opts?: RequestOptions): Promise<ResponseLike>;
|
|
68
|
+
/**
|
|
69
|
+
* POST request with a JSON body.
|
|
70
|
+
*/
|
|
71
|
+
postJson(url: string, body: unknown, opts?: RequestOptions): Promise<ResponseLike>;
|
|
72
|
+
/**
|
|
73
|
+
* Perform an HTTP request with retries on 429.
|
|
74
|
+
*/
|
|
75
|
+
request(url: string, opts?: RequestOptions): Promise<ResponseLike>;
|
|
76
|
+
/**
|
|
77
|
+
* Wrap a raw `Response` so that `.json()` returns `unknown` and re-throwing
|
|
78
|
+
* makes the type usable in tests.
|
|
79
|
+
*/
|
|
80
|
+
private normalizeResponse;
|
|
81
|
+
private extractSetCookies;
|
|
82
|
+
/**
|
|
83
|
+
* Lazily load undici and create a ProxyAgent when a proxy URL is configured.
|
|
84
|
+
* Returns `undefined` if no proxy is set.
|
|
85
|
+
*/
|
|
86
|
+
private maybeProxyDispatcher;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=httpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/http/httpClient.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,eAAe,CAAsB;gBAEjC,MAAM,GAAE,gBAAqB;IAczC;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxE;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5F;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqD5E;;;OAGG;YACW,iBAAiB;IAkB/B,OAAO,CAAC,iBAAiB;IAczB;;;OAGG;YACW,oBAAoB;CAiBnC"}
|