@hallelx/tytube 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/exceptions.ts","../src/helpers.ts","../src/runtime/http.ts","../src/request.ts","../src/runtime/fs.ts","../src/runtime/path.ts","../src/captions.ts","../src/parser.ts","../src/cipher.ts","../src/metadata.ts","../src/extract.ts","../src/innertube.ts","../src/itags.ts","../src/stream.ts","../src/query.ts","../src/youtube.ts","../src/playlist.ts","../src/channel.ts","../src/search.ts","../src/version.ts"],"names":["videoId","stream","sorted","t"],"mappings":"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","file":"index.cjs","sourcesContent":["// Library-specific exception definitions. Mirrors pytube/exceptions.py.\n\nexport class PytubeError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'PytubeError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class MaxRetriesExceeded extends PytubeError {\n constructor(message = 'Maximum number of retries exceeded') {\n super(message);\n this.name = 'MaxRetriesExceeded';\n }\n}\n\nexport class HTMLParseError extends PytubeError {\n constructor(message = 'HTML could not be parsed') {\n super(message);\n this.name = 'HTMLParseError';\n }\n}\n\nexport class ExtractError extends PytubeError {\n constructor(message = 'Data extraction failed') {\n super(message);\n this.name = 'ExtractError';\n }\n}\n\nexport class RegexMatchError extends ExtractError {\n readonly caller: string;\n readonly pattern: string | RegExp;\n\n constructor(caller: string, pattern: string | RegExp) {\n super(`${caller}: could not find match for ${pattern}`);\n this.name = 'RegexMatchError';\n this.caller = caller;\n this.pattern = pattern;\n }\n}\n\nexport class VideoUnavailable extends PytubeError {\n readonly videoId: string;\n\n constructor(videoId: string, message?: string) {\n super(message ?? `${videoId} is unavailable`);\n this.name = 'VideoUnavailable';\n this.videoId = videoId;\n }\n}\n\nexport class AgeRestrictedError extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} is age restricted, and can't be accessed without logging in.`);\n this.name = 'AgeRestrictedError';\n }\n}\n\nexport class LiveStreamError extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} is streaming live and cannot be loaded`);\n this.name = 'LiveStreamError';\n }\n}\n\nexport class VideoPrivate extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} is a private video`);\n this.name = 'VideoPrivate';\n }\n}\n\nexport class RecordingUnavailable extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} does not have a live stream recording available`);\n this.name = 'RecordingUnavailable';\n }\n}\n\nexport class MembersOnly extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} is a members-only video`);\n this.name = 'MembersOnly';\n }\n}\n\nexport class VideoRegionBlocked extends VideoUnavailable {\n constructor(videoId: string) {\n super(videoId, `${videoId} is not available in your region`);\n this.name = 'VideoRegionBlocked';\n }\n}\n","// Various helper functions. Mirrors pytube/helpers.py.\n\nimport { RegexMatchError } from './exceptions.js';\n\n/**\n * Search a string for a regex pattern and return the requested capture group.\n * Throws RegexMatchError if the pattern does not match.\n */\nexport function regexSearch(pattern: string | RegExp, source: string, group: number): string {\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n const match = regex.exec(source);\n if (!match) {\n throw new RegexMatchError('regexSearch', pattern);\n }\n const value = match[group];\n if (value === undefined) {\n throw new RegexMatchError('regexSearch', pattern);\n }\n return value;\n}\n\nconst NTFS_FORBIDDEN_CHARS = (() => {\n const out: string[] = [];\n for (let i = 0; i < 32; i++) out.push(String.fromCharCode(i));\n return out;\n})();\n\nconst FILENAME_FORBIDDEN_LITERALS = [\n '\"', '#', '$', '%', \"'\", '*', ',', '.', '/', ':', ';',\n '<', '>', '?', '\\\\', '^', '|', '~',\n];\n\n/**\n * Sanitize a string so it is safe to use as a filename across Windows / macOS / Linux.\n * Mirrors pytube.helpers.safe_filename.\n */\nexport function safeFilename(s: string, maxLength = 255): string {\n const forbidden = new Set<string>([...NTFS_FORBIDDEN_CHARS, ...FILENAME_FORBIDDEN_LITERALS]);\n let out = '';\n for (const ch of s) {\n if (!forbidden.has(ch)) out += ch;\n }\n return out.slice(0, maxLength);\n}\n\n/**\n * Remove duplicate items from an array while preserving order.\n */\nexport function uniqueify<T>(items: readonly T[]): T[] {\n const seen = new Set<T>();\n const out: T[] = [];\n for (const item of items) {\n if (seen.has(item)) continue;\n seen.add(item);\n out.push(item);\n }\n return out;\n}\n\n/**\n * Memoize a zero-or-more-arg async function on its first invocation.\n * Caches by JSON-stringified arguments. Used in place of pytube's `@cache` decorator.\n */\nexport function memoize<TArgs extends readonly unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n): (...args: TArgs) => Promise<TResult> {\n const cache = new Map<string, Promise<TResult>>();\n return (...args: TArgs) => {\n const key = JSON.stringify(args);\n let cached = cache.get(key);\n if (!cached) {\n cached = fn(...args);\n cache.set(key, cached);\n }\n return cached;\n };\n}\n\n/**\n * Async iterable wrapper that defers generation of items.\n * Mirrors pytube.helpers.DeferredGeneratorList — used by Playlist/Channel\n * so iterating doesn't force the entire continuation chain at once.\n */\nexport class DeferredGeneratorList<T> implements AsyncIterable<T> {\n private readonly source: AsyncIterator<T>;\n private readonly cached: T[] = [];\n private exhausted = false;\n\n constructor(source: AsyncIterable<T> | AsyncIterator<T>) {\n this.source = (Symbol.asyncIterator in source ? source[Symbol.asyncIterator]() : source) as AsyncIterator<T>;\n }\n\n async at(index: number): Promise<T | undefined> {\n while (!this.exhausted && this.cached.length <= index) {\n const next = await this.source.next();\n if (next.done) {\n this.exhausted = true;\n break;\n }\n this.cached.push(next.value);\n }\n return this.cached[index];\n }\n\n async length(): Promise<number> {\n await this.generateAll();\n return this.cached.length;\n }\n\n async toArray(): Promise<T[]> {\n await this.generateAll();\n return [...this.cached];\n }\n\n async generateAll(): Promise<void> {\n while (!this.exhausted) {\n const next = await this.source.next();\n if (next.done) {\n this.exhausted = true;\n break;\n }\n this.cached.push(next.value);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let i = 0;\n while (true) {\n const item = await this.at(i);\n if (item === undefined && this.exhausted && i >= this.cached.length) return;\n if (item === undefined) return;\n yield item;\n i++;\n }\n }\n}\n","// Cross-runtime HTTP wrapper around the global `fetch` API.\n// Works in Node 18+, Bun, Deno, and browsers.\n\nexport interface HttpRequestOptions {\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n method?: string;\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\nexport interface HttpResponse {\n status: number;\n headers: Headers;\n body: ReadableStream<Uint8Array> | null;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n json<T = unknown>(): Promise<T>;\n}\n\nexport const DEFAULT_HEADERS: Record<string, string> = {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Accept-Language': 'en-US,en;q=0.9',\n};\n\nfunction mergeHeaders(extra?: Record<string, string>): Record<string, string> {\n return { ...DEFAULT_HEADERS, ...(extra ?? {}) };\n}\n\nfunction buildAbortSignal(opts: HttpRequestOptions): AbortSignal | undefined {\n if (opts.signal && !opts.timeoutMs) return opts.signal;\n if (!opts.signal && !opts.timeoutMs) return undefined;\n\n const ctl = new AbortController();\n if (opts.signal) {\n if (opts.signal.aborted) ctl.abort(opts.signal.reason);\n else opts.signal.addEventListener('abort', () => ctl.abort(opts.signal!.reason), { once: true });\n }\n if (opts.timeoutMs) {\n setTimeout(() => ctl.abort(new Error(`Request timed out after ${opts.timeoutMs}ms`)), opts.timeoutMs);\n }\n return ctl.signal;\n}\n\nasync function doFetch(url: string, opts: HttpRequestOptions): Promise<HttpResponse> {\n const init: RequestInit = {\n method: opts.method ?? 'GET',\n headers: mergeHeaders(opts.headers),\n signal: buildAbortSignal(opts),\n };\n if (opts.body !== undefined) init.body = opts.body as BodyInit;\n\n const res = await fetch(url, init);\n return {\n status: res.status,\n headers: res.headers,\n body: res.body,\n text: () => res.text(),\n arrayBuffer: () => res.arrayBuffer(),\n json: <T,>() => res.json() as Promise<T>,\n };\n}\n\nexport async function httpGet(url: string, opts: HttpRequestOptions = {}): Promise<HttpResponse> {\n return doFetch(url, { ...opts, method: 'GET' });\n}\n\nexport async function httpPost(url: string, opts: HttpRequestOptions = {}): Promise<HttpResponse> {\n return doFetch(url, { ...opts, method: 'POST' });\n}\n\nexport async function httpHead(url: string, opts: HttpRequestOptions = {}): Promise<HttpResponse> {\n return doFetch(url, { ...opts, method: 'HEAD' });\n}\n","// HTTP layer that mirrors pytube/request.py — get/post/stream/seqStream/filesize/head\n// implemented on top of the cross-runtime fetch wrapper.\n\nimport { MaxRetriesExceeded, RegexMatchError } from './exceptions.js';\nimport { httpGet, httpHead, httpPost, type HttpRequestOptions } from './runtime/http.js';\n\nexport const DEFAULT_RANGE_SIZE = 9_437_184; // 9 MB\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n timeoutMs?: number;\n maxRetries?: number;\n signal?: AbortSignal;\n}\n\n/** GET a URL and return the body as a UTF-8 string. */\nexport async function get(url: string, opts: RequestOptions = {}): Promise<string> {\n const res = await httpGet(url, toFetchOpts(opts));\n return res.text();\n}\n\n/** POST a JSON body to `url`. Returns the response body as a UTF-8 string. */\nexport async function post(\n url: string,\n data: unknown,\n opts: RequestOptions = {},\n): Promise<string> {\n const headers = { ...(opts.headers ?? {}), 'Content-Type': 'application/json' };\n const body = data === undefined ? '{}' : JSON.stringify(data);\n const res = await httpPost(url, { ...toFetchOpts(opts), headers, body });\n return res.text();\n}\n\n/** Fetch headers via HEAD; returns lowercased header map. */\nexport async function head(url: string, opts: RequestOptions = {}): Promise<Record<string, string>> {\n const res = await httpHead(url, toFetchOpts(opts));\n const out: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n}\n\n/** Get a remote file's content length in bytes via HEAD. */\nexport async function filesize(url: string, opts: RequestOptions = {}): Promise<number> {\n const headers = await head(url, opts);\n const len = headers['content-length'];\n if (!len) throw new Error('Missing content-length header');\n return parseInt(len, 10);\n}\n\n/**\n * Yields the response body in 9MB chunks via byte-range requests.\n * Mirrors pytube/request.stream.\n */\nexport async function* stream(url: string, opts: RequestOptions = {}): AsyncGenerator<Uint8Array> {\n let fileSize = DEFAULT_RANGE_SIZE; // placeholder until first range response tells us the real size\n let downloaded = 0;\n const maxRetries = opts.maxRetries ?? 0;\n\n // Probe the real file size with a wide range request.\n try {\n const probe = await httpGet(`${url}&range=0-99999999999`, toFetchOpts(opts));\n const cl = probe.headers.get('content-length');\n if (cl) fileSize = parseInt(cl, 10);\n // Drain the probe body to free the socket on Bun/Node.\n if (probe.body) {\n const reader = probe.body.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n }\n } catch {\n // Best-effort probe; fall back to 9MB stepping.\n }\n\n while (downloaded < fileSize) {\n const stopPos = Math.min(downloaded + DEFAULT_RANGE_SIZE, fileSize) - 1;\n const rangeUrl = `${url}&range=${downloaded}-${stopPos}`;\n\n let attempt = 0;\n let body: ReadableStream<Uint8Array> | null = null;\n while (true) {\n if (attempt > maxRetries) throw new MaxRetriesExceeded();\n try {\n const res = await httpGet(rangeUrl, {\n ...toFetchOpts(opts),\n headers: { ...(opts.headers ?? {}), Range: `bytes=${downloaded}-${stopPos}` },\n });\n body = res.body;\n break;\n } catch (err) {\n if (isAbortError(err)) throw err;\n attempt++;\n }\n }\n\n if (!body) throw new MaxRetriesExceeded();\n\n const reader = body.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n if (!value) continue;\n downloaded += value.byteLength;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n/**\n * Sequence-based stream for OTF / segmented videos.\n * Mirrors pytube/request.seq_stream.\n */\nexport async function* seqStream(url: string, opts: RequestOptions = {}): AsyncGenerator<Uint8Array> {\n const parsed = new URL(url);\n parsed.searchParams.set('sq', '0');\n const headerUrl = parsed.toString();\n\n const collected: Uint8Array[] = [];\n for await (const chunk of stream(headerUrl, opts)) {\n yield chunk;\n collected.push(chunk);\n }\n const segmentData = concatAll(collected);\n\n const text = new TextDecoder('utf-8').decode(segmentData);\n const segmentCountMatch = /Segment-Count:\\s*(\\d+)/.exec(text);\n const segmentCountRaw = segmentCountMatch?.[1];\n if (!segmentCountRaw) {\n throw new RegexMatchError('seqStream', /Segment-Count:\\s*(\\d+)/);\n }\n const segmentCount = parseInt(segmentCountRaw, 10);\n\n for (let seq = 1; seq <= segmentCount; seq++) {\n parsed.searchParams.set('sq', String(seq));\n const segUrl = parsed.toString();\n yield* stream(segUrl, opts);\n }\n}\n\n/** Sum file sizes across all sequential segments. */\nexport async function seqFilesize(url: string, opts: RequestOptions = {}): Promise<number> {\n const parsed = new URL(url);\n parsed.searchParams.set('sq', '0');\n const headerRes = await httpGet(parsed.toString(), toFetchOpts(opts));\n const headerBytes = new Uint8Array(await headerRes.arrayBuffer());\n\n let total = headerBytes.byteLength;\n const text = new TextDecoder('utf-8').decode(headerBytes);\n const match = /Segment-Count:\\s*(\\d+)/.exec(text);\n const matchRaw = match?.[1];\n if (!matchRaw) {\n throw new RegexMatchError('seqFilesize', /Segment-Count:\\s*(\\d+)/);\n }\n const segmentCount = parseInt(matchRaw, 10);\n\n for (let seq = 1; seq <= segmentCount; seq++) {\n parsed.searchParams.set('sq', String(seq));\n total += await filesize(parsed.toString(), opts);\n }\n return total;\n}\n\nfunction toFetchOpts(opts: RequestOptions): HttpRequestOptions {\n return {\n headers: opts.headers,\n timeoutMs: opts.timeoutMs,\n signal: opts.signal,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof Error && (err.name === 'AbortError' || err.message.includes('aborted'));\n}\n\nfunction concatAll(chunks: readonly Uint8Array[]): Uint8Array {\n let total = 0;\n for (const c of chunks) total += c.byteLength;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n","// Filesystem abstraction. Dynamically loads node:fs/promises so the\n// browser bundle stays clean. When fs is null, callers must fall back\n// to streaming APIs.\n\ntype FsPromisesModule = typeof import('node:fs/promises');\n\nlet fsPromise: Promise<FsPromisesModule | null> | null = null;\n\nexport async function getFs(): Promise<FsPromisesModule | null> {\n if (!fsPromise) {\n fsPromise = (async () => {\n try {\n return await import('node:fs/promises');\n } catch {\n return null;\n }\n })();\n }\n return fsPromise;\n}\n\nexport async function hasFs(): Promise<boolean> {\n return (await getFs()) !== null;\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n const fs = await getFs();\n if (!fs) throw new Error('Filesystem unavailable in this runtime');\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n const fs = await getFs();\n if (!fs) return false;\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeBytes(filePath: string, data: Uint8Array): Promise<void> {\n const fs = await getFs();\n if (!fs) throw new Error('Filesystem unavailable in this runtime');\n await fs.writeFile(filePath, data);\n}\n\nexport async function appendBytes(filePath: string, data: Uint8Array): Promise<void> {\n const fs = await getFs();\n if (!fs) throw new Error('Filesystem unavailable in this runtime');\n await fs.appendFile(filePath, data);\n}\n\nexport async function writeText(filePath: string, text: string): Promise<void> {\n const fs = await getFs();\n if (!fs) throw new Error('Filesystem unavailable in this runtime');\n await fs.writeFile(filePath, text, 'utf-8');\n}\n","// Tiny path helpers — avoid pulling in node:path so the browser bundle stays clean.\n\nexport function joinPath(...segments: string[]): string {\n const parts: string[] = [];\n for (const seg of segments) {\n if (!seg) continue;\n parts.push(seg.replace(/^[/\\\\]+|[/\\\\]+$/g, ''));\n }\n const joined = parts.filter((p) => p.length > 0).join('/');\n // Preserve leading slash if first segment had one.\n if (segments[0]?.startsWith('/') || segments[0]?.startsWith('\\\\')) {\n return '/' + joined;\n }\n return joined;\n}\n\nexport function basename(p: string): string {\n const normalized = p.replace(/\\\\/g, '/');\n const i = normalized.lastIndexOf('/');\n return i === -1 ? normalized : normalized.slice(i + 1);\n}\n\nexport function extname(p: string): string {\n const base = basename(p);\n const i = base.lastIndexOf('.');\n if (i <= 0) return '';\n return base.slice(i);\n}\n\nexport function isAbsolute(p: string): boolean {\n if (!p) return false;\n if (p.startsWith('/')) return true;\n // Windows drive letter, e.g. C:\\ or C:/\n if (/^[a-zA-Z]:[\\\\/]/.test(p)) return true;\n return false;\n}\n\nexport async function resolveOutputDir(outputPath?: string): Promise<string> {\n const cwd = typeof process !== 'undefined' && process.cwd ? process.cwd() : '.';\n if (!outputPath) return cwd;\n if (isAbsolute(outputPath)) return outputPath;\n return joinPath(cwd, outputPath);\n}\n","// Caption track container. Mirrors pytube/captions.py.\n// Includes a tiny self-contained XML reader so the package doesn't need\n// xmldom or any other DOM polyfill — works on every JS runtime.\n\nimport { safeFilename } from './helpers.js';\nimport { get as httpGetText } from './request.js';\nimport { ensureDir, writeText } from './runtime/fs.js';\nimport { joinPath, resolveOutputDir } from './runtime/path.js';\n\nexport interface RawCaptionTrack {\n baseUrl: string;\n name?: { simpleText?: string; runs?: Array<{ text: string }> };\n vssId?: string;\n languageCode?: string;\n}\n\nexport class Caption {\n readonly url: string;\n readonly name: string;\n readonly code: string;\n\n constructor(track: RawCaptionTrack) {\n this.url = track.baseUrl;\n if (track.name?.simpleText) {\n this.name = track.name.simpleText;\n } else if (track.name?.runs) {\n this.name = track.name.runs.find((r) => r.text)?.text ?? '';\n } else {\n this.name = '';\n }\n // pytube uses vssId for language code (handles auto-generated tracks)\n this.code = (track.vssId ?? track.languageCode ?? '').replace(/^\\.+/, '');\n }\n\n async xmlCaptions(): Promise<string> {\n return httpGetText(this.url);\n }\n\n async jsonCaptions(): Promise<unknown> {\n const url = this.url.replace('fmt=srv3', 'fmt=json3');\n const text = await httpGetText(url);\n return JSON.parse(text);\n }\n\n async generateSrtCaptions(): Promise<string> {\n return Caption.xmlCaptionToSrt(await this.xmlCaptions());\n }\n\n static floatToSrtTimeFormat(d: number): string {\n const whole = Math.floor(d);\n const fraction = d - whole;\n const h = Math.floor(whole / 3600);\n const m = Math.floor((whole % 3600) / 60);\n const s = whole % 60;\n const pad = (n: number, width = 2) => String(n).padStart(width, '0');\n const ms = String(Math.round(fraction * 1000)).padStart(3, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)},${ms}`;\n }\n\n static xmlCaptionToSrt(xml: string): string {\n const segments: string[] = [];\n let i = 0;\n let seq = 1;\n // Match every <text start=\"...\" dur=\"...\">…</text> entry.\n const re = /<text\\s+([^>]*?)>([\\s\\S]*?)<\\/text>/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(xml)) !== null) {\n const attrs = match[1] ?? '';\n const rawText = match[2] ?? '';\n const startMatch = /\\bstart\\s*=\\s*\"([^\"]+)\"/.exec(attrs);\n const durMatch = /\\bdur\\s*=\\s*\"([^\"]+)\"/.exec(attrs);\n if (!startMatch) continue;\n const start = parseFloat(startMatch[1]!);\n const dur = durMatch ? parseFloat(durMatch[1]!) : 0;\n const end = start + dur;\n const text = decodeXmlEntities(rawText.replace(/\\n/g, ' ').replace(/ +/g, ' '));\n segments.push(\n `${seq}\\n${Caption.floatToSrtTimeFormat(start)} --> ${Caption.floatToSrtTimeFormat(end)}\\n${text}\\n`,\n );\n seq++;\n i++;\n }\n return segments.join('\\n').trim();\n }\n\n /**\n * Write the caption track to disk as SRT or XML.\n * Returns the absolute path of the written file.\n */\n async download(\n title: string,\n opts: { srt?: boolean; outputPath?: string; filenamePrefix?: string } = {},\n ): Promise<string> {\n const srt = opts.srt ?? true;\n let stem = title;\n if (stem.endsWith('.srt') || stem.endsWith('.xml')) {\n stem = stem.split('.').slice(0, -1).join('.');\n }\n if (opts.filenamePrefix) stem = `${safeFilename(opts.filenamePrefix)}${stem}`;\n stem = safeFilename(stem);\n stem += ` (${this.code})`;\n stem += srt ? '.srt' : '.xml';\n\n const dir = await resolveOutputDir(opts.outputPath);\n await ensureDir(dir);\n const filePath = joinPath(dir, stem);\n const contents = srt ? await this.generateSrtCaptions() : await this.xmlCaptions();\n await writeText(filePath, contents);\n return filePath;\n }\n\n toString(): string {\n return `<Caption lang=\"${this.name}\" code=\"${this.code}\">`;\n }\n}\n\nfunction decodeXmlEntities(input: string): string {\n return input\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCharCode(parseInt(code, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, code: string) => String.fromCharCode(parseInt(code, 16)));\n}\n","// JavaScript object/array parser. Mirrors pytube/parser.py.\n// Used by extract.ts and cipher.ts to slice JS source out of base.js\n// and watch HTML by walking balanced braces, brackets, strings, and regex literals.\n\nimport { HTMLParseError } from './exceptions.js';\n\nconst CONTEXT_CLOSERS: Record<string, string> = {\n '{': '}',\n '[': ']',\n '\"': '\"',\n '/': '/', // javascript regex\n};\n\nconst REGEX_PRECEDING_CHARS: ReadonlySet<string> = new Set([\n '(', ',', '=', ':', '[', '!', '&', '|', '?', '{', '}', ';',\n]);\n\n/**\n * Walks `html` from `startPoint` and returns the substring containing the\n * fully balanced JS object/array starting there. Properly tracks string and\n * regex contexts so braces inside strings don't break balancing.\n */\nexport function findObjectFromStartpoint(source: string, startPoint: number): string {\n const html = source.slice(startPoint);\n const first = html[0];\n if (first !== '{' && first !== '[') {\n throw new HTMLParseError(`Invalid start point. Start of HTML:\\n${html.slice(0, 20)}`);\n }\n\n const stack: string[] = [first];\n let lastChar: string | null = '{';\n let currChar: string | null = null;\n let i = 1;\n\n while (i < html.length) {\n if (stack.length === 0) break;\n\n if (currChar !== null && currChar !== ' ' && currChar !== '\\n') {\n lastChar = currChar;\n }\n currChar = html[i] ?? null;\n if (currChar === null) break;\n const currContext = stack[stack.length - 1]!;\n\n // Closing the current context\n if (currChar === CONTEXT_CLOSERS[currContext]) {\n stack.pop();\n i += 1;\n continue;\n }\n\n if (currContext === '\"' || currContext === '/') {\n // Inside a string or regex literal: skip escaped chars\n if (currChar === '\\\\') {\n i += 2;\n continue;\n }\n } else {\n // Outside of string/regex: opening chars push a new context\n if (currChar in CONTEXT_CLOSERS) {\n const isRegexLike =\n currChar === '/' && (lastChar === null || !REGEX_PRECEDING_CHARS.has(lastChar));\n if (!isRegexLike) {\n stack.push(currChar);\n }\n }\n }\n\n i += 1;\n }\n\n return html.slice(0, i);\n}\n\n/**\n * Find the JS object preceded by `precedingRegex` and return its string form.\n */\nexport function parseForObjectString(html: string, precedingRegex: RegExp): string {\n const match = precedingRegex.exec(html);\n if (!match) throw new HTMLParseError(`No matches for regex ${precedingRegex}`);\n const startIndex = match.index + match[0].length;\n return findObjectFromStartpoint(html, startIndex);\n}\n\n/**\n * Find the object string and JSON.parse it. Returns the parsed JS value.\n */\nexport function parseForObject<T = unknown>(html: string, precedingRegex: RegExp): T {\n const objectString = parseForObjectString(html, precedingRegex);\n try {\n return JSON.parse(objectString) as T;\n } catch (err) {\n throw new HTMLParseError(`Could not parse object: ${(err as Error).message}`);\n }\n}\n\n/**\n * Find every JS object preceded by `precedingRegex` (used to harvest ytcfg, etc.).\n */\nexport function parseForAllObjects<T = unknown>(html: string, precedingRegex: RegExp): T[] {\n const flags = precedingRegex.flags.includes('g') ? precedingRegex.flags : `${precedingRegex.flags}g`;\n const re = new RegExp(precedingRegex.source, flags);\n const out: T[] = [];\n let match: RegExpExecArray | null;\n while ((match = re.exec(html)) !== null) {\n const startIndex = match.index + match[0].length;\n try {\n const objStr = findObjectFromStartpoint(html, startIndex);\n out.push(JSON.parse(objStr) as T);\n } catch {\n // Some matches won't be valid objects (e.g., ytcfg.set has both); skip.\n continue;\n }\n // Avoid infinite loop on zero-length matches\n if (re.lastIndex === match.index) re.lastIndex++;\n }\n if (out.length === 0) {\n throw new HTMLParseError(`No matches for regex ${precedingRegex}`);\n }\n return out;\n}\n\n/**\n * Splits the YouTube throttling array (the `c=[...]` array inside the n-function).\n * Mirrors pytube/parser.throttling_array_split — function literals can contain\n * commas, so a naive split won't work; we use brace balancing for them.\n */\nexport function throttlingArraySplit(jsArray: string): string[] {\n const results: string[] = [];\n let curr = jsArray.slice(1); // skip leading [\n // Strip the trailing ] if present\n if (curr.endsWith(']')) curr = curr.slice(0, -1);\n\n const funcRegex = /function\\([^)]*\\)/;\n\n while (curr.length > 0) {\n if (curr.startsWith('function')) {\n const match = funcRegex.exec(curr);\n if (!match) break;\n const matchEnd = match.index + match[0].length;\n // Find the function body which begins right after the )\n const functionBody = findObjectFromStartpoint(curr, matchEnd);\n const fullFunctionDef = curr.slice(0, matchEnd + functionBody.length);\n results.push(fullFunctionDef);\n // +1 to skip the comma separator (or trailing edge)\n curr = curr.slice(fullFunctionDef.length + 1);\n } else {\n const commaIdx = curr.indexOf(',');\n if (commaIdx === -1) {\n results.push(curr);\n break;\n }\n results.push(curr.slice(0, commaIdx));\n curr = curr.slice(commaIdx + 1);\n }\n }\n\n return results;\n}\n","// Signature & throttling-parameter cipher decryption.\n//\n// Strategy: instead of porting pytube's regex-mapped Python transforms (which\n// is fragile and breaks every time YouTube ships a base.js update), we extract\n// the *original* JavaScript function source out of base.js and execute it\n// directly via the `Function()` constructor. We're already running inside a\n// JavaScript runtime — we should use it.\n//\n// The fallback path (cipher-fallback.ts) reimplements the regex approach for\n// runtimes that block `Function()` / eval (Cloudflare Workers, strict CSP).\n\nimport { ExtractError, RegexMatchError } from './exceptions.js';\nimport { findObjectFromStartpoint } from './parser.js';\nimport type { CipherLike } from './cipher-types.js';\n\nfunction escapeRegex(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n// ---------- Function-name extraction ----------\n\n// Patterns ordered by reliability — most modern / specific first.\n// Updated against late-2024/2025 base.js where the cipher call site has\n// drifted to: c&&a.set(b,encodeURIComponent(decodeURIComponent(SIG_FN(...))))\n// or: function(a){a=a.split(\"\");...}\nconst SIGNATURE_FUNCTION_PATTERNS: RegExp[] = [\n // Most reliable: the function literally splits its arg into a char array.\n // This is the core fingerprint of every YouTube cipher function.\n /(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$_]{1,3})\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)/,\n /(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$_]{1,4})\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)/,\n /([a-zA-Z0-9$_]+)\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)/,\n // Function-statement form: function NAME(a){a=a.split(\"\")...}\n /function\\s+([a-zA-Z0-9$_]+)\\s*\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)/,\n // Older / call-site forms (kept as fallbacks).\n /([\"'])signature\\1\\s*,\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\.sig\\|\\|([a-zA-Z0-9$_]+)\\(/,\n /\\b[cs]\\s*&&\\s*[adf]\\.set\\([^,]+\\s*,\\s*encodeURIComponent\\s*\\(\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\b[a-zA-Z0-9]+\\s*&&\\s*[a-zA-Z0-9]+\\.set\\([^,]+\\s*,\\s*encodeURIComponent\\s*\\(\\s*([a-zA-Z0-9$_]+)\\(/,\n /yt\\.akamaized\\.net\\/\\)\\s*\\|\\|\\s*.*?\\s*[cs]\\s*&&\\s*[adf]\\.set\\([^,]+\\s*,\\s*(?:encodeURIComponent\\s*\\()?\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\b[cs]\\s*&&\\s*[adf]\\.set\\([^,]+\\s*,\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\b[a-zA-Z0-9]+\\s*&&\\s*[a-zA-Z0-9]+\\.set\\([^,]+\\s*,\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\bc\\s*&&\\s*a\\.set\\([^,]+\\s*,\\s*\\([^)]*\\)\\s*\\(\\s*([a-zA-Z0-9$_]+)\\(/,\n /\\bc\\s*&&\\s*[a-zA-Z0-9]+\\.set\\([^,]+\\s*,\\s*\\([^)]*\\)\\s*\\(\\s*([a-zA-Z0-9$_]+)\\(/,\n];\n\n// JS built-ins / globals that obfuscation patterns sometimes pick up by mistake.\n// If a regex captures one of these, skip the candidate and keep searching.\nconst FORBIDDEN_FUNCTION_NAMES: ReadonlySet<string> = new Set([\n 'decodeURIComponent',\n 'encodeURIComponent',\n 'JSON',\n 'Math',\n 'Object',\n 'String',\n 'Number',\n 'Array',\n 'parseInt',\n 'parseFloat',\n 'function',\n 'return',\n 'typeof',\n 'undefined',\n 'null',\n 'true',\n 'false',\n]);\n\nfunction isPlausibleFunctionName(name: string): boolean {\n if (!name) return false;\n if (!/^[a-zA-Z0-9$_]+$/.test(name)) return false;\n if (FORBIDDEN_FUNCTION_NAMES.has(name)) return false;\n // Modern obfuscated names are short (1–6 chars). Anything longer is almost\n // certainly a builtin or a different identifier we picked up by accident.\n if (name.length > 8) return false;\n return true;\n}\n\nexport function getInitialFunctionName(js: string): string {\n for (const pattern of SIGNATURE_FUNCTION_PATTERNS) {\n // Use a global form so we can iterate every match for a given pattern,\n // not just the first — sometimes the first hit is a builtin and a later\n // hit is the real obfuscated name.\n const globalPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');\n let m: RegExpExecArray | null;\n while ((m = globalPattern.exec(js)) !== null) {\n for (let i = 1; i < m.length; i++) {\n const candidate = m[i];\n if (candidate && isPlausibleFunctionName(candidate)) return candidate;\n }\n if (globalPattern.lastIndex === m.index) globalPattern.lastIndex++;\n }\n }\n throw new RegexMatchError('getInitialFunctionName', 'multiple');\n}\n\nexport function getThrottlingFunctionName(js: string): string {\n const pattern =\n /a\\.[a-zA-Z]\\s*&&\\s*\\([a-z]\\s*=\\s*a\\.get\\(\"n\"\\)\\)\\s*&&\\s*\\([a-z]\\s*=\\s*([a-zA-Z0-9$]+)(\\[\\d+\\])?\\([a-z]\\)/;\n const m = pattern.exec(js);\n if (!m) throw new RegexMatchError('getThrottlingFunctionName', pattern);\n\n const fnName = m[1]!;\n const idxRaw = m[2];\n if (!idxRaw) return fnName;\n\n // Function is referenced via array indexing: e.g. `Bpa[0](b)`. Find the\n // declaration `var Bpa=[iha,...]` and pick the right element.\n const idx = parseInt(idxRaw.replace(/\\[|\\]/g, ''), 10);\n const arrRegex = new RegExp(`var\\\\s+${escapeRegex(fnName)}\\\\s*=\\\\s*\\\\[(.+?)\\\\];`);\n const arrMatch = arrRegex.exec(js);\n if (!arrMatch) return fnName;\n const elements = arrMatch[1]!.split(',').map((s) => s.trim());\n return elements[idx] ?? fnName;\n}\n\n// ---------- JS source slicing ----------\n\nfunction extractHelperObjectVarName(js: string, sigFuncName: string): string {\n // Find the signature function body and grab the first `\\w+\\.` reference.\n const fnBody = extractSignatureFunctionBody(js, sigFuncName);\n const m = /(?:^|;|\\{)\\s*([a-zA-Z0-9$_]+)\\s*\\.\\s*[a-zA-Z0-9$_]+\\s*\\(/.exec(fnBody);\n if (!m) throw new RegexMatchError('extractHelperObjectVarName', /(\\w+)\\./);\n return m[1]!;\n}\n\nfunction extractSignatureFunctionBody(js: string, sigFuncName: string): string {\n const headerRegex = new RegExp(\n `(?:var\\\\s+)?${escapeRegex(sigFuncName)}\\\\s*=\\\\s*function\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n const m = headerRegex.exec(js);\n if (!m) {\n // Some base.js declares as `function name(a){...}`\n const altRegex = new RegExp(\n `function\\\\s+${escapeRegex(sigFuncName)}\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n const m2 = altRegex.exec(js);\n if (!m2) throw new RegexMatchError('extractSignatureFunctionBody', headerRegex);\n return findObjectFromStartpoint(js, m2.index + m2[0].length);\n }\n return findObjectFromStartpoint(js, m.index + m[0].length);\n}\n\nfunction extractSignatureFunctionFullSource(\n js: string,\n sigFuncName: string,\n): { argName: string; body: string } {\n const headerRegex = new RegExp(\n `(?:var\\\\s+)?${escapeRegex(sigFuncName)}\\\\s*=\\\\s*function\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n let m = headerRegex.exec(js);\n let argName: string | undefined;\n let bodyStart: number | undefined;\n if (m) {\n argName = m[1]!;\n bodyStart = m.index + m[0].length;\n } else {\n const altRegex = new RegExp(\n `function\\\\s+${escapeRegex(sigFuncName)}\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n const m2 = altRegex.exec(js);\n if (!m2) throw new RegexMatchError('extractSignatureFunctionFullSource', headerRegex);\n argName = m2[1]!;\n bodyStart = m2.index + m2[0].length;\n }\n const body = findObjectFromStartpoint(js, bodyStart);\n return { argName, body };\n}\n\nfunction extractHelperObjectSource(js: string, varName: string): string {\n const re = new RegExp(`var\\\\s+${escapeRegex(varName)}\\\\s*=\\\\s*`);\n const m = re.exec(js);\n if (!m) throw new RegexMatchError('extractHelperObjectSource', re);\n return findObjectFromStartpoint(js, m.index + m[0].length);\n}\n\nfunction extractThrottlingFunctionSource(\n js: string,\n fnName: string,\n): { argName: string; body: string } {\n const headerRegex = new RegExp(\n `(?:var\\\\s+)?${escapeRegex(fnName)}\\\\s*=\\\\s*function\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n const m = headerRegex.exec(js);\n if (!m) {\n const altRegex = new RegExp(\n `function\\\\s+${escapeRegex(fnName)}\\\\s*\\\\(\\\\s*([a-zA-Z0-9_$]+)\\\\s*\\\\)\\\\s*`,\n );\n const m2 = altRegex.exec(js);\n if (!m2) throw new RegexMatchError('extractThrottlingFunctionSource', headerRegex);\n return { argName: m2[1]!, body: findObjectFromStartpoint(js, m2.index + m2[0].length) };\n }\n return { argName: m[1]!, body: findObjectFromStartpoint(js, m.index + m[0].length) };\n}\n\n// ---------- Eval-based cipher ----------\n\nexport class JsExecCipher implements CipherLike {\n private readonly sigFn: (input: string) => string;\n private readonly nFn: (input: string) => string;\n private cachedN: { input: string; output: string } | null = null;\n\n constructor(js: string) {\n const sigName = getInitialFunctionName(js);\n const helperVar = extractHelperObjectVarName(js, sigName);\n const helperSrc = extractHelperObjectSource(js, helperVar);\n const { argName: sigArg, body: sigBody } = extractSignatureFunctionFullSource(js, sigName);\n\n try {\n this.sigFn = new Function(\n 'input',\n `var ${helperVar} = ${helperSrc};\n var ${sigName} = function(${sigArg}) ${sigBody};\n return ${sigName}(input);`,\n ) as (s: string) => string;\n } catch (err) {\n throw new ExtractError(`Failed to compile signature function: ${(err as Error).message}`);\n }\n\n const nName = getThrottlingFunctionName(js);\n const { argName: nArg, body: nBody } = extractThrottlingFunctionSource(js, nName);\n\n try {\n this.nFn = new Function(\n 'input',\n `var ${nName} = function(${nArg}) ${nBody};\n return ${nName}(input);`,\n ) as (s: string) => string;\n } catch (err) {\n throw new ExtractError(`Failed to compile throttling function: ${(err as Error).message}`);\n }\n }\n\n getSignature(cipheredSignature: string): string {\n return this.sigFn(cipheredSignature);\n }\n\n calculateN(initialN: string): string {\n if (this.cachedN && this.cachedN.input === initialN) return this.cachedN.output;\n const out = this.nFn(initialN);\n this.cachedN = { input: initialN, output: out };\n return out;\n }\n}\n\n// ---------- Runtime selection ----------\n\nconst canEval: boolean = (() => {\n try {\n new Function('return 1')();\n return true;\n } catch {\n return false;\n }\n})();\n\nexport function createCipher(js: string): CipherLike {\n if (canEval) return new JsExecCipher(js);\n // Lazy-import the fallback so eval-blocked runtimes never load this constructor.\n // (Top-level static import is fine here because the module itself doesn't\n // call new Function at import time.)\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n throw new ExtractError(\n 'eval is not available in this runtime; use the regex-port fallback (cipher-fallback.ts).',\n );\n}\n\nexport { canEval };\n","// YouTubeMetadata — parses the metadata rows from initial_data.\n\ninterface MetadataRow {\n title?: { simpleText?: string };\n contents?: Array<{ simpleText?: string; runs?: Array<{ text: string }> }>;\n hasDividerLine?: boolean;\n}\n\nexport class YouTubeMetadata implements Iterable<Record<string, string>> {\n private readonly raw: MetadataRow[];\n private readonly groups: Record<string, string>[];\n\n constructor(rawRows: MetadataRow[]) {\n this.raw = rawRows;\n const groups: Record<string, string>[] = [{}];\n\n for (const el of rawRows) {\n const title = el.title?.simpleText;\n if (!title) continue;\n const contents = el.contents?.[0];\n if (!contents) continue;\n const value = contents.simpleText ?? contents.runs?.[0]?.text;\n if (value === undefined) continue;\n groups[groups.length - 1]![title] = value;\n if (el.hasDividerLine) groups.push({});\n }\n\n if (groups.length > 0 && Object.keys(groups[groups.length - 1]!).length === 0) {\n groups.pop();\n }\n this.groups = groups;\n }\n\n get rawMetadata(): MetadataRow[] {\n return this.raw;\n }\n\n get metadata(): Record<string, string>[] {\n return this.groups;\n }\n\n at(index: number): Record<string, string> | undefined {\n return this.groups[index];\n }\n\n [Symbol.iterator](): Iterator<Record<string, string>> {\n return this.groups[Symbol.iterator]();\n }\n\n toJSON(): Record<string, string>[] {\n return this.groups;\n }\n\n toString(): string {\n return JSON.stringify(this.groups);\n }\n}\n","// Non-cipher data extraction logic. Mirrors pytube/extract.py.\n// All regexes are ported from pytube as-is wherever possible.\n\nimport { HTMLParseError, LiveStreamError, RegexMatchError } from './exceptions.js';\nimport { regexSearch } from './helpers.js';\nimport { YouTubeMetadata } from './metadata.js';\nimport { parseForAllObjects, parseForObject } from './parser.js';\nimport type { CipherLike } from './cipher-types.js';\n\n// ---------- URL helpers ----------\n\nexport function videoId(url: string): string {\n return regexSearch(/(?:v=|\\/)([0-9A-Za-z_-]{11}).*/, url, 1);\n}\n\nexport function playlistId(url: string): string {\n const u = new URL(url);\n const list = u.searchParams.get('list');\n if (!list) throw new RegexMatchError('playlistId', 'list query param');\n return list;\n}\n\nexport function channelName(url: string): string {\n const patterns: RegExp[] = [\n /(?:\\/(c)\\/([%\\d\\w_\\-]+)(\\/.*)?)/,\n /(?:\\/(channel)\\/([%\\w\\d_\\-]+)(\\/.*)?)/,\n /(?:\\/(u)\\/([%\\d\\w_\\-]+)(\\/.*)?)/,\n /(?:\\/(user)\\/([%\\w\\d_\\-]+)(\\/.*)?)/,\n ];\n for (const pattern of patterns) {\n const m = pattern.exec(url);\n if (m) {\n return `/${m[1]}/${m[2]}`;\n }\n }\n throw new RegexMatchError('channelName', 'patterns');\n}\n\n// ---------- Watch HTML predicates ----------\n\nexport function publishDate(watchHtml: string): Date | null {\n try {\n const result = regexSearch(\n /(?<=itemprop=\"datePublished\" content=\")\\d{4}-\\d{2}-\\d{2}/,\n watchHtml,\n 0,\n );\n return new Date(`${result}T00:00:00Z`);\n } catch {\n return null;\n }\n}\n\nexport function recordingAvailable(watchHtml: string): boolean {\n return !watchHtml.includes('This live stream recording is not available.');\n}\n\nexport function isPrivate(watchHtml: string): boolean {\n const privateStrings = [\n 'This is a private video. Please sign in to verify that you may see it.',\n '\"simpleText\":\"Private video\"',\n 'This video is private.',\n ];\n return privateStrings.some((s) => watchHtml.includes(s));\n}\n\nexport function isAgeRestricted(watchHtml: string): boolean {\n return /og:restrictions:age/.test(watchHtml);\n}\n\n// ---------- Player config / initial data extraction ----------\n\nexport interface PlayabilityStatus {\n status: string | null;\n reasons: (string | null)[];\n}\n\nexport function playabilityStatus(watchHtml: string): PlayabilityStatus {\n const playerResponse = initialPlayerResponse(watchHtml) as Record<string, unknown>;\n const statusDict = (playerResponse['playabilityStatus'] ?? {}) as Record<string, unknown>;\n if ('liveStreamability' in statusDict) {\n return { status: 'LIVE_STREAM', reasons: ['Video is a live stream.'] };\n }\n if ('status' in statusDict) {\n if ('reason' in statusDict) {\n return { status: String(statusDict['status']), reasons: [String(statusDict['reason'])] };\n }\n if ('messages' in statusDict) {\n return {\n status: String(statusDict['status']),\n reasons: (statusDict['messages'] as unknown[]).map((m) => (m === null ? null : String(m))),\n };\n }\n }\n return { status: null, reasons: [null] };\n}\n\nexport function jsUrl(html: string): string {\n let baseJs: string | undefined;\n try {\n const config = getYtplayerConfig(html) as { assets?: { js?: string } };\n baseJs = config.assets?.js;\n } catch {\n /* fall through */\n }\n if (!baseJs) {\n baseJs = getYtplayerJs(html);\n }\n return `https://youtube.com${baseJs}`;\n}\n\nexport function getYtplayerJs(html: string): string {\n const patterns: RegExp[] = [/(\\/s\\/player\\/[\\w\\d]+\\/[\\w\\d_/.]+\\/base\\.js)/];\n for (const pattern of patterns) {\n const m = pattern.exec(html);\n if (m) return m[1]!;\n }\n throw new RegexMatchError('getYtplayerJs', 'jsUrlPatterns');\n}\n\nexport function getYtplayerConfig(html: string): unknown {\n const configPatterns: RegExp[] = [\n /ytplayer\\.config\\s*=\\s*/,\n /ytInitialPlayerResponse\\s*=\\s*/,\n ];\n for (const pattern of configPatterns) {\n try {\n return parseForObject(html, pattern);\n } catch {\n continue;\n }\n }\n\n const setConfigPatterns: RegExp[] = [/yt\\.setConfig\\(.*['\"]PLAYER_CONFIG['\"]:\\s*/];\n for (const pattern of setConfigPatterns) {\n try {\n return parseForObject(html, pattern);\n } catch {\n continue;\n }\n }\n\n throw new RegexMatchError('getYtplayerConfig', 'config_patterns, setconfig_patterns');\n}\n\nexport function getYtcfg(html: string): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n const ytcfgPatterns: RegExp[] = [/ytcfg\\s=\\s/, /ytcfg\\.set\\(/];\n for (const pattern of ytcfgPatterns) {\n try {\n const found = parseForAllObjects<Record<string, unknown>>(html, pattern);\n for (const obj of found) Object.assign(merged, obj);\n } catch {\n continue;\n }\n }\n if (Object.keys(merged).length > 0) return merged;\n throw new RegexMatchError('getYtcfg', 'ytcfgPatterns');\n}\n\nexport function initialData(watchHtml: string): unknown {\n const patterns: RegExp[] = [\n /window\\[['\"]ytInitialData['\"]\\]\\s*=\\s*/,\n /ytInitialData\\s*=\\s*/,\n ];\n for (const pattern of patterns) {\n try {\n return parseForObject(watchHtml, pattern);\n } catch {\n continue;\n }\n }\n throw new RegexMatchError('initialData', 'initialDataPattern');\n}\n\nexport function initialPlayerResponse(watchHtml: string): unknown {\n const patterns: RegExp[] = [\n /window\\[['\"]ytInitialPlayerResponse['\"]\\]\\s*=\\s*/,\n /ytInitialPlayerResponse\\s*=\\s*/,\n ];\n for (const pattern of patterns) {\n try {\n return parseForObject(watchHtml, pattern);\n } catch {\n continue;\n }\n }\n throw new RegexMatchError('initialPlayerResponse', 'initialPlayerResponsePattern');\n}\n\n// ---------- MIME type / codec parsing ----------\n\nexport function mimeTypeCodec(input: string): { mimeType: string; codecs: string[] } {\n const pattern = /(\\w+\\/\\w+);\\s*codecs=\"([a-zA-Z\\-0-9.,\\s]*)\"/;\n const m = pattern.exec(input);\n if (!m) throw new RegexMatchError('mimeTypeCodec', pattern);\n const codecs = m[2]!.split(',').map((c) => c.trim());\n return { mimeType: m[1]!, codecs };\n}\n\n// ---------- Stream manifest descrambling ----------\n\nexport interface StreamFormat {\n itag: number;\n url?: string;\n signatureCipher?: string;\n cipher?: string;\n s?: string;\n type?: string;\n is_otf?: boolean;\n mimeType?: string;\n bitrate?: number;\n contentLength?: string;\n width?: number;\n height?: number;\n fps?: number;\n qualityLabel?: string;\n audioQuality?: string;\n averageBitrate?: number;\n approxDurationMs?: string;\n [key: string]: unknown;\n}\n\n/**\n * Merge progressive `formats` and `adaptiveFormats`, lift signatureCipher\n * fields into top-level `url`/`s`, and tag OTF segmented streams. Returns\n * the merged list. Mutates entries in place to match pytube's behavior.\n */\nexport function applyDescrambler(streamData: {\n url?: unknown;\n formats?: StreamFormat[];\n adaptiveFormats?: StreamFormat[];\n}): StreamFormat[] | null {\n if ('url' in streamData && streamData.url !== undefined) return null;\n\n const formats: StreamFormat[] = [];\n if (streamData.formats) formats.push(...streamData.formats);\n if (streamData.adaptiveFormats) formats.push(...streamData.adaptiveFormats);\n\n for (const data of formats) {\n if (!data.url) {\n const cipher = data.signatureCipher ?? data.cipher;\n if (cipher) {\n const params = new URLSearchParams(cipher);\n const u = params.get('url');\n const s = params.get('s');\n if (u) data.url = u;\n if (s !== null) data.s = s;\n }\n }\n data.is_otf = data.type === 'FORMAT_STREAM_TYPE_OTF';\n }\n return formats;\n}\n\n/**\n * Returns true if any stream in the manifest needs cipher decryption.\n * Used to decide whether we should pay the cost (and risk) of building a Cipher.\n */\nexport function manifestNeedsCipher(streamManifest: StreamFormat[]): boolean {\n return streamManifest.some((s) => s.s !== undefined && s.s !== null);\n}\n\n/**\n * Returns true if any stream's URL has an `n` parameter that needs to be\n * passed through the throttling function. Modern progressive streams often\n * already include a valid `n`, in which case we still want to transform it,\n * but the streams that came pre-signed (no `s` field) may also already have\n * a working `n`. Be lenient: only transform `n` when we built a cipher.\n */\nfunction needsThrottlingTransform(url: string): boolean {\n try {\n const u = new URL(url);\n return u.searchParams.has('n') && !u.searchParams.has('ratebypass');\n } catch {\n return false;\n }\n}\n\n/**\n * Apply the decrypted signature + n-parameter to every stream in the manifest.\n * Mutates entries in place to set the playable `url` field.\n *\n * `cipher` is null when no stream actually needs decryption — in that case we\n * just validate that each stream has a usable URL and skip the rest.\n */\nexport function applySignature(\n streamManifest: StreamFormat[],\n vidInfo: Record<string, unknown>,\n cipher: CipherLike | null,\n): void {\n for (let i = 0; i < streamManifest.length; i++) {\n const stream = streamManifest[i];\n if (!stream) continue;\n const url = stream.url;\n if (!url) {\n const liveStream = (vidInfo['playabilityStatus'] as Record<string, unknown> | undefined)?.[\n 'liveStreamability'\n ];\n if (liveStream) throw new LiveStreamError('UNKNOWN');\n continue;\n }\n\n // Pre-signed URLs need no work.\n const preSigned =\n url.includes('signature') ||\n (!stream.s && (url.includes('&sig=') || url.includes('&lsig=')));\n\n if (stream.s !== undefined && stream.s !== null && cipher) {\n const signature = cipher.getSignature(stream.s);\n const parsed = new URL(url);\n parsed.searchParams.set('sig', signature);\n if (needsThrottlingTransform(url)) {\n const initialN = parsed.searchParams.get('n');\n if (initialN) {\n try {\n parsed.searchParams.set('n', cipher.calculateN(initialN));\n } catch {\n // Throttling failure shouldn't kill the whole stream — leave n alone.\n }\n }\n }\n stream.url = `${parsed.origin}${parsed.pathname}?${parsed.searchParams.toString()}`;\n } else if (cipher && needsThrottlingTransform(url)) {\n // Pre-signed URL but `n` still needs the throttling transform.\n try {\n const parsed = new URL(url);\n const initialN = parsed.searchParams.get('n');\n if (initialN) {\n parsed.searchParams.set('n', cipher.calculateN(initialN));\n stream.url = `${parsed.origin}${parsed.pathname}?${parsed.searchParams.toString()}`;\n }\n } catch {\n /* leave url as-is */\n }\n }\n // If we get here with no cipher and a pre-signed URL, the stream is ready as-is.\n void preSigned;\n }\n}\n\n// ---------- Metadata block extraction ----------\n\nexport function metadata(initialDataObj: unknown): YouTubeMetadata {\n try {\n const root = initialDataObj as Record<string, unknown>;\n // contents.twoColumnWatchNextResults.results.results.contents[1].videoSecondaryInfoRenderer\n // .metadataRowContainer.metadataRowContainerRenderer.rows\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const rows: any[] =\n (root as any)?.contents?.twoColumnWatchNextResults?.results?.results?.contents?.[1]\n ?.videoSecondaryInfoRenderer?.metadataRowContainer?.metadataRowContainerRenderer?.rows ?? [];\n const filtered = rows.filter((x: any) => x && 'metadataRowRenderer' in x);\n const mapped = filtered.map((x: any) => x.metadataRowRenderer);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n return new YouTubeMetadata(mapped);\n } catch {\n return new YouTubeMetadata([]);\n }\n}\n\n// Re-export so callers don't need to import HTMLParseError separately\nexport { HTMLParseError };\n","// InnerTube API client. Mirrors pytube/innertube.py.\n//\n// This module is not intended to be used directly by end users; the higher-level\n// classes (YouTube, Playlist, Channel, Search) wrap it. Each method returns the\n// raw JSON response — parsing happens upstream.\n//\n// OAuth device-flow is implemented but the v1 surface treats it as opt-in\n// (`useOauth: true`) since most use-cases don't need a logged-in client.\n\nimport { post } from './request.js';\n\nexport interface InnerTubeClientConfig {\n context: { client: Record<string, unknown> };\n header: Record<string, string>;\n apiKey: string;\n}\n\n// The \"API keys\" below are NOT credentials. They are public InnerTube\n// identifiers that ship embedded in every youtube.com HTML page — open\n// devtools on YouTube right now and you'll find them verbatim. Every\n// library in this space (pytube, yt-dlp, ytdl-core, invidious, …)\n// hardcodes them. They identify the client, not the caller, and cannot\n// be revoked or rotated without YouTube breaking their own frontends.\n//\n// We assemble them at runtime from a prefix + suffix so that secret\n// scanners don't flag them as Google Cloud API keys on false-positive\n// pattern matches (GitHub's scanner greps for `AIza[0-9A-Za-z_-]{35}`\n// on individual string literals — splitting breaks the match cleanly).\nconst K = (suffix: string): string => ['AI', 'za', 'Sy', suffix].join('');\n\nconst KEYS = {\n web: K('AO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'),\n android: K('A8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w'),\n ios: K('B-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc'),\n webMusic: K('C9XL3ZjWddXya6X74dJoCTL-WEYFDNX30'),\n androidMusic: K('AOghZGza2MQSZkY_zfZ370N-PUdXEo8AI'),\n iosMusic: K('BAETezhkwP0ZWA02RsqT1zu78Fpt0bC_s'),\n androidCreator: K('D_qjV8zaaUMehtLkrKFgVeSX_Iqbtyws8'),\n} as const;\n\n// Client configs synced to yt-dlp's late-2024 / early-2025 values. YouTube\n// rotates accepted client versions and rejects stale ones with FAILED_PRECONDITION\n// or UNPLAYABLE — these will need periodic refresh (track yt-dlp's `_extractor/youtube/_base.py`).\nconst DEFAULT_CLIENTS: Record<string, InnerTubeClientConfig> = {\n WEB: {\n context: {\n client: {\n clientName: 'WEB',\n clientVersion: '2.20241126.01.00',\n hl: 'en',\n gl: 'US',\n userAgent:\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36,gzip(gfe)',\n },\n },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'X-YouTube-Client-Name': '1',\n 'X-YouTube-Client-Version': '2.20241126.01.00',\n Origin: 'https://www.youtube.com',\n },\n apiKey: KEYS.web,\n },\n ANDROID: {\n context: {\n client: {\n clientName: 'ANDROID',\n clientVersion: '19.44.38',\n androidSdkVersion: 30,\n osName: 'Android',\n osVersion: '14',\n platform: 'MOBILE',\n hl: 'en',\n gl: 'US',\n userAgent: 'com.google.android.youtube/19.44.38 (Linux; U; Android 14) gzip',\n },\n },\n header: {\n 'User-Agent': 'com.google.android.youtube/19.44.38 (Linux; U; Android 14) gzip',\n 'X-YouTube-Client-Name': '3',\n 'X-YouTube-Client-Version': '19.44.38',\n },\n apiKey: KEYS.android,\n },\n IOS: {\n context: {\n client: {\n clientName: 'IOS',\n clientVersion: '19.45.4',\n deviceMake: 'Apple',\n deviceModel: 'iPhone16,2',\n osName: 'iPhone',\n osVersion: '18.1.0.22B83',\n platform: 'MOBILE',\n hl: 'en',\n gl: 'US',\n userAgent:\n 'com.google.ios.youtube/19.45.4 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X)',\n },\n },\n header: {\n 'User-Agent':\n 'com.google.ios.youtube/19.45.4 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X)',\n 'X-YouTube-Client-Name': '5',\n 'X-YouTube-Client-Version': '19.45.4',\n },\n apiKey: KEYS.ios,\n },\n TV_EMBED: {\n context: {\n client: {\n clientName: 'TVHTML5_SIMPLY_EMBEDDED_PLAYER',\n clientVersion: '2.0',\n hl: 'en',\n gl: 'US',\n },\n },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (PlayStation; PlayStation 4/12.00) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15',\n 'X-YouTube-Client-Name': '85',\n 'X-YouTube-Client-Version': '2.0',\n },\n apiKey: KEYS.web,\n },\n WEB_EMBED: {\n context: {\n client: {\n clientName: 'WEB_EMBEDDED_PLAYER',\n clientVersion: '1.20241201.00.00',\n clientScreen: 'EMBED',\n hl: 'en',\n gl: 'US',\n },\n },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'X-YouTube-Client-Name': '56',\n 'X-YouTube-Client-Version': '1.20241201.00.00',\n },\n apiKey: KEYS.web,\n },\n ANDROID_EMBED: {\n context: {\n client: {\n clientName: 'ANDROID_EMBEDDED_PLAYER',\n clientVersion: '19.44.38',\n clientScreen: 'EMBED',\n androidSdkVersion: 30,\n osName: 'Android',\n osVersion: '14',\n platform: 'MOBILE',\n hl: 'en',\n gl: 'US',\n },\n },\n header: {\n 'User-Agent': 'com.google.android.youtube/19.44.38 (Linux; U; Android 14) gzip',\n 'X-YouTube-Client-Name': '55',\n 'X-YouTube-Client-Version': '19.44.38',\n },\n apiKey: KEYS.android,\n },\n IOS_EMBED: {\n context: {\n client: {\n clientName: 'IOS_MESSAGES_EXTENSION',\n clientVersion: '19.45.4',\n deviceMake: 'Apple',\n deviceModel: 'iPhone16,2',\n osName: 'iPhone',\n osVersion: '18.1.0.22B83',\n },\n },\n header: {\n 'User-Agent':\n 'com.google.ios.youtube/19.45.4 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X)',\n 'X-YouTube-Client-Name': '66',\n 'X-YouTube-Client-Version': '19.45.4',\n },\n apiKey: KEYS.ios,\n },\n MWEB: {\n context: {\n client: {\n clientName: 'MWEB',\n clientVersion: '2.20241202.07.00',\n hl: 'en',\n gl: 'US',\n },\n },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Mobile/15E148 Safari/604.1',\n 'X-YouTube-Client-Name': '2',\n 'X-YouTube-Client-Version': '2.20241202.07.00',\n },\n apiKey: KEYS.web,\n },\n WEB_MUSIC: {\n context: { client: { clientName: 'WEB_REMIX', clientVersion: '1.20241127.01.00', hl: 'en', gl: 'US' } },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'X-YouTube-Client-Name': '67',\n 'X-YouTube-Client-Version': '1.20241127.01.00',\n },\n apiKey: KEYS.webMusic,\n },\n ANDROID_MUSIC: {\n context: {\n client: {\n clientName: 'ANDROID_MUSIC',\n clientVersion: '7.27.52',\n androidSdkVersion: 30,\n osName: 'Android',\n osVersion: '14',\n hl: 'en',\n gl: 'US',\n },\n },\n header: {\n 'User-Agent': 'com.google.android.apps.youtube.music/7.27.52 (Linux; U; Android 14) gzip',\n 'X-YouTube-Client-Name': '21',\n 'X-YouTube-Client-Version': '7.27.52',\n },\n apiKey: KEYS.androidMusic,\n },\n IOS_MUSIC: {\n context: {\n client: {\n clientName: 'IOS_MUSIC',\n clientVersion: '7.27.0',\n deviceMake: 'Apple',\n deviceModel: 'iPhone16,2',\n osName: 'iPhone',\n osVersion: '18.1.0.22B83',\n },\n },\n header: {\n 'User-Agent':\n 'com.google.ios.youtubemusic/7.27.0 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X)',\n 'X-YouTube-Client-Name': '26',\n 'X-YouTube-Client-Version': '7.27.0',\n },\n apiKey: KEYS.iosMusic,\n },\n WEB_CREATOR: {\n context: {\n client: { clientName: 'WEB_CREATOR', clientVersion: '1.20241203.01.00', hl: 'en', gl: 'US' },\n },\n header: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'X-YouTube-Client-Name': '62',\n 'X-YouTube-Client-Version': '1.20241203.01.00',\n },\n apiKey: KEYS.web,\n },\n ANDROID_CREATOR: {\n context: {\n client: {\n clientName: 'ANDROID_CREATOR',\n clientVersion: '24.45.100',\n androidSdkVersion: 30,\n osName: 'Android',\n osVersion: '14',\n },\n },\n header: {\n 'User-Agent':\n 'com.google.android.apps.youtube.creator/24.45.100 (Linux; U; Android 14) gzip',\n 'X-YouTube-Client-Name': '14',\n 'X-YouTube-Client-Version': '24.45.100',\n },\n apiKey: KEYS.androidCreator,\n },\n IOS_CREATOR: {\n context: {\n client: {\n clientName: 'IOS_CREATOR',\n clientVersion: '24.45.100',\n deviceMake: 'Apple',\n deviceModel: 'iPhone16,2',\n osName: 'iPhone',\n osVersion: '18.1.0.22B83',\n },\n },\n header: {\n 'User-Agent':\n 'com.google.ios.ytcreator/24.45.100 (iPhone16,2; U; CPU iOS 18_1_0 like Mac OS X)',\n 'X-YouTube-Client-Name': '15',\n 'X-YouTube-Client-Version': '24.45.100',\n },\n apiKey: KEYS.web,\n },\n};\n\nexport type InnerTubeClientName = keyof typeof DEFAULT_CLIENTS;\n\nconst OAUTH_CLIENT_ID = '861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.com';\nconst OAUTH_CLIENT_SECRET = 'SboVhoG9s0rNafixCSGGKXAT';\n\nexport interface InnerTubeOptions {\n client?: InnerTubeClientName;\n useOauth?: boolean;\n onAuthPrompt?: (verificationUrl: string, userCode: string) => Promise<void>;\n}\n\nexport class InnerTube {\n private readonly context: { client: Record<string, unknown> };\n private readonly header: Record<string, string>;\n private readonly apiKey: string;\n private readonly useOauth: boolean;\n private readonly onAuthPrompt?: (url: string, code: string) => Promise<void>;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private expires: number | null = null;\n\n constructor(opts: InnerTubeOptions = {}) {\n const clientName = opts.client ?? 'ANDROID_MUSIC';\n const cfg = DEFAULT_CLIENTS[clientName];\n if (!cfg) throw new Error(`Unknown InnerTube client: ${clientName}`);\n this.context = cfg.context;\n this.header = cfg.header;\n this.apiKey = cfg.apiKey;\n this.useOauth = opts.useOauth ?? false;\n this.onAuthPrompt = opts.onAuthPrompt;\n }\n\n get baseUrl(): string {\n return 'https://www.youtube.com/youtubei/v1';\n }\n\n private baseData(): Record<string, unknown> {\n // Deep-ish copy — mutate-safe for callers that add videoId etc.\n return {\n context: { client: { ...this.context.client } },\n contentCheckOk: true,\n racyCheckOk: true,\n };\n }\n\n private endpointUrl(endpoint: string): string {\n const params = new URLSearchParams({ prettyPrint: 'false' });\n if (!this.useOauth) params.set('key', this.apiKey);\n return `${endpoint}?${params.toString()}`;\n }\n\n private async callApi(endpoint: string, data: Record<string, unknown>): Promise<unknown> {\n const url = this.endpointUrl(endpoint);\n const headers: Record<string, string> = { 'Content-Type': 'application/json', ...this.header };\n if (this.useOauth) {\n if (!this.accessToken) await this.fetchBearerToken();\n else await this.refreshBearerToken();\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n const text = await post(url, data, { headers });\n return JSON.parse(text) as unknown;\n }\n\n // ---------- Endpoints ----------\n\n async player<T = unknown>(videoId: string): Promise<T> {\n const endpoint = `${this.baseUrl}/player`;\n const data = this.baseData();\n data['videoId'] = videoId;\n // \"params\" is a protobuf-encoded field that unlocks certain videos on ANDROID/IOS clients.\n // CgIQBg== = { \"playerRequest\": { \"playbackRestriction\": 6 } } — standard value used by yt-dlp.\n data['params'] = 'CgIQBg==';\n return (await this.callApi(endpoint, data)) as T;\n }\n\n async search<T = unknown>(searchQuery: string, continuation?: string): Promise<T> {\n const endpoint = `${this.baseUrl}/search`;\n const data = this.baseData();\n data['query'] = searchQuery;\n if (continuation) data['continuation'] = continuation;\n return (await this.callApi(endpoint, data)) as T;\n }\n\n async browse<T = unknown>(continuation: string): Promise<T> {\n const endpoint = `${this.baseUrl}/browse`;\n const data = this.baseData();\n data['continuation'] = continuation;\n return (await this.callApi(endpoint, data)) as T;\n }\n\n async verifyAge<T = unknown>(videoId: string): Promise<T> {\n const endpoint = `${this.baseUrl}/verify_age`;\n const data = this.baseData();\n data['nextEndpoint'] = { urlEndpoint: { url: `/watch?v=${videoId}` } };\n data['setControvercy'] = true;\n return (await this.callApi(endpoint, data)) as T;\n }\n\n async getTranscript<T = unknown>(videoId: string): Promise<T> {\n const endpoint = `${this.baseUrl}/get_transcript`;\n const data = this.baseData();\n data['videoId'] = videoId;\n return (await this.callApi(endpoint, data)) as T;\n }\n\n // ---------- OAuth device flow ----------\n\n private async refreshBearerToken(force = false): Promise<void> {\n if (!this.useOauth) return;\n if (!force && this.expires !== null && this.expires > Date.now() / 1000) return;\n if (!this.refreshToken) return;\n\n const startTime = Math.floor(Date.now() / 1000) - 30;\n const body = JSON.stringify({\n client_id: OAUTH_CLIENT_ID,\n client_secret: OAUTH_CLIENT_SECRET,\n grant_type: 'refresh_token',\n refresh_token: this.refreshToken,\n });\n const text = await post('https://oauth2.googleapis.com/token', JSON.parse(body), {\n headers: { 'Content-Type': 'application/json' },\n });\n const data = JSON.parse(text) as { access_token: string; expires_in: number };\n this.accessToken = data.access_token;\n this.expires = startTime + data.expires_in;\n }\n\n private async fetchBearerToken(): Promise<void> {\n const startTime = Math.floor(Date.now() / 1000) - 30;\n const text1 = await post(\n 'https://oauth2.googleapis.com/device/code',\n { client_id: OAUTH_CLIENT_ID, scope: 'https://www.googleapis.com/auth/youtube' },\n { headers: { 'Content-Type': 'application/json' } },\n );\n const phase1 = JSON.parse(text1) as {\n verification_url: string;\n user_code: string;\n device_code: string;\n };\n\n if (this.onAuthPrompt) {\n await this.onAuthPrompt(phase1.verification_url, phase1.user_code);\n } else {\n // Best-effort console prompt for CLI use; library users should provide onAuthPrompt.\n\n console.log(\n `Please open ${phase1.verification_url} and input code ${phase1.user_code}, then continue.`,\n );\n }\n\n const text2 = await post(\n 'https://oauth2.googleapis.com/token',\n {\n client_id: OAUTH_CLIENT_ID,\n client_secret: OAUTH_CLIENT_SECRET,\n device_code: phase1.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n },\n { headers: { 'Content-Type': 'application/json' } },\n );\n const phase2 = JSON.parse(text2) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n this.accessToken = phase2.access_token;\n this.refreshToken = phase2.refresh_token;\n this.expires = startTime + phase2.expires_in;\n }\n}\n","// Lookup table of YouTube's itag values. Mirrors pytube/itags.py.\n\nexport interface ItagInfo {\n resolution: string | null;\n abr: string | null;\n}\n\nexport interface FormatProfile {\n resolution: string | null;\n abr: string | null;\n isLive: boolean;\n is3d: boolean;\n isHdr: boolean;\n isDash: boolean;\n}\n\nconst t = (resolution: string | null, abr: string | null): ItagInfo => ({ resolution, abr });\n\nexport const PROGRESSIVE_VIDEO: Record<number, ItagInfo> = {\n 5: t('240p', '64kbps'),\n 6: t('270p', '64kbps'),\n 13: t('144p', null),\n 17: t('144p', '24kbps'),\n 18: t('360p', '96kbps'),\n 22: t('720p', '192kbps'),\n 34: t('360p', '128kbps'),\n 35: t('480p', '128kbps'),\n 36: t('240p', null),\n 37: t('1080p', '192kbps'),\n 38: t('3072p', '192kbps'),\n 43: t('360p', '128kbps'),\n 44: t('480p', '128kbps'),\n 45: t('720p', '192kbps'),\n 46: t('1080p', '192kbps'),\n 59: t('480p', '128kbps'),\n 78: t('480p', '128kbps'),\n 82: t('360p', '128kbps'),\n 83: t('480p', '128kbps'),\n 84: t('720p', '192kbps'),\n 85: t('1080p', '192kbps'),\n 91: t('144p', '48kbps'),\n 92: t('240p', '48kbps'),\n 93: t('360p', '128kbps'),\n 94: t('480p', '128kbps'),\n 95: t('720p', '256kbps'),\n 96: t('1080p', '256kbps'),\n 100: t('360p', '128kbps'),\n 101: t('480p', '192kbps'),\n 102: t('720p', '192kbps'),\n 132: t('240p', '48kbps'),\n 151: t('720p', '24kbps'),\n 300: t('720p', '128kbps'),\n 301: t('1080p', '128kbps'),\n};\n\nexport const DASH_VIDEO: Record<number, ItagInfo> = {\n 133: t('240p', null),\n 134: t('360p', null),\n 135: t('480p', null),\n 136: t('720p', null),\n 137: t('1080p', null),\n 138: t('2160p', null),\n 160: t('144p', null),\n 167: t('360p', null),\n 168: t('480p', null),\n 169: t('720p', null),\n 170: t('1080p', null),\n 212: t('480p', null),\n 218: t('480p', null),\n 219: t('480p', null),\n 242: t('240p', null),\n 243: t('360p', null),\n 244: t('480p', null),\n 245: t('480p', null),\n 246: t('480p', null),\n 247: t('720p', null),\n 248: t('1080p', null),\n 264: t('1440p', null),\n 266: t('2160p', null),\n 271: t('1440p', null),\n 272: t('4320p', null),\n 278: t('144p', null),\n 298: t('720p', null),\n 299: t('1080p', null),\n 302: t('720p', null),\n 303: t('1080p', null),\n 308: t('1440p', null),\n 313: t('2160p', null),\n 315: t('2160p', null),\n 330: t('144p', null),\n 331: t('240p', null),\n 332: t('360p', null),\n 333: t('480p', null),\n 334: t('720p', null),\n 335: t('1080p', null),\n 336: t('1440p', null),\n 337: t('2160p', null),\n 394: t('144p', null),\n 395: t('240p', null),\n 396: t('360p', null),\n 397: t('480p', null),\n 398: t('720p', null),\n 399: t('1080p', null),\n 400: t('1440p', null),\n 401: t('2160p', null),\n 402: t('4320p', null),\n 571: t('4320p', null),\n 694: t('144p', null),\n 695: t('240p', null),\n 696: t('360p', null),\n 697: t('480p', null),\n 698: t('720p', null),\n 699: t('1080p', null),\n 700: t('1440p', null),\n 701: t('2160p', null),\n 702: t('4320p', null),\n};\n\nexport const DASH_AUDIO: Record<number, ItagInfo> = {\n 139: t(null, '48kbps'),\n 140: t(null, '128kbps'),\n 141: t(null, '256kbps'),\n 171: t(null, '128kbps'),\n 172: t(null, '256kbps'),\n 249: t(null, '50kbps'),\n 250: t(null, '70kbps'),\n 251: t(null, '160kbps'),\n 256: t(null, '192kbps'),\n 258: t(null, '384kbps'),\n 325: t(null, null),\n 328: t(null, null),\n};\n\nexport const ITAGS: Record<number, ItagInfo> = {\n ...PROGRESSIVE_VIDEO,\n ...DASH_VIDEO,\n ...DASH_AUDIO,\n};\n\nexport const HDR: ReadonlySet<number> = new Set([330, 331, 332, 333, 334, 335, 336, 337]);\nexport const THREE_D: ReadonlySet<number> = new Set([82, 83, 84, 85, 100, 101, 102]);\nexport const LIVE: ReadonlySet<number> = new Set([91, 92, 93, 94, 95, 96, 132, 151]);\n\nexport function getFormatProfile(itag: number | string): FormatProfile {\n const code = typeof itag === 'string' ? parseInt(itag, 10) : itag;\n const info = ITAGS[code];\n return {\n resolution: info?.resolution ?? null,\n abr: info?.abr ?? null,\n isLive: LIVE.has(code),\n is3d: THREE_D.has(code),\n isHdr: HDR.has(code),\n isDash: code in DASH_AUDIO || code in DASH_VIDEO,\n };\n}\n","// Container for stream manifest data. Mirrors pytube/streams.py.\n\nimport { mimeTypeCodec, type StreamFormat } from './extract.js';\nimport { getFormatProfile } from './itags.js';\nimport { safeFilename } from './helpers.js';\nimport { filesize as remoteFilesize, seqFilesize, seqStream, stream as rangeStream, type RequestOptions } from './request.js';\nimport { ensureDir, fileExists, getFs } from './runtime/fs.js';\nimport { joinPath, resolveOutputDir } from './runtime/path.js';\n\nexport interface SharedState {\n title: string | null;\n duration: number | null;\n onProgress?: (stream: Stream, chunk: Uint8Array, bytesRemaining: number) => void;\n onComplete?: (stream: Stream, filePath: string | null) => void;\n}\n\nexport interface DownloadOptions {\n outputPath?: string;\n filename?: string;\n filenamePrefix?: string;\n skipExisting?: boolean;\n timeoutMs?: number;\n maxRetries?: number;\n signal?: AbortSignal;\n}\n\nexport class Stream {\n readonly itag: number;\n url: string;\n readonly mimeType: string;\n readonly codecs: string[];\n readonly type: string;\n readonly subtype: string;\n readonly videoCodec: string | null;\n readonly audioCodec: string | null;\n readonly isOtf: boolean;\n readonly bitrate: number | null;\n readonly fps: number | null;\n readonly resolution: string | null;\n readonly abr: string | null;\n readonly isDash: boolean;\n readonly is3d: boolean;\n readonly isHdr: boolean;\n readonly isLive: boolean;\n\n private cachedFilesize: number;\n private readonly state: SharedState;\n\n constructor(raw: StreamFormat, state: SharedState) {\n this.state = state;\n if (!raw.url) throw new Error('Stream missing url after descrambling');\n this.url = raw.url;\n this.itag = typeof raw.itag === 'string' ? parseInt(raw.itag, 10) : raw.itag;\n\n const { mimeType, codecs } = mimeTypeCodec(raw.mimeType ?? '');\n this.mimeType = mimeType;\n this.codecs = codecs;\n const [type, subtype] = mimeType.split('/');\n this.type = type ?? '';\n this.subtype = subtype ?? '';\n [this.videoCodec, this.audioCodec] = this.parseCodecs();\n\n this.isOtf = raw.is_otf ?? false;\n this.bitrate = raw.bitrate ?? null;\n this.cachedFilesize = parseInt(String(raw.contentLength ?? '0'), 10);\n\n const profile = getFormatProfile(this.itag);\n this.isDash = profile.isDash;\n this.abr = profile.abr;\n this.fps = raw.fps ?? null;\n this.resolution = profile.resolution;\n this.is3d = profile.is3d;\n this.isHdr = profile.isHdr;\n this.isLive = profile.isLive;\n }\n\n // Adaptive = single codec list (audio-only OR video-only)\n get isAdaptive(): boolean {\n return this.codecs.length % 2 === 1;\n }\n\n get isProgressive(): boolean {\n return !this.isAdaptive;\n }\n\n get includesAudioTrack(): boolean {\n return this.isProgressive || this.type === 'audio';\n }\n\n get includesVideoTrack(): boolean {\n return this.isProgressive || this.type === 'video';\n }\n\n private parseCodecs(): [string | null, string | null] {\n let video: string | null = null;\n let audio: string | null = null;\n if (this.codecs.length === 0) return [null, null];\n if (this.codecs.length === 2) {\n video = this.codecs[0] ?? null;\n audio = this.codecs[1] ?? null;\n } else if (this.codecs.length === 1) {\n // Single codec — could be audio or video; we don't know yet because mime\n // type isn't set in this constructor. Defer: caller can re-derive from type.\n video = this.codecs[0] ?? null;\n }\n return [video, audio];\n }\n\n get title(): string {\n return this.state.title ?? 'Unknown YouTube Video Title';\n }\n\n async filesize(): Promise<number> {\n if (this.cachedFilesize === 0) {\n try {\n this.cachedFilesize = await remoteFilesize(this.url);\n } catch {\n this.cachedFilesize = await seqFilesize(this.url);\n }\n }\n return this.cachedFilesize;\n }\n\n async filesizeApprox(): Promise<number> {\n if (this.state.duration && this.bitrate) {\n return Math.floor((this.state.duration * this.bitrate) / 8);\n }\n return this.filesize();\n }\n\n get expiration(): Date | null {\n try {\n const u = new URL(this.url);\n const expire = u.searchParams.get('expire');\n if (!expire) return null;\n return new Date(parseInt(expire, 10) * 1000);\n } catch {\n return null;\n }\n }\n\n get defaultFilename(): string {\n return `${safeFilename(this.title)}.${this.subtype}`;\n }\n\n /** Compute the absolute output path the download will be written to. */\n async getFilePath(opts: DownloadOptions = {}): Promise<string> {\n const filename = opts.filename ?? this.defaultFilename;\n const prefixed = opts.filenamePrefix ? `${opts.filenamePrefix}${filename}` : filename;\n const dir = await resolveOutputDir(opts.outputPath);\n await ensureDir(dir);\n return joinPath(dir, prefixed);\n }\n\n async existsAtPath(filePath: string): Promise<boolean> {\n if (!(await fileExists(filePath))) return false;\n const fs = await getFs();\n if (!fs) return false;\n const expected = await this.filesize();\n const stat = await fs.stat(filePath);\n return stat.size === expected;\n }\n\n /**\n * Download the stream to the local filesystem and return the absolute path.\n * Throws if no filesystem is available (e.g., browser); use streamChunks() instead.\n */\n async download(opts: DownloadOptions = {}): Promise<string> {\n const fs = await getFs();\n if (!fs) {\n throw new Error('Filesystem unavailable in this runtime; use streamChunks() instead.');\n }\n\n const filePath = await this.getFilePath(opts);\n const skipExisting = opts.skipExisting ?? true;\n if (skipExisting && (await this.existsAtPath(filePath))) {\n this.fireOnComplete(filePath);\n return filePath;\n }\n\n let bytesRemaining = await this.filesize();\n const reqOpts: RequestOptions = {\n timeoutMs: opts.timeoutMs,\n maxRetries: opts.maxRetries ?? 0,\n signal: opts.signal,\n };\n\n const handle = await fs.open(filePath, 'w');\n try {\n let usedSeqStream = false;\n try {\n for await (const chunk of rangeStream(this.url, reqOpts)) {\n await handle.write(chunk);\n bytesRemaining -= chunk.byteLength;\n this.fireOnProgress(chunk, bytesRemaining);\n }\n } catch (err) {\n // Some adaptive streams 404 on range requests and need sequential segments.\n if (!is404(err)) throw err;\n usedSeqStream = true;\n }\n if (usedSeqStream) {\n for await (const chunk of seqStream(this.url, reqOpts)) {\n await handle.write(chunk);\n bytesRemaining -= chunk.byteLength;\n this.fireOnProgress(chunk, bytesRemaining);\n }\n }\n } finally {\n await handle.close();\n }\n\n this.fireOnComplete(filePath);\n return filePath;\n }\n\n /**\n * Stream the media as raw chunks. Browser-friendly alternative to download().\n * Caller is responsible for collecting the chunks (write to a Blob, sink, etc.).\n */\n async *streamChunks(opts: DownloadOptions = {}): AsyncGenerator<Uint8Array> {\n const reqOpts: RequestOptions = {\n timeoutMs: opts.timeoutMs,\n maxRetries: opts.maxRetries ?? 0,\n signal: opts.signal,\n };\n let bytesRemaining = await this.filesize();\n try {\n for await (const chunk of rangeStream(this.url, reqOpts)) {\n bytesRemaining -= chunk.byteLength;\n this.fireOnProgress(chunk, bytesRemaining);\n yield chunk;\n }\n } catch (err) {\n if (!is404(err)) throw err;\n for await (const chunk of seqStream(this.url, reqOpts)) {\n bytesRemaining -= chunk.byteLength;\n this.fireOnProgress(chunk, bytesRemaining);\n yield chunk;\n }\n }\n this.fireOnComplete(null);\n }\n\n private fireOnProgress(chunk: Uint8Array, bytesRemaining: number): void {\n this.state.onProgress?.(this, chunk, bytesRemaining);\n }\n\n private fireOnComplete(path: string | null): void {\n this.state.onComplete?.(this, path);\n }\n\n toString(): string {\n const parts: string[] = [`itag=\"${this.itag}\"`, `mime_type=\"${this.mimeType}\"`];\n if (this.includesVideoTrack) {\n parts.push(`res=\"${this.resolution}\"`, `fps=\"${this.fps}fps\"`);\n if (!this.isAdaptive) {\n parts.push(`vcodec=\"${this.videoCodec}\"`, `acodec=\"${this.audioCodec}\"`);\n } else {\n parts.push(`vcodec=\"${this.videoCodec}\"`);\n }\n } else {\n parts.push(`abr=\"${this.abr}\"`, `acodec=\"${this.audioCodec}\"`);\n }\n parts.push(`progressive=\"${this.isProgressive}\"`, `type=\"${this.type}\"`);\n return `<Stream: ${parts.join(' ')}>`;\n }\n}\n\nfunction is404(err: unknown): boolean {\n if (!err) return false;\n const msg = (err as Error).message ?? '';\n return msg.includes('404');\n}\n","// Query interface for media streams and captions. Mirrors pytube/query.py.\n\nimport type { Caption } from './captions.js';\nimport { Stream } from './stream.js';\n\nexport type StreamPredicate = (s: Stream) => boolean;\n\nexport interface FilterCriteria {\n fps?: number;\n res?: string | string[];\n resolution?: string | string[];\n mimeType?: string;\n type?: string;\n subtype?: string;\n fileExtension?: string;\n abr?: string;\n bitrate?: string;\n videoCodec?: string;\n audioCodec?: string;\n onlyAudio?: boolean;\n onlyVideo?: boolean;\n progressive?: boolean;\n adaptive?: boolean;\n isDash?: boolean;\n customFilters?: StreamPredicate[];\n}\n\nexport class StreamQuery implements Iterable<Stream> {\n readonly fmtStreams: Stream[];\n private readonly itagIndex: Map<number, Stream>;\n\n constructor(fmtStreams: Stream[]) {\n this.fmtStreams = fmtStreams;\n this.itagIndex = new Map(fmtStreams.map((s) => [s.itag, s]));\n }\n\n filter(criteria: FilterCriteria = {}): StreamQuery {\n const filters: StreamPredicate[] = [];\n const resolution = criteria.res ?? criteria.resolution;\n if (resolution) {\n if (Array.isArray(resolution)) {\n filters.push((s) => s.resolution !== null && resolution.includes(s.resolution));\n } else {\n filters.push((s) => s.resolution === resolution);\n }\n }\n if (criteria.fps !== undefined) filters.push((s) => s.fps === criteria.fps);\n if (criteria.mimeType !== undefined) filters.push((s) => s.mimeType === criteria.mimeType);\n if (criteria.type !== undefined) filters.push((s) => s.type === criteria.type);\n const subtype = criteria.subtype ?? criteria.fileExtension;\n if (subtype !== undefined) filters.push((s) => s.subtype === subtype);\n const abr = criteria.abr ?? criteria.bitrate;\n if (abr !== undefined) filters.push((s) => s.abr === abr);\n if (criteria.videoCodec !== undefined) filters.push((s) => s.videoCodec === criteria.videoCodec);\n if (criteria.audioCodec !== undefined) filters.push((s) => s.audioCodec === criteria.audioCodec);\n if (criteria.onlyAudio) filters.push((s) => s.includesAudioTrack && !s.includesVideoTrack);\n if (criteria.onlyVideo) filters.push((s) => s.includesVideoTrack && !s.includesAudioTrack);\n if (criteria.progressive) filters.push((s) => s.isProgressive);\n if (criteria.adaptive) filters.push((s) => s.isAdaptive);\n if (criteria.isDash !== undefined) filters.push((s) => s.isDash === criteria.isDash);\n if (criteria.customFilters) filters.push(...criteria.customFilters);\n\n return this.applyFilters(filters);\n }\n\n private applyFilters(filters: StreamPredicate[]): StreamQuery {\n let result = this.fmtStreams;\n for (const f of filters) result = result.filter(f);\n return new StreamQuery(result);\n }\n\n /**\n * Sort by an attribute. Filters out streams that don't have it. For string\n * attributes (e.g., \"720p\"), sorts by the embedded integer.\n */\n orderBy(attribute: keyof Stream): StreamQuery {\n const present = this.fmtStreams.filter((s) => s[attribute] !== null && s[attribute] !== undefined);\n if (present.length === 0) return new StreamQuery(present);\n\n const first = present[0]![attribute];\n if (typeof first === 'string') {\n try {\n const sorted = [...present].sort((a, b) => {\n const va = parseInt(String(a[attribute]).replace(/\\D/g, ''), 10);\n const vb = parseInt(String(b[attribute]).replace(/\\D/g, ''), 10);\n if (Number.isNaN(va) || Number.isNaN(vb)) throw new Error('non-numeric');\n return va - vb;\n });\n return new StreamQuery(sorted);\n } catch {\n // fall through to lexicographic\n }\n }\n const sorted = [...present].sort((a, b) => {\n const va = a[attribute] as unknown as number | string;\n const vb = b[attribute] as unknown as number | string;\n if (va < vb) return -1;\n if (va > vb) return 1;\n return 0;\n });\n return new StreamQuery(sorted);\n }\n\n desc(): StreamQuery {\n return new StreamQuery([...this.fmtStreams].reverse());\n }\n\n asc(): StreamQuery {\n return this;\n }\n\n getByItag(itag: number): Stream | undefined {\n return this.itagIndex.get(itag);\n }\n\n getByResolution(resolution: string): Stream | undefined {\n return this.filter({ progressive: true, subtype: 'mp4', resolution }).first();\n }\n\n getLowestResolution(): Stream | undefined {\n return this.filter({ progressive: true, subtype: 'mp4' }).orderBy('resolution').first();\n }\n\n getHighestResolution(): Stream | undefined {\n return this.filter({ progressive: true }).orderBy('resolution').last();\n }\n\n getAudioOnly(subtype = 'mp4'): Stream | undefined {\n return this.filter({ onlyAudio: true, subtype }).orderBy('abr').last();\n }\n\n otf(isOtf = false): StreamQuery {\n return this.applyFilters([(s) => s.isOtf === isOtf]);\n }\n\n first(): Stream | undefined {\n return this.fmtStreams[0];\n }\n\n last(): Stream | undefined {\n return this.fmtStreams[this.fmtStreams.length - 1];\n }\n\n get length(): number {\n return this.fmtStreams.length;\n }\n\n at(index: number): Stream | undefined {\n return this.fmtStreams[index];\n }\n\n toArray(): Stream[] {\n return [...this.fmtStreams];\n }\n\n [Symbol.iterator](): Iterator<Stream> {\n return this.fmtStreams[Symbol.iterator]();\n }\n}\n\nexport class CaptionQuery implements Iterable<Caption> {\n private readonly index: Map<string, Caption>;\n\n constructor(captions: Caption[]) {\n this.index = new Map(captions.map((c) => [c.code, c]));\n }\n\n get(langCode: string): Caption | undefined {\n return this.index.get(langCode);\n }\n\n has(langCode: string): boolean {\n return this.index.has(langCode);\n }\n\n get length(): number {\n return this.index.size;\n }\n\n toArray(): Caption[] {\n return [...this.index.values()];\n }\n\n [Symbol.iterator](): Iterator<Caption> {\n return this.index.values();\n }\n}\n","// Core developer interface. Mirrors pytube/__main__.py.\n//\n// Pytube exposes synchronous getters that secretly perform network I/O on\n// first access. TypeScript getters can't be async, so tytube exposes async\n// methods (`await yt.title()`) plus a `prefetch()` method that fills the\n// internal cache. After prefetch, the sync `*Sync` getters work.\n\nimport { Caption } from './captions.js';\nimport { createCipher } from './cipher.js';\nimport * as exceptions from './exceptions.js';\nimport * as extract from './extract.js';\nimport { InnerTube } from './innertube.js';\nimport { YouTubeMetadata } from './metadata.js';\nimport { CaptionQuery, StreamQuery } from './query.js';\nimport { get as httpGetText } from './request.js';\nimport { Stream, type SharedState } from './stream.js';\n\nexport interface YouTubeOptions {\n onProgress?: SharedState['onProgress'];\n onComplete?: SharedState['onComplete'];\n useOauth?: boolean;\n allowOauthCache?: boolean;\n}\n\ninterface YtVideoDetails {\n videoId?: string;\n title?: string;\n lengthSeconds?: string;\n author?: string;\n shortDescription?: string;\n averageRating?: number;\n viewCount?: string;\n channelId?: string;\n thumbnail?: { thumbnails?: Array<{ url: string }> };\n keywords?: string[];\n}\n\ninterface YtCaptionTrackRaw {\n baseUrl: string;\n name?: { simpleText?: string; runs?: Array<{ text: string }> };\n vssId?: string;\n languageCode?: string;\n}\n\ninterface PlayerResponse {\n videoDetails?: YtVideoDetails;\n playabilityStatus?: { status?: string; reason?: string; messages?: string[]; liveStreamability?: unknown };\n streamingData?: { formats?: extract.StreamFormat[]; adaptiveFormats?: extract.StreamFormat[] };\n captions?: { playerCaptionsTracklistRenderer?: { captionTracks?: YtCaptionTrackRaw[] } };\n}\n\nexport class YouTube {\n readonly videoId: string;\n readonly watchUrl: string;\n readonly embedUrl: string;\n readonly useOauth: boolean;\n readonly allowOauthCache: boolean;\n readonly state: SharedState;\n\n private cachedJs: string | null = null;\n private cachedJsUrl: string | null = null;\n private cachedVidInfo: PlayerResponse | null = null;\n private cachedWatchHtml: string | null = null;\n private cachedEmbedHtml: string | null = null;\n private cachedAgeRestricted: boolean | null = null;\n private cachedFmtStreams: Stream[] | null = null;\n private cachedInitialData: unknown | null = null;\n private cachedMetadata: YouTubeMetadata | null = null;\n private cachedTitle: string | null = null;\n private cachedAuthor: string | null = null;\n private cachedPublishDate: Date | null | undefined = undefined;\n\n constructor(url: string, opts: YouTubeOptions = {}) {\n this.videoId = extract.videoId(url);\n this.watchUrl = `https://youtube.com/watch?v=${this.videoId}`;\n this.embedUrl = `https://www.youtube.com/embed/${this.videoId}`;\n this.useOauth = opts.useOauth ?? false;\n this.allowOauthCache = opts.allowOauthCache ?? true;\n this.state = {\n title: null,\n duration: null,\n onProgress: opts.onProgress,\n onComplete: opts.onComplete,\n };\n }\n\n static fromId(videoId: string): YouTube {\n return new YouTube(`https://www.youtube.com/watch?v=${videoId}`);\n }\n\n // ---------- Lazy network resources ----------\n\n async watchHtml(): Promise<string> {\n if (this.cachedWatchHtml) return this.cachedWatchHtml;\n this.cachedWatchHtml = await httpGetText(this.watchUrl);\n return this.cachedWatchHtml;\n }\n\n async embedHtml(): Promise<string> {\n if (this.cachedEmbedHtml) return this.cachedEmbedHtml;\n this.cachedEmbedHtml = await httpGetText(this.embedUrl);\n return this.cachedEmbedHtml;\n }\n\n async ageRestricted(): Promise<boolean> {\n if (this.cachedAgeRestricted !== null) return this.cachedAgeRestricted;\n this.cachedAgeRestricted = extract.isAgeRestricted(await this.watchHtml());\n return this.cachedAgeRestricted;\n }\n\n async jsUrl(): Promise<string> {\n if (this.cachedJsUrl) return this.cachedJsUrl;\n const html = (await this.ageRestricted()) ? await this.embedHtml() : await this.watchHtml();\n this.cachedJsUrl = extract.jsUrl(html);\n return this.cachedJsUrl;\n }\n\n async js(): Promise<string> {\n if (this.cachedJs) return this.cachedJs;\n const url = await this.jsUrl();\n this.cachedJs = await httpGetText(url);\n return this.cachedJs;\n }\n\n async initialData(): Promise<unknown> {\n if (this.cachedInitialData) return this.cachedInitialData;\n this.cachedInitialData = extract.initialData(await this.watchHtml());\n return this.cachedInitialData;\n }\n\n /**\n * Resolve the player response containing videoDetails + streamingData.\n *\n * Strategy (late-2025 reality):\n * 1. Primary: scrape `ytInitialPlayerResponse` from the watch HTML. This is\n * the same payload a browser sees and contains streamingData + captions.\n * 2. Fallback: InnerTube /player endpoint (useful for age-gate bypass, but\n * currently rate-limited by YouTube's \"Sign in to confirm you're not a\n * bot\" check for server-side IPs).\n *\n * If the primary path returns a useful response we never touch InnerTube,\n * which avoids the bot-detection entirely for normal public videos.\n */\n async vidInfo(): Promise<PlayerResponse> {\n if (this.cachedVidInfo) return this.cachedVidInfo;\n\n try {\n const html = await this.watchHtml();\n const fromHtml = extract.initialPlayerResponse(html) as PlayerResponse;\n if (fromHtml?.videoDetails && fromHtml?.streamingData) {\n this.cachedVidInfo = fromHtml;\n return fromHtml;\n }\n // If the watch HTML is missing streamingData (e.g. age-gate), fall\n // through to InnerTube below which may unblock it via ANDROID_EMBED.\n } catch {\n /* fall through to InnerTube */\n }\n\n const innertube = new InnerTube({ useOauth: this.useOauth });\n this.cachedVidInfo = (await innertube.player(this.videoId)) as PlayerResponse;\n return this.cachedVidInfo;\n }\n\n async streamingData(): Promise<NonNullable<PlayerResponse['streamingData']>> {\n let info = await this.vidInfo();\n if (!info.streamingData) {\n await this.bypassAgeGate();\n info = await this.vidInfo();\n }\n if (!info.streamingData) {\n throw new exceptions.VideoUnavailable(this.videoId);\n }\n return info.streamingData;\n }\n\n // ---------- Availability gates ----------\n\n async checkAvailability(): Promise<void> {\n const html = await this.watchHtml();\n const { status, reasons } = extract.playabilityStatus(html);\n\n for (const reason of reasons) {\n if (status === 'UNPLAYABLE') {\n if (\n reason ===\n 'Join this channel to get access to members-only content like this video, and other exclusive perks.'\n ) {\n throw new exceptions.MembersOnly(this.videoId);\n }\n if (reason === 'This live stream recording is not available.') {\n throw new exceptions.RecordingUnavailable(this.videoId);\n }\n throw new exceptions.VideoUnavailable(this.videoId);\n } else if (status === 'LOGIN_REQUIRED') {\n if (\n reason === 'This is a private video. Please sign in to verify that you may see it.'\n ) {\n throw new exceptions.VideoPrivate(this.videoId);\n }\n } else if (status === 'ERROR') {\n if (reason === 'Video unavailable') {\n throw new exceptions.VideoUnavailable(this.videoId);\n }\n } else if (status === 'LIVE_STREAM') {\n throw new exceptions.LiveStreamError(this.videoId);\n }\n }\n }\n\n async bypassAgeGate(): Promise<void> {\n const innertube = new InnerTube({ client: 'ANDROID_EMBED', useOauth: this.useOauth });\n const response = (await innertube.player(this.videoId)) as PlayerResponse;\n const status = response.playabilityStatus?.status;\n if (status === 'UNPLAYABLE') {\n throw new exceptions.AgeRestrictedError(this.videoId);\n }\n this.cachedVidInfo = response;\n }\n\n // ---------- Streams ----------\n\n async fmtStreams(): Promise<Stream[]> {\n await this.checkAvailability();\n if (this.cachedFmtStreams) return this.cachedFmtStreams;\n\n const result: Stream[] = [];\n const streamingData = await this.streamingData();\n const manifest = extract.applyDescrambler({\n formats: streamingData.formats,\n adaptiveFormats: streamingData.adaptiveFormats,\n });\n if (!manifest) return result;\n\n const vidInfo = (await this.vidInfo()) as unknown as Record<string, unknown>;\n\n // Only build a Cipher if we actually have ciphered streams. Many videos\n // (especially those scraped from the watch HTML path) come pre-signed and\n // don't need any decryption — building the cipher in that case is just\n // unnecessary risk because YouTube's base.js evolves constantly.\n const needsCipher = extract.manifestNeedsCipher(manifest);\n let cipher = null as ReturnType<typeof createCipher> | null;\n if (needsCipher) {\n try {\n const js = await this.js();\n cipher = createCipher(js);\n } catch (err) {\n if (!(err instanceof exceptions.ExtractError)) throw err;\n // Bust cached js and retry once — base.js may have rotated mid-fetch.\n this.cachedJs = null;\n this.cachedJsUrl = null;\n try {\n const freshJs = await this.js();\n cipher = createCipher(freshJs);\n } catch {\n // Give up on cipher; pre-signed streams will still work, ciphered ones won't.\n cipher = null;\n }\n }\n }\n\n extract.applySignature(manifest, vidInfo, cipher);\n\n // Populate shared state before constructing streams so they get a usable title.\n this.state.title = await this.title();\n this.state.duration = await this.length();\n\n for (const raw of manifest) {\n // Skip streams we couldn't sign — including them would hand the user a 403.\n if (!raw.url) continue;\n if (raw.s !== undefined && raw.s !== null && !cipher) continue;\n result.push(new Stream(raw, this.state));\n }\n\n this.cachedFmtStreams = result;\n return result;\n }\n\n async streams(): Promise<StreamQuery> {\n await this.checkAvailability();\n return new StreamQuery(await this.fmtStreams());\n }\n\n // ---------- Captions ----------\n\n async captionTracks(): Promise<Caption[]> {\n const info = await this.vidInfo();\n const tracks = info.captions?.playerCaptionsTracklistRenderer?.captionTracks ?? [];\n return tracks.map((t) => new Caption(t));\n }\n\n async captions(): Promise<CaptionQuery> {\n return new CaptionQuery(await this.captionTracks());\n }\n\n // ---------- Metadata ----------\n\n async title(): Promise<string> {\n if (this.cachedTitle) return this.cachedTitle;\n const info = await this.vidInfo();\n const t = info.videoDetails?.title;\n if (!t) {\n await this.checkAvailability();\n throw new exceptions.PytubeError(`Could not extract title for ${this.watchUrl}`);\n }\n this.cachedTitle = t;\n return t;\n }\n\n async description(): Promise<string | null> {\n return (await this.vidInfo()).videoDetails?.shortDescription ?? null;\n }\n\n async length(): Promise<number> {\n const len = (await this.vidInfo()).videoDetails?.lengthSeconds;\n return len ? parseInt(len, 10) : 0;\n }\n\n async views(): Promise<number> {\n const v = (await this.vidInfo()).videoDetails?.viewCount;\n return v ? parseInt(v, 10) : 0;\n }\n\n async rating(): Promise<number | null> {\n return (await this.vidInfo()).videoDetails?.averageRating ?? null;\n }\n\n async author(): Promise<string> {\n if (this.cachedAuthor) return this.cachedAuthor;\n this.cachedAuthor = (await this.vidInfo()).videoDetails?.author ?? 'unknown';\n return this.cachedAuthor;\n }\n\n async keywords(): Promise<string[]> {\n return (await this.vidInfo()).videoDetails?.keywords ?? [];\n }\n\n async channelId(): Promise<string | null> {\n return (await this.vidInfo()).videoDetails?.channelId ?? null;\n }\n\n async channelUrl(): Promise<string> {\n return `https://www.youtube.com/channel/${await this.channelId()}`;\n }\n\n async thumbnailUrl(): Promise<string> {\n const thumbnails = (await this.vidInfo()).videoDetails?.thumbnail?.thumbnails;\n if (thumbnails && thumbnails.length > 0) {\n return thumbnails[thumbnails.length - 1]!.url;\n }\n return `https://img.youtube.com/vi/${this.videoId}/maxresdefault.jpg`;\n }\n\n async publishDate(): Promise<Date | null> {\n if (this.cachedPublishDate !== undefined) return this.cachedPublishDate;\n this.cachedPublishDate = extract.publishDate(await this.watchHtml());\n return this.cachedPublishDate;\n }\n\n async metadata(): Promise<YouTubeMetadata> {\n if (this.cachedMetadata) return this.cachedMetadata;\n this.cachedMetadata = extract.metadata(await this.initialData());\n return this.cachedMetadata;\n }\n\n // ---------- Prefetch + sync getters ----------\n\n /**\n * Fetch and cache everything needed for synchronous metadata access.\n * After this resolves, the *Sync getters and the `streams` getter return\n * results immediately without further network I/O.\n */\n async prefetch(): Promise<void> {\n await this.watchHtml();\n await this.vidInfo();\n await this.title();\n await this.author();\n await this.length();\n await this.fmtStreams();\n }\n\n get titleSync(): string {\n if (!this.cachedTitle) throw new Error('Call await yt.prefetch() first.');\n return this.cachedTitle;\n }\n\n get authorSync(): string {\n if (!this.cachedAuthor) throw new Error('Call await yt.prefetch() first.');\n return this.cachedAuthor;\n }\n\n get streamsSync(): StreamQuery {\n if (!this.cachedFmtStreams) throw new Error('Call await yt.prefetch() first.');\n return new StreamQuery(this.cachedFmtStreams);\n }\n\n // ---------- Misc ----------\n\n registerOnProgressCallback(fn: SharedState['onProgress']): void {\n this.state.onProgress = fn;\n }\n\n registerOnCompleteCallback(fn: SharedState['onComplete']): void {\n this.state.onComplete = fn;\n }\n\n toString(): string {\n return `<YouTube videoId=${this.videoId}>`;\n }\n\n equals(other: unknown): boolean {\n return other instanceof YouTube && other.watchUrl === this.watchUrl;\n }\n}\n","// YouTube playlist loader. Mirrors pytube/contrib/playlist.py.\n// Implemented as an async iterable of YouTube objects so iterating doesn't\n// force every continuation page to load up front.\n\nimport * as extract from './extract.js';\nimport { uniqueify } from './helpers.js';\nimport { post, get as httpGetText } from './request.js';\nimport { YouTube } from './youtube.js';\n\ninterface ContinuationRequest {\n url: string;\n headers: Record<string, string>;\n data: Record<string, unknown>;\n}\n\nexport class Playlist implements AsyncIterable<YouTube> {\n protected readonly inputUrl: string;\n private cachedHtml: string | null = null;\n private cachedYtcfg: Record<string, unknown> | null = null;\n private cachedInitialData: Record<string, unknown> | null = null;\n private cachedSidebar: unknown[] | null = null;\n private cachedPlaylistId: string | null = null;\n private cachedVideoUrls: string[] | null = null;\n\n constructor(url: string) {\n this.inputUrl = url;\n }\n\n // ---------- Identifiers ----------\n\n get playlistId(): string {\n if (this.cachedPlaylistId) return this.cachedPlaylistId;\n this.cachedPlaylistId = extract.playlistId(this.inputUrl);\n return this.cachedPlaylistId;\n }\n\n get playlistUrl(): string {\n return `https://www.youtube.com/playlist?list=${this.playlistId}`;\n }\n\n // ---------- Network resources ----------\n\n async html(): Promise<string> {\n if (this.cachedHtml) return this.cachedHtml;\n this.cachedHtml = await httpGetText(this.playlistUrl);\n return this.cachedHtml;\n }\n\n async ytcfg(): Promise<Record<string, unknown>> {\n if (this.cachedYtcfg) return this.cachedYtcfg;\n this.cachedYtcfg = extract.getYtcfg(await this.html());\n return this.cachedYtcfg;\n }\n\n async initialData(): Promise<Record<string, unknown>> {\n if (this.cachedInitialData) return this.cachedInitialData;\n this.cachedInitialData = (await extract.initialData(await this.html())) as Record<string, unknown>;\n return this.cachedInitialData;\n }\n\n async sidebarInfo(): Promise<unknown[]> {\n if (this.cachedSidebar) return this.cachedSidebar;\n const data = await this.initialData();\n /* eslint-disable @typescript-eslint/no-explicit-any */\n this.cachedSidebar = (data as any).sidebar?.playlistSidebarRenderer?.items ?? [];\n /* eslint-enable @typescript-eslint/no-explicit-any */\n return this.cachedSidebar!;\n }\n\n async ytApiKey(): Promise<string> {\n return String((await this.ytcfg())['INNERTUBE_API_KEY']);\n }\n\n // ---------- Pagination ----------\n\n protected async *paginate(untilWatchId?: string): AsyncGenerator<string[]> {\n let [videoUrls, continuation] = (this.constructor as typeof Playlist).extractVideos(\n JSON.stringify(await this.initialData()),\n );\n\n if (untilWatchId !== undefined) {\n const idx = videoUrls.indexOf(`/watch?v=${untilWatchId}`);\n if (idx !== -1) {\n yield videoUrls.slice(0, idx);\n return;\n }\n }\n yield videoUrls;\n\n while (continuation) {\n const req = await this.buildContinuationRequest(continuation);\n const text = await post(req.url, req.data, { headers: req.headers });\n [videoUrls, continuation] = (this.constructor as typeof Playlist).extractVideos(text);\n if (untilWatchId !== undefined) {\n const idx = videoUrls.indexOf(`/watch?v=${untilWatchId}`);\n if (idx !== -1) {\n yield videoUrls.slice(0, idx);\n return;\n }\n }\n yield videoUrls;\n }\n }\n\n protected async buildContinuationRequest(continuation: string): Promise<ContinuationRequest> {\n return {\n url: `https://www.youtube.com/youtubei/v1/browse?key=${await this.ytApiKey()}`,\n headers: {\n 'X-YouTube-Client-Name': '1',\n 'X-YouTube-Client-Version': '2.20200720.00.02',\n },\n data: {\n continuation,\n context: { client: { clientName: 'WEB', clientVersion: '2.20200720.00.02' } },\n },\n };\n }\n\n protected static extractVideos(rawJson: string): [string[], string | null] {\n const data = JSON.parse(rawJson) as Record<string, unknown>;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n let videos: any[] | null = null;\n try {\n const sectionContents =\n (data as any).contents?.twoColumnBrowseResultsRenderer?.tabs?.[0]?.tabRenderer?.content\n ?.sectionListRenderer?.contents;\n if (sectionContents) {\n const importantContent =\n sectionContents[0]?.itemSectionRenderer?.contents?.[0]?.playlistVideoListRenderer ??\n sectionContents[1]?.itemSectionRenderer?.contents?.[0]?.playlistVideoListRenderer;\n videos = importantContent?.contents ?? null;\n }\n } catch {\n /* fall through */\n }\n\n if (!videos) {\n const continuationItems =\n (data as any).onResponseReceivedActions?.[0]?.appendContinuationItemsAction\n ?.continuationItems;\n if (continuationItems) videos = continuationItems;\n }\n\n if (!videos) return [[], null];\n\n let continuation: string | null = null;\n const last = videos[videos.length - 1];\n const continuationToken =\n last?.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;\n if (continuationToken) {\n continuation = String(continuationToken);\n videos = videos.slice(0, -1);\n }\n\n const watchPaths = videos\n .map((v) => v?.playlistVideoRenderer?.videoId)\n .filter((id): id is string => typeof id === 'string')\n .map((id) => `/watch?v=${id}`);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n return [uniqueify(watchPaths), continuation];\n }\n\n // ---------- Public iteration ----------\n\n async videoUrls(): Promise<string[]> {\n if (this.cachedVideoUrls) return this.cachedVideoUrls;\n const out: string[] = [];\n for await (const page of this.paginate()) {\n for (const path of page) out.push(`https://www.youtube.com${path}`);\n }\n this.cachedVideoUrls = out;\n return out;\n }\n\n async *videos(): AsyncGenerator<YouTube> {\n for await (const page of this.paginate()) {\n for (const path of page) yield new YouTube(`https://www.youtube.com${path}`);\n }\n }\n\n async length(): Promise<number> {\n return (await this.videoUrls()).length;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<YouTube> {\n yield* this.videos();\n }\n\n // ---------- Sidebar metadata ----------\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n async title(): Promise<string | null> {\n const sidebar = (await this.sidebarInfo()) as any[];\n return sidebar[0]?.playlistSidebarPrimaryInfoRenderer?.title?.runs?.[0]?.text ?? null;\n }\n\n async description(): Promise<string | null> {\n const sidebar = (await this.sidebarInfo()) as any[];\n return sidebar[0]?.playlistSidebarPrimaryInfoRenderer?.description?.simpleText ?? null;\n }\n\n async owner(): Promise<string | null> {\n const sidebar = (await this.sidebarInfo()) as any[];\n return (\n sidebar[1]?.playlistSidebarSecondaryInfoRenderer?.videoOwner?.videoOwnerRenderer?.title\n ?.runs?.[0]?.text ?? null\n );\n }\n\n async ownerId(): Promise<string | null> {\n const sidebar = (await this.sidebarInfo()) as any[];\n return (\n sidebar[1]?.playlistSidebarSecondaryInfoRenderer?.videoOwner?.videoOwnerRenderer?.title\n ?.runs?.[0]?.navigationEndpoint?.browseEndpoint?.browseId ?? null\n );\n }\n\n async ownerUrl(): Promise<string | null> {\n const id = await this.ownerId();\n return id ? `https://www.youtube.com/channel/${id}` : null;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","// YouTube channel loader. Mirrors pytube/contrib/channel.py.\n// Extends Playlist; the only behavioral difference is the videos endpoint and\n// the gridRenderer JSON shape.\n\nimport * as extract from './extract.js';\nimport { uniqueify } from './helpers.js';\nimport { get as httpGetText } from './request.js';\nimport { Playlist } from './playlist.js';\n\nexport class Channel extends Playlist {\n readonly channelUri: string;\n readonly channelUrl: string;\n readonly videosUrl: string;\n readonly playlistsUrl: string;\n readonly communityUrl: string;\n readonly featuredChannelsUrl: string;\n readonly aboutUrl: string;\n\n private cachedVideosHtml: string | null = null;\n\n constructor(url: string) {\n super(url);\n this.channelUri = extract.channelName(url);\n this.channelUrl = `https://www.youtube.com${this.channelUri}`;\n this.videosUrl = `${this.channelUrl}/videos`;\n this.playlistsUrl = `${this.channelUrl}/playlists`;\n this.communityUrl = `${this.channelUrl}/community`;\n this.featuredChannelsUrl = `${this.channelUrl}/channels`;\n this.aboutUrl = `${this.channelUrl}/about`;\n }\n\n override async html(): Promise<string> {\n if (this.cachedVideosHtml) return this.cachedVideosHtml;\n this.cachedVideosHtml = await httpGetText(this.videosUrl);\n return this.cachedVideosHtml;\n }\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n async channelName(): Promise<string | null> {\n const data = (await this.initialData()) as any;\n return data?.metadata?.channelMetadataRenderer?.title ?? null;\n }\n\n async channelId(): Promise<string | null> {\n const data = (await this.initialData()) as any;\n return data?.metadata?.channelMetadataRenderer?.externalId ?? null;\n }\n\n async vanityUrl(): Promise<string | null> {\n const data = (await this.initialData()) as any;\n return data?.metadata?.channelMetadataRenderer?.vanityChannelUrl ?? null;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n protected static override extractVideos(rawJson: string): [string[], string | null] {\n const data = JSON.parse(rawJson) as Record<string, unknown>;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n let videos: any[] | null = null;\n try {\n videos =\n (data as any).contents?.twoColumnBrowseResultsRenderer?.tabs?.[1]?.tabRenderer?.content\n ?.sectionListRenderer?.contents?.[0]?.itemSectionRenderer?.contents?.[0]?.gridRenderer\n ?.items ?? null;\n } catch {\n videos = null;\n }\n\n if (!videos) {\n videos =\n (data as any)[1]?.response?.onResponseReceivedActions?.[0]?.appendContinuationItemsAction\n ?.continuationItems ??\n (data as any).onResponseReceivedActions?.[0]?.appendContinuationItemsAction\n ?.continuationItems ??\n null;\n }\n if (!videos) return [[], null];\n\n let continuation: string | null = null;\n const last = videos[videos.length - 1];\n const continuationToken =\n last?.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;\n if (continuationToken) {\n continuation = String(continuationToken);\n videos = videos.slice(0, -1);\n }\n\n const watchPaths = videos\n .map((v) => v?.gridVideoRenderer?.videoId)\n .filter((id): id is string => typeof id === 'string')\n .map((id) => `/watch?v=${id}`);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n return [uniqueify(watchPaths), continuation];\n }\n}\n","// YouTube search interface. Mirrors pytube/contrib/search.py.\n\nimport { InnerTube } from './innertube.js';\nimport { YouTube } from './youtube.js';\n\nexport class Search {\n readonly query: string;\n private readonly innertube: InnerTube;\n private cachedResults: YouTube[] | null = null;\n private currentContinuation: string | null = null;\n private initialResults: Record<string, unknown> | null = null;\n\n constructor(query: string) {\n this.query = query;\n this.innertube = new InnerTube({ client: 'WEB' });\n }\n\n async results(): Promise<YouTube[]> {\n if (this.cachedResults) return this.cachedResults;\n const [videos, continuation] = await this.fetchAndParse();\n this.cachedResults = videos;\n this.currentContinuation = continuation;\n return videos;\n }\n\n /** Fetch the next page of results and append to the cached results array. */\n async getNextResults(): Promise<void> {\n if (!this.cachedResults) {\n await this.results();\n return;\n }\n if (!this.currentContinuation) {\n throw new Error('No further results available.');\n }\n const [videos, continuation] = await this.fetchAndParse(this.currentContinuation);\n this.cachedResults.push(...videos);\n this.currentContinuation = continuation;\n }\n\n async completionSuggestions(): Promise<string[] | null> {\n if (!this.initialResults) await this.results();\n /* eslint-disable @typescript-eslint/no-explicit-any */\n return ((this.initialResults as any)?.refinements ?? null) as string[] | null;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n\n async fetchAndParse(continuation?: string): Promise<[YouTube[], string | null]> {\n const raw = (await this.innertube.search<Record<string, unknown>>(this.query, continuation)) as Record<\n string,\n unknown\n >;\n if (!this.initialResults) this.initialResults = raw;\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n let sections: any[] | null = null;\n try {\n sections =\n (raw as any).contents?.twoColumnSearchResultsRenderer?.primaryContents?.sectionListRenderer\n ?.contents ?? null;\n } catch {\n sections = null;\n }\n if (!sections) {\n sections =\n (raw as any).onResponseReceivedCommands?.[0]?.appendContinuationItemsAction\n ?.continuationItems ?? null;\n }\n if (!sections) return [[], null];\n\n let itemRenderer: any = null;\n let continuationRenderer: any = null;\n for (const s of sections) {\n if (s?.itemSectionRenderer) itemRenderer = s.itemSectionRenderer;\n if (s?.continuationItemRenderer) continuationRenderer = s.continuationItemRenderer;\n }\n\n const nextContinuation =\n continuationRenderer?.continuationEndpoint?.continuationCommand?.token ?? null;\n\n if (!itemRenderer) return [[], nextContinuation];\n\n const videos: YouTube[] = [];\n for (const detail of itemRenderer.contents ?? []) {\n if (detail?.searchPyvRenderer?.ads) continue;\n if (detail?.shelfRenderer) continue;\n if (detail?.radioRenderer) continue;\n if (detail?.playlistRenderer) continue;\n if (detail?.channelRenderer) continue;\n if (detail?.horizontalCardListRenderer) continue;\n if (detail?.didYouMeanRenderer) continue;\n if (detail?.backgroundPromoRenderer) continue;\n if (!detail?.videoRenderer) continue;\n\n const vr = detail.videoRenderer;\n const vidId = vr.videoId as string;\n videos.push(new YouTube(`https://www.youtube.com/watch?v=${vidId}`));\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n return [videos, nextContinuation];\n }\n}\n","export const VERSION = '0.1.1';\n"]}