async function searchResults(keyword) { try { const encodedKeyword = encodeURIComponent(keyword); const ddosInterceptor = new DdosGuardInterceptor(); const responseText = await ddosInterceptor.fetchWithBypass(`https://animepahe.si/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.si/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]; console.log("Episode extraction starting for id:", id); const ddosInterceptor = new DdosGuardInterceptor(); let page = 1; const apiUrl1 = `https://animepahe.si/api?m=release&id=${id}&sort=episode_asc&page=${page}`; console.log("Fetching page 1..."); const response1 = await ddosInterceptor.fetchWithBypass(apiUrl1); const dataText1 = await response1.text(); console.log("Page 1 response length:", dataText1.length); const data1 = JSON.parse(dataText1); console.log("Page 1 episodes:", data1.data.length, "Last page:", data1.last_page); for (const item of data1.data) { results.push({ href: `https://animepahe.si/play/${id}/${item.session}`, number: item.episode }); } const lastPage = data1.last_page; if (lastPage > 1) { console.log("Fetching additional pages from 2 to", lastPage); for (let p = 2; p <= lastPage; p++) { let pageData = null; let retries = 0; while (!pageData && retries < 3) { try { const apiUrl = `https://animepahe.si/api?m=release&id=${id}&sort=episode_asc&page=${p}`; console.log("Fetching page", p, "attempt", retries + 1); const response = await ddosInterceptor.fetchWithBypass(apiUrl); const dataText = await response.text(); pageData = JSON.parse(dataText); console.log("Page", p, "success, episodes:", pageData.data.length); } catch (pageErr) { retries++; console.log("Page", p, "error:", pageErr.message); if (retries < 3) { await new Promise(resolve => setTimeout(resolve, 1000)); } } } if (pageData) { for (const item of pageData.data) { results.push({ href: `https://animepahe.si/play/${id}/${item.session}`, number: item.episode }); } } } } console.log("Total episodes fetched:", results.length); return JSON.stringify(results); } catch (err) { console.log("Episodes error:", err.message); 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 buttonMatches = dataText.match(/]*data-src="([^"]*)"[^>]*>/g); if (!buttonMatches) { return JSON.stringify({ streams: [], subtitle: "" }); } const streams = []; for (const buttonHtml of buttonMatches) { const srcMatch = buttonHtml.match(/data-src="([^"]*)"/); const resMatch = buttonHtml.match(/data-resolution="([^"]*)"/); const audioMatch = buttonHtml.match(/data-audio="([^"]*)"/); const fansubMatch = buttonHtml.match(/data-fansub="([^"]*)"/); if (!srcMatch || !srcMatch[1].includes('kwik.cx')) continue; const kwikUrl = srcMatch[1]; const resolution = resMatch ? resMatch[1] : "Unknown"; const audio = audioMatch ? audioMatch[1] : "jpn"; const fansub = fansubMatch ? fansubMatch[1] : "Unknown"; try { const html = await fetchv2(kwikUrl).then(r => r.text()); const scriptMatch = html.match(/