@jburnhams/tube-ts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers.ts","../src/ShakaPlayerAdapter.ts","../src/BotguardService.ts","../src/TubePlayer.ts"],"names":["shaka","requestInit","YTUtils"],"mappings":"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","file":"index.js","sourcesContent":["import shaka from 'shaka-player/dist/shaka-player.ui';\n\nexport function asMap<K, V>(object: Record<string, V>): Map<K, V> {\n const map = new Map<K, V>();\n for (const key of Object.keys(object)) {\n map.set(key as K, object[key]);\n }\n return map;\n}\n\nexport function createRecoverableError(message: string, info?: Record<string, any>) {\n return new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.HTTP_ERROR,\n message,\n { info }\n );\n}\n\nexport function headersToGenericObject(headers: Headers): Record<string, string> {\n const headersObj: Record<string, string> = {};\n headers.forEach((value, key) => {\n // Since Edge incorrectly returns the header with a leading new line\n // character ('\\n'), we trim the header here.\n headersObj[key.trim()] = value;\n });\n return headersObj;\n}\n\nexport function makeResponse(\n headers: Record<string, string>,\n data: BufferSource,\n status: number,\n uri: string,\n responseURL: string,\n request: shaka.extern.Request,\n requestType: shaka.net.NetworkingEngine.RequestType\n): shaka.extern.Response & { originalRequest: shaka.extern.Request } {\n if (status >= 200 && status <= 299 && status !== 202) {\n return {\n uri: responseURL || uri,\n originalUri: uri,\n data,\n status,\n headers,\n originalRequest: request,\n fromCache: !!headers['x-shaka-from-cache']\n };\n }\n\n let responseText: string | null = null;\n try {\n responseText = shaka.util.StringUtils.fromBytesAutoDetect(data);\n } catch { /* no-op */ }\n\n const severity = status === 401 || status === 403\n ? shaka.util.Error.Severity.CRITICAL\n : shaka.util.Error.Severity.RECOVERABLE;\n\n throw new shaka.util.Error(\n severity,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.BAD_HTTP_STATUS,\n uri,\n status,\n responseText,\n headers,\n requestType,\n responseURL || uri\n );\n}\n\n// Proxied fetchFunction using https://vps.jonathanburnhams.com/\nexport async function fetchFunction(input: string | Request | URL, init?: RequestInit): Promise<Response> {\n const url = input instanceof URL ? input : new URL(typeof input === 'string' ? input : input.url);\n const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));\n\n if (url.pathname.includes('v1/player')) {\n url.searchParams.set('$fields', 'playerConfig,storyboards,captions,playabilityStatus,streamingData,responseContext.mainAppWebResponseContext.datasyncId,videoDetails.isLive,videoDetails.isLiveContent,videoDetails.title,videoDetails.author,videoDetails.thumbnail');\n }\n\n // Allow skipping proxy via environment variable (useful for Node.js testing)\n // Check process.env in a safe way for browsers\n let skipProxy = false;\n try {\n if (typeof process !== 'undefined' && process.env && process.env.SKIP_PROXY === 'true') {\n skipProxy = true;\n }\n } catch (e) {\n // ignore\n }\n\n if (skipProxy) {\n const requestInit = {\n ...init,\n headers\n };\n if (input instanceof Request && !requestInit.method) {\n requestInit.method = input.method;\n }\n return fetch(url.toString(), requestInit);\n }\n\n const proxyUrl = new URL(url.pathname + url.search, 'https://vps.jonathanburnhams.com/');\n\n // FIX: Force player scripts to target www.youtube.com\n // When running on GitHub Pages (e.g. /tube-ts/), relative paths like /s/player/... \n // get resolved to https://jburnhams.github.io/tube-ts/s/player/...\n // We need to strip the local prefix and force the host to youtube.\n if (url.pathname.includes('/s/player/') || url.pathname.includes('/yts/jsbin/')) {\n proxyUrl.searchParams.set('__host', 'www.youtube.com');\n\n // Strip common deployment prefixes if present (simple heuristic: find where /s/player starts)\n // or just ensure the path on proxy starts with /s/player\n const scriptPathIndex = url.pathname.indexOf('/s/player/');\n if (scriptPathIndex > -1) {\n proxyUrl.pathname = url.pathname.substring(scriptPathIndex);\n } else {\n const jsbinIndex = url.pathname.indexOf('/yts/jsbin/');\n if (jsbinIndex > -1) {\n proxyUrl.pathname = url.pathname.substring(jsbinIndex);\n }\n }\n } else {\n proxyUrl.searchParams.set('__host', url.host);\n }\n\n try {\n // Prioritize session ID from environment variable if present (for testing)\n let sessionId: string | null = null;\n if (typeof process !== 'undefined' && process.env && process.env.PROXY_SESSION_ID) {\n sessionId = process.env.PROXY_SESSION_ID;\n } else if (typeof window !== 'undefined' && window.localStorage) {\n sessionId = window.localStorage.getItem('tube-ts-session-id');\n }\n\n if (sessionId) {\n proxyUrl.searchParams.set('session', sessionId);\n }\n } catch {\n // Ignore errors when accessing localStorage (e.g. security restrictions)\n }\n\n const headersObj: Record<string, string> = {};\n headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n proxyUrl.searchParams.set('__headers', JSON.stringify(headersObj));\n\n const requestInit = {\n ...init,\n headers\n };\n\n if (input instanceof Request) {\n if (!requestInit.method) {\n requestInit.method = input.method;\n }\n }\n\n const response = await fetch(proxyUrl, requestInit);\n\n const contentType = response.headers.get('content-type');\n // youtubei.js requests return JSON (application/json) or JS (text/javascript).\n // If we get HTML, it's almost certainly a proxy error page or captive portal, even if 200 OK.\n if (contentType && contentType.includes('text/html')) {\n const text = await response.text();\n throw new Error(`Proxy returned HTML (likely error page): ${response.status} ${response.statusText} - ${text.substring(0, 100)}`);\n }\n\n return response;\n}\n","import shaka from 'shaka-player/dist/shaka-player.ui';\n\nimport { FormatKeyUtils, type CacheManager, type RequestMetadataManager, isGoogleVideoURL } from 'googlevideo/utils';\n\nimport type { SabrFormat } from 'googlevideo/shared-types';\n\nimport {\n SabrUmpProcessor,\n type RequestFilter,\n type ResponseFilter,\n type SabrPlayerAdapter,\n type SabrRequestMetadata,\n type UmpProcessingResult\n} from 'googlevideo/sabr-streaming-adapter';\n\nimport {\n asMap,\n createRecoverableError,\n headersToGenericObject,\n makeResponse,\n fetchFunction\n} from './helpers.js';\n\ninterface ShakaResponseArgs {\n uri: string;\n request: shaka.extern.Request;\n requestType: shaka.net.NetworkingEngine.RequestType;\n response: Response;\n arrayBuffer?: Uint8Array | ArrayBuffer;\n}\n\nexport class ShakaPlayerAdapter implements SabrPlayerAdapter {\n protected player: shaka.Player | null = null;\n private requestMetadataManager?: RequestMetadataManager;\n private cacheManager?: CacheManager;\n private abortController?: AbortController;\n\n private requestFilter?: (type: shaka.net.NetworkingEngine.RequestType, request: shaka.extern.Request, context?: shaka.extern.RequestContext) => Promise<void>;\n private responseFilter?: (type: shaka.net.NetworkingEngine.RequestType, response: shaka.extern.Response, context?: shaka.extern.RequestContext) => Promise<void>;\n\n public initialize(\n player: shaka.Player,\n requestMetadataManager: RequestMetadataManager,\n cacheManager: CacheManager\n ): void {\n this.player = player;\n this.requestMetadataManager = requestMetadataManager;\n this.cacheManager = cacheManager;\n\n const networkingEngine = shaka.net.NetworkingEngine;\n const schemes = [ 'http', 'https' ];\n\n if (!shaka.net.HttpFetchPlugin.isSupported())\n throw new Error('The Fetch API is not supported in this browser.');\n\n schemes.forEach((scheme) => {\n networkingEngine.registerScheme(\n scheme, this.parseRequest.bind(this),\n networkingEngine.PluginPriority.PREFERRED\n );\n });\n }\n\n private parseRequest(\n uri: string,\n request: shaka.extern.Request,\n requestType: shaka.net.NetworkingEngine.RequestType,\n progressUpdated: shaka.extern.ProgressUpdated,\n headersReceived: shaka.extern.HeadersReceived,\n config: shaka.extern.SchemePluginConfig\n ): shaka.extern.IAbortableOperation<shaka.extern.Response> {\n const headers = new Headers();\n asMap(request.headers).forEach((value, key) => {\n headers.append(key as string, value as string);\n });\n\n const controller = new AbortController();\n this.abortController = controller;\n\n const init: RequestInit = {\n body: request.body as any || undefined,\n headers,\n method: request.method,\n signal: this.abortController.signal,\n credentials: request.allowCrossSiteCredentials ? 'include' : undefined\n };\n\n const abortStatus = { canceled: false, timedOut: false };\n\n const minBytes = config.minBytesForProgressEvents || 0;\n\n const pendingRequest = this.request(uri, request, requestType, init, controller, abortStatus, progressUpdated, headersReceived, minBytes);\n\n const operation = new shaka.util.AbortableOperation(\n pendingRequest,\n () => {\n abortStatus.canceled = true;\n controller.abort();\n return Promise.resolve();\n }\n );\n\n const timeoutMs = request.retryParameters.timeout;\n if (timeoutMs) {\n const timer = new shaka.util.Timer(() => {\n abortStatus.timedOut = true;\n controller.abort();\n console.warn('[ShakaPlayerAdapter]', 'Request aborted due to timeout:', uri, requestType);\n });\n timer.tickAfter(timeoutMs / 1000);\n operation.finally(() => timer.stop());\n }\n\n return operation;\n }\n\n private async handleCachedRequest(\n requestMetadata: SabrRequestMetadata,\n uri: string,\n request: shaka.extern.Request,\n progressUpdated: shaka.extern.ProgressUpdated,\n headersReceived: shaka.extern.HeadersReceived,\n requestType: shaka.net.NetworkingEngine.RequestType\n ): Promise<shaka.extern.Response | null> {\n if (!requestMetadata.byteRange || !this.cacheManager) {\n return null;\n }\n\n const segmentKey = FormatKeyUtils.createSegmentCacheKeyFromMetadata(requestMetadata);\n\n let arrayBuffer = (\n requestMetadata.isInit ?\n this.cacheManager.getInitSegment(segmentKey) :\n this.cacheManager.getSegment(segmentKey)\n )?.buffer as ArrayBuffer;\n\n if (!arrayBuffer) {\n return null;\n }\n\n if (requestMetadata.isInit) {\n arrayBuffer = arrayBuffer.slice(\n requestMetadata.byteRange.start,\n requestMetadata.byteRange.end + 1\n );\n }\n\n const headers = {\n 'content-type': requestMetadata.format?.mimeType?.split(';')[0] || '',\n 'content-length': arrayBuffer.byteLength.toString(),\n 'x-shaka-from-cache': 'true'\n };\n\n headersReceived(headers);\n progressUpdated(0, arrayBuffer.byteLength, 0);\n\n return makeResponse(headers, arrayBuffer, 200, uri, uri, request, requestType);\n }\n\n private async handleUmpResponse(\n response: Response,\n requestMetadata: SabrRequestMetadata,\n uri: string,\n request: shaka.extern.Request,\n requestType: shaka.net.NetworkingEngine.RequestType,\n progressUpdated: shaka.extern.ProgressUpdated,\n abortController: AbortController,\n minBytes: number\n ): Promise<shaka.extern.Response> {\n let lastTime = Date.now();\n\n const sabrUmpReader = new SabrUmpProcessor(requestMetadata, this.cacheManager);\n\n const checkResultIntegrity = (result: UmpProcessingResult) => {\n if (!result.data && ((!!requestMetadata.error || requestMetadata.streamInfo?.streamProtectionStatus?.status === 3) && !requestMetadata.streamInfo?.sabrContextUpdate)) {\n throw createRecoverableError('Server streaming error', requestMetadata);\n }\n };\n\n const shouldReturnEmptyResponse = () => {\n return requestMetadata.isSABR && (requestMetadata.streamInfo?.redirect || requestMetadata.streamInfo?.sabrContextUpdate);\n };\n\n // Fetch returning a ReadableStream response body is not currently\n // supported by all browsers.\n // Browser compatibility:\n // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n // If it is not supported, returning the whole segment when\n // it's ready (as xhr)\n if (!response.body) {\n const arrayBuffer = await response.arrayBuffer();\n const currentTime = Date.now();\n\n progressUpdated(currentTime - lastTime, arrayBuffer.byteLength, 0);\n\n const result = await sabrUmpReader.processChunk(new Uint8Array(arrayBuffer));\n\n if (result) {\n checkResultIntegrity(result);\n return this.createShakaResponse({ uri, request, requestType, response, arrayBuffer: result.data });\n }\n\n if (shouldReturnEmptyResponse()) {\n return this.createShakaResponse({ uri, request, requestType, response, arrayBuffer: undefined });\n }\n\n throw createRecoverableError('Empty response with no redirect information', requestMetadata);\n } else {\n const reader = response.body.getReader();\n\n let loaded = 0;\n let lastLoaded = 0;\n let contentLength: string | undefined;\n\n while (!abortController.signal.aborted) {\n let readObj;\n try {\n readObj = await reader.read();\n } catch {\n // If we abort the request while reading, we'll get an error here. Just ignore it.\n break;\n }\n\n const { value, done } = readObj;\n\n if (done) {\n // If we got here, we read the whole response but there was no segment data; it means we must follow a\n // redirect, or handle protocol updates.\n if (shouldReturnEmptyResponse()) {\n return this.createShakaResponse({ uri, request, requestType, response, arrayBuffer: undefined });\n }\n throw createRecoverableError('Empty response with no redirect information', requestMetadata);\n }\n\n const result = await sabrUmpReader.processChunk(value);\n\n const segmentInfo = sabrUmpReader.getSegmentInfo();\n\n if (segmentInfo) {\n if (!contentLength) {\n contentLength = segmentInfo.mediaHeader.contentLength?.toString();\n }\n\n loaded += segmentInfo.lastChunkSize || 0;\n segmentInfo.lastChunkSize = 0;\n }\n\n const currentTime = Date.now();\n const chunkSize = loaded - lastLoaded;\n\n // If the time between last time and this time we got\n // progress event is long enough, or if a whole segment\n // is downloaded, call progressUpdated().\n if ((currentTime - lastTime > 100 && chunkSize >= minBytes) || result) {\n // If we have a result, check its integrity before attempting anything.\n if (result) checkResultIntegrity(result);\n if (contentLength) {\n const numBytesRemaining = result ? 0 : parseInt(contentLength) - loaded;\n try {\n progressUpdated(currentTime - lastTime, chunkSize, numBytesRemaining);\n } catch { /** no-op */\n } finally {\n lastLoaded = loaded;\n lastTime = currentTime;\n }\n }\n }\n\n if (result) {\n abortController.abort();\n return this.createShakaResponse({ uri, request, requestType, response, arrayBuffer: result.data });\n }\n }\n\n // Unreachable if the loop is aborted correctly.\n throw createRecoverableError('UMP stream processing was aborted but did not produce a result.', requestMetadata);\n }\n }\n\n private async request(\n uri: string,\n request: shaka.extern.Request,\n requestType: shaka.net.NetworkingEngine.RequestType,\n init: RequestInit,\n abortController: AbortController,\n abortStatus: { canceled: boolean; timedOut: boolean },\n progressUpdated: shaka.extern.ProgressUpdated,\n headersReceived: shaka.extern.HeadersReceived,\n minBytes: number\n ): Promise<shaka.extern.Response> {\n try {\n const requestMetadata = this.requestMetadataManager?.getRequestMetadata(uri);\n\n // Check the cache first.\n if (requestMetadata) {\n const cachedResponse = await this.handleCachedRequest(requestMetadata, uri, request, progressUpdated, headersReceived, requestType);\n if (cachedResponse) {\n return cachedResponse;\n }\n }\n\n // We use standard fetch now\n const fetchFn = fetchFunction;\n\n const response = await fetchFn(uri, init);\n headersReceived(headersToGenericObject(response.headers));\n\n if (requestMetadata && init.method !== 'HEAD' && response.headers.get('content-type') === 'application/vnd.yt-ump') {\n return this.handleUmpResponse(response, requestMetadata, uri, request, requestType, progressUpdated, abortController, minBytes);\n }\n\n // Handle other requests normally.\n const lastTime = Date.now();\n\n const arrayBuffer = await response.arrayBuffer();\n const currentTime = Date.now();\n\n progressUpdated(currentTime - lastTime, arrayBuffer.byteLength, 0);\n\n return this.createShakaResponse({\n uri,\n request,\n requestType,\n response,\n arrayBuffer\n });\n } catch (error) {\n if (abortStatus.canceled) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.OPERATION_ABORTED,\n uri, requestType\n );\n } else if (abortStatus.timedOut) {\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.TIMEOUT,\n uri, requestType\n );\n }\n throw new shaka.util.Error(\n shaka.util.Error.Severity.RECOVERABLE,\n shaka.util.Error.Category.NETWORK,\n shaka.util.Error.Code.HTTP_ERROR,\n uri, error, requestType\n );\n }\n }\n\n public checkPlayerStatus(): asserts this is ({ player: shaka.Player } & this) {\n if (!this.player) {\n throw new Error('Player not initialized');\n }\n }\n\n public getPlayerTime() {\n this.checkPlayerStatus();\n return this.player.getMediaElement()?.currentTime || 0;\n }\n\n public getPlaybackRate() {\n this.checkPlayerStatus();\n return this.player.getPlaybackRate();\n }\n\n public getBandwidthEstimate() {\n this.checkPlayerStatus();\n return this.player.getStats().estimatedBandwidth;\n }\n\n public getActiveTrackFormats(activeFormat: SabrFormat, sabrFormats: SabrFormat[]): {\n videoFormat?: SabrFormat;\n audioFormat?: SabrFormat\n } {\n this.checkPlayerStatus();\n\n const activeVariant = this.player.getVariantTracks().find((track: any) =>\n FormatKeyUtils.getUniqueFormatId(activeFormat) === (activeFormat.width ? track.originalVideoId : track.originalAudioId)\n );\n\n if (!activeVariant) {\n return { videoFormat: undefined, audioFormat: undefined };\n }\n\n const formatMap = new Map(sabrFormats.map((format) => [ FormatKeyUtils.getUniqueFormatId(format), format ]));\n\n return {\n videoFormat: activeVariant.originalVideoId ? formatMap.get(activeVariant.originalVideoId) : undefined,\n audioFormat: activeVariant.originalAudioId ? formatMap.get(activeVariant.originalAudioId) : undefined\n };\n }\n\n public registerRequestInterceptor(interceptor: RequestFilter): void {\n this.checkPlayerStatus();\n\n const networkingEngine = this.player.getNetworkingEngine();\n if (!networkingEngine)\n return;\n\n this.requestFilter = async (type, request, context) => {\n if (type !== shaka.net.NetworkingEngine.RequestType.SEGMENT || !isGoogleVideoURL(request.uris[0])) return;\n\n const modifiedRequest = await interceptor({\n headers: request.headers,\n url: request.uris[0],\n method: request.method,\n segment: {\n getStartTime: () => context?.segment?.getStartTime() ?? null,\n isInit: () => !context?.segment\n },\n body: request.body as BufferSource\n });\n\n if (modifiedRequest) {\n request.uris = modifiedRequest.url ? [ modifiedRequest.url ] : request.uris;\n request.method = modifiedRequest.method || request.method;\n request.headers = modifiedRequest.headers || request.headers;\n request.body = modifiedRequest.body || request.body;\n }\n };\n\n networkingEngine.registerRequestFilter(this.requestFilter);\n }\n\n public registerResponseInterceptor(interceptor: ResponseFilter): void {\n this.checkPlayerStatus();\n const networkingEngine = this.player.getNetworkingEngine();\n if (!networkingEngine) return;\n\n this.responseFilter = async (type, response, context) => {\n if (type !== shaka.net.NetworkingEngine.RequestType.SEGMENT || !isGoogleVideoURL(response.uri)) return;\n\n const modifiedResponse = await interceptor({\n url: response.originalRequest.uris[0],\n method: response.originalRequest.method,\n headers: response.headers,\n data: response.data,\n makeRequest: async (url: string, headers: Record<string, string>) => {\n const retryParameters = this.player!.getConfiguration().streaming.retryParameters;\n const redirectRequest = shaka.net.NetworkingEngine.makeRequest([ url ], retryParameters);\n Object.assign(redirectRequest.headers, headers);\n\n const requestOperation = networkingEngine.request(type, redirectRequest, context);\n const redirectResponse = await requestOperation.promise;\n\n return {\n url: redirectResponse.uri,\n method: redirectResponse.originalRequest.method,\n headers: redirectResponse.headers,\n data: redirectResponse.data\n };\n }\n });\n\n if (modifiedResponse) {\n response.data = modifiedResponse.data ?? response.data;\n Object.assign(response.headers, modifiedResponse.headers);\n }\n };\n\n networkingEngine.registerResponseFilter(this.responseFilter);\n }\n\n public createShakaResponse(args: ShakaResponseArgs): shaka.extern.Response {\n return makeResponse(\n headersToGenericObject(args.response.headers),\n args.arrayBuffer as any || new ArrayBuffer(0),\n args.response.status,\n args.uri,\n args.response.url,\n args.request,\n args.requestType\n );\n }\n\n public dispose(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = undefined;\n }\n\n if (this.player) {\n const networkingEngine = this.player.getNetworkingEngine();\n\n if (networkingEngine && this.requestFilter && this.responseFilter) {\n networkingEngine.unregisterRequestFilter(this.requestFilter);\n networkingEngine.unregisterResponseFilter(this.responseFilter);\n }\n\n shaka.net.NetworkingEngine.unregisterScheme('http');\n shaka.net.NetworkingEngine.unregisterScheme('https');\n\n this.player = null;\n }\n }\n}\n","import { fetchFunction } from './helpers.js';\nimport type { DescrambledChallenge, WebPoSignalOutput } from 'bgutils-js';\nimport { BG, buildURL, GOOG_API_KEY } from 'bgutils-js';\n\nexport class BotguardService {\n private readonly waaRequestKey = 'O43z0dpjhgX20SCx4KAo';\n\n public botguardClient?: BG.BotGuardClient;\n public initializationPromise?: Promise<BG.BotGuardClient | undefined> | null = null;\n public integrityTokenBasedMinter?: BG.WebPoMinter;\n public bgChallenge?: DescrambledChallenge & { challenge?: string, interpreterUrl?: string };\n\n async init() {\n if (this.initializationPromise) {\n return await this.initializationPromise;\n }\n\n return this.setup();\n }\n\n private async setup() {\n if (this.initializationPromise)\n return await this.initializationPromise;\n\n this.initializationPromise = this._initBotguard();\n\n try {\n this.botguardClient = await this.initializationPromise;\n return this.botguardClient;\n } finally {\n this.initializationPromise = null;\n }\n }\n\n private async _initBotguard() {\n const challengeResponse = await fetchFunction(buildURL('Create', true), {\n method: 'POST',\n headers: {\n 'content-type': 'application/json+protobuf',\n 'x-goog-api-key': GOOG_API_KEY,\n 'x-user-agent': 'grpc-web-javascript/0.1'\n },\n body: JSON.stringify([ this.waaRequestKey ])\n });\n\n const challengeResponseData = await challengeResponse.json();\n this.bgChallenge = BG.Challenge.parseChallengeData(challengeResponseData);\n\n if (!this.bgChallenge)\n return;\n\n const interpreterJavascript = this.bgChallenge.interpreterJavascript.privateDoNotAccessOrElseSafeScriptWrappedValue;\n\n if (!interpreterJavascript) {\n console.error('[BotguardService]', 'Could not get interpreter javascript. Interpreter Hash:', this.bgChallenge.interpreterHash);\n return;\n }\n\n if (!document.getElementById(this.bgChallenge.interpreterHash)) {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.id = this.bgChallenge.interpreterHash;\n script.textContent = interpreterJavascript;\n document.head.appendChild(script);\n }\n\n this.botguardClient = await BG.BotGuardClient.create({\n globalObj: globalThis,\n globalName: this.bgChallenge.globalName,\n program: this.bgChallenge.program\n });\n\n if (this.bgChallenge) {\n const webPoSignalOutput: WebPoSignalOutput = [];\n const botguardResponse = await this.botguardClient.snapshot({ webPoSignalOutput });\n\n const integrityTokenResponse = await fetchFunction(buildURL('GenerateIT', true), {\n method: 'POST',\n headers: {\n 'content-type': 'application/json+protobuf',\n 'x-goog-api-key': GOOG_API_KEY,\n 'x-user-agent': 'grpc-web-javacript/0.1'\n },\n body: JSON.stringify([ this.waaRequestKey, botguardResponse ])\n });\n\n const integrityTokenResponseData = await integrityTokenResponse.json();\n const integrityToken = integrityTokenResponseData[0] as string | undefined;\n\n if (!integrityToken) {\n console.error('[BotguardService]', 'Could not get integrity token. Interpreter Hash:', this.bgChallenge.interpreterHash);\n return;\n }\n\n this.integrityTokenBasedMinter = await BG.WebPoMinter.create({ integrityToken }, webPoSignalOutput);\n }\n\n return this.botguardClient;\n }\n\n public mintColdStartToken(contentBinding: string) {\n return BG.PoToken.generateColdStartToken(contentBinding);\n }\n\n public isInitialized() {\n return !!this.botguardClient && !!this.integrityTokenBasedMinter;\n }\n\n public dispose() {\n if (this.botguardClient && this.bgChallenge) {\n this.botguardClient.shutdown();\n this.botguardClient = undefined;\n this.integrityTokenBasedMinter = undefined;\n\n const script = document.getElementById(this.bgChallenge.interpreterHash);\n if (script) {\n script.remove();\n }\n }\n }\n\n public async reinit() {\n if (this.initializationPromise)\n return this.initializationPromise;\n this.dispose();\n return this.setup();\n }\n}\n\nexport const botguardService = new BotguardService();\n","import shaka from 'shaka-player/dist/shaka-player.ui';\nimport type { Types, YT } from 'youtubei.js/web';\nimport { Constants, Innertube, Platform, UniversalCache, Utils, YT as YTUtils } from 'youtubei.js/web';\nimport { SabrStreamingAdapter } from 'googlevideo/sabr-streaming-adapter';\nimport { buildSabrFormat } from 'googlevideo/utils';\nimport { ShakaPlayerAdapter } from './ShakaPlayerAdapter.js';\nimport { botguardService } from './BotguardService.js';\nimport { fetchFunction } from './helpers.js';\nimport 'shaka-player/dist/controls.css';\n\n// Shim for youtubei.js\nPlatform.shim.eval = async (data: Types.BuildScriptResult, env: Record<string, Types.VMPrimative>) => {\n const properties = [];\n\n // Log code info for debugging\n if (data.output && data.output.length < 1000) {\n console.log('[TubePlayer] Short code received:', data.output);\n } else {\n console.log(`[TubePlayer] Code received, length: ${data.output?.length}`);\n }\n\n if (env.n) {\n if (data.exported?.includes('nFunction')) {\n properties.push(`n: exportedVars.nFunction(${JSON.stringify(String(env.n))})`);\n } else {\n console.warn('[TubePlayer] nFunction not exported. Available exports:', data.exported);\n throw new Error(`[TubePlayer] nFunction not exported. Available: ${data.exported?.join(', ')}`);\n }\n }\n\n if (env.sig) {\n if (data.exported?.includes('sigFunction')) {\n properties.push(`sig: exportedVars.sigFunction(${JSON.stringify(String(env.sig))})`);\n } else {\n console.warn('[TubePlayer] sigFunction not exported, skipping sig transformation');\n }\n }\n\n const code = `${data.output}\\nreturn { ${properties.join(', ')} }`;\n\n try {\n return new Function(code)();\n } catch (e: any) {\n console.error('[TubePlayer] Shim evaluation failed:', e);\n // Log first few lines of code for debugging\n console.error('[TubePlayer] Code preview:', code.substring(0, 200));\n throw e;\n }\n};\n\nexport class TubePlayer {\n private player: shaka.Player;\n private ui: shaka.ui.Overlay;\n private sabrAdapter?: SabrStreamingAdapter;\n private innertube?: Innertube;\n private playbackWebPoTokenContentBinding?: string;\n private playbackWebPoTokenCreationLock = false;\n private playbackWebPoToken?: string;\n private coldStartToken?: string;\n private container: HTMLElement;\n private videoElement: HTMLVideoElement;\n\n constructor(containerId: string) {\n const container = document.getElementById(containerId);\n if (!container) throw new Error(`Container element with ID ${containerId} not found.`);\n this.container = container as HTMLElement;\n\n // Create video element\n this.videoElement = document.createElement('video');\n this.videoElement.style.width = '100%';\n this.videoElement.style.height = '100%';\n this.videoElement.controls = false; // We use Shaka UI\n this.container.appendChild(this.videoElement);\n\n shaka.polyfill.installAll();\n\n if (!shaka.Player.isBrowserSupported()) {\n console.warn('Shaka Player is not supported on this browser.');\n }\n\n this.player = new shaka.Player();\n this.ui = new shaka.ui.Overlay(this.player, this.container, this.videoElement);\n }\n\n // Store initialization options for retry logic\n private initOptions?: { useProxy?: boolean; cache?: boolean };\n\n async initialize(options?: { useProxy?: boolean; cache?: boolean }) {\n this.initOptions = options;\n let retryCount = 0;\n const maxRetries = 3;\n const useProxy = options?.useProxy ?? true;\n // Default to strict caching unless explicitly disabled seems safest,\n // but the original logic was `retryCount === 0` (so true on first attempt).\n // Let's explicitly support a `cache` override.\n const enableCache = options?.cache ?? true;\n\n while (retryCount < maxRetries) {\n try {\n const fetchWrapper = async (input: RequestInfo | URL, init?: RequestInit) => {\n // Even on first try, we might want to catch player/base.js and timestamp it?\n // The current structure only enters this block if retryCount > 0.\n // Let's refactor to check URL regardless of retryCount for player scripts.\n\n let urlStr = typeof input === 'string' ? input : (input instanceof Request ? input.url : input.toString());\n const urlObj = new URL(urlStr);\n\n if (urlStr.includes('player') || urlStr.includes('base.js')) {\n // Always add timestamp to prevent caching old/bad player scripts\n urlObj.searchParams.set('t', String(Date.now()));\n // Log the player script URL to debug what we are actually fetching\n console.log('[TubePlayer] Fetching player script from:', urlObj.toString());\n\n // If input is a Request object, we might lose the method (e.g. POST) if we just pass the URL string.\n // The init object (if present) contains the body, but might rely on the Request object for the method.\n // If we convert Request -> URL string, we must ensure the method is preserved in init.\n let modifiedInit = init;\n if (input instanceof Request) {\n modifiedInit = {\n method: input.method,\n ...init\n };\n }\n\n // If we are skipping proxy, we still want to apply the timestamp, \n // but we use native fetch (or default behavior) instead of fetchFunction\n if (!useProxy) return fetch(urlObj.toString(), modifiedInit);\n return fetchFunction(urlObj.toString(), modifiedInit);\n }\n\n if (!useProxy) {\n return fetch(input, init);\n }\n return fetchFunction(input, init);\n };\n\n this.innertube = await Innertube.create({\n // Create cache: persistent if enabled AND first try. \n // If we are retrying internally here (retryCount > 0), we disable it.\n // If enableCache is passed as false (from loadVideo retry), we disable it.\n cache: new UniversalCache(enableCache && retryCount === 0),\n fetch: fetchWrapper\n });\n break;\n } catch (error: any) {\n console.error('Innertube init failed', error);\n retryCount++;\n if (retryCount >= maxRetries) throw error;\n console.log(`Retrying Innertube init (attempt ${retryCount + 1})...`);\n }\n }\n\n await botguardService.init();\n\n this.player.configure({\n abr: { enabled: true },\n streaming: {\n bufferingGoal: 120,\n rebufferingGoal: 2\n }\n });\n\n await this.player.attach(this.videoElement);\n\n this.ui.configure({\n addBigPlayButton: false,\n overflowMenuButtons: [\n 'captions',\n 'quality',\n 'language',\n 'chapter',\n 'picture_in_picture',\n 'playback_rate',\n 'loop',\n 'recenter_vr',\n 'toggle_stereoscopic',\n 'save_video_frame'\n ],\n customContextMenu: true\n });\n }\n\n async loadVideo(videoId: string): Promise<YT.VideoInfo['basic_info']> {\n if (!this.innertube) {\n throw new Error('TubePlayer not initialized. Call initialize() first.');\n }\n\n if (!videoId) {\n throw new Error('Please enter a video ID.');\n }\n\n this.playbackWebPoToken = undefined;\n this.playbackWebPoTokenContentBinding = videoId;\n\n try {\n // Unload previous video.\n await this.player.unload();\n\n if (this.sabrAdapter) {\n this.sabrAdapter.dispose();\n }\n\n // Now fetch video info from YouTube.\n const playerResponse = await this.innertube.actions.execute('/player', {\n videoId,\n contentCheckOk: true,\n racyCheckOk: true,\n playbackContext: {\n adPlaybackContext: {\n pyv: true\n },\n contentPlaybackContext: {\n signatureTimestamp: this.innertube.session.player?.signature_timestamp\n }\n }\n });\n\n const cpn = Utils.generateRandomString(16);\n const videoInfo = new YTUtils.VideoInfo([playerResponse], this.innertube.actions, cpn);\n\n if (videoInfo.playability_status?.status !== 'OK') {\n throw new Error(`Cannot play video: ${videoInfo.playability_status?.reason}`);\n }\n\n const isLive = videoInfo.basic_info.is_live;\n const isPostLiveDVR = !!videoInfo.basic_info.is_post_live_dvr ||\n (videoInfo.basic_info.is_live_content && !!(videoInfo.streaming_data?.dash_manifest_url || videoInfo.streaming_data?.hls_manifest_url));\n\n // Initialize and attach SABR adapter.\n this.sabrAdapter = new SabrStreamingAdapter({\n playerAdapter: new ShakaPlayerAdapter(),\n clientInfo: {\n osName: this.innertube.session.context.client.osName,\n osVersion: this.innertube.session.context.client.osVersion,\n clientName: parseInt(Constants.CLIENT_NAME_IDS[this.innertube.session.context.client.clientName as keyof typeof Constants.CLIENT_NAME_IDS]),\n clientVersion: this.innertube.session.context.client.clientVersion\n }\n });\n\n this.sabrAdapter.onMintPoToken(async () => {\n if (!this.playbackWebPoToken) {\n if (isLive) {\n await this.mintContentWebPO();\n } else {\n this.mintContentWebPO().then();\n }\n }\n\n return this.playbackWebPoToken || this.coldStartToken || '';\n });\n\n this.sabrAdapter.onReloadPlayerResponse(async (reloadContext) => {\n const reloadedInfo = await this.innertube!.actions.execute('/player', {\n videoId,\n contentCheckOk: true,\n racyCheckOk: true,\n playbackContext: {\n adPlaybackContext: {\n pyv: true\n },\n contentPlaybackContext: {\n signatureTimestamp: this.innertube!.session.player?.signature_timestamp\n },\n reloadPlaybackContext: reloadContext\n }\n });\n\n const parsedInfo = new YTUtils.VideoInfo([reloadedInfo], this.innertube!.actions, cpn);\n this.sabrAdapter!.setStreamingURL(await this.innertube!.session.player!.decipher(parsedInfo.streaming_data?.server_abr_streaming_url));\n this.sabrAdapter!.setUstreamerConfig(videoInfo.player_config?.media_common_config.media_ustreamer_request_config?.video_playback_ustreamer_config);\n });\n\n this.sabrAdapter.attach(this.player);\n\n if (videoInfo.streaming_data && !isPostLiveDVR && !isLive) {\n // This call triggers decipher, which triggers shim.eval.\n // If nFunction is missing, this will throw the \"nFunction not exported\" error.\n this.sabrAdapter.setStreamingURL(await this.innertube.session.player!.decipher(videoInfo.streaming_data?.server_abr_streaming_url));\n this.sabrAdapter.setUstreamerConfig(videoInfo.player_config?.media_common_config.media_ustreamer_request_config?.video_playback_ustreamer_config);\n this.sabrAdapter.setServerAbrFormats(videoInfo.streaming_data.adaptive_formats.map(buildSabrFormat));\n }\n\n let manifestUri: string | undefined;\n if (videoInfo.streaming_data) {\n if (isLive) {\n manifestUri = videoInfo.streaming_data.dash_manifest_url ? `${videoInfo.streaming_data.dash_manifest_url}/mpd_version/7` : videoInfo.streaming_data.hls_manifest_url;\n } else if (isPostLiveDVR) {\n manifestUri = videoInfo.streaming_data.hls_manifest_url || `${videoInfo.streaming_data.dash_manifest_url}/mpd_version/7`;\n } else {\n manifestUri = `data:application/dash+xml;base64,${btoa(await videoInfo.toDash({\n manifest_options: {\n is_sabr: true,\n captions_format: 'vtt',\n include_thumbnails: false\n }\n }))}`;\n }\n }\n\n if (!manifestUri)\n throw new Error('Could not find a valid manifest URI.');\n\n await this.player.load(manifestUri);\n\n return videoInfo.basic_info;\n\n } catch (e: any) {\n console.error('[TubePlayer]', 'Error loading video:', e);\n\n // Retry mechanism for stale/poisoned cache (e.g. bad player script causing signatureTimestamp: 0)\n if (!this.isRetrying && this.initOptions) {\n console.warn('[TubePlayer] Load failed. Retrying with cache disabled to fetch fresh player script...');\n this.isRetrying = true;\n try {\n // Re-initialize with cache disabled\n await this.initialize({ ...this.initOptions, cache: false });\n return this.loadVideo(videoId);\n } catch (retryError) {\n console.error('[TubePlayer] Retry failed:', retryError);\n } finally {\n this.isRetrying = false;\n }\n }\n\n throw e;\n }\n }\n\n // Track retry state to prevent infinite loops\n private isRetrying = false;\n\n private async mintContentWebPO() {\n if (!this.playbackWebPoTokenContentBinding || this.playbackWebPoTokenCreationLock) return;\n\n this.playbackWebPoTokenCreationLock = true;\n try {\n this.coldStartToken = botguardService.mintColdStartToken(this.playbackWebPoTokenContentBinding);\n\n if (!botguardService.isInitialized()) await botguardService.reinit();\n\n if (botguardService.integrityTokenBasedMinter) {\n this.playbackWebPoToken = await botguardService.integrityTokenBasedMinter.mintAsWebsafeString(decodeURIComponent(this.playbackWebPoTokenContentBinding));\n }\n } catch (err) {\n console.error('[TubePlayer]', 'Error minting WebPO token', err);\n } finally {\n this.playbackWebPoTokenCreationLock = false;\n }\n }\n\n destroy() {\n this.player.destroy();\n this.sabrAdapter?.dispose();\n botguardService.dispose();\n this.ui.destroy();\n this.videoElement.remove();\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@jburnhams/tube-ts",
3
+ "version": "0.1.0",
4
+ "description": "A TypeScript library designed to play YouTube videos by wrapping shaka-player and youtubei.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/jburnhams/tube-ts.git"
8
+ },
9
+ "main": "dist/index.cjs",
10
+ "module": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "type": "module",
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "browser": {
20
+ "default": "./dist/index.js"
21
+ },
22
+ "import": "./dist/index.js",
23
+ "require": "./dist/index.cjs",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./bundle": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./dist/bundles/index.esm.js"
29
+ },
30
+ "./browser": {
31
+ "default": "./dist/browser/index.global.js"
32
+ },
33
+ "./package.json": "./package.json"
34
+ },
35
+ "browser": "dist/browser/index.global.js",
36
+ "unpkg": "dist/browser/index.global.js",
37
+ "jsdelivr": "dist/browser/index.global.js",
38
+ "files": [
39
+ "dist",
40
+ "README.md"
41
+ ],
42
+ "scripts": {
43
+ "clean": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\"",
44
+ "build": "tsup",
45
+ "patch:shaka": "node scripts/patchShaka.mjs",
46
+ "postinstall": "npm run patch:shaka",
47
+ "build:docs": "npm run build -w docs",
48
+ "test": "vitest run",
49
+ "test:unit": "vitest run tests/unit",
50
+ "test:integration": "npm run build && vitest run tests/integration",
51
+ "test:all": "npm run test:unit && npm run test:integration",
52
+ "coverage": "vitest run tests/unit --coverage",
53
+ "prepublishOnly": "npm run build"
54
+ },
55
+ "keywords": [
56
+ "library",
57
+ "template"
58
+ ],
59
+ "author": "Jonathan Burnhams <jburnhams@gmail.com>",
60
+ "license": "MIT",
61
+ "workspaces": [
62
+ "docs"
63
+ ],
64
+ "dependencies": {
65
+ "bgutils-js": "^3.2.0",
66
+ "googlevideo": "^4.0.4",
67
+ "shaka-player": "^4.16.12",
68
+ "youtubei.js": "^16.0.1"
69
+ },
70
+ "devDependencies": {
71
+ "@types/node": "^24.10.4",
72
+ "@vitest/coverage-v8": "^4.0.16",
73
+ "happy-dom": "^20.0.11",
74
+ "tsup": "^8.5.1",
75
+ "typescript": "^5.9.3",
76
+ "vitest": "^4.0.16"
77
+ },
78
+ "engines": {
79
+ "node": ">=20.0.0"
80
+ }
81
+ }