{"version":3,"sources":["jsdelivr-header.js","/npm/youtube-search-api@2.0.1/dist/index.js"],"names":[],"mappings":"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","file":"/npm/youtube-search-api@2.0.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/youtube-search-api@2.0.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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetShortVideo = exports.GetVideoDetails = exports.GetChannelById = exports.GetSuggestData = exports.GetPlaylistData = exports.NextPage = exports.GetListByKeyword = exports.VideoRender = exports.ErrorHandler = exports.ErrorCodes = exports.YouTubeAPIError = void 0;\nconst axios_1 = __importDefault(require(\"axios\"));\n// 自定義錯誤類別\nclass YouTubeAPIError extends Error {\n    constructor(message, code, statusCode, originalError) {\n        super(message);\n        this.name = 'YouTubeAPIError';\n        this.code = code;\n        this.statusCode = statusCode;\n        this.originalError = originalError;\n    }\n}\nexports.YouTubeAPIError = YouTubeAPIError;\n// 錯誤代碼枚舉\nvar ErrorCodes;\n(function (ErrorCodes) {\n    ErrorCodes[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n    ErrorCodes[\"INIT_DATA_ERROR\"] = \"INIT_DATA_ERROR\";\n    ErrorCodes[\"PLAYER_DATA_ERROR\"] = \"PLAYER_DATA_ERROR\";\n    ErrorCodes[\"INVALID_PLAYLIST\"] = \"INVALID_PLAYLIST\";\n    ErrorCodes[\"INVALID_VIDEO_ID\"] = \"INVALID_VIDEO_ID\";\n    ErrorCodes[\"INVALID_CHANNEL_ID\"] = \"INVALID_CHANNEL_ID\";\n    ErrorCodes[\"RATE_LIMIT_ERROR\"] = \"RATE_LIMIT_ERROR\";\n    ErrorCodes[\"PARSE_ERROR\"] = \"PARSE_ERROR\";\n    ErrorCodes[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {}));\n// 錯誤處理器\nclass ErrorHandler {\n    constructor() { }\n    static getInstance() {\n        if (!ErrorHandler.instance) {\n            ErrorHandler.instance = new ErrorHandler();\n        }\n        return ErrorHandler.instance;\n    }\n    setErrorLogger(logger) {\n        this.errorLogger = logger;\n    }\n    handleError(error, context, code = ErrorCodes.UNKNOWN_ERROR) {\n        var _a;\n        let youtubeError;\n        if (error instanceof YouTubeAPIError) {\n            youtubeError = error;\n        }\n        else if (axios_1.default.isAxiosError(error)) {\n            const statusCode = (_a = error.response) === null || _a === void 0 ? void 0 : _a.status;\n            const message = this.getErrorMessage(code, context, error.message);\n            youtubeError = new YouTubeAPIError(message, code, statusCode, error);\n        }\n        else {\n            const message = this.getErrorMessage(code, context, (error === null || error === void 0 ? void 0 : error.message) || (error === null || error === void 0 ? void 0 : error.toString()) || '未知錯誤');\n            youtubeError = new YouTubeAPIError(message, code, undefined, error);\n        }\n        // 記錄錯誤\n        if (this.errorLogger) {\n            this.errorLogger(youtubeError);\n        }\n        else {\n            console.error(`[YouTubeAPI Error] ${youtubeError.code}: ${youtubeError.message}`);\n        }\n        throw youtubeError;\n    }\n    getErrorMessage(code, context, originalMessage) {\n        const errorMessages = {\n            [ErrorCodes.NETWORK_ERROR]: `Network connection error: ${context}`,\n            [ErrorCodes.INIT_DATA_ERROR]: `Cannot get initialization data: ${context}`,\n            [ErrorCodes.PLAYER_DATA_ERROR]: `Cannot get player data: ${context}`,\n            [ErrorCodes.INVALID_PLAYLIST]: `Invalid playlist ID: ${context}`,\n            [ErrorCodes.INVALID_VIDEO_ID]: `Invalid video ID: ${context}`,\n            [ErrorCodes.INVALID_CHANNEL_ID]: `Invalid channel ID: ${context}`,\n            [ErrorCodes.RATE_LIMIT_ERROR]: `Rate limit exceeded, please try again later: ${context}`,\n            [ErrorCodes.PARSE_ERROR]: `Data parsing error: ${context}`,\n            [ErrorCodes.UNKNOWN_ERROR]: `Unknown error: ${context}`\n        };\n        const baseMessage = errorMessages[code];\n        return originalMessage ? `${baseMessage} (${originalMessage})` : baseMessage;\n    }\n    createError(message, code, statusCode, originalError) {\n        return new YouTubeAPIError(message, code, statusCode, originalError);\n    }\n}\nexports.ErrorHandler = ErrorHandler;\n// 全域錯誤處理器實例\nconst errorHandler = ErrorHandler.getInstance();\nconst youtubeEndpoint = `https://www.youtube.com`;\nconst GetYoutubeInitData = (url) => __awaiter(void 0, void 0, void 0, function* () {\n    let initdata = {};\n    let apiToken = null;\n    let context = null;\n    try {\n        const page = yield axios_1.default.get(encodeURI(url));\n        const ytInitData = page.data.split(\"var ytInitialData =\");\n        if (ytInitData && ytInitData.length > 1) {\n            const data = ytInitData[1].split(\"</script>\")[0].slice(0, -1);\n            if (page.data.split(\"innertubeApiKey\").length > 1) {\n                const apiKeyPart = page.data.split(\"innertubeApiKey\")[1];\n                if (apiKeyPart) {\n                    apiToken = apiKeyPart\n                        .trim()\n                        .split(\",\")[0]\n                        .split('\"')[2];\n                }\n            }\n            if (page.data.split(\"INNERTUBE_CONTEXT\").length > 1) {\n                const contextPart = page.data.split(\"INNERTUBE_CONTEXT\")[1];\n                if (contextPart) {\n                    context = JSON.parse(contextPart.trim().slice(2, -2));\n                }\n            }\n            initdata = JSON.parse(data);\n            return { initdata, apiToken, context };\n        }\n        else {\n            errorHandler.handleError(new Error(\"Cannot parse YouTube initialization data\"), `URL: ${url}`, ErrorCodes.INIT_DATA_ERROR);\n            // 這行永遠不會執行，因為 handleError 會拋出錯誤\n            throw new Error(\"Unreachable code\");\n        }\n    }\n    catch (ex) {\n        if (ex instanceof YouTubeAPIError) {\n            throw ex;\n        }\n        errorHandler.handleError(ex, `Failed to get initialization data - URL: ${url}`, ErrorCodes.INIT_DATA_ERROR);\n        // 這行永遠不會執行，因為 handleError 會拋出錯誤\n        throw new Error(\"Unreachable code\");\n    }\n});\nconst GetYoutubePlayerDetail = (url) => __awaiter(void 0, void 0, void 0, function* () {\n    let initdata = {};\n    try {\n        const page = yield axios_1.default.get(encodeURI(url));\n        const ytInitData = page.data.split(\"var ytInitialPlayerResponse =\");\n        if (ytInitData && ytInitData.length > 1) {\n            const data = ytInitData[1].split(\"</script>\")[0].slice(0, -1);\n            initdata = JSON.parse(data);\n            return Object.assign({}, initdata.videoDetails);\n        }\n        else {\n            errorHandler.handleError(new Error(\"Cannot parse YouTube player data\"), `URL: ${url}`, ErrorCodes.PLAYER_DATA_ERROR);\n            // 這行永遠不會執行，因為 handleError 會拋出錯誤\n            throw new Error(\"Unreachable code\");\n        }\n    }\n    catch (ex) {\n        if (ex instanceof YouTubeAPIError) {\n            throw ex;\n        }\n        errorHandler.handleError(ex, `Failed to get player data - URL: ${url}`, ErrorCodes.PLAYER_DATA_ERROR);\n        // 這行永遠不會執行，因為 handleError 會拋出錯誤\n        throw new Error(\"Unreachable code\");\n    }\n});\nconst GetData = (keyword_1, ...args_1) => __awaiter(void 0, [keyword_1, ...args_1], void 0, function* (keyword, withPlaylist = false, limit = 0, options = []) {\n    let endpoint = `${youtubeEndpoint}/results?search_query=${keyword}`;\n    try {\n        if (Array.isArray(options) && options.length > 0) {\n            const type = options.find((z) => z.type);\n            if (type && typeof type.type === \"string\") {\n                switch (type.type.toLowerCase()) {\n                    case \"video\":\n                        endpoint = `${endpoint}&sp=EgIQAQ%3D%3D`;\n                        break;\n                    case \"channel\":\n                        endpoint = `${endpoint}&sp=EgIQAg%3D%3D`;\n                        break;\n                    case \"playlist\":\n                        endpoint = `${endpoint}&sp=EgIQAw%3D%3D`;\n                        break;\n                    case \"movie\":\n                        endpoint = `${endpoint}&sp=EgIQBA%3D%3D`;\n                        break;\n                }\n            }\n        }\n        const page = yield GetYoutubeInitData(endpoint);\n        const sectionListRenderer = page.initdata.contents.twoColumnSearchResultsRenderer.primaryContents\n            .sectionListRenderer;\n        let contToken = {};\n        let items = [];\n        sectionListRenderer.contents.forEach((content) => {\n            if (content.continuationItemRenderer) {\n                contToken =\n                    content.continuationItemRenderer.continuationEndpoint\n                        .continuationCommand.token;\n            }\n            else if (content.itemSectionRenderer) {\n                content.itemSectionRenderer.contents.forEach((item) => {\n                    if (item.channelRenderer) {\n                        let channelRenderer = item.channelRenderer;\n                        items.push({\n                            id: channelRenderer.channelId,\n                            type: \"channel\",\n                            thumbnail: channelRenderer.thumbnail,\n                            title: channelRenderer.title.simpleText\n                        });\n                    }\n                    else {\n                        let videoRender = item.videoRenderer;\n                        let playListRender = item.playlistRenderer;\n                        if (videoRender && videoRender.videoId) {\n                            items.push((0, exports.VideoRender)(item));\n                        }\n                        if (withPlaylist) {\n                            if (playListRender && playListRender.playlistId) {\n                                items.push({\n                                    id: playListRender.playlistId,\n                                    type: \"playlist\",\n                                    thumbnail: playListRender.thumbnails,\n                                    title: playListRender.title.simpleText,\n                                    length: playListRender.videoCount,\n                                    videos: playListRender.videos,\n                                    videoCount: playListRender.videoCount,\n                                    isLive: false\n                                });\n                            }\n                        }\n                    }\n                });\n            }\n        });\n        const apiToken = page.apiToken;\n        const context = page.context;\n        const nextPageContext = { context, continuation: contToken };\n        const itemsResult = limit !== 0 ? items.slice(0, limit) : items;\n        return {\n            items: itemsResult,\n            nextPage: { nextPageToken: apiToken, nextPageContext }\n        };\n    }\n    catch (ex) {\n        if (ex instanceof YouTubeAPIError) {\n            throw ex;\n        }\n        errorHandler.handleError(ex, `Search failed - keyword: ${keyword}`, ErrorCodes.UNKNOWN_ERROR);\n        // 這行永遠不會執行，因為 handleError 會拋出錯誤\n        throw new Error(\"Unreachable code\");\n    }\n});\nexports.GetListByKeyword = GetData;\nconst nextPage = (nextPage_1, ...args_1) => __awaiter(void 0, [nextPage_1, ...args_1], void 0, function* (nextPage, withPlaylist = false, limit = 0) {\n    const endpoint = `${youtubeEndpoint}/youtubei/v1/search?key=${nextPage.nextPageToken}`;\n    try {\n        const page = yield axios_1.default.post(encodeURI(endpoint), nextPage.nextPageContext);\n        const item1 = page.data.onResponseReceivedCommands[0].appendContinuationItemsAction;\n        let items = [];\n        item1.continuationItems.forEach((conitem) => {\n            if (conitem.itemSectionRenderer) {\n                conitem.itemSectionRenderer.contents.forEach((item) => __awaiter(void 0, void 0, void 0, function* () {\n                    let videoRender = item.videoRenderer;\n                    let playListRender = item.playlistRenderer;\n                    if (videoRender && videoRender.videoId) {\n                        items.push((0, exports.VideoRender)(item));\n                    }\n                    if (withPlaylist) {\n                        if (playListRender && playListRender.playlistId) {\n                            items.push({\n                                id: playListRender.playlistId,\n                                type: \"playlist\",\n                                thumbnail: playListRender.thumbnails,\n                                title: playListRender.title.simpleText,\n                                length: playListRender.videoCount,\n                                videos: (yield GetPlaylistData(playListRender.playlistId))\n                                    .items,\n                                videoCount: playListRender.videoCount,\n                                isLive: false\n                            });\n                        }\n                    }\n                }));\n            }\n            else if (conitem.continuationItemRenderer) {\n                nextPage.nextPageContext.continuation =\n                    conitem.continuationItemRenderer.continuationEndpoint.continuationCommand.token;\n            }\n        });\n        const itemsResult = limit !== 0 ? items.slice(0, limit) : items;\n        return { items: itemsResult, nextPage };\n    }\n    catch (ex) {\n        if (ex instanceof YouTubeAPIError) {\n            throw ex;\n        }\n        errorHandler.handleError(ex, `Failed to get next page`, ErrorCodes.UNKNOWN_ERROR);\n        // 這行永遠不會執行，因為 handleError 會拋出錯誤\n        throw new Error(\"Unreachable code\");\n    }\n});\nexports.NextPage = nextPage;\nconst GetPlaylistData = (playlistId_1, ...args_1) => __awaiter(void 0, [playlistId_1, ...args_1], void 0, function* (playlistId, limit = 0) {\n    const endpoint = `${youtubeEndpoint}/playlist?list=${playlistId}`;\n    try {\n        const initData = yield GetYoutubeInitData(endpoint);\n        const sectionListRenderer = initData.initdata;\n        const metadata = sectionListRenderer.metadata;\n        if (sectionListRenderer && sectionListRenderer.contents) {\n            const videoItems = sectionListRenderer.contents.twoColumnBrowseResultsRenderer.tabs[0]\n                .tabRenderer.content.sectionListRenderer.contents[0]\n                .itemSectionRenderer.contents[0].playlistVideoListRenderer.contents;\n            let items = [];\n            videoItems.forEach((item) => {\n                let videoRender = item.playlistVideoRenderer;\n                if (videoRender && videoRender.videoId) {\n                    items.push((0, exports.VideoRender)(item));\n                }\n            });\n            const itemsResult = limit !== 0 ? items.slice(0, limit) : items;\n            return { items: itemsResult, metadata };\n        }\n        else {\n            errorHandler.handleError(new Error(\"Invalid playlist\"), `播放清單 ID: ${playlistId}`, ErrorCodes.INVALID_PLAYLIST);\n            // 這行永遠不會執行，因為 handleError 會拋出錯誤\n            throw new Error(\"Unreachable code\");\n        }\n    }\n    catch (ex) {\n        if (ex instanceof YouTubeAPIError) {\n            throw ex;\n        }\n        errorHandler.handleError(ex, `Failed to get playlist - ID: ${playlistId}`, ErrorCodes.UNKNOWN_ERROR);\n        // 這行永遠不會執行，因為 handleError 會拋出錯誤\n        throw new Error(\"Unreachable code\");\n    }\n});\nexports.GetPlaylistData = GetPlaylistData;\nconst GetSuggestData = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (limit = 0) {\n    const endpoint = youtubeEndpoint;\n    try {\n        const page = yield GetYoutubeInitData(endpoint);\n        const sectionListRenderer = page.initdata.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer\n            .content.richGridRenderer.contents;\n        let items = [];\n        let otherItems = [];\n        sectionListRenderer.forEach((item) => {\n            if (item.richItemRenderer && item.richItemRenderer.content) {\n                let videoRender = item.richItemRenderer.content.videoRenderer;\n                if (videoRender && videoRender.videoId) {\n                    items.push((0, exports.VideoRender)(item.richItemRenderer.content));\n                }\n                else {\n                    otherItems.push(videoRender);\n                }\n            }\n        });\n        const itemsResult = limit !== 0 ? items.slice(0, limit) : items;\n        return { items: itemsResult };\n    }\n    catch (ex) {\n        console.error(ex);\n        throw ex;\n    }\n});\nexports.GetSuggestData = GetSuggestData;\nconst GetChannelById = (channelId) => __awaiter(void 0, void 0, void 0, function* () {\n    const endpoint = `${youtubeEndpoint}/channel/${channelId}`;\n    try {\n        const page = yield GetYoutubeInitData(endpoint);\n        const tabs = page.initdata.contents.twoColumnBrowseResultsRenderer.tabs;\n        const items = tabs\n            .map((json) => {\n            if (json && json.tabRenderer) {\n                const tabRenderer = json.tabRenderer;\n                const title = tabRenderer.title;\n                const content = tabRenderer.content;\n                return { title, content };\n            }\n        })\n            .filter((y) => typeof y !== \"undefined\");\n        return items;\n    }\n    catch (ex) {\n        console.error(ex);\n        throw ex;\n    }\n});\nexports.GetChannelById = GetChannelById;\nconst GetVideoDetails = (videoId) => __awaiter(void 0, void 0, void 0, function* () {\n    const endpoint = `${youtubeEndpoint}/watch?v=${videoId}`;\n    try {\n        const page = yield GetYoutubeInitData(endpoint);\n        const playerData = yield GetYoutubePlayerDetail(endpoint);\n        const result = page.initdata.contents.twoColumnWatchNextResults;\n        const firstContent = result.results.results.contents[0].videoPrimaryInfoRenderer;\n        const secondContent = result.results.results.contents[1].videoSecondaryInfoRenderer;\n        const res = {\n            id: playerData.videoId,\n            title: firstContent.title.runs[0].text,\n            thumbnail: playerData.thumbnail,\n            isLive: firstContent.viewCount.videoViewCountRenderer.hasOwnProperty(\"isLive\")\n                ? firstContent.viewCount.videoViewCountRenderer.isLive\n                : false,\n            channel: playerData.author ||\n                secondContent.owner.videoOwnerRenderer.title.runs[0].text,\n            channelId: playerData.channelId,\n            description: playerData.shortDescription,\n            keywords: playerData.keywords,\n            suggestion: result.secondaryResults.secondaryResults.results\n                .filter((y) => y.hasOwnProperty(\"compactVideoRenderer\"))\n                .map((x) => compactVideoRenderer(x))\n        };\n        return res;\n    }\n    catch (ex) {\n        console.error(ex);\n        throw ex;\n    }\n});\nexports.GetVideoDetails = GetVideoDetails;\nconst VideoRender = (json) => {\n    try {\n        if (json && (json.videoRenderer || json.playlistVideoRenderer)) {\n            let videoRenderer = json.videoRenderer || json.playlistVideoRenderer;\n            let isLive = false;\n            if (videoRenderer.badges &&\n                videoRenderer.badges.length > 0 &&\n                videoRenderer.badges[0].metadataBadgeRenderer &&\n                videoRenderer.badges[0].metadataBadgeRenderer.style ===\n                    \"BADGE_STYLE_TYPE_LIVE_NOW\") {\n                isLive = true;\n            }\n            if (videoRenderer.thumbnailOverlays) {\n                videoRenderer.thumbnailOverlays.forEach((item) => {\n                    if (item.thumbnailOverlayTimeStatusRenderer &&\n                        item.thumbnailOverlayTimeStatusRenderer.style &&\n                        item.thumbnailOverlayTimeStatusRenderer.style === \"LIVE\") {\n                        isLive = true;\n                    }\n                });\n            }\n            const id = videoRenderer.videoId;\n            const thumbnail = videoRenderer.thumbnail;\n            const title = videoRenderer.title.runs[0].text;\n            const shortBylineText = videoRenderer.shortBylineText\n                ? videoRenderer.shortBylineText\n                : \"\";\n            const lengthText = videoRenderer.lengthText\n                ? videoRenderer.lengthText\n                : \"\";\n            const channelTitle = videoRenderer.ownerText && videoRenderer.ownerText.runs\n                ? videoRenderer.ownerText.runs[0].text\n                : \"\";\n            return {\n                id,\n                type: \"video\",\n                thumbnail,\n                title,\n                channelTitle,\n                shortBylineText,\n                length: lengthText,\n                isLive\n            };\n        }\n        return {\n            id: \"\",\n            type: \"\",\n            thumbnail: undefined,\n            title: \"\"\n        };\n    }\n    catch (ex) {\n        throw ex;\n    }\n};\nexports.VideoRender = VideoRender;\nconst compactVideoRenderer = (json) => {\n    const compactVideoRendererJson = json.compactVideoRenderer;\n    let isLive = false;\n    if (compactVideoRendererJson.badges &&\n        compactVideoRendererJson.badges.length > 0 &&\n        compactVideoRendererJson.badges[0].metadataBadgeRenderer &&\n        compactVideoRendererJson.badges[0].metadataBadgeRenderer.style ===\n            \"BADGE_STYLE_TYPE_LIVE_NOW\") {\n        isLive = true;\n    }\n    return {\n        id: compactVideoRendererJson.videoId,\n        type: \"video\",\n        thumbnail: compactVideoRendererJson.thumbnail.thumbnails,\n        title: compactVideoRendererJson.title.simpleText,\n        channelTitle: compactVideoRendererJson.shortBylineText.runs[0].text,\n        shortBylineText: compactVideoRendererJson.shortBylineText.runs[0].text,\n        length: compactVideoRendererJson.lengthText,\n        isLive\n    };\n};\nconst GetShortVideo = () => __awaiter(void 0, void 0, void 0, function* () {\n    const page = yield GetYoutubeInitData(youtubeEndpoint);\n    const shortResult = page.initdata.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.richGridRenderer.contents\n        .filter((x) => x.richSectionRenderer)\n        .map((z) => z.richSectionRenderer.content)\n        .filter((y) => y.richShelfRenderer)\n        .map((u) => u.richShelfRenderer)\n        .find((i) => i.title.runs[0].text === \"Shorts\");\n    const res = shortResult.contents\n        .map((z) => z.richItemRenderer)\n        .map((y) => y.content.reelItemRenderer);\n    return res.map((json) => ({\n        id: json.videoId,\n        type: \"reel\",\n        thumbnail: json.thumbnail.thumbnails[0],\n        title: json.headline.simpleText,\n        inlinePlaybackEndpoint: json.inlinePlaybackEndpoint || {}\n    }));\n});\nexports.GetShortVideo = GetShortVideo;\n"]}