UNPKG

@np-dev/youtubei-js

Version:

A wrapper around YouTube's private API. Supports YouTube, YouTube Music, YouTube Kids and YouTube Studio (WIP).

1,346 lines (1,300 loc) 773 kB
"use strict"; /* eslint-disable */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // dist/src/platform/node.js var node_exports = {}; __export(node_exports, { Actions: () => Actions_default, AppendContinuationItemsAction: () => AppendContinuationItemsAction_default, ClientType: () => ClientType, Clients: () => clients_exports, Constants: () => Constants_exports, Continuation: () => Continuation, ContinuationCommand: () => ContinuationCommand, Endpoints: () => endpoints_exports, EventEmitter: () => EventEmitterLike_default, FormatUtils: () => FormatUtils_exports, Generator: () => generator_exports, GridContinuation: () => GridContinuation, HTTPClient: () => HTTPClient_default, Helpers: () => helpers_exports, Innertube: () => Innertube_default, ItemSectionContinuation: () => ItemSectionContinuation, LiveChatContinuation: () => LiveChatContinuation, Managers: () => managers_exports, Misc: () => misc_exports, Mixins: () => mixins_exports, MusicPlaylistShelfContinuation: () => MusicPlaylistShelfContinuation, MusicShelfContinuation: () => MusicShelfContinuation, NavigateAction: () => NavigateAction, OAuth: () => OAuth_default, Parser: () => parser_exports, Platform: () => Platform, Player: () => Player_default, PlaylistPanelContinuation: () => PlaylistPanelContinuation, Proto: () => proto_exports, ReloadContinuationItemsCommand: () => ReloadContinuationItemsCommand, SectionListContinuation: () => SectionListContinuation, Session: () => Session_default, ShowMiniplayerCommand: () => ShowMiniplayerCommand, Types: () => types_exports, UniversalCache: () => Cache_default, Utils: () => Utils_exports, YT: () => youtube_exports, YTKids: () => ytkids_exports, YTMusic: () => ytmusic_exports, YTNodes: () => nodes_exports, YTShorts: () => ytshorts_exports, default: () => node_default }); module.exports = __toCommonJS(node_exports); var import_tslib67 = require("tslib"); var import_web = require("stream/web"); var import_undici = require("undici"); // dist/src/utils/Utils.js var Utils_exports = {}; __export(Utils_exports, { ChannelError: () => ChannelError, InnertubeError: () => InnertubeError, MissingParamError: () => MissingParamError, OAuthError: () => OAuthError, ParsingError: () => ParsingError, Platform: () => Platform, PlayerError: () => PlayerError, SessionError: () => SessionError, base64ToU8: () => base64ToU8, concatMemos: () => concatMemos, debugFetch: () => debugFetch, deepCompare: () => deepCompare, escapeStringRegexp: () => escapeStringRegexp, generateRandomString: () => generateRandomString, generateSidAuth: () => generateSidAuth, getRandomUserAgent: () => getRandomUserAgent, getStringBetweenStrings: () => getStringBetweenStrings, hasKeys: () => hasKeys, isTextRun: () => isTextRun, streamToIterable: () => streamToIterable, throwIfMissing: () => throwIfMissing, timeToSeconds: () => timeToSeconds, u8ToBase64: () => u8ToBase64 }); var import_tslib54 = require("tslib"); // dist/src/parser/helpers.js var helpers_exports = {}; __export(helpers_exports, { Maybe: () => Maybe, Memo: () => Memo, SuperParsedResult: () => SuperParsedResult, YTNode: () => YTNode, observe: () => observe }); var import_tslib = require("tslib"); var _YTNode_instances; var _YTNode_is; var _Maybe_instances; var _Maybe_value; var _Maybe_checkPrimative; var _Maybe_assertPrimative; var _SuperParsedResult_result; var isObserved = Symbol("ObservedArray.isObserved"); var YTNode = class { constructor() { _YTNode_instances.add(this); this.type = this.constructor.type; } is(...types) { return types.some((type) => (0, import_tslib.__classPrivateFieldGet)(this, _YTNode_instances, "m", _YTNode_is).call(this, type)); } as(...types) { if (!this.is(...types)) { throw new ParsingError(`Cannot cast ${this.type} to one of ${types.map((t) => t.type).join(", ")}`); } return this; } hasKey(key) { return Reflect.has(this, key); } key(key) { if (!this.hasKey(key)) { throw new ParsingError(`Missing key ${key}`); } return new Maybe(this[key]); } }; __name(YTNode, "YTNode"); _YTNode_instances = /* @__PURE__ */ new WeakSet(), _YTNode_is = /* @__PURE__ */ __name(function _YTNode_is2(type) { return this.type === type.type; }, "_YTNode_is"); YTNode.type = "YTNode"; var Maybe = class { constructor(value) { _Maybe_instances.add(this); _Maybe_value.set(this, void 0); (0, import_tslib.__classPrivateFieldSet)(this, _Maybe_value, value, "f"); } get typeof() { return typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } string() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "string"); } isString() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "string"); } number() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "number"); } isNumber() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "number"); } bigint() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "bigint"); } isBigint() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "bigint"); } boolean() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "boolean"); } isBoolean() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "boolean"); } symbol() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "symbol"); } isSymbol() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "symbol"); } undefined() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "undefined"); } isUndefined() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "undefined"); } null() { if ((0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") !== null) throw new TypeError(`Expected null, got ${typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")}`); return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } isNull() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") === null; } object() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "object"); } isObject() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "object"); } function() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_assertPrimative).call(this, "function"); } isFunction() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, "function"); } array() { if (!Array.isArray((0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"))) { throw new TypeError(`Expected array, got ${typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } arrayOfMaybe() { const arrayProps = []; return new Proxy(this.array(), { get(target, prop) { if (Reflect.has(arrayProps, prop)) { return Reflect.get(target, prop); } return new Maybe(Reflect.get(target, prop)); } }); } isArray() { return Array.isArray((0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")); } node() { if (!((0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") instanceof YTNode)) { throw new TypeError(`Expected YTNode, got ${(0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f").constructor.name}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } isNode() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") instanceof YTNode; } nodeOfType(...types) { return this.node().as(...types); } isNodeOfType(...types) { return this.isNode() && this.node().is(...types); } observed() { if (!this.isObserved()) { throw new TypeError(`Expected ObservedArray, got ${typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } isObserved() { var _a3; return (_a3 = (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")) === null || _a3 === void 0 ? void 0 : _a3[isObserved]; } parsed() { if (!((0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") instanceof SuperParsedResult)) { throw new TypeError(`Expected SuperParsedResult, got ${typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f")}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } isParsed() { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") instanceof SuperParsedResult; } any() { console.warn("This call is not meant to be used outside of debugging. Please use the specific type getter instead."); return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } instanceof(type) { if (!this.isInstanceof(type)) { throw new TypeError(`Expected instance of ${type.name}, got ${(0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f").constructor.name}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); } isInstanceof(type) { return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") instanceof type; } }; __name(Maybe, "Maybe"); _Maybe_value = /* @__PURE__ */ new WeakMap(), _Maybe_instances = /* @__PURE__ */ new WeakSet(), _Maybe_checkPrimative = /* @__PURE__ */ __name(function _Maybe_checkPrimative2(type) { if (typeof (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f") !== type) { return false; } return true; }, "_Maybe_checkPrimative"), _Maybe_assertPrimative = /* @__PURE__ */ __name(function _Maybe_assertPrimative2(type) { if (!(0, import_tslib.__classPrivateFieldGet)(this, _Maybe_instances, "m", _Maybe_checkPrimative).call(this, type)) { throw new TypeError(`Expected ${type}, got ${this.typeof}`); } return (0, import_tslib.__classPrivateFieldGet)(this, _Maybe_value, "f"); }, "_Maybe_assertPrimative"); var SuperParsedResult = class { constructor(result) { _SuperParsedResult_result.set(this, void 0); (0, import_tslib.__classPrivateFieldSet)(this, _SuperParsedResult_result, result, "f"); } get is_null() { return (0, import_tslib.__classPrivateFieldGet)(this, _SuperParsedResult_result, "f") === null; } get is_array() { return !this.is_null && Array.isArray((0, import_tslib.__classPrivateFieldGet)(this, _SuperParsedResult_result, "f")); } get is_node() { return !this.is_array; } array() { if (!this.is_array) { throw new TypeError("Expected an array, got a node"); } return (0, import_tslib.__classPrivateFieldGet)(this, _SuperParsedResult_result, "f"); } item() { if (!this.is_node) { throw new TypeError("Expected a node, got an array"); } return (0, import_tslib.__classPrivateFieldGet)(this, _SuperParsedResult_result, "f"); } }; __name(SuperParsedResult, "SuperParsedResult"); _SuperParsedResult_result = /* @__PURE__ */ new WeakMap(); function observe(obj) { return new Proxy(obj, { get(target, prop) { if (prop == "get") { return (rule, del_item) => target.find((obj2, index) => { const match = deepCompare(rule, obj2); if (match && del_item) { target.splice(index, 1); } return match; }); } if (prop == isObserved) { return true; } if (prop == "getAll") { return (rule, del_items) => target.filter((obj2, index) => { const match = deepCompare(rule, obj2); if (match && del_items) { target.splice(index, 1); } return match; }); } if (prop == "matchCondition") { return (condition) => target.find((obj2) => { return condition(obj2); }); } if (prop == "filterType") { return (...types) => { return observe(target.filter((node) => { if (node.is(...types)) return true; return false; })); }; } if (prop == "firstOfType") { return (...types) => { return target.find((node) => { if (node.is(...types)) return true; return false; }); }; } if (prop == "first") { return () => target[0]; } if (prop == "as") { return (...types) => { return observe(target.map((node) => { if (node.is(...types)) return node; throw new ParsingError(`Expected node of any type ${types.map((type) => type.type).join(", ")}, got ${node.type}`); })); }; } if (prop == "remove") { return (index) => target.splice(index, 1); } return Reflect.get(target, prop); } }); } __name(observe, "observe"); var Memo = class extends Map { getType(...types) { types = types.flat(); return observe(types.flatMap((type) => this.get(type.type) || [])); } }; __name(Memo, "Memo"); // dist/src/parser/misc.js var misc_exports = {}; __export(misc_exports, { Author: () => Author, ChildElement: () => ChildElement_default, EmojiRun: () => EmojiRun, Format: () => Format_default, Text: () => Text2, TextRun: () => TextRun, Thumbnail: () => Thumbnail, VideoDetails: () => VideoDetails }); // dist/src/utils/Constants.js var Constants_exports = {}; __export(Constants_exports, { CLIENTS: () => CLIENTS, INNERTUBE_HEADERS_BASE: () => INNERTUBE_HEADERS_BASE, OAUTH: () => OAUTH, STREAM_HEADERS: () => STREAM_HEADERS, URLS: () => URLS }); var URLS = Object.freeze({ YT_BASE: "https://www.youtube.com", YT_MUSIC_BASE: "https://music.youtube.com", YT_SUGGESTIONS: "https://suggestqueries.google.com/complete/", YT_UPLOAD: "https://upload.youtube.com/", API: Object.freeze({ BASE: "https://youtubei.googleapis.com", PRODUCTION_1: "https://www.youtube.com/youtubei/", PRODUCTION_2: "https://youtubei.googleapis.com/youtubei/", STAGING: "https://green-youtubei.sandbox.googleapis.com/youtubei/", RELEASE: "https://release-youtubei.sandbox.googleapis.com/youtubei/", TEST: "https://test-youtubei.sandbox.googleapis.com/youtubei/", CAMI: "http://cami-youtubei.sandbox.googleapis.com/youtubei/", UYTFE: "https://uytfe.sandbox.google.com/youtubei/" }) }); var OAUTH = Object.freeze({ SCOPE: "http://gdata.youtube.com https://www.googleapis.com/auth/youtube-paid-content", GRANT_TYPE: "http://oauth.net/grant_type/device/1.0", MODEL_NAME: "ytlr::", HEADERS: Object.freeze({ "accept": "*/*", "origin": "https://www.youtube.com", "user-agent": "Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version", "content-type": "application/json", "referer": "https://www.youtube.com/tv", "accept-language": "en-US" }), REGEX: Object.freeze({ AUTH_SCRIPT: /<script id="base-js" src="(.*?)" nonce=".*?"><\/script>/, CLIENT_IDENTITY: /var .+?={clientId:"(?<client_id>.+?)",.+?:"(?<client_secret>.+?)".+?}/ }) }); var CLIENTS = Object.freeze({ iOS: { NAME: "iOS", VERSION: "18.06.35", USER_AGENT: "com.google.ios.youtube/18.06.35 (iPhone; CPU iPhone OS 14_4 like Mac OS X; en_US)", DEVICE_MODEL: "iPhone10,6" }, WEB: { NAME: "WEB", VERSION: "2.20230622.06.00", API_KEY: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", API_VERSION: "v1", STATIC_VISITOR_ID: "6zpwvWUNAco" }, WEB_KIDS: { NAME: "WEB_KIDS", VERSION: "2.20230111.00.00" }, YTMUSIC: { NAME: "WEB_REMIX", VERSION: "1.20211213.00.00" }, ANDROID: { NAME: "ANDROID", VERSION: "18.06.35", SDK_VERSION: "29", USER_AGENT: "com.google.android.youtube/18.06.35 (Linux; U; Android 10; US)" }, YTSTUDIO_ANDROID: { NAME: "ANDROID_CREATOR", VERSION: "22.43.101" }, YTMUSIC_ANDROID: { NAME: "ANDROID_MUSIC", VERSION: "5.34.51" }, TV_EMBEDDED: { NAME: "TVHTML5_SIMPLY_EMBEDDED_PLAYER", VERSION: "2.0" } }); var STREAM_HEADERS = Object.freeze({ "accept": "*/*", "origin": "https://www.youtube.com", "referer": "https://www.youtube.com", "DNT": "?1" }); var INNERTUBE_HEADERS_BASE = Object.freeze({ "accept": "*/*", "accept-encoding": "gzip, deflate", "content-type": "application/json" }); // dist/src/parser/parser.js var parser_exports = {}; __export(parser_exports, { addRuntimeParser: () => addRuntimeParser, applyMutations: () => applyMutations, getDynamicParsers: () => getDynamicParsers, getParserByName: () => getParserByName, hasParser: () => hasParser, parse: () => parse, parseActions: () => parseActions, parseArray: () => parseArray, parseC: () => parseC, parseFormats: () => parseFormats, parseItem: () => parseItem, parseLC: () => parseLC, parseRR: () => parseRR, parseResponse: () => parseResponse, sanitizeClassName: () => sanitizeClassName, setParserErrorHandler: () => setParserErrorHandler, shouldIgnore: () => shouldIgnore }); var import_tslib10 = require("tslib"); // dist/src/parser/classes/AudioOnlyPlayability.js var AudioOnlyPlayability = class extends YTNode { constructor(data) { super(); this.audio_only_availability = data.audioOnlyAvailability; } }; __name(AudioOnlyPlayability, "AudioOnlyPlayability"); AudioOnlyPlayability.type = "AudioOnlyPlayability"; var AudioOnlyPlayability_default = AudioOnlyPlayability; // dist/src/parser/classes/Button.js var Button = class extends YTNode { constructor(data) { super(); if (Reflect.has(data, "text")) this.text = new Text2(data.text).toString(); if (Reflect.has(data, "accessibility") && Reflect.has(data.accessibility, "label")) this.label = data.accessibility.label; if (Reflect.has(data, "tooltip")) this.tooltip = data.tooltip; if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) this.icon_type = data.icon.iconType; if (Reflect.has(data, "isDisabled")) this.is_disabled = data.isDisabled; this.endpoint = new NavigationEndpoint_default(data.navigationEndpoint || data.serviceEndpoint || data.command); } }; __name(Button, "Button"); Button.type = "Button"; var Button_default = Button; // dist/src/parser/classes/DropdownItem.js var DropdownItem = class extends YTNode { constructor(data) { var _a3; super(); this.label = new Text2(data.label).toString(); this.selected = !!data.isSelected; if (Reflect.has(data, "int32Value")) { this.value = data.int32Value; } else if (data.stringValue) { this.value = data.stringValue; } if (Reflect.has(data, "onSelectCommand")) { this.endpoint = new NavigationEndpoint_default(data.onSelectCommand); } if (Reflect.has(data, "icon")) { this.icon_type = (_a3 = data.icon) === null || _a3 === void 0 ? void 0 : _a3.iconType; } if (Reflect.has(data, "descriptionText")) { this.description = new Text2(data.descriptionText); } } }; __name(DropdownItem, "DropdownItem"); DropdownItem.type = "DropdownItem"; var DropdownItem_default = DropdownItem; // dist/src/parser/classes/Dropdown.js var Dropdown = class extends YTNode { constructor(data) { super(); this.label = data.label || ""; this.entries = parser_exports.parseArray(data.entries, DropdownItem_default); } }; __name(Dropdown, "Dropdown"); Dropdown.type = "Dropdown"; var Dropdown_default = Dropdown; // dist/src/parser/classes/CreatePlaylistDialog.js var CreatePlaylistDialog = class extends YTNode { constructor(data) { super(); this.title = new Text2(data.dialogTitle).toString(); this.title_placeholder = data.titlePlaceholder || ""; this.privacy_option = parser_exports.parseItem(data.privacyOption, Dropdown_default); this.create_button = parser_exports.parseItem(data.cancelButton, Button_default); this.cancel_button = parser_exports.parseItem(data.cancelButton, Button_default); } }; __name(CreatePlaylistDialog, "CreatePlaylistDialog"); CreatePlaylistDialog.type = "CreatePlaylistDialog"; var CreatePlaylistDialog_default = CreatePlaylistDialog; // dist/src/parser/classes/actions/OpenPopupAction.js var OpenPopupAction = class extends YTNode { constructor(data) { super(); this.popup = parser_exports.parseItem(data.popup); this.popup_type = data.popupType; } }; __name(OpenPopupAction, "OpenPopupAction"); OpenPopupAction.type = "OpenPopupAction"; var OpenPopupAction_default = OpenPopupAction; // dist/src/parser/classes/NavigationEndpoint.js var NavigationEndpoint = class extends YTNode { constructor(data) { var _a3, _b, _c, _d, _e, _f, _g, _h; super(); if (Reflect.has(data || {}, "innertubeCommand")) data = data.innertubeCommand; if (Reflect.has(data || {}, "openPopupAction")) this.open_popup = new OpenPopupAction_default(data.openPopupAction); const name = Object.keys(data || {}).find((item) => item.endsWith("Endpoint") || item.endsWith("Command")); this.payload = name ? Reflect.get(data, name) : {}; if (Reflect.has(this.payload, "dialog") || Reflect.has(this.payload, "content")) { this.dialog = parser_exports.parseItem(this.payload.dialog || this.payload.content); } if (data === null || data === void 0 ? void 0 : data.serviceEndpoint) { data = data.serviceEndpoint; } this.metadata = {}; if ((_b = (_a3 = data === null || data === void 0 ? void 0 : data.commandMetadata) === null || _a3 === void 0 ? void 0 : _a3.webCommandMetadata) === null || _b === void 0 ? void 0 : _b.url) { this.metadata.url = data.commandMetadata.webCommandMetadata.url; } if ((_d = (_c = data === null || data === void 0 ? void 0 : data.commandMetadata) === null || _c === void 0 ? void 0 : _c.webCommandMetadata) === null || _d === void 0 ? void 0 : _d.webPageType) { this.metadata.page_type = data.commandMetadata.webCommandMetadata.webPageType; } if ((_f = (_e = data === null || data === void 0 ? void 0 : data.commandMetadata) === null || _e === void 0 ? void 0 : _e.webCommandMetadata) === null || _f === void 0 ? void 0 : _f.apiUrl) { this.metadata.api_url = data.commandMetadata.webCommandMetadata.apiUrl.replace("/youtubei/v1/", ""); } else if (name) { this.metadata.api_url = this.getEndpoint(name); } if ((_h = (_g = data === null || data === void 0 ? void 0 : data.commandMetadata) === null || _g === void 0 ? void 0 : _g.webCommandMetadata) === null || _h === void 0 ? void 0 : _h.sendPost) { this.metadata.send_post = data.commandMetadata.webCommandMetadata.sendPost; } if (data === null || data === void 0 ? void 0 : data.createPlaylistEndpoint) { if (data === null || data === void 0 ? void 0 : data.createPlaylistEndpoint.createPlaylistDialog) { this.dialog = parser_exports.parseItem(data === null || data === void 0 ? void 0 : data.createPlaylistEndpoint.createPlaylistDialog, CreatePlaylistDialog_default); } } } getEndpoint(name) { switch (name) { case "browseEndpoint": return "/browse"; case "watchEndpoint": return "/player"; case "searchEndpoint": return "/search"; case "watchPlaylistEndpoint": return "/next"; case "liveChatItemContextMenuEndpoint": return "live_chat/get_item_context_menu"; } } call(actions, args) { if (!actions) throw new Error("An active caller must be provided"); if (!this.metadata.api_url) throw new Error("Expected an api_url, but none was found, this is a bug."); return actions.execute(this.metadata.api_url, Object.assign(Object.assign({}, this.payload), args)); } toURL() { if (!this.metadata.url) return void 0; if (!this.metadata.page_type) return void 0; return this.metadata.page_type === "WEB_PAGE_TYPE_UNKNOWN" ? this.metadata.url : `https://www.youtube.com${this.metadata.url}`; } }; __name(NavigationEndpoint, "NavigationEndpoint"); NavigationEndpoint.type = "NavigationEndpoint"; var NavigationEndpoint_default = NavigationEndpoint; // dist/src/parser/classes/misc/Thumbnail.js var Thumbnail = class { constructor(data) { this.url = data.url; this.width = data.width; this.height = data.height; } static fromResponse(data) { if (!data || !data.thumbnails) return []; return data.thumbnails.map((x) => new Thumbnail(x)).sort((a, b) => b.width - a.width); } }; __name(Thumbnail, "Thumbnail"); // dist/src/parser/classes/misc/EmojiRun.js var EmojiRun = class { constructor(data) { var _a3, _b, _c, _d, _e, _f; this.text = ((_a3 = data.emoji) === null || _a3 === void 0 ? void 0 : _a3.emojiId) || ((_c = (_b = data.emoji) === null || _b === void 0 ? void 0 : _b.shortcuts) === null || _c === void 0 ? void 0 : _c[0]) || ""; this.emoji = { emoji_id: data.emoji.emojiId, shortcuts: ((_d = data.emoji) === null || _d === void 0 ? void 0 : _d.shortcuts) || [], search_terms: ((_e = data.emoji) === null || _e === void 0 ? void 0 : _e.searchTerms) || [], image: Thumbnail.fromResponse(data.emoji.image), is_custom: !!((_f = data.emoji) === null || _f === void 0 ? void 0 : _f.isCustomEmoji) }; } toString() { return this.text; } toHTML() { const escaped_text = escape(this.text); return `<img src="${this.emoji.image[0].url}" alt="${escaped_text}" title="${escaped_text}" style="display: inline-block; vertical-align: text-top; height: var(--yt-emoji-size, 1rem); width: var(--yt-emoji-size, 1rem);" loading="lazy" crossorigin="anonymous" />`; } }; __name(EmojiRun, "EmojiRun"); // dist/src/parser/classes/misc/TextRun.js var TextRun = class { constructor(data) { this.text = data.text; this.bold = Boolean(data.bold); this.italics = Boolean(data.italics); this.strikethrough = Boolean(data.strikethrough); if (Reflect.has(data, "navigationEndpoint")) { this.endpoint = new NavigationEndpoint_default(data.navigationEndpoint); } this.attachment = data.attachment; } toString() { return this.text; } toHTML() { const tags = []; if (this.bold) tags.push("b"); if (this.italics) tags.push("i"); if (this.strikethrough) tags.push("s"); const escaped_text = escape(this.text); const styled_text = tags.map((tag) => `<${tag}>`).join("") + escaped_text + tags.map((tag) => `</${tag}>`).join(""); const wrapped_text = `<span style="white-space: pre-wrap;">${styled_text}</span>`; if (this.attachment) { if (this.attachment.element.type.imageType.image.sources.length) { const { url } = this.attachment.element.type.imageType.image.sources[0]; if (this.endpoint) { const nav_url = this.endpoint.toURL(); if (nav_url) return `<a href="${nav_url}" class="yt-ch-link" display: block; width: fit-content; font-size: small;><img src="${url}" style="vertical-align: middle; height: ${this.attachment.element.properties.layoutProperties.height.value}px; width: ${this.attachment.element.properties.layoutProperties.width.value}px;">${wrapped_text}</a>`; } } } if (this.endpoint) { const url = this.endpoint.toURL(); if (url) return `<a href="${url}">${wrapped_text}</a>`; } return wrapped_text; } }; __name(TextRun, "TextRun"); // dist/src/parser/classes/misc/Text.js function escape(text) { return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); } __name(escape, "escape"); var Text2 = class { constructor(data) { var _a3, _b, _c, _d; if (typeof data === "object" && data !== null && Reflect.has(data, "runs") && Array.isArray(data.runs)) { this.runs = data.runs.map((run) => run.emoji ? new EmojiRun(run) : new TextRun(run)); this.text = this.runs.map((run) => run.text).join(""); } else { this.text = data === null || data === void 0 ? void 0 : data.simpleText; } if (typeof data === "object" && data !== null && Reflect.has(data, "navigationEndpoint")) { this.endpoint = new NavigationEndpoint_default(data.navigationEndpoint); } if (typeof data === "object" && data !== null && Reflect.has(data, "titleNavigationEndpoint")) { this.endpoint = new NavigationEndpoint_default(data.titleNavigationEndpoint); } if (!this.endpoint) { if ((_b = (_a3 = this.runs) === null || _a3 === void 0 ? void 0 : _a3[0]) === null || _b === void 0 ? void 0 : _b.endpoint) { this.endpoint = (_d = (_c = this.runs) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.endpoint; } } } static fromAttributed(data) { const runs = []; const content = data.content; const command_runs = data.commandRuns; let last_end_index = 0; if (command_runs) { for (const item of command_runs) { const length = item.length; const start_index = item.startIndex; if (start_index > last_end_index) { runs.push({ text: content.slice(last_end_index, start_index) }); } if (Reflect.has(item, "onTap")) { let attachment = null; if (Reflect.has(data, "attachmentRuns")) { const attachment_runs = data.attachmentRuns; for (const attatchment_run of attachment_runs) { if (attatchment_run.startIndex - 2 == start_index) { attachment = attatchment_run; break; } } } if (attachment) { runs.push({ text: content.slice(start_index, start_index + length), navigationEndpoint: item.onTap, attachment }); } else { runs.push({ text: content.slice(start_index, start_index + length), navigationEndpoint: item.onTap }); } } last_end_index = start_index + length; } if (last_end_index < content.length) { runs.push({ text: content.slice(last_end_index) }); } } else { runs.push({ text: content }); } return new Text2({ runs }); } toHTML() { return this.runs ? this.runs.map((run) => run.toHTML()).join("") : this.text; } isEmpty() { return this.text === void 0; } toString() { return this.text || "N/A"; } }; __name(Text2, "Text"); // dist/src/parser/classes/CardCollection.js var CardCollection = class extends YTNode { constructor(data) { super(); this.cards = parser_exports.parseArray(data.cards); this.header = new Text2(data.headerText); this.allow_teaser_dismiss = data.allowTeaserDismiss; } }; __name(CardCollection, "CardCollection"); CardCollection.type = "CardCollection"; var CardCollection_default = CardCollection; // dist/src/parser/classes/Endscreen.js var Endscreen = class extends YTNode { constructor(data) { super(); this.elements = parser_exports.parseArray(data.elements); this.start_ms = data.startMs; } }; __name(Endscreen, "Endscreen"); Endscreen.type = "Endscreen"; var Endscreen_default = Endscreen; // dist/src/parser/classes/PlayerAnnotationsExpanded.js var PlayerAnnotationsExpanded = class extends YTNode { constructor(data) { super(); if (Reflect.has(data, "featuredChannel")) { this.featured_channel = { start_time_ms: data.featuredChannel.startTimeMs, end_time_ms: data.featuredChannel.endTimeMs, watermark: Thumbnail.fromResponse(data.featuredChannel.watermark), channel_name: data.featuredChannel.channelName, endpoint: new NavigationEndpoint_default(data.featuredChannel.navigationEndpoint), subscribe_button: parser_exports.parseItem(data.featuredChannel.subscribeButton) }; } this.allow_swipe_dismiss = data.allowSwipeDismiss; this.annotation_id = data.annotationId; } }; __name(PlayerAnnotationsExpanded, "PlayerAnnotationsExpanded"); PlayerAnnotationsExpanded.type = "PlayerAnnotationsExpanded"; var PlayerAnnotationsExpanded_default = PlayerAnnotationsExpanded; // dist/src/parser/classes/PlayerCaptionsTracklist.js var PlayerCaptionsTracklist = class extends YTNode { constructor(data) { super(); if (Reflect.has(data, "captionTracks")) { this.caption_tracks = data.captionTracks.map((ct) => ({ base_url: ct.baseUrl, name: new Text2(ct.name), vss_id: ct.vssId, language_code: ct.languageCode, kind: ct.kind, is_translatable: ct.isTranslatable })); } if (Reflect.has(data, "audioTracks")) { this.audio_tracks = data.audioTracks.map((at) => ({ audio_track_id: at.audioTrackId, captions_initial_state: at.captionsInitialState, default_caption_track_index: at.defaultCaptionTrackIndex, has_default_track: at.hasDefaultTrack, visibility: at.visibility, caption_track_indices: at.captionTrackIndices })); } if (Reflect.has(data, "defaultAudioTrackIndex")) { this.default_audio_track_index = data.defaultAudioTrackIndex; } if (Reflect.has(data, "translationLanguages")) { this.translation_languages = data.translationLanguages.map((tl) => ({ language_code: tl.languageCode, language_name: new Text2(tl.languageName) })); } } }; __name(PlayerCaptionsTracklist, "PlayerCaptionsTracklist"); PlayerCaptionsTracklist.type = "PlayerCaptionsTracklist"; var PlayerCaptionsTracklist_default = PlayerCaptionsTracklist; // dist/src/parser/classes/PlayerLiveStoryboardSpec.js var PlayerLiveStoryboardSpec = class extends YTNode { constructor() { super(); } }; __name(PlayerLiveStoryboardSpec, "PlayerLiveStoryboardSpec"); PlayerLiveStoryboardSpec.type = "PlayerLiveStoryboardSpec"; var PlayerLiveStoryboardSpec_default = PlayerLiveStoryboardSpec; // dist/src/parser/classes/PlayerStoryboardSpec.js var PlayerStoryboardSpec = class extends YTNode { constructor(data) { super(); const parts = data.spec.split("|"); const url = new URL(parts.shift()); this.boards = parts.map((part, i) => { const [thumbnail_width, thumbnail_height, thumbnail_count, columns, rows, interval, name, sigh] = part.split("#"); url.searchParams.set("sigh", sigh); const storyboard_count = Math.ceil(parseInt(thumbnail_count, 10) / (parseInt(columns, 10) * parseInt(rows, 10))); return { template_url: url.toString().replace("$L", i).replace("$N", name), thumbnail_width: parseInt(thumbnail_width, 10), thumbnail_height: parseInt(thumbnail_height, 10), thumbnail_count: parseInt(thumbnail_count, 10), interval: parseInt(interval, 10), columns: parseInt(columns, 10), rows: parseInt(rows, 10), storyboard_count }; }); } }; __name(PlayerStoryboardSpec, "PlayerStoryboardSpec"); PlayerStoryboardSpec.type = "PlayerStoryboardSpec"; var PlayerStoryboardSpec_default = PlayerStoryboardSpec; // dist/src/parser/classes/Alert.js var Alert = class extends YTNode { constructor(data) { super(); this.text = new Text2(data.text); this.alert_type = data.type; } }; __name(Alert, "Alert"); Alert.type = "Alert"; var Alert_default = Alert; // dist/src/parser/classes/AlertWithButton.js var AlertWithButton = class extends YTNode { constructor(data) { super(); this.text = new Text2(data.text); this.alert_type = data.type; this.dismiss_button = parser_exports.parseItem(data.dismissButton, Button_default); } }; __name(AlertWithButton, "AlertWithButton"); AlertWithButton.type = "AlertWithButton"; var AlertWithButton_default = AlertWithButton; // dist/src/parser/classes/ClipCreationTextInput.js var ClipCreationTextInput = class extends YTNode { constructor(data) { super(); this.placeholder_text = new Text2(data.placeholderText); this.max_character_limit = data.maxCharacterLimit; } }; __name(ClipCreationTextInput, "ClipCreationTextInput"); ClipCreationTextInput.type = "ClipCreationTextInput"; var ClipCreationTextInput_default = ClipCreationTextInput; // dist/src/parser/classes/ClipCreationScrubber.js var ClipCreationScrubber = class extends YTNode { constructor(data) { var _a3, _b, _c, _d, _e, _f; super(); this.length_template = data.lengthTemplate; this.max_length_ms = data.maxLengthMs; this.min_length_ms = data.minLengthMs; this.default_length_ms = data.defaultLengthMs; this.window_size_ms = data.windowSizeMs; this.start_label = (_b = (_a3 = data.startAccessibility) === null || _a3 === void 0 ? void 0 : _a3.accessibilityData) === null || _b === void 0 ? void 0 : _b.label; this.end_label = (_d = (_c = data.endAccessibility) === null || _c === void 0 ? void 0 : _c.accessibilityData) === null || _d === void 0 ? void 0 : _d.label; this.duration_label = (_f = (_e = data.durationAccessibility) === null || _e === void 0 ? void 0 : _e.accessibilityData) === null || _f === void 0 ? void 0 : _f.label; } }; __name(ClipCreationScrubber, "ClipCreationScrubber"); ClipCreationScrubber.type = "ClipCreationScrubber"; var ClipCreationScrubber_default = ClipCreationScrubber; // dist/src/parser/classes/ClipAdState.js var ClipAdState = class extends YTNode { constructor(data) { super(); this.title = new Text2(data.title); this.body = new Text2(data.body); } }; __name(ClipAdState, "ClipAdState"); ClipAdState.type = "ClipAdState"; var ClipAdState_default = ClipAdState; // dist/src/parser/classes/ClipCreation.js var ClipCreation = class extends YTNode { constructor(data) { super(); this.user_avatar = Thumbnail.fromResponse(data.userAvatar); this.title_input = parser_exports.parseItem(data.titleInput, [ClipCreationTextInput_default]); this.scrubber = parser_exports.parseItem(data.scrubber, [ClipCreationScrubber_default]); this.save_button = parser_exports.parseItem(data.saveButton, [Button_default]); this.display_name = new Text2(data.displayName); this.publicity_label = data.publicityLabel; this.cancel_button = parser_exports.parseItem(data.cancelButton, [Button_default]); this.ad_state_overlay = parser_exports.parseItem(data.adStateOverlay, [ClipAdState_default]); this.external_video_id = data.externalVideoId; this.publicity_label_icon = data.publicityLabelIcon; } }; __name(ClipCreation, "ClipCreation"); ClipCreation.type = "ClipCreation"; var ClipCreation_default = ClipCreation; // dist/src/parser/classes/ClipSection.js var ClipSection = class extends YTNode { constructor(data) { super(); this.contents = parser_exports.parse(data.contents, true, [ClipCreation_default]); } }; __name(ClipSection, "ClipSection"); ClipSection.type = "ClipSection"; var ClipSection_default = ClipSection; // dist/src/parser/classes/ContinuationItem.js var ContinuationItem = class extends YTNode { constructor(data) { super(); this.trigger = data.trigger; if (Reflect.has(data, "button")) { this.button = parser_exports.parseItem(data.button, Button_default); } this.endpoint = new NavigationEndpoint_default(data.continuationEndpoint); } }; __name(ContinuationItem, "ContinuationItem"); ContinuationItem.type = "ContinuationItem"; var ContinuationItem_default = ContinuationItem; // dist/src/parser/classes/EngagementPanelTitleHeader.js var EngagementPanelTitleHeader = class extends YTNode { constructor(data) { super(); this.title = new Text2(data.title); this.visibility_button = parser_exports.parseItem(data.visibilityButton, Button_default); } }; __name(EngagementPanelTitleHeader, "EngagementPanelTitleHeader"); EngagementPanelTitleHeader.type = "EngagementPanelTitleHeader"; var EngagementPanelTitleHeader_default = EngagementPanelTitleHeader; // dist/src/parser/classes/menus/Menu.js var Menu = class extends YTNode { constructor(data) { super(); this.items = parser_exports.parseArray(data.items); this.top_level_buttons = parser_exports.parseArray(data.topLevelButtons); if (Reflect.has(data, "accessibility") && Reflect.has(data.accessibility, "accessibilityData")) { this.label = data.accessibility.accessibilityData.label; } } get contents() { return this.items; } }; __name(Menu, "Menu"); Menu.type = "Menu"; var Menu_default = Menu; // dist/src/parser/classes/MacroMarkersInfoItem.js var MacroMarkersInfoItem = class extends YTNode { constructor(data) { super(); this.info_text = new Text2(data.infoText); this.menu = parser_exports.parseItem(data.menu, Menu_default); } }; __name(MacroMarkersInfoItem, "MacroMarkersInfoItem"); MacroMarkersInfoItem.type = "MacroMarkersInfoItem"; var MacroMarkersInfoItem_default = MacroMarkersInfoItem; // dist/src/parser/classes/MacroMarkersListItem.js var MacroMarkersListItem = class extends YTNode { constructor(data) { super(); this.title = new Text2(data.title); this.time_description = new Text2(data.timeDescription); this.thumbnail = Thumbnail.fromResponse(data.thumbnail); this.on_tap_endpoint = new NavigationEndpoint_default(data.onTap); this.layout = data.layout; this.is_highlighted = !!data.isHighlighted; } }; __name(MacroMarkersListItem, "MacroMarkersListItem"); MacroMarkersListItem.type = "MacroMarkersListItem"; var MacroMarkersListItem_default = MacroMarkersListItem; // dist/src/parser/classes/MacroMarkersList.js var MacroMarkersList = class extends YTNode { constructor(data) { super(); this.contents = parser_exports.parseArray(data.contents, [MacroMarkersInfoItem_default, MacroMarkersListItem_default]); this.sync_button_label = new Text2(data.syncButtonLabel); } }; __name(MacroMarkersList, "MacroMarkersList"); MacroMarkersList.type = "MacroMarkersList"; var MacroMarkersList_default = MacroMarkersList; // dist/src/parser/classes/ProductList.js var ProductList = class extends YTNode { constructor(data) { super(); this.contents = parser_exports.parseArray(data.contents); } }; __name(ProductList, "ProductList"); ProductList.type = "ProductList"; var ProductList_default = ProductList; // dist/src/parser/classes/SectionList.js var SectionList = class extends YTNode { constructor(data) { super(); this.contents = parser_exports.parseArray(data.contents); if (Reflect.has(data, "targetId")) { this.target_id = data.targetId; } if (Reflect.has(data, "continuations")) { if (Reflect.has(data.continuations[0], "nextContinuationData")) { this.continuation = data.continuations[0].nextContinuationData.continuation; } else if (Reflect.has(data.continuations[0], "reloadContinuationData")) { this.continuation = data.continuations[0].reloadContinuationData.continuation; } } if (Reflect.has(data, "header")) { this.header = parser_exports.parseItem(data.header); } if (Reflect.has(data, "subMenu")) { this.sub_menu = parser_exports.parseItem(data.subMenu); } } }; __name(SectionList, "SectionList"); SectionList.type = "SectionList"; var SectionList_default = SectionList; // dist/src/parser/classes/ExpandableVideoDescriptionBody.js var ExpandableVideoDescriptionBody = class extends YTNode { constructor(data) { var _a3; super(); this.show_more_text = new Text2(data.showMoreText); this.show_less_text = new Text2(data.showLessText); if (Reflect.has(data, "attributedDescriptionBodyText")) { this.attributed_description_body_text = (_a3 = data.attributedDescriptionBodyText) === null || _a3 === void 0 ? void 0 : _a3.content; } } }; __name(ExpandableVideoDescriptionBody, "ExpandableVideoDescriptionBody"); ExpandableVideoDescriptionBody.type = "ExpandableVideoDescriptionBody"; var ExpandableVideoDescriptionBody_default = ExpandableVideoDescriptionBody; // dist/src/parser/classes/SearchRefinementCard.js var SearchRefinementCard = class extends YTNode { constructor(data) { super(); this.thumbnails = Thumbnail.fromResponse(data.thumbnail); this.endpoint = new NavigationEndpoint_default(data.searchEndpoint); this.query = new Text2(data.query).toString(); } }; __name(SearchRefinementCard, "SearchRefinementCard"); SearchRefinementCard.type = "SearchRefinementCard"; var SearchRefinementCard_default = SearchRefinementCard; // dist/src/parser/classes/GameCard.js var GameCard = class extends YTNode { constructor(data) { super(); this.game = parser_exports.parseItem(data.game); } }; __name(GameCard, "GameCard"); GameCard.type = "GameCard"; var GameCard_default = GameCard; // dist/src/parser/classes/HorizontalList.js var HorizontalList = class extends YTNode { constructor(data) { super(); this.visible_item_count = data.visibleItemCount; this.items = parser_exports.parseArray(data.items); } get contents() { return this.items; } }; __name(HorizontalList, "HorizontalList"); HorizontalList.type = "HorizontalList"; var HorizontalList_default = HorizontalList; // dist/src/parser/classes/ExpandableMetadata.js var ExpandableMetadata = class extends YTNode { constructor(data) { super(); if (Reflect.has(data, "header")) { this.header = { collapsed_title: new Text2(data.header.collapsedTitle), collapsed_thumbnail: Thumbnail.fromResponse(data.header.collapsedThumbnail), collapsed_label: new Text2(data.header.collapsedLabel), expanded_title: new Text2(data.header.expandedTitle) }; } this.expanded_content = parser_exports.parseItem(data.expandedContent, [HorizontalCardList_default, HorizontalList_default]); this.expand_button = parser_exports.parseItem(data.expandButton, Button_default); this.collapse_button = parser_exports.parseItem(data.collapseButton, Button_default); } }; __name(ExpandableMetadata, "ExpandableMetadata"); ExpandableMetadata.type = "ExpandableMetadata"; var ExpandableMetadata_default = ExpandableMetadata; // dist/src/parser/classes/MetadataBadge.js var MetadataBadge = class extends YTNode { constructor(data) { super(); if (Reflect.has(data, "icon")) { this.icon_type = data.icon.iconType; } if (Reflect.has(data, "style")) { this.style = data.style; } if (Reflect.has(data, "label")) { this.label = data.label; } if (Reflect.has(data, "tooltip") || Reflect.has(data, "iconTooltip")) { this.tooltip = data.tooltip || data.iconTooltip; } } }; __name(MetadataBadge, "MetadataBadge"); MetadataBadge.type = "MetadataBadge"; var MetadataBadge_default = MetadataBadge; // dist/src/parser/classes/ThumbnailOverlayTimeStatus.js var ThumbnailOverlayTimeStatus = class extends YTNode { constructor(data) { super(); this.text = new Text2(data.text).toString(); this.style = data.style; } }; __name(ThumbnailOverlayTimeStatus, "ThumbnailOverlayTimeStatus"); ThumbnailOverlayTimeStatus.type = "ThumbnailOverlayTimeStatus"; var ThumbnailOverlayTimeStatus_default = ThumbnailOverlayTimeStatus; // dist/src/parser/classes/Video.js var Video = class extends YTNode { constructor(data) { var _a3, _b, _c; super(); const overlay_time_status = ((_a3 = data.thumbnailOverlays.find((overlay) => overlay.thumbnailOverlayTimeStatusRenderer)) === null || _a3 === void 0 ? void 0 : _a3.thumbnailOverlayTimeStatusRenderer.text) || "N/A"; this.id = data.videoId; this.title = new Text2(data.title); if (Reflect.has(data, "descriptionSnippet")) { this.description_snippet = new Text2(data.descriptionSnippet); } if (Reflect.has(data, "detailedMetadataSnippets")) { this.snippets = data.detailedMetadataSnippets.map((snippet) => ({ text: new Text2