async function searchResults(keyword) { try { const encodedKeyword = encodeURIComponent(keyword); const ddosInterceptor = new DdosGuardInterceptor(); const responseText = await ddosInterceptor.fetchWithBypass(`https://animepahe.com/api?m=search&q=${encodedKeyword}`); const dataText = await responseText.text(); console.log(dataText); const data = JSON.parse(dataText); const transformedResults = data.data.map(result => { return { title: result.title, image: result.poster, href: `https://animepahe.com/anime/${result.session}` }; }); return JSON.stringify(transformedResults); } catch (error) { console.log("Fetch error in searchResults: " + error); return JSON.stringify([{ title: "Error", image: "", href: "" }]); } } async function extractDetails(url) { try { const ddosInterceptor = new DdosGuardInterceptor(); const responseText = await ddosInterceptor.fetchWithBypass(url); const dataText = await responseText.text(); const descMatch = dataText.match(/
(.*?)<\/div>/s); const description = descMatch ? descMatch[1].replace(//gi, '\n').trim() : 'N/A'; const aliasMatch = dataText.match(/Synonyms: <\/strong>(.*?)<\/p>/); const aliases = aliasMatch ? aliasMatch[1].trim() : 'N/A'; const airMatch = dataText.match(/Aired:<\/strong>(.*?)<\/p>/s); const airdate = airMatch ? airMatch[1].replace(/\s+/g, ' ').trim() : 'N/A'; return JSON.stringify([{ description, aliases, airdate }]); } catch (err) { return JSON.stringify([{ description: "Error", aliases: "Error", airdate: "Error" }]); } } async function extractEpisodes(url) { const results = []; try { const uuidMatch = url.match(/\/anime\/([^\/]+)/); if (!uuidMatch) throw new Error("Invalid URL"); const id = uuidMatch[1]; const ddosInterceptor = new DdosGuardInterceptor(); let page = 1; const apiUrl1 = `https://animepahe.com/api?m=release&id=${id}&sort=episode_asc&page=${page}`; const response1 = await ddosInterceptor.fetchWithBypass(apiUrl1); const dataText1 = await response1.text(); const data1 = JSON.parse(dataText1); for (const item of data1.data) { results.push({ href: `https://animepahe.com/play/${id}/${item.session}`, number: item.episode }); } const lastPage = data1.last_page; if (lastPage > 1) { const pagePromises = []; for (let p = 2; p <= lastPage; p++) { pagePromises.push((async (pageNum) => { let pageData = null; let retries = 0; while (!pageData && retries < 3) { try { const apiUrl = `https://animepahe.com/api?m=release&id=${id}&sort=episode_asc&page=${pageNum}`; const response = await ddosInterceptor.fetchWithBypass(apiUrl); const dataText = await response.text(); pageData = JSON.parse(dataText); } catch (pageErr) { retries++; if (retries < 3) { await new Promise(resolve => setTimeout(resolve, 500)); } } } return pageData; })(p)); } const allPagesData = await Promise.all(pagePromises); for (const pageData of allPagesData) { if (pageData && pageData.data) { for (const item of pageData.data) { results.push({ href: `https://animepahe.com/play/${id}/${item.session}`, number: item.episode }); } } } } return JSON.stringify(results); } catch (err) { return JSON.stringify([{ href: "Error", number: "Error" }]); } } async function extractStreamUrl(url) { try { const ddosInterceptor = new DdosGuardInterceptor(); const responseText = await ddosInterceptor.fetchWithBypass(url); const dataText = await responseText.text(); const buttonRegex = /]*data-src="([^"]+)"[^>]*data-fansub="([^"]+)"[^>]*data-resolution="([^"]+)"[^>]*data-audio="([^"]+)"[^>]*>/g; const buttons = []; let match; while ((match = buttonRegex.exec(dataText)) !== null) { buttons.push({ src: match[1], fansub: match[2], resolution: match[3], audio: match[4] }); } if (buttons.length === 0) { const buttonMatches = dataText.match(/]*data-src="([^"]*)"[^>]*>/g); if (!buttonMatches) { return JSON.stringify({ streams: [], subtitle: "" }); } return JSON.stringify({ streams: [], subtitle: "" }); } const deepUnpack = (source) => { let decoded = source; let safety = 0; while (/eval\(function\(p,a,c,k,e,d\)/.test(decoded) && safety < 5) { try { decoded = unpack(decoded); safety++; } catch (e) { console.warn("[Animepahe] Unpack error at depth " + safety + ": " + e.message); break; } } return decoded; }; const streamPromises = buttons.map(async (btn) => { const kwikUrl = btn.src; const audioType = btn.audio === "jpn" ? "Hardsub" : "Dub"; const title = btn.resolution + "p • " + audioType; try { const headers = { "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", "Referer": "https://animepahe.pw/", "Origin": "https://kwik.cx", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }; const resp = await fetchv2(kwikUrl, headers); const html = await resp.text(); const evalRegex = /eval\(function\(p,a,c,k,e,d\)\{[^}]*\}\('[^']*',\d+,\d+,'[^']*'\.split\('\|'\)[^)]*\)/g; const evalBlocks = [...html.matchAll(evalRegex)].map(m => m[0]); if (evalBlocks.length === 0) { const scriptMatch = html.match(/