{"version":3,"sources":["jsdelivr-header.js","/npm/youtube-caption-extractor@1.9.1/dist/index.js"],"names":[],"mappings":"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","file":"/npm/youtube-caption-extractor@1.9.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/youtube-caption-extractor@1.9.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSubtitles = exports.getVideoDetails = void 0;\nconst he_1 = __importDefault(require(\"he\"));\nconst striptags_1 = __importDefault(require(\"striptags\"));\n// Universal logger that works in all environments (Node.js, Cloudflare Workers, etc.)\nconst createLogger = (namespace) => {\n    const isDebugEnabled = () => {\n        try {\n            // Try to access environment variables in a safe way\n            const env = typeof process !== 'undefined' && process.env ? process.env : {};\n            const debugEnv = env.DEBUG || '';\n            return debugEnv === '*' || debugEnv.includes(namespace);\n        }\n        catch (_a) {\n            return false;\n        }\n    };\n    return (message, ...args) => {\n        if (isDebugEnabled()) {\n            const timestamp = new Date().toISOString();\n            const logMessage = `${timestamp} ${namespace} ${message}`;\n            // Use console.log safely - available in all environments\n            if (args.length > 0) {\n                console.log(logMessage, ...args);\n            }\n            else {\n                console.log(logMessage);\n            }\n        }\n    };\n};\nconst debug = createLogger('youtube-caption-extractor');\n// YouTube InnerTube API configuration based on YouTube.js\nconst INNERTUBE_CONFIG = {\n    API_BASE: 'https://www.youtube.com/youtubei/v1',\n    API_KEY: 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',\n    CLIENT: {\n        WEB: {\n            NAME: 'WEB',\n            VERSION: '2.20250222.10.00',\n        },\n        ANDROID: {\n            NAME: 'ANDROID',\n            VERSION: '19.35.36',\n        },\n    },\n};\n// Detect serverless environment\nconst isServerless = !!(process.env.VERCEL ||\n    process.env.AWS_LAMBDA_FUNCTION_NAME ||\n    process.env.NETLIFY ||\n    process.env.CF_WORKER);\n// Generate proper session data for serverless environments\nfunction generateSessionData() {\n    const visitorData = generateVisitorData();\n    return {\n        context: {\n            client: {\n                hl: 'en',\n                gl: 'US',\n                clientName: INNERTUBE_CONFIG.CLIENT.WEB.NAME,\n                clientVersion: INNERTUBE_CONFIG.CLIENT.WEB.VERSION,\n                visitorData,\n            },\n            user: {\n                enableSafetyMode: false,\n            },\n            request: {\n                useSsl: true,\n            },\n        },\n        visitorData,\n    };\n}\n// Generate visitor data (simplified version of YouTube.js approach)\nfunction generateVisitorData() {\n    // This is a simplified version - YouTube.js uses more complex protobuf encoding\n    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n    let result = '';\n    for (let i = 0; i < 11; i++) {\n        result += chars.charAt(Math.floor(Math.random() * chars.length));\n    }\n    return result;\n}\n// Enhanced fetch with proper InnerTube headers\nasync function fetchInnerTube(endpoint, data) {\n    const headers = {\n        'Content-Type': 'application/json',\n        Accept: '*/*',\n        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',\n        'X-Youtube-Client-Version': INNERTUBE_CONFIG.CLIENT.WEB.VERSION,\n        'X-Youtube-Client-Name': '1', // WEB client ID\n        'X-Goog-Visitor-Id': data.visitorData,\n        Origin: 'https://www.youtube.com',\n        Referer: 'https://www.youtube.com/',\n    };\n    const url = `${INNERTUBE_CONFIG.API_BASE}${endpoint}?key=${INNERTUBE_CONFIG.API_KEY}`;\n    debug(`Calling InnerTube endpoint: ${endpoint}`);\n    return await fetch(url, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify(data),\n    });\n}\n// Get video info using proper InnerTube API\nasync function getVideoInfo(videoID) {\n    var _a, _b;\n    const sessionData = generateSessionData();\n    const payload = {\n        ...sessionData,\n        videoId: videoID,\n        playbackContext: {\n            contentPlaybackContext: {\n                vis: 0,\n                splay: false,\n                lactMilliseconds: '-1',\n            },\n        },\n        racyCheckOk: true,\n        contentCheckOk: true,\n    };\n    const response = await fetchInnerTube('/player', payload);\n    if (!response.ok) {\n        throw new Error(`Player API failed: ${response.status} ${response.statusText}`);\n    }\n    const playerData = await response.json();\n    if (((_a = playerData.playabilityStatus) === null || _a === void 0 ? void 0 : _a.status) === 'LOGIN_REQUIRED') {\n        debug(` LOGIN_REQUIRED status, trying next endpoint`);\n        // Try the next endpoint for additional data including engagement panels\n        const nextPayload = {\n            ...sessionData,\n            videoId: videoID,\n        };\n        const nextResponse = await fetchInnerTube('/next', nextPayload);\n        if (!nextResponse.ok) {\n            throw new Error(`Next API failed: ${nextResponse.status} ${nextResponse.statusText}`);\n        }\n        const nextData = await nextResponse.json();\n        debug(` Next API response keys:`, Object.keys(nextData));\n        return { playerData, nextData };\n    }\n    debug(`Player API success, status:`, (_b = playerData.playabilityStatus) === null || _b === void 0 ? void 0 : _b.status);\n    return { playerData, nextData: null };\n}\n// Extract transcript using proper engagement panel approach (like YouTube.js)\nasync function getTranscriptFromEngagementPanel(videoID, nextData) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;\n    if (!(nextData === null || nextData === void 0 ? void 0 : nextData.engagementPanels)) {\n        debug(` No engagement panels found`);\n        return [];\n    }\n    debug(` Found ${nextData.engagementPanels.length} engagement panels`);\n    // Find the transcript panel\n    const transcriptPanel = nextData.engagementPanels.find((panel) => {\n        var _a;\n        return ((_a = panel === null || panel === void 0 ? void 0 : panel.engagementPanelSectionListRenderer) === null || _a === void 0 ? void 0 : _a.panelIdentifier) ===\n            'engagement-panel-searchable-transcript';\n    });\n    if (!transcriptPanel) {\n        debug(` No transcript engagement panel found`);\n        return [];\n    }\n    debug(` Found transcript engagement panel`);\n    // Extract continuation token for transcript\n    const content = (_a = transcriptPanel.engagementPanelSectionListRenderer) === null || _a === void 0 ? void 0 : _a.content;\n    // Extract continuation token for transcript API\n    // Try multiple ways to find the continuation token\n    let continuationItem;\n    let token;\n    // Method 1: Direct continuationItemRenderer\n    continuationItem = content === null || content === void 0 ? void 0 : content.continuationItemRenderer;\n    // Check for different token/params structures\n    if ((_c = (_b = continuationItem === null || continuationItem === void 0 ? void 0 : continuationItem.continuationEndpoint) === null || _b === void 0 ? void 0 : _b.continuationCommand) === null || _c === void 0 ? void 0 : _c.token) {\n        token = continuationItem.continuationEndpoint.continuationCommand.token;\n        debug(` Found token via continuationCommand`);\n    }\n    else if ((_e = (_d = continuationItem === null || continuationItem === void 0 ? void 0 : continuationItem.continuationEndpoint) === null || _d === void 0 ? void 0 : _d.getTranscriptEndpoint) === null || _e === void 0 ? void 0 : _e.params) {\n        token = continuationItem.continuationEndpoint.getTranscriptEndpoint.params;\n        debug(` Found token via getTranscriptEndpoint`);\n    }\n    // Method 2: Inside sectionListRenderer\n    if (!token && ((_g = (_f = content === null || content === void 0 ? void 0 : content.sectionListRenderer) === null || _f === void 0 ? void 0 : _f.contents) === null || _g === void 0 ? void 0 : _g[0])) {\n        continuationItem =\n            content.sectionListRenderer.contents[0].continuationItemRenderer;\n        if ((_j = (_h = continuationItem === null || continuationItem === void 0 ? void 0 : continuationItem.continuationEndpoint) === null || _h === void 0 ? void 0 : _h.continuationCommand) === null || _j === void 0 ? void 0 : _j.token) {\n            token = continuationItem.continuationEndpoint.continuationCommand.token;\n        }\n    }\n    // Method 3: Look for transcriptRenderer with footer\n    if (!token && ((_k = content === null || content === void 0 ? void 0 : content.sectionListRenderer) === null || _k === void 0 ? void 0 : _k.contents)) {\n        for (const item of content.sectionListRenderer.contents) {\n            if (item === null || item === void 0 ? void 0 : item.transcriptRenderer) {\n                // Look for footer with continuation\n                const footer = item.transcriptRenderer.footer;\n                if ((_o = (_m = (_l = footer === null || footer === void 0 ? void 0 : footer.transcriptFooterRenderer) === null || _l === void 0 ? void 0 : _l.languageMenu) === null || _m === void 0 ? void 0 : _m.sortFilterSubMenuRenderer) === null || _o === void 0 ? void 0 : _o.subMenuItems) {\n                    // Find English or first available language\n                    const menuItems = footer.transcriptFooterRenderer.languageMenu\n                        .sortFilterSubMenuRenderer.subMenuItems;\n                    const englishItem = menuItems.find((item) => {\n                        var _a;\n                        return ((_a = item === null || item === void 0 ? void 0 : item.title) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('english')) ||\n                            (item === null || item === void 0 ? void 0 : item.selected) === true;\n                    }) || menuItems[0];\n                    if ((_q = (_p = englishItem === null || englishItem === void 0 ? void 0 : englishItem.continuation) === null || _p === void 0 ? void 0 : _p.reloadContinuationData) === null || _q === void 0 ? void 0 : _q.continuation) {\n                        token =\n                            englishItem.continuation.reloadContinuationData.continuation;\n                        break;\n                    }\n                }\n            }\n        }\n    }\n    if (!token) {\n        debug(` No continuation token found in transcript panel`);\n        return [];\n    }\n    debug(` Found continuation token, calling get_transcript`);\n    // Call the get_transcript endpoint\n    const sessionData = generateSessionData();\n    const transcriptPayload = {\n        ...sessionData,\n        params: token,\n    };\n    const transcriptResponse = await fetchInnerTube('/get_transcript', transcriptPayload);\n    if (!transcriptResponse.ok) {\n        throw new Error(`Transcript API failed: ${transcriptResponse.status} ${transcriptResponse.statusText}`);\n    }\n    const transcriptData = await transcriptResponse.json();\n    debug(` Transcript API response keys:`, Object.keys(transcriptData));\n    // Parse transcript segments\n    const segments = (_z = (_y = (_x = (_w = (_v = (_u = (_t = (_s = (_r = transcriptData === null || transcriptData === void 0 ? void 0 : transcriptData.actions) === null || _r === void 0 ? void 0 : _r[0]) === null || _s === void 0 ? void 0 : _s.updateEngagementPanelAction) === null || _t === void 0 ? void 0 : _t.content) === null || _u === void 0 ? void 0 : _u.transcriptRenderer) === null || _v === void 0 ? void 0 : _v.content) === null || _w === void 0 ? void 0 : _w.transcriptSearchPanelRenderer) === null || _x === void 0 ? void 0 : _x.body) === null || _y === void 0 ? void 0 : _y.transcriptSegmentListRenderer) === null || _z === void 0 ? void 0 : _z.initialSegments;\n    if (!segments || !Array.isArray(segments)) {\n        debug(` No transcript segments found`);\n        return [];\n    }\n    debug(` Found ${segments.length} transcript segments`);\n    // Successfully parsing transcript segments\n    const subtitles = [];\n    let debugCount = 0;\n    for (const segment of segments) {\n        if (segment.transcriptSegmentRenderer) {\n            const renderer = segment.transcriptSegmentRenderer;\n            // Extract subtitle data\n            const startMs = parseInt(renderer.startMs || '0');\n            const endMs = parseInt(renderer.endMs || '0');\n            // Try different text extraction paths\n            let text = '';\n            if ((_0 = renderer.snippet) === null || _0 === void 0 ? void 0 : _0.simpleText) {\n                text = renderer.snippet.simpleText;\n            }\n            else if ((_1 = renderer.snippet) === null || _1 === void 0 ? void 0 : _1.runs) {\n                text = renderer.snippet.runs.map((run) => run.text).join('');\n            }\n            else if ((_2 = renderer.snippet) === null || _2 === void 0 ? void 0 : _2.text) {\n                text = renderer.snippet.text;\n            }\n            // Log progress for first few segments\n            if (debugCount < 5) {\n                debug(` Segment: startMs=${startMs}, endMs=${endMs}, text=\"${text.substring(0, 50)}${text.length > 50 ? '...' : ''}\"`);\n                debugCount++;\n            }\n            if (text.trim()) {\n                subtitles.push({\n                    start: (startMs / 1000).toString(),\n                    dur: ((endMs - startMs) / 1000).toString(),\n                    text: he_1.default.decode((0, striptags_1.default)(text)),\n                });\n            }\n        }\n    }\n    return subtitles;\n}\n// Fallback: Extract captions from player data (traditional method)\nasync function getSubtitlesFromCaptions(videoID, playerData, lang = 'en') {\n    var _a, _b;\n    const captionTracks = (_b = (_a = playerData === null || playerData === void 0 ? void 0 : playerData.captions) === null || _a === void 0 ? void 0 : _a.playerCaptionsTracklistRenderer) === null || _b === void 0 ? void 0 : _b.captionTracks;\n    if (!captionTracks || !Array.isArray(captionTracks)) {\n        debug(` No caption tracks found in player data`);\n        return [];\n    }\n    debug(` Found ${captionTracks.length} caption tracks`);\n    // Find the appropriate subtitle language track\n    const subtitle = captionTracks.find((track) => track.vssId === `.${lang}`) ||\n        captionTracks.find((track) => track.vssId === `a.${lang}`) ||\n        captionTracks.find((track) => { var _a; return (_a = track.vssId) === null || _a === void 0 ? void 0 : _a.includes(`.${lang}`); }) ||\n        captionTracks[0]; // fallback to first available\n    if (!(subtitle === null || subtitle === void 0 ? void 0 : subtitle.baseUrl)) {\n        debug(` No suitable caption track found`);\n        return [];\n    }\n    debug(` Using caption track: ${subtitle.vssId}`);\n    // Fetch the caption content\n    const captionUrl = subtitle.baseUrl.replace('&fmt=srv3', ''); // Force XML format\n    const response = await fetch(captionUrl, {\n        headers: {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',\n            Referer: `https://www.youtube.com/watch?v=${videoID}`,\n        },\n    });\n    if (!response.ok) {\n        throw new Error(`Caption fetch failed: ${response.status}`);\n    }\n    const xmlText = await response.text();\n    if (!xmlText.trim() || !xmlText.includes('<text')) {\n        throw new Error('Caption content is empty or invalid');\n    }\n    debug(` Caption XML length: ${xmlText.length} characters`);\n    // Parse XML captions\n    const startRegex = /start=\"([\\d.]+)\"/;\n    const durRegex = /dur=\"([\\d.]+)\"/;\n    return extractSubtitlesFromXML(xmlText, startRegex, durRegex);\n}\nfunction extractSubtitlesFromXML(transcript, startRegex, durRegex) {\n    return transcript\n        .replace('<?xml version=\"1.0\" encoding=\"utf-8\" ?><transcript>', '')\n        .replace('</transcript>', '')\n        .split('</text>')\n        .filter((line) => line && line.trim())\n        .reduce((acc, line) => {\n        const startResult = startRegex.exec(line);\n        const durResult = durRegex.exec(line);\n        if (!startResult || !durResult) {\n            return acc;\n        }\n        const [, start] = startResult;\n        const [, dur] = durResult;\n        const htmlText = line\n            .replace(/<text.+>/, '')\n            .replace(/&amp;/gi, '&')\n            .replace(/<\\/?[^>]+(>|$)/g, '');\n        const decodedText = he_1.default.decode(htmlText);\n        const text = (0, striptags_1.default)(decodedText);\n        acc.push({\n            start,\n            dur,\n            text,\n        });\n        return acc;\n    }, []);\n}\nconst getVideoDetails = async ({ videoID, lang = 'en', }) => {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30;\n    try {\n        debug(` Getting video details for ${videoID}, serverless: ${isServerless}`);\n        // Get video info using proper InnerTube API\n        const { playerData, nextData } = await getVideoInfo(videoID);\n        // Extract basic video details\n        const videoDetails = playerData === null || playerData === void 0 ? void 0 : playerData.videoDetails;\n        // Extract title from multiple possible locations\n        let title = 'No title found';\n        if (videoDetails === null || videoDetails === void 0 ? void 0 : videoDetails.title) {\n            title = videoDetails.title;\n        }\n        else if ((_k = (_j = (_h = (_g = (_f = (_e = (_d = (_c = (_b = (_a = nextData === null || nextData === void 0 ? void 0 : nextData.contents) === null || _a === void 0 ? void 0 : _a.twoColumnWatchNextResults) === null || _b === void 0 ? void 0 : _b.results) === null || _c === void 0 ? void 0 : _c.results) === null || _d === void 0 ? void 0 : _d.contents) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.videoPrimaryInfoRenderer) === null || _g === void 0 ? void 0 : _g.title) === null || _h === void 0 ? void 0 : _h.runs) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.text) {\n            title =\n                nextData.contents.twoColumnWatchNextResults.results.results.contents[0]\n                    .videoPrimaryInfoRenderer.title.runs[0].text;\n        }\n        else if ((_o = (_m = (_l = nextData === null || nextData === void 0 ? void 0 : nextData.metadata) === null || _l === void 0 ? void 0 : _l.videoMetadataRenderer) === null || _m === void 0 ? void 0 : _m.title) === null || _o === void 0 ? void 0 : _o.simpleText) {\n            title = nextData.metadata.videoMetadataRenderer.title.simpleText;\n        }\n        else if ((_p = nextData === null || nextData === void 0 ? void 0 : nextData.videoDetails) === null || _p === void 0 ? void 0 : _p.title) {\n            title = nextData.videoDetails.title;\n        }\n        // Extract description from multiple possible locations\n        let description = 'No description found';\n        if (videoDetails === null || videoDetails === void 0 ? void 0 : videoDetails.shortDescription) {\n            description = videoDetails.shortDescription;\n        }\n        else if ((_x = (_w = (_v = (_u = (_t = (_s = (_r = (_q = nextData === null || nextData === void 0 ? void 0 : nextData.contents) === null || _q === void 0 ? void 0 : _q.twoColumnWatchNextResults) === null || _r === void 0 ? void 0 : _r.results) === null || _s === void 0 ? void 0 : _s.results) === null || _t === void 0 ? void 0 : _t.contents) === null || _u === void 0 ? void 0 : _u[1]) === null || _v === void 0 ? void 0 : _v.videoSecondaryInfoRenderer) === null || _w === void 0 ? void 0 : _w.description) === null || _x === void 0 ? void 0 : _x.runs) {\n            description =\n                nextData.contents.twoColumnWatchNextResults.results.results.contents[1].videoSecondaryInfoRenderer.description.runs\n                    .map((run) => run.text)\n                    .join('');\n        }\n        else if ((_6 = (_5 = (_4 = (_3 = (_2 = (_1 = (_0 = (_z = (_y = nextData === null || nextData === void 0 ? void 0 : nextData.contents) === null || _y === void 0 ? void 0 : _y.twoColumnWatchNextResults) === null || _z === void 0 ? void 0 : _z.results) === null || _0 === void 0 ? void 0 : _0.results) === null || _1 === void 0 ? void 0 : _1.contents) === null || _2 === void 0 ? void 0 : _2[0]) === null || _3 === void 0 ? void 0 : _3.videoPrimaryInfoRenderer) === null || _4 === void 0 ? void 0 : _4.videoActions) === null || _5 === void 0 ? void 0 : _5.menuRenderer) === null || _6 === void 0 ? void 0 : _6.topLevelButtons) {\n            // Look for description in primary info renderer\n            const primaryInfo = nextData.contents.twoColumnWatchNextResults.results.results.contents[0]\n                .videoPrimaryInfoRenderer;\n            if ((_7 = primaryInfo === null || primaryInfo === void 0 ? void 0 : primaryInfo.description) === null || _7 === void 0 ? void 0 : _7.runs) {\n                description = primaryInfo.description.runs\n                    .map((run) => run.text)\n                    .join('');\n            }\n        }\n        else if ((_10 = (_9 = (_8 = nextData === null || nextData === void 0 ? void 0 : nextData.metadata) === null || _8 === void 0 ? void 0 : _8.videoMetadataRenderer) === null || _9 === void 0 ? void 0 : _9.description) === null || _10 === void 0 ? void 0 : _10.simpleText) {\n            description =\n                nextData.metadata.videoMetadataRenderer.description.simpleText;\n        }\n        else if ((_11 = nextData === null || nextData === void 0 ? void 0 : nextData.videoDetails) === null || _11 === void 0 ? void 0 : _11.shortDescription) {\n            description = nextData.videoDetails.shortDescription;\n        }\n        // Additional search in the secondary info renderer with alternative path\n        if (description === 'No description found' &&\n            ((_15 = (_14 = (_13 = (_12 = nextData === null || nextData === void 0 ? void 0 : nextData.contents) === null || _12 === void 0 ? void 0 : _12.twoColumnWatchNextResults) === null || _13 === void 0 ? void 0 : _13.results) === null || _14 === void 0 ? void 0 : _14.results) === null || _15 === void 0 ? void 0 : _15.contents)) {\n            for (const content of nextData.contents.twoColumnWatchNextResults.results\n                .results.contents) {\n                if ((_17 = (_16 = content === null || content === void 0 ? void 0 : content.videoSecondaryInfoRenderer) === null || _16 === void 0 ? void 0 : _16.description) === null || _17 === void 0 ? void 0 : _17.runs) {\n                    description = content.videoSecondaryInfoRenderer.description.runs\n                        .map((run) => run.text)\n                        .join('');\n                    break;\n                }\n                if ((_19 = (_18 = content === null || content === void 0 ? void 0 : content.videoSecondaryInfoRenderer) === null || _18 === void 0 ? void 0 : _18.attributedDescription) === null || _19 === void 0 ? void 0 : _19.content) {\n                    description =\n                        content.videoSecondaryInfoRenderer.attributedDescription.content;\n                    break;\n                }\n            }\n        }\n        // Search in engagement panels for description\n        if (description === 'No description found' && (nextData === null || nextData === void 0 ? void 0 : nextData.engagementPanels)) {\n            for (const panel of nextData.engagementPanels) {\n                if ((_22 = (_21 = (_20 = panel === null || panel === void 0 ? void 0 : panel.engagementPanelSectionListRenderer) === null || _20 === void 0 ? void 0 : _20.content) === null || _21 === void 0 ? void 0 : _21.structuredDescriptionContentRenderer) === null || _22 === void 0 ? void 0 : _22.items) {\n                    const items = panel.engagementPanelSectionListRenderer.content\n                        .structuredDescriptionContentRenderer.items;\n                    for (const item of items) {\n                        if ((_24 = (_23 = item === null || item === void 0 ? void 0 : item.videoDescriptionHeaderRenderer) === null || _23 === void 0 ? void 0 : _23.description) === null || _24 === void 0 ? void 0 : _24.runs) {\n                            description = item.videoDescriptionHeaderRenderer.description.runs\n                                .map((run) => run.text)\n                                .join('');\n                            break;\n                        }\n                        if ((_26 = (_25 = item === null || item === void 0 ? void 0 : item.expandableVideoDescriptionBodyRenderer) === null || _25 === void 0 ? void 0 : _25.descriptionBodyText) === null || _26 === void 0 ? void 0 : _26.runs) {\n                            description =\n                                item.expandableVideoDescriptionBodyRenderer.descriptionBodyText.runs\n                                    .map((run) => run.text)\n                                    .join('');\n                            break;\n                        }\n                    }\n                    if (description !== 'No description found')\n                        break;\n                }\n            }\n        }\n        debug(` Video title: ${title}`);\n        debug(` Video description: ${description.substring(0, 100)}${description.length > 100 ? '...' : ''}`);\n        // Debug: Show available data structures for description\n        if (description === 'No description found') {\n            debug(` Description not found, checking available structures...`);\n            if ((_30 = (_29 = (_28 = (_27 = nextData === null || nextData === void 0 ? void 0 : nextData.contents) === null || _27 === void 0 ? void 0 : _27.twoColumnWatchNextResults) === null || _28 === void 0 ? void 0 : _28.results) === null || _29 === void 0 ? void 0 : _29.results) === null || _30 === void 0 ? void 0 : _30.contents) {\n                nextData.contents.twoColumnWatchNextResults.results.results.contents.forEach((content, index) => {\n                    debug(` Content ${index} keys:`, Object.keys(content || {}));\n                    if (content === null || content === void 0 ? void 0 : content.videoSecondaryInfoRenderer) {\n                        debug(`videoSecondaryInfoRenderer keys:`, Object.keys(content.videoSecondaryInfoRenderer || {}));\n                    }\n                });\n            }\n        }\n        let subtitles = [];\n        // Method 1: Try to get transcript from engagement panel (preferred, like YouTube.js)\n        if (nextData) {\n            try {\n                subtitles = await getTranscriptFromEngagementPanel(videoID, nextData);\n                if (subtitles.length > 0) {\n                    debug(` Successfully got ${subtitles.length} subtitles from transcript API`);\n                }\n            }\n            catch (error) {\n                debug(` Transcript API failed:`, error instanceof Error ? error.message : 'Unknown error');\n            }\n        }\n        // Method 2: Fallback to traditional caption tracks\n        if (subtitles.length === 0) {\n            try {\n                subtitles = await getSubtitlesFromCaptions(videoID, playerData, lang);\n                if (subtitles.length > 0) {\n                    debug(` Successfully got ${subtitles.length} subtitles from captions`);\n                }\n            }\n            catch (error) {\n                debug(` Caption fallback failed:`, error instanceof Error ? error.message : 'Unknown error');\n            }\n        }\n        if (subtitles.length === 0) {\n            debug(` No subtitles found for video: ${videoID} (language: ${lang})`);\n        }\n        return {\n            title,\n            description,\n            subtitles,\n        };\n    }\n    catch (error) {\n        debug(`Error in getVideoDetails:`, error);\n        throw error;\n    }\n};\nexports.getVideoDetails = getVideoDetails;\nconst getSubtitles = async ({ videoID, lang = 'en', }) => {\n    try {\n        debug(` Getting subtitles for ${videoID}, serverless: ${isServerless}`);\n        const { playerData, nextData } = await getVideoInfo(videoID);\n        // Try transcript API first\n        if (nextData) {\n            try {\n                const subtitles = await getTranscriptFromEngagementPanel(videoID, nextData);\n                if (subtitles.length > 0) {\n                    return subtitles;\n                }\n            }\n            catch (error) {\n                debug(` Transcript API failed:`, error instanceof Error ? error.message : 'Unknown error');\n            }\n        }\n        // Fallback to captions\n        return await getSubtitlesFromCaptions(videoID, playerData, lang);\n    }\n    catch (error) {\n        debug('Error getting subtitles:', error);\n        throw error;\n    }\n};\nexports.getSubtitles = getSubtitles;\n"]}