diff --git a/animekai/hardsub/animekai.js b/animekai/hardsub/animekai.js index 1a042bd..9e8a627 100644 --- a/animekai/hardsub/animekai.js +++ b/animekai/hardsub/animekai.js @@ -80,50 +80,49 @@ async function extractDetails(url) { } } -async function extractEpisodes(animeUrl) { +async function extractEpisodes(url) { + const sendEpisodes = async (endpoint, episodeData) => { + const promises = episodeData.map(item => + fetchv2(`${endpoint}=${encodeURIComponent(item.data)}`) + .then(res => res.json()) + .then(json => ({ name: item.name, data: json.result })) + .catch(err => ({ name: item.name, error: err.toString() })) + ); + return Promise.all(promises); + }; + try { - const response = await fetchv2(animeUrl); - const htmlText = await response.text(); - - const animeIdMatch = (htmlText.match(/
]*data-id="([^"]+)"/) || [])[1]; - if (!animeIdMatch) { - return [{ - error: "AniID not found" - }]; - } - - const tokenResponse = await fetchv2(`https://ilovekai.simplepostrequest.workers.dev/?ilovefeet=${encodeURIComponent(animeIdMatch)}`); - const token = await tokenResponse.text(); - - const episodeListUrl = `https://animekai.to/ajax/episodes/list?ani_id=${animeIdMatch}&_=${token}`; - - const episodeListResponse = await fetchv2(episodeListUrl); - const episodeListData = await episodeListResponse.json(); - const cleanedHtml = cleanJsonHtml(episodeListData.result); - - const episodeRegex = /]+num="([^"]+)"[^>]+token="([^"]+)"[^>]*>/g; - const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; - - const episodeData = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ - name: `Episode ${episodeNum}`, - data: episodeToken - })); - - const batchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", - {}, - "POST", - JSON.stringify(episodeData) - ); - - const batchResults = await batchResponse.json(); - - const episodes = batchResults.map((result, index) => ({ - number: parseInt(episodeMatches[index][1], 10), - href: `https://animekai.to/ajax/links/list?token=${episodeMatches[index][2]}&_=${result.data}` - })); - - return JSON.stringify(episodes); + const actualUrl = url.replace("Animekai:", "").trim(); + const htmlText = await (await fetchv2(actualUrl)).text(); + const animeIdMatch = (htmlText.match(/
]*data-id="([^"]+)"/) || [])[1]; + if (!animeIdMatch) return JSON.stringify([{ error: "AniID not found" }]); + + const tokenResponse = await fetchv2(`https://enc-dec.app/api/enc-kai?text=${encodeURIComponent(animeIdMatch)}`); + const tokenData = await tokenResponse.json(); + const token = tokenData.result; + + const episodeListUrl = `https://animekai.to/ajax/episodes/list?ani_id=${animeIdMatch}&_=${token}`; + const episodeListData = await (await fetchv2(episodeListUrl)).json(); + const cleanedHtml = cleanJsonHtml(episodeListData.result); + + const episodeRegex = /]+num="([^"]+)"[^>]+token="([^"]+)"[^>]*>/g; + const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; + + const recentEpisodeMatches = episodeMatches.slice(-50); + + const episodeData = recentEpisodeMatches.map(([_, episodeNum, episodeToken]) => ({ + name: `Episode ${episodeNum}`, + data: episodeToken + })); + + const batchResults = await sendEpisodes("https://enc-dec.app/api/enc-kai?text", episodeData); + + const episodes = batchResults.map((result, index) => ({ + number: parseInt(recentEpisodeMatches[index][1], 10), + href: `https://animekai.to/ajax/links/list?token=${recentEpisodeMatches[index][2]}&_=${result.data}` + })); + + return JSON.stringify(episodes); } catch (err) { console.error("Error fetching episodes:" + err); return [{ @@ -159,13 +158,13 @@ async function extractStreamUrl(url) { { name: "Sub", data: serverIdSub } ].filter(item => item.data); - const tokenBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/?ilovefeet", - {}, - "POST", - JSON.stringify(tokenRequestData) + const tokenPromises = tokenRequestData.map(item => + fetchv2(`https://enc-dec.app/api/enc-kai?text=${encodeURIComponent(item.data)}`) + .then(res => res.json()) + .then(json => ({ name: item.name, data: json.result })) + .catch(err => ({ name: item.name, error: err.toString() })) ); - const tokenResults = await tokenBatchResponse.json(); + const tokenResults = await Promise.all(tokenPromises); const streamUrls = tokenResults.map(result => { const serverIdMap = { @@ -210,13 +209,13 @@ async function extractStreamUrl(url) { return {}; } - const decryptBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/?ilovearmpits", - {}, - "POST", - JSON.stringify(decryptRequestData) + const decryptPromises = decryptRequestData.map(item => + fetchv2(`https://enc-dec.app/api/dec-kai?text=${encodeURIComponent(item.data)}`) + .then(res => res.json()) + .then(json => ({ name: item.name, data: JSON.stringify(json.result) })) + .catch(err => ({ name: item.name, error: err.toString() })) ); - const decryptResults = await decryptBatchResponse.json(); + const decryptResults = await Promise.all(decryptPromises); const finalResults = {}; decryptResults.forEach(result => { @@ -234,16 +233,16 @@ async function extractStreamUrl(url) { }; const decryptedUrls = await processStreams(streamUrls); - const decryptedSub = decryptedUrls.Sub || decryptedUrls.Softsub || decryptedUrls.Dub; - - console.log(decryptedSub); + const decryptedDub = decryptedUrls.Sub || decryptedUrls.Dub || decryptedUrls.Softsub; + + console.log(decryptedDub); const headers = { "Referer": "https://animekai.to/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" }; - if (decryptedSub) { - const response = await fetchv2(decryptedSub.replace("/e/", "/media/"), headers); + if (decryptedDub) { + const response = await fetchv2(decryptedDub.replace("/e/", "/media/"), headers); const responseJson = await response.json(); const result = responseJson?.result;