From 05ffcfb54da3d4adf85c6e74fceddbdc9eaebf30 Mon Sep 17 00:00:00 2001 From: 50/50 <80717571+50n50@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:02:46 +0100 Subject: [PATCH] aa --- .gitignore | 1 + .tmp.driveupload/2714 | Bin 40062 -> 0 bytes .tmp.driveupload/2744 | 296 ---------------- .tmp.driveupload/2746 | 20 -- .tmp.driveupload/2750 | 296 ---------------- .tmp.driveupload/2752 | 20 -- .tmp.driveupload/3128 | 19 -- .tmp.driveupload/3130 | 318 ------------------ .tmp.driveupload/3326 | 36 -- .tmp.driveupload/3462 | 19 -- .tmp.driveupload/3464 | 761 ------------------------------------------ .tmp.driveupload/508 | 439 ------------------------ .tmp.driveupload/530 | 1 - .tmp.driveupload/560 | 1 - .tmp.driveupload/576 | 12 - .tmp.driveupload/578 | 12 - 16 files changed, 1 insertion(+), 2250 deletions(-) delete mode 100644 .tmp.driveupload/2714 delete mode 100644 .tmp.driveupload/2744 delete mode 100644 .tmp.driveupload/2746 delete mode 100644 .tmp.driveupload/2750 delete mode 100644 .tmp.driveupload/2752 delete mode 100644 .tmp.driveupload/3128 delete mode 100644 .tmp.driveupload/3130 delete mode 100644 .tmp.driveupload/3326 delete mode 100644 .tmp.driveupload/3462 delete mode 100644 .tmp.driveupload/3464 delete mode 100644 .tmp.driveupload/508 delete mode 100644 .tmp.driveupload/530 delete mode 100644 .tmp.driveupload/560 delete mode 100644 .tmp.driveupload/576 delete mode 100644 .tmp.driveupload/578 diff --git a/.gitignore b/.gitignore index e5fbdeb..feec568 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ *.tmp *.tmp.driveupload .tmp.driveupload/ +.tmp.drivedownload/ update_global_extractor.py \ No newline at end of file diff --git a/.tmp.driveupload/2714 b/.tmp.driveupload/2714 deleted file mode 100644 index fd1b7b26fc3d09a120decce7d313f3bfb3e7ffb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40062 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�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 diff --git a/.tmp.driveupload/2744 b/.tmp.driveupload/2744 deleted file mode 100644 index 2eb77a7..0000000 --- a/.tmp.driveupload/2744 +++ /dev/null @@ -1,296 +0,0 @@ -async function searchResults(query) { - const encodeQuery = keyword => encodeURIComponent(keyword); - const searchBaseUrl = "https://animekai.to/browser?keyword="; - const baseUrl = "https://animekai.to"; - - const posterHrefRegex = /href="[^"]*" class="poster"/g; - const titleRegex = /class="title"[^>]*title="[^"]*"/g; - const imageRegex = /data-src="[^"]*"/g; - const extractHrefRegex = /href="([^"]*)"/; - const extractImageRegex = /data-src="([^"]*)"/; - const extractTitleRegex = /title="([^"]*)"/; - - try { - const encodedQuery = encodeQuery(query); - const searchUrl = searchBaseUrl + encodedQuery; - const response = await fetchv2(searchUrl); - const htmlText = await response.text(); - - const results = []; - const posterMatches = htmlText.match(posterHrefRegex) || []; - const titleMatches = htmlText.match(titleRegex) || []; - const imageMatches = htmlText.match(imageRegex) || []; - - const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); - - for (let index = 0; index < minLength; index++) { - const hrefMatch = posterMatches[index].match(extractHrefRegex); - const fullHref = hrefMatch ? - (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : - null; - - const imageMatch = imageMatches[index].match(extractImageRegex); - const imageSrc = imageMatch ? imageMatch[1] : null; - - const titleMatch = titleMatches[index].match(extractTitleRegex); - const cleanTitle = titleMatch ? - decodeHtmlEntities(titleMatch[1]) : - null; - - if (fullHref && imageSrc && cleanTitle) { - results.push({ - href: fullHref, - image: imageSrc, - title: cleanTitle - }); - } - } - - return JSON.stringify(results); - } catch (error) { - return JSON.stringify([{ - href: "", - image: "", - title: "Search failed: " + error.message - }]); - } -} - -async function extractDetails(url) { - try { - const response = await fetchv2(url); - const htmlText = await response.text(); - console.log(htmlText); - - const descriptionMatch = (/
([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; - const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; - - return JSON.stringify([{ - description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", - aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", - airdate: "If stream doesn't load try later or disable VPN/DNS" - }]); - } catch (error) { - console.error("Error fetching details:" + error); - return [{ - description: "Error loading description", - aliases: "Aliases: Unknown", - airdate: "Aired: Unknown" - }]; - } -} - -async function extractEpisodes(url) { - try { - 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 episodes = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ - number: parseInt(episodeNum, 10), - href: `https://animekai.to/ajax/links/list?token=${episodeToken}&_=ENCRYPT_ME` - })); - - return JSON.stringify(episodes); - } catch (err) { - console.error("Error fetching episodes:" + err); - return [{ - number: 1, - href: "Error fetching episodes" - }]; - } -} - -async function extractStreamUrl(url) { - try { - const tokenMatch = url.match(/token=([^&]+)/); - if (tokenMatch && tokenMatch[1]) { - const rawToken = tokenMatch[1]; - const encryptResponse = await fetchv2(`https://enc-dec.app/api/enc-kai?text=${encodeURIComponent(rawToken)}`); - const encryptData = await encryptResponse.json(); - const encryptedToken = encryptData.result; - url = url.replace('&_=ENCRYPT_ME', `&_=${encryptedToken}`); - } - - const fetchUrl = `${url}`; - const response = await fetchv2(fetchUrl); - const text = await response.text(); - const cleanedHtml = cleanJsonHtml(text); - const subRegex = /
]*>([\s\S]*?)<\/div>/; - const softsubRegex = /
]*>([\s\S]*?)<\/div>/; - const dubRegex = /
]*>([\s\S]*?)<\/div>/; - const subMatch = subRegex.exec(cleanedHtml); - const softsubMatch = softsubRegex.exec(cleanedHtml); - const dubMatch = dubRegex.exec(cleanedHtml); - const subContent = subMatch ? subMatch[1].trim() : ""; - const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; - const dubContent = dubMatch ? dubMatch[1].trim() : ""; - const serverSpanRegex = /]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; - const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; - const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; - const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; - - const tokenRequestData = [ - { name: "Dub", data: serverIdDub }, - { name: "Softsub", data: serverIdSoftsub }, - { name: "Sub", data: serverIdSub } - ].filter(item => item.data); - - 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 Promise.all(tokenPromises); - - const streamUrls = tokenResults.map(result => { - const serverIdMap = { - "Dub": serverIdDub, - "Softsub": serverIdSoftsub, - "Sub": serverIdSub - }; - return { - type: result.name, - url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` - }; - }); - - const processStreams = async (streamUrls) => { - const streamResponses = await Promise.all( - streamUrls.map(async ({ type, url }) => { - try { - const res = await fetchv2(url); - const json = await res.json(); - return { - type: type, - result: json.result - }; - } catch (error) { - console.log(`Error fetching ${type} stream:`, error); - return { - type: type, - result: null - }; - } - }) - ); - - const decryptRequestData = streamResponses - .filter(item => item.result) - .map(item => ({ - name: item.type, - data: item.result - })); - - if (decryptRequestData.length === 0) { - return {}; - } - - 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 Promise.all(decryptPromises); - - const finalResults = {}; - decryptResults.forEach(result => { - try { - const parsed = JSON.parse(result.data); - finalResults[result.name] = parsed.url; - console.log(`decrypted${result.name} URL:` + parsed.url); - } catch (error) { - console.log(`Error parsing ${result.name} result:`, error); - finalResults[result.name] = null; - } - }); - - return finalResults; - }; - - const decryptedUrls = await processStreams(streamUrls); - const decryptedSub = decryptedUrls.Sub || decryptedUrls.Dub || decryptedUrls.Softsub; - - console.log(decryptedSub); - 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/").replace("megaup22", "megaup.site"), headers); - const responseJson = await response.json(); - - const result = responseJson?.result; - - const postData = { - "text": result, - "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" - } - - const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); - const finalJson = await finalResponse.json(); - const m3u8Link = finalJson?.result?.sources?.[0]?.file; - - return m3u8Link; - } - - return "error"; - } catch (error) { - console.log("Fetch error:"+ error); - return "https://error.org"; - } -} - -function cleanHtmlSymbols(string) { - if (!string) { - return ""; - } - return string - .replace(/’/g, "'") - .replace(/–/g, "-") - .replace(/&#[0-9]+;/g, "") - .replace(/\r?\n|\r/g, " ") - .replace(/\s+/g, " ") - .trim(); -} - -function cleanJsonHtml(jsonHtml) { - if (!jsonHtml) { - return ""; - } - return jsonHtml - .replace(/\\"/g, "\"") - .replace(/\\'/g, "'") - .replace(/\\\\/g, "\\") - .replace(/\\n/g, "\n") - .replace(/\\t/g, "\t") - .replace(/\\r/g, "\r"); -} - -function decodeHtmlEntities(text) { - if (!text) { - return ""; - } - return text - .replace(/'/g, "'") - .replace(/"/g, "\"") - .replace(/&/g, "&") - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/ /g, " "); -} diff --git a/.tmp.driveupload/2746 b/.tmp.driveupload/2746 deleted file mode 100644 index 3639642..0000000 --- a/.tmp.driveupload/2746 +++ /dev/null @@ -1,20 +0,0 @@ -{ - "sourceName": "AnimeKai (Hardsub)", - "iconUrl": "https://apktodo.io/uploads/2025/5/animekai-icon.jpg", - "author": { - "name": "50/50", - "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" - }, - "version": "1.0.5", - "language": "English", - "streamType": "HLS", - "quality": "1080p", - "baseUrl": "https://animekai.to/", - "searchBaseUrl": "https://animekai.to/", - "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/animekai/hardsub/animekai.js", - "type": "anime", - "asyncJS": true, - "softsub": false, - "downloadSupport": true, - "note": "Make sure you're on the latest version of Sora." -} diff --git a/.tmp.driveupload/2750 b/.tmp.driveupload/2750 deleted file mode 100644 index b0629d2..0000000 --- a/.tmp.driveupload/2750 +++ /dev/null @@ -1,296 +0,0 @@ -async function searchResults(query) { - const encodeQuery = keyword => encodeURIComponent(keyword); - const searchBaseUrl = "https://animekai.to/browser?keyword="; - const baseUrl = "https://animekai.to"; - - const posterHrefRegex = /href="[^"]*" class="poster"/g; - const titleRegex = /class="title"[^>]*title="[^"]*"/g; - const imageRegex = /data-src="[^"]*"/g; - const extractHrefRegex = /href="([^"]*)"/; - const extractImageRegex = /data-src="([^"]*)"/; - const extractTitleRegex = /title="([^"]*)"/; - - try { - const encodedQuery = encodeQuery(query); - const searchUrl = searchBaseUrl + encodedQuery; - const response = await fetchv2(searchUrl); - const htmlText = await response.text(); - - const results = []; - const posterMatches = htmlText.match(posterHrefRegex) || []; - const titleMatches = htmlText.match(titleRegex) || []; - const imageMatches = htmlText.match(imageRegex) || []; - - const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); - - for (let index = 0; index < minLength; index++) { - const hrefMatch = posterMatches[index].match(extractHrefRegex); - const fullHref = hrefMatch ? - (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : - null; - - const imageMatch = imageMatches[index].match(extractImageRegex); - const imageSrc = imageMatch ? imageMatch[1] : null; - - const titleMatch = titleMatches[index].match(extractTitleRegex); - const cleanTitle = titleMatch ? - decodeHtmlEntities(titleMatch[1]) : - null; - - if (fullHref && imageSrc && cleanTitle) { - results.push({ - href: fullHref, - image: imageSrc, - title: cleanTitle - }); - } - } - - return JSON.stringify(results); - } catch (error) { - return JSON.stringify([{ - href: "", - image: "", - title: "Search failed: " + error.message - }]); - } -} - -async function extractDetails(url) { - try { - const response = await fetchv2(url); - const htmlText = await response.text(); - console.log(htmlText); - - const descriptionMatch = (/
([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; - const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; - - return JSON.stringify([{ - description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", - aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", - airdate: "If stream doesn't load try later or disable VPN/DNS" - }]); - } catch (error) { - console.error("Error fetching details:" + error); - return [{ - description: "Error loading description", - aliases: "Aliases: Unknown", - airdate: "Aired: Unknown" - }]; - } -} - -async function extractEpisodes(url) { - try { - 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 episodes = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ - number: parseInt(episodeNum, 10), - href: `https://animekai.to/ajax/links/list?token=${episodeToken}&_=ENCRYPT_ME` - })); - - return JSON.stringify(episodes); - } catch (err) { - console.error("Error fetching episodes:" + err); - return [{ - number: 1, - href: "Error fetching episodes" - }]; - } -} - -async function extractStreamUrl(url) { - try { - const tokenMatch = url.match(/token=([^&]+)/); - if (tokenMatch && tokenMatch[1]) { - const rawToken = tokenMatch[1]; - const encryptResponse = await fetchv2(`https://enc-dec.app/api/enc-kai?text=${encodeURIComponent(rawToken)}`); - const encryptData = await encryptResponse.json(); - const encryptedToken = encryptData.result; - url = url.replace('&_=ENCRYPT_ME', `&_=${encryptedToken}`); - } - - const fetchUrl = `${url}`; - const response = await fetchv2(fetchUrl); - const text = await response.text(); - const cleanedHtml = cleanJsonHtml(text); - const subRegex = /
]*>([\s\S]*?)<\/div>/; - const softsubRegex = /
]*>([\s\S]*?)<\/div>/; - const dubRegex = /
]*>([\s\S]*?)<\/div>/; - const subMatch = subRegex.exec(cleanedHtml); - const softsubMatch = softsubRegex.exec(cleanedHtml); - const dubMatch = dubRegex.exec(cleanedHtml); - const subContent = subMatch ? subMatch[1].trim() : ""; - const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; - const dubContent = dubMatch ? dubMatch[1].trim() : ""; - const serverSpanRegex = /]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; - const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; - const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; - const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; - - const tokenRequestData = [ - { name: "Dub", data: serverIdDub }, - { name: "Softsub", data: serverIdSoftsub }, - { name: "Sub", data: serverIdSub } - ].filter(item => item.data); - - 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 Promise.all(tokenPromises); - - const streamUrls = tokenResults.map(result => { - const serverIdMap = { - "Dub": serverIdDub, - "Softsub": serverIdSoftsub, - "Sub": serverIdSub - }; - return { - type: result.name, - url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` - }; - }); - - const processStreams = async (streamUrls) => { - const streamResponses = await Promise.all( - streamUrls.map(async ({ type, url }) => { - try { - const res = await fetchv2(url); - const json = await res.json(); - return { - type: type, - result: json.result - }; - } catch (error) { - console.log(`Error fetching ${type} stream:`, error); - return { - type: type, - result: null - }; - } - }) - ); - - const decryptRequestData = streamResponses - .filter(item => item.result) - .map(item => ({ - name: item.type, - data: item.result - })); - - if (decryptRequestData.length === 0) { - return {}; - } - - 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 Promise.all(decryptPromises); - - const finalResults = {}; - decryptResults.forEach(result => { - try { - const parsed = JSON.parse(result.data); - finalResults[result.name] = parsed.url; - console.log(`decrypted${result.name} URL:` + parsed.url); - } catch (error) { - console.log(`Error parsing ${result.name} result:`, error); - finalResults[result.name] = null; - } - }); - - return finalResults; - }; - - const decryptedUrls = await processStreams(streamUrls); - const decryptedDub = decryptedUrls.Dub || decryptedUrls.Sub || 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 (decryptedDub) { - const response = await fetchv2(decryptedDub.replace("/e/", "/media/").replace("megaup22", "megaup.site"), headers); - const responseJson = await response.json(); - - const result = responseJson?.result; - - const postData = { - "text": result, - "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" - } - - const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); - const finalJson = await finalResponse.json(); - const m3u8Link = finalJson?.result?.sources?.[0]?.file; - - return m3u8Link; - } - - return "error"; - } catch (error) { - console.log("Fetch error:"+ error); - return "https://error.org"; - } -} - -function cleanHtmlSymbols(string) { - if (!string) { - return ""; - } - return string - .replace(/’/g, "'") - .replace(/–/g, "-") - .replace(/&#[0-9]+;/g, "") - .replace(/\r?\n|\r/g, " ") - .replace(/\s+/g, " ") - .trim(); -} - -function cleanJsonHtml(jsonHtml) { - if (!jsonHtml) { - return ""; - } - return jsonHtml - .replace(/\\"/g, "\"") - .replace(/\\'/g, "'") - .replace(/\\\\/g, "\\") - .replace(/\\n/g, "\n") - .replace(/\\t/g, "\t") - .replace(/\\r/g, "\r"); -} - -function decodeHtmlEntities(text) { - if (!text) { - return ""; - } - return text - .replace(/'/g, "'") - .replace(/"/g, "\"") - .replace(/&/g, "&") - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/ /g, " "); -} diff --git a/.tmp.driveupload/2752 b/.tmp.driveupload/2752 deleted file mode 100644 index 4b6f849..0000000 --- a/.tmp.driveupload/2752 +++ /dev/null @@ -1,20 +0,0 @@ -{ - "sourceName": "AnimeKai (Dub)", - "iconUrl": "https://apktodo.io/uploads/2025/5/animekai-icon.jpg", - "author": { - "name": "50/50", - "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" - }, - "version": "1.0.6", - "language": "English", - "streamType": "HLS", - "quality": "1080p", - "baseUrl": "https://animekai.to/", - "searchBaseUrl": "https://animekai.to/", - "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/animekai/dub/animekai.js", - "type": "anime", - "asyncJS": true, - "softsub": false, - "downloadSupport": true, - "note": "Make sure you're on the latest version of Sora." -} diff --git a/.tmp.driveupload/3128 b/.tmp.driveupload/3128 deleted file mode 100644 index e3f4c51..0000000 --- a/.tmp.driveupload/3128 +++ /dev/null @@ -1,19 +0,0 @@ -{ - "sourceName": "1Movies", - "iconUrl": "https://1movies.bz/assets/uploads/675b5c22f2829fc8e3a4030af7f4284acad017e5241280b3dc21.png", - "author": { - "name": "50/50", - "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" - }, - "version": "1.0.9", - "language": "English", - "streamType": "HLS", - "quality": "1080p", - "baseUrl": "https://animekai.to/", - "searchBaseUrl": "https://1movies.bz/home", - "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/1movies/1movies.js", - "type": "shows/movies", - "asyncJS": true, - "softsub": true, - "downloadSupport": true -} diff --git a/.tmp.driveupload/3130 b/.tmp.driveupload/3130 deleted file mode 100644 index d7942ea..0000000 --- a/.tmp.driveupload/3130 +++ /dev/null @@ -1,318 +0,0 @@ -async function searchResults(query) { - const encodeQuery = keyword => encodeURIComponent(keyword); - const searchBaseUrl = "https://1movies.bz/browser?keyword="; - const baseUrl = "https://1movies.bz"; - - const posterHrefRegex = /href="([^"]*)" class="poster"/g; - const titleRegex = /class="title" href="[^"]*">([^<]*) { - const results = []; - const posterMatches = [...htmlText.matchAll(posterHrefRegex)]; - const titleMatches = [...htmlText.matchAll(titleRegex)]; - const imageMatches = [...htmlText.matchAll(imageRegex)]; - - const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); - - for (let index = 0; index < minLength; index++) { - const href = posterMatches[index][1]; - const fullHref = href.startsWith("http") ? href : baseUrl + href; - - const imageSrc = imageMatches[index][1]; - - const title = titleMatches[index][1]; - const cleanTitle = decodeHtmlEntities(title); - - if (fullHref && imageSrc && cleanTitle) { - results.push({ - href: fullHref, - image: imageSrc, - title: cleanTitle - }); - } - } - return results; - }; - - try { - const encodedQuery = encodeQuery(query); - - const urls = [ - `${searchBaseUrl}${encodedQuery}`, - `${searchBaseUrl}${encodedQuery}&page=2`, - `${searchBaseUrl}${encodedQuery}&page=3` - ]; - - const responses = await Promise.all(urls.map(url => fetchv2(url))); - - const htmlTexts = await Promise.all(responses.map(response => response.text())); - - const allResults = []; - htmlTexts.forEach(htmlText => { - const pageResults = extractResultsFromHTML(htmlText); - allResults.push(...pageResults); - }); - - return JSON.stringify(allResults); - } catch (error) { - return JSON.stringify([{ - href: "", - image: "", - title: "Search failed: " + error.message - }]); - } -} - -async function extractDetails(url) { - try { - const response = await fetchv2(url); - const htmlText = await response.text(); - - const descriptionMatch = (/
([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; - const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; - const airdateMatch = (/
  • Released:\s*]*>(.*?)<\/span>/.exec(htmlText) || [])[1]; - - return JSON.stringify([{ - description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", - aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not aliases", - airdate: airdateMatch ? cleanHtmlSymbols(airdateMatch) : "Not available" - }]); - } catch (error) { - console.error("Error fetching details:" + error); - return [{ - description: "Error loading description", - aliases: "Not available", - airdate: "Not available" - }]; - } -} - -async function extractEpisodes(movieUrl) { - try { - const response = await fetchv2(movieUrl); - const htmlText = await response.text(); - const movieIDMatch = (htmlText.match(/
    ]*id="movie-rating"[^>]*data-id="([^"]+)"/) || [])[1]; - if (!movieIDMatch) { - return [{ - error: "MovieID not found" - }]; - } - - const movieIdApiUrl = `https://enc-dec.app/api/enc-movies-flix?text=${movieIDMatch}`; - const movieIdTokenResponse = await fetchv2(movieIdApiUrl); - const movieIdTokenData = await movieIdTokenResponse.json(); - const token = movieIdTokenData.result; - - const episodeListUrl = `https://1movies.bz/ajax/episodes/list?id=${movieIDMatch}&_=${token}`; - const episodeListResponse = await fetchv2(episodeListUrl); - const episodeListData = await episodeListResponse.json(); - const cleanedHtml = cleanJsonHtml(episodeListData.result); - - const episodeRegex = /]+eid="([^"]+)"[^>]+num="([^"]+)"[^>]*>/g; - const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; - - const episodes = episodeMatches.map(([_, episodeToken, episodeNum]) => ({ - number: parseInt(episodeNum, 10), - href: `https://1movies.bz/ajax/links/list?eid=${episodeToken}&_=ENCRYPT_ME` - })); - - return JSON.stringify(episodes); - } catch (err) { - console.error("Error fetching episodes:" + err); - return [{ - number: 1, - href: "Error fetching episodes" - }]; - } -} - -async function extractStreamUrl(url) { - try { - const eidMatch = url.match(/eid=([^&]+)/); - if (eidMatch && eidMatch[1]) { - const rawEpisodeToken = eidMatch[1]; - const encryptResponse = await fetchv2(`https://enc-dec.app/api/enc-movies-flix?text=${rawEpisodeToken}`); - const encryptData = await encryptResponse.json(); - const encryptedToken = encryptData.result; - url = url.replace('&_=ENCRYPT_ME', `&_=${encryptedToken}`); - } - - const fetchUrl = `${url}`; - const response = await fetchv2(fetchUrl); - const responseData = await response.json(); - const cleanedHtml = cleanJsonHtml(responseData.result); - - const server1Regex = /
    ]*data-lid="([^"]+)"[^>]*>\s*Server 1<\/span>/; - const server1Match = server1Regex.exec(cleanedHtml); - - if (!server1Match) { - console.log("Server 1 not found"); - return "error"; - } - - const serverId = server1Match[1]; - - const tokenRequestData = [{ name: "Server1", data: serverId }]; - - const tokenBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", - {}, - "POST", - JSON.stringify(tokenRequestData) - ); - const tokenResults = await tokenBatchResponse.json(); - const token = tokenResults[0]?.data; - - if (!token) { - console.log("Token not found"); - return "error"; - } - - const streamUrl = `https://1movies.bz/ajax/links/view?id=${serverId}&_=${token}`; - const streamResponse = await fetchv2(streamUrl); - const streamData = await streamResponse.json(); - - if (!streamData.result) { - console.log("Stream result not found"); - return "error"; - } - - const decryptRequestData = [{ name: "Server1", data: streamData.result }]; - - const decryptBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/iloveboobs", - {}, - "POST", - JSON.stringify(decryptRequestData) - ); - const decryptedResponse = await decryptBatchResponse.json(); - const decryptedUrl = decryptedResponse[0]?.data.url; - - const subListEncoded = decryptedUrl.split("sub.list=")[1]?.split("&")[0]; - let subtitles = "N/A"; - - if (subListEncoded) { - try { - const subListUrl = decodeURIComponent(subListEncoded); - const subResponse = await fetchv2(subListUrl); - subtitles = await subResponse.json(); - } catch { - subtitles = "N/A"; - } - } - - const englishSubUrl = Array.isArray(subtitles) - ? subtitles.find(sub => sub.label === "English")?.file.replace(/\\\//g, "/") - : "N/A"; - - if (!decryptedUrl) { - console.log("Decryption failed"); - return "error"; - } - - const headers = { - "Referer": "https://1movies.bz/", - "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" - }; - - const mediaResponse = await fetchv2(decryptedUrl.replace("/e/", "/media/"), headers); - const mediaJson = await mediaResponse.json(); - - const result = mediaJson?.result; - if (!result) { - console.log("Media result not found"); - return "error"; - } - - const postData = { - "text": result, - "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" - }; - - const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/ilovebush", {}, "POST", JSON.stringify(postData)); - const finalJson = await finalResponse.json(); - - const m3u8Link = finalJson?.result?.sources?.[0]?.file; - - const m3u8Response = await fetchv2(m3u8Link); - const m3u8Text = await m3u8Response.text(); - - const baseUrl = m3u8Link.substring(0, m3u8Link.lastIndexOf('/') + 1); - - const streams = []; - const lines = m3u8Text.split('\n'); - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim(); - if (line.startsWith('#EXT-X-STREAM-INF:')) { - const resolutionMatch = line.match(/RESOLUTION=(\d+x\d+)/); - let quality = 'Unknown'; - - if (resolutionMatch) { - const [width, height] = resolutionMatch[1].split('x'); - quality = `${height}p`; - } - - if (i + 1 < lines.length) { - const streamPath = lines[i + 1].trim(); - const streamUrl = baseUrl + streamPath; - - streams.push({ - title: quality, - streamUrl: streamUrl - }); - } - } - } - - const returnValue = { - streams: streams, - subtitle: englishSubUrl !== "N/A" ? englishSubUrl : "" - }; - console.log("RETURN: " + JSON.stringify(returnValue)); - return JSON.stringify(returnValue); - } catch (error) { - console.log("Fetch error:"+ error); - return "https://error.org"; - } -} - -function cleanHtmlSymbols(string) { - if (!string) { - return ""; - } - return string - .replace(/’/g, "'") - .replace(/–/g, "-") - .replace(/&#[0-9]+;/g, "") - .replace(/\r?\n|\r/g, " ") - .replace(/\s+/g, " ") - .trim(); -} - -function cleanJsonHtml(jsonHtml) { - if (!jsonHtml) { - return ""; - } - return jsonHtml - .replace(/\\"/g, "\"") - .replace(/\\'/g, "'") - .replace(/\\\\/g, "\\") - .replace(/\\n/g, "\n") - .replace(/\\t/g, "\t") - .replace(/\\r/g, "\r"); -} - -function decodeHtmlEntities(text) { - if (!text) { - return ""; - } - return text - .replace(/'/g, "'") - .replace(/"/g, "\"") - .replace(/&/g, "&") - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/ /g, " "); -} diff --git a/.tmp.driveupload/3326 b/.tmp.driveupload/3326 deleted file mode 100644 index 8e8e23c..0000000 --- a/.tmp.driveupload/3326 +++ /dev/null @@ -1,36 +0,0 @@ -
    - -
    -

    ⚠️ IMPORTANT

    -

    Any app meeting the following criteria is free to use my modules:

    -
      -
    1. No paywall, subscription, or payment required for my modules - (you may charge for other parts of your app).
    2. -
    3. No advertisements during the usage of my modules.
    4. -
    5. Open source: your app’s source code must be publicly available.
    6. -
    -

    All the above terms are mandatory unless given permission by me.
    -In short: no commercial use and transparency is required.

    -
    - -
    - -
    -

    🚫 CAUTION

    -

    Do not pay to use these modules — if someone is charging you, it's a scam!

    -

    Neither should you bear watching ads to use these modules. Please report apps that do this forcibly!

    -
    - -
    - -
    - -[![Discord Presence](https://lanyard.cnrad.dev/api/1072985316916469870?theme=dark&bg=000000&animated=false&hideDiscrim=true&borderRadius=30px&idleMessage=For%20requests%20or%20issues%2C%20use%20the%20Sora%20server.%20For%20module-usage%20questions%2C%20DM%20me.)](https://discord.com/users/1072985316916469870) - -
    - -[![Ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/50n50) - -
    -
    - diff --git a/.tmp.driveupload/3462 b/.tmp.driveupload/3462 deleted file mode 100644 index 41bffab..0000000 --- a/.tmp.driveupload/3462 +++ /dev/null @@ -1,19 +0,0 @@ -{ - "sourceName": "Ashi (あし) - Literally Everything", - "iconUrl": "https://files.catbox.moe/y8v199.png", - "author": { - "name": "50/50", - "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s" - }, - "version": "1.1.1", - "language": "English", - "streamType": "HLS", - "quality": "1080p", - "baseUrl": "https://animekai.to/", - "searchBaseUrl": "https://animekai.to/", - "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/ashi/ashi.js", - "type": "anime/movies/shows", - "asyncJS": true, - "softsub": true, - "downloadSupport": true -} diff --git a/.tmp.driveupload/3464 b/.tmp.driveupload/3464 deleted file mode 100644 index 69436d5..0000000 --- a/.tmp.driveupload/3464 +++ /dev/null @@ -1,761 +0,0 @@ -// -// -// Main functions -// -// - -async function searchResults(query) { - const encodeQuery = keyword => encodeURIComponent(keyword); - - const decodeHtmlEntities = (str) => { - if (!str) return str; - return str.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec)) - .replace(/"/g, '"') - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>'); - }; - - const fuzzyMatch = (query, title) => { - const q = query.toLowerCase().trim(); - const t = title.toLowerCase().trim(); - - if (t === q) return 1000; - - if (t.startsWith(q + ' ') || t.startsWith(q + ':') || t.startsWith(q + '-')) return 950; - - const wordBoundaryRegex = new RegExp(`\\b${q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`); - if (wordBoundaryRegex.test(t)) return 900; - - const qTokens = q.split(/\s+/).filter(token => token.length > 0); - const tTokens = t.split(/[\s\-:]+/).filter(token => token.length > 0); - - const stopwords = new Set(['the', 'a', 'an', 'and', 'or', 'of', 'in', 'on', 'at', 'to', 'for', 'with']); - - let score = 0; - let exactMatches = 0; - let partialMatches = 0; - let significantMatches = 0; - - qTokens.forEach(qToken => { - const isStopword = stopwords.has(qToken); - let bestMatch = 0; - let hasExactMatch = false; - - tTokens.forEach(tToken => { - let matchScore = 0; - - if (tToken === qToken) { - matchScore = isStopword ? 25 : 120; - hasExactMatch = true; - if (!isStopword) significantMatches++; - } - else if (qToken.includes(tToken) && tToken.length >= 3 && qToken.length <= tToken.length + 2) { - matchScore = isStopword ? 8 : 40; - if (!isStopword) significantMatches++; - } - else if (tToken.startsWith(qToken) && qToken.length >= 3) { - matchScore = isStopword ? 12 : 70; - if (!isStopword) significantMatches++; - } - else if (qToken.length >= 4 && tToken.length >= 4) { - const dist = levenshteinDistance(qToken, tToken); - const maxLen = Math.max(qToken.length, tToken.length); - const similarity = 1 - (dist / maxLen); - - if (similarity > 0.8) { - matchScore = Math.floor(similarity * 60); - if (!isStopword) significantMatches++; - } - } - - bestMatch = Math.max(bestMatch, matchScore); - }); - - if (bestMatch > 0) { - score += bestMatch; - if (hasExactMatch) exactMatches++; - else partialMatches++; - } - }); - - const significantTokens = qTokens.filter(t => !stopwords.has(t)).length; - - const requiredMatches = Math.max(1, Math.ceil(significantTokens * 0.8)); - if (significantMatches < requiredMatches) { - return 0; - } - - if (exactMatches + partialMatches >= qTokens.length) { - score += 80; - } - - score += exactMatches * 20; - - const extraWords = tTokens.length - qTokens.length; - if (extraWords > 2) { - score -= (extraWords - 2) * 25; - } - - let orderBonus = 0; - for (let i = 0; i < qTokens.length - 1; i++) { - const currentTokenIndex = tTokens.findIndex(t => t.includes(qTokens[i])); - const nextTokenIndex = tTokens.findIndex(t => t.includes(qTokens[i + 1])); - - if (currentTokenIndex !== -1 && nextTokenIndex !== -1 && currentTokenIndex < nextTokenIndex) { - orderBonus += 15; - } - } - score += orderBonus; - - return Math.max(0, score); - }; - - const levenshteinDistance = (a, b) => { - const matrix = []; - - for (let i = 0; i <= b.length; i++) { - matrix[i] = [i]; - } - - for (let j = 0; j <= a.length; j++) { - matrix[0][j] = j; - } - - for (let i = 1; i <= b.length; i++) { - for (let j = 1; j <= a.length; j++) { - if (b.charAt(i - 1) === a.charAt(j - 1)) { - matrix[i][j] = matrix[i - 1][j - 1]; - } else { - matrix[i][j] = Math.min( - matrix[i - 1][j - 1] + 1, - matrix[i][j - 1] + 1, - matrix[i - 1][j] + 1 - ); - } - } - } - - return matrix[b.length][a.length]; - }; - - const animekaiSearch = async () => { - const searchBaseUrl = "https://animekai.to/browser?keyword="; - const baseUrl = "https://animekai.to"; - - const posterHrefRegex = /href="[^"]*" class="poster"/g; - const titleRegex = /class="title"[^>]*title="[^"]*"/g; - const imageRegex = /data-src="[^"]*"/g; - const extractHrefRegex = /href="([^"]*)"/; - const extractImageRegex = /data-src="([^"]*)"/; - const extractTitleRegex = /title="([^"]*)"/; - - const extractResultsFromHTML = (htmlText) => { - const results = []; - const posterMatches = htmlText.match(posterHrefRegex) || []; - const titleMatches = htmlText.match(titleRegex) || []; - const imageMatches = htmlText.match(imageRegex) || []; - const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); - - for (let i = 0; i < minLength; i++) { - const hrefMatch = posterMatches[i].match(extractHrefRegex); - const fullHref = hrefMatch ? (hrefMatch[1].startsWith("http") ? hrefMatch[1] : baseUrl + hrefMatch[1]) : null; - - const imageMatch = imageMatches[i].match(extractImageRegex); - const imageSrc = imageMatch ? imageMatch[1] : null; - - const titleMatch = titleMatches[i].match(extractTitleRegex); - const cleanTitle = titleMatch ? decodeHtmlEntities(titleMatch[1]) : null; - - if (fullHref && imageSrc && cleanTitle) { - results.push({ - href: `Animekai:${fullHref}`, - image: imageSrc, - title: cleanTitle - }); - } - } - - return results; - }; - - try { - const encodedQuery = encodeQuery(query); - const urls = [ - `${searchBaseUrl}${encodedQuery}`, - `${searchBaseUrl}${encodedQuery}&page=2`, - `${searchBaseUrl}${encodedQuery}&page=3` - ]; - - const responses = await Promise.all(urls.map(url => fetchv2(url))); - const htmlTexts = await Promise.all(responses.map(res => res.text())); - - const allResults = []; - htmlTexts.forEach(html => allResults.push(...extractResultsFromHTML(html))); - return allResults; - } catch (error) { - console.error("Animekai search error:" + error); - return []; - } - }; - - const oneMoviesSearch = async () => { - const searchBaseUrl = "https://1movies.bz/browser?keyword="; - const baseUrl = "https://1movies.bz"; - - const posterHrefRegex = /href="([^"]*)" class="poster"/g; - const titleRegex = /class="title" href="[^"]*">([^<]*) { - const results = []; - const posterMatches = [...htmlText.matchAll(posterHrefRegex)]; - const titleMatches = [...htmlText.matchAll(titleRegex)]; - const imageMatches = [...htmlText.matchAll(imageRegex)]; - const minLength = Math.min(posterMatches.length, titleMatches.length, imageMatches.length); - - for (let i = 0; i < minLength; i++) { - const href = posterMatches[i][1]; - const fullHref = href.startsWith("http") ? href : baseUrl + href; - - const imageSrc = imageMatches[i][1]; - const title = decodeHtmlEntities(titleMatches[i][1]); - - results.push({ href: fullHref, image: imageSrc, title }); - } - return results; - }; - - try { - const encodedQuery = encodeQuery(query); - const urls = [ - `${searchBaseUrl}${encodedQuery}`, - `${searchBaseUrl}${encodedQuery}&page=2`, - `${searchBaseUrl}${encodedQuery}&page=3` - ]; - - const responses = await Promise.all(urls.map(url => fetchv2(url))); - const htmlTexts = await Promise.all(responses.map(res => res.text())); - - const allResults = []; - htmlTexts.forEach(html => allResults.push(...extractResultsFromHTML(html))); - return allResults; - } catch (error) { - console.error("1Movies search error:" + error); - return []; - } - }; - - try { - const [animekaiResults, oneMoviesResults] = await Promise.all([ - animekaiSearch(), - oneMoviesSearch() - ]); - - const mergedResults = [...animekaiResults, ...oneMoviesResults]; - - const scoredResults = mergedResults.map(r => ({ - ...r, - score: fuzzyMatch(query, r.title) - })); - - const filteredResults = scoredResults - .filter(r => r.score > 50) - .sort((a, b) => b.score - a.score) - .map(({ score, ...rest }) => rest); - - return JSON.stringify(filteredResults.length > 0 ? filteredResults : [{ - href: "", - image: "", - title: "No results found, please refine query." - }]); - } catch (error) { - return JSON.stringify([{ - href: "", - image: "", - title: "Search failed: " + error.message - }]); - } -} - -async function extractDetails(url) { - - if (url.startsWith("Animekai:")) { - const actualUrl = url.replace("Animekai:", "").trim(); - - try { - const response = await fetchv2(actualUrl); - const htmlText = await response.text(); - - const descriptionMatch = (/
    ([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; - const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; - - return JSON.stringify([{ - description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", - aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not available", - airdate: "If stream doesn't load try later or disable VPN/DNS" - }]); - } catch (error) { - console.error("Error fetching Animekai details:" + error); - return JSON.stringify([{ - description: "Error loading description", - aliases: "Aliases: Unknown", - airdate: "Aired: Unknown" - }]); - } - } else { - try { - const response = await fetchv2(url); - const htmlText = await response.text(); - - const descriptionMatch = (/
    ([\s\S]*?)<\/div>/.exec(htmlText) || [])[1]; - const aliasesMatch = (/([\s\S]*?)<\/small>/.exec(htmlText) || [])[1]; - const airdateMatch = (/
  • Released:\s*]*>(.*?)<\/span>/.exec(htmlText) || [])[1]; - - return JSON.stringify([{ - description: descriptionMatch ? cleanHtmlSymbols(descriptionMatch) : "Not available", - aliases: aliasesMatch ? cleanHtmlSymbols(aliasesMatch) : "Not aliases", - airdate: airdateMatch ? cleanHtmlSymbols(airdateMatch) : "Not available" - }]); - } catch (error) { - console.error("Error fetching 1Movies details:"+ error); - return JSON.stringify([{ - description: "Error loading description", - aliases: "Not available", - airdate: "Not available" - }]); - } - } -} - -async function extractEpisodes(url) { - try { - if (url.startsWith("Animekai:")) { - 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 episodes = episodeMatches.map(([_, episodeNum, episodeToken]) => ({ - number: parseInt(episodeNum, 10), - href: `Animekai:https://animekai.to/ajax/links/list?token=${episodeToken}&_=ENCRYPT_ME` - })); - - return JSON.stringify(episodes); - } else { - const htmlText = await (await fetchv2(url)).text(); - const movieIDMatch = (htmlText.match(/
    ]*id="movie-rating"[^>]*data-id="([^"]+)"/) || [])[1]; - if (!movieIDMatch) return JSON.stringify([{ error: "MovieID not found" }]); - - const tokenResponse = await fetchv2("https://enc-dec.app/api/enc-movies-flix?text=" + encodeURIComponent(movieIDMatch)); - const temp = await tokenResponse.json(); - const token = temp.result; - - const episodeListUrl = `https://1movies.bz/ajax/episodes/list?id=${movieIDMatch}&_=${token}`; - const episodeListData = await (await fetchv2(episodeListUrl)).json(); - const cleanedHtml = cleanJsonHtml(episodeListData.result); - - const episodeRegex = /]+eid="([^"]+)"[^>]+num="([^"]+)"[^>]*>/g; - const episodeMatches = [...cleanedHtml.matchAll(episodeRegex)]; - - const episodes = episodeMatches.map(([_, episodeToken, episodeNum]) => ({ - number: parseInt(episodeNum, 10), - href: `https://1movies.bz/ajax/links/list?eid=${episodeToken}&_=ENCRYPT_ME` - })); - - return JSON.stringify(episodes); - } - } catch (err) { - console.error("Error fetching episodes:" + err); - return JSON.stringify([{ number: 1, href: "Error fetching episodes" }]); - } -} - -async function extractStreamUrl(url) { - let source, actualUrl; - - if (url.startsWith("Animekai:")) { - source = "Animekai"; - actualUrl = url.replace("Animekai:", "").trim(); - } else if (url.includes("1movies.bz")) { - source = "1Movies"; - actualUrl = url.trim(); - } else { - console.log("Failed to match URL:", url); - return "Invalid URL format: " + url; - } - - if (source === "Animekai") { - try { - const tokenMatch = actualUrl.match(/token=([^&]+)/); - if (tokenMatch && tokenMatch[1]) { - const rawToken = tokenMatch[1]; - const encryptResponse = await fetchv2(`https://enc-dec.app/api/enc-kai?text=${encodeURIComponent(rawToken)}`); - const encryptData = await encryptResponse.json(); - const encryptedToken = encryptData.result; - actualUrl = actualUrl.replace('&_=ENCRYPT_ME', `&_=${encryptedToken}`); - } - - const response = await fetchv2(actualUrl); - const text = await response.text(); - const cleanedHtml = cleanJsonHtml(text); - const subRegex = /
    ]*>([\s\S]*?)<\/div>/; - const softsubRegex = /
    ]*>([\s\S]*?)<\/div>/; - const dubRegex = /
    ]*>([\s\S]*?)<\/div>/; - const subMatch = subRegex.exec(cleanedHtml); - const softsubMatch = softsubRegex.exec(cleanedHtml); - const dubMatch = dubRegex.exec(cleanedHtml); - const subContent = subMatch ? subMatch[1].trim() : ""; - const softsubContent = softsubMatch ? softsubMatch[1].trim() : ""; - const dubContent = dubMatch ? dubMatch[1].trim() : ""; - const serverSpanRegex = /]*data-lid="([^"]+)"[^>]*>Server 1<\/span>/; - const serverIdDub = serverSpanRegex.exec(dubContent)?.[1]; - const serverIdSoftsub = serverSpanRegex.exec(softsubContent)?.[1]; - const serverIdSub = serverSpanRegex.exec(subContent)?.[1]; - - const tokenRequestData = [ - { name: "Dub", data: serverIdDub }, - { name: "Softsub", data: serverIdSoftsub }, - { name: "Sub", data: serverIdSub } - ].filter(item => item.data); - - 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 Promise.all(tokenPromises); - - const streamUrls = tokenResults.map(result => { - const serverIdMap = { - "Dub": serverIdDub, - "Softsub": serverIdSoftsub, - "Sub": serverIdSub - }; - return { - type: result.name, - url: `https://animekai.to/ajax/links/view?id=${serverIdMap[result.name]}&_=${result.data}` - }; - }); - - const processStreams = async (streamUrls) => { - const streamResponses = await Promise.all( - streamUrls.map(async ({ type, url }) => { - try { - const res = await fetchv2(url); - const json = await res.json(); - return { - type: type, - result: json.result - }; - } catch (error) { - console.log(`Error fetching ${type} stream:` + error); - return { - type: type, - result: null - }; - } - }) - ); - - const decryptRequestData = streamResponses - .filter(item => item.result) - .map(item => ({ - name: item.type, - data: item.result - })); - - if (decryptRequestData.length === 0) { - return {}; - } - - 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 Promise.all(decryptPromises); - - const finalResults = {}; - decryptResults.forEach(result => { - try { - const parsed = JSON.parse(result.data); - finalResults[result.name] = parsed.url; - console.log(`decrypted${result.name} URL:` + parsed.url); - } catch (error) { - console.log(`Error parsing ${result.name} result:` + error); - finalResults[result.name] = null; - } - }); - - return finalResults; - }; - - const decryptedUrls = await processStreams(streamUrls); - const decryptedSub = decryptedUrls.Sub; - const decryptedDub = decryptedUrls.Dub; - const decryptedRaw = decryptedUrls.Softsub; - - 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" - }; - - async function getStream(url) { - try { - const response = await fetchv2(url.replace("/e/", "/media/"), headers); - const responseJson = await response.json(); - - const result = responseJson?.result; - - const postData = { - "text": result, - "Useragent": headers["User-Agent"] - }; - - const finalResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/ilovebush", - {}, - "POST", - JSON.stringify(postData) - ); - - const finalJson = await finalResponse.json(); - return finalJson?.result?.sources?.[0]?.file || null; - } catch { - return null; - } - } - - const streams = []; - - const subStream = decryptedSub ? await getStream(decryptedSub.replace("megaup22", "megaup.site")) : null; - if (subStream) streams.push("Hardsub English", subStream); - - const dubStream = decryptedDub ? await getStream(decryptedDub.replace("megaup22", "megaup.site")) : null; - if (dubStream) streams.push("Dubbed English", dubStream); - - const rawStream = decryptedRaw ? await getStream(decryptedRaw.replace("megaup22", "megaup.site")) : null; - if (rawStream) streams.push("Original audio", rawStream); - - const final = { - streams, - subtitles: "" - }; - - console.log("RETURN: " + JSON.stringify(final)); - return JSON.stringify(final); - - } catch (error) { - console.log("Animekai fetch error:" + error); - return "https://error.org"; - } - } else if (source === "1Movies") { - try { - const eidMatch = actualUrl.match(/eid=([^&]+)/); - if (eidMatch && eidMatch[1]) { - const rawEpisodeToken = eidMatch[1]; - const encryptResponse = await fetchv2(`https://enc-dec.app/api/enc-movies-flix?text=${rawEpisodeToken}`); - const encryptData = await encryptResponse.json(); - const encryptedToken = encryptData.result; - actualUrl = actualUrl.replace('&_=ENCRYPT_ME', `&_=${encryptedToken}`); - } - - const response = await fetchv2(actualUrl); - const responseData = await response.json(); - const cleanedHtml = cleanJsonHtml(responseData.result); - - const server1Regex = /
    ]*data-lid="([^"]+)"[^>]*>\s*Server 1<\/span>/; - const server1Match = server1Regex.exec(cleanedHtml); - - if (!server1Match) { - console.log("Server 1 not found"); - return "error"; - } - - const serverId = server1Match[1]; - - const tokenRequestData = [{ name: "Server1", data: serverId }]; - - const tokenBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/ilovethighs", - {}, - "POST", - JSON.stringify(tokenRequestData) - ); - const tokenResults = await tokenBatchResponse.json(); - const token = tokenResults[0]?.data; - - if (!token) { - console.log("Token not found"); - return "error"; - } - - const streamUrl = `https://1movies.bz/ajax/links/view?id=${serverId}&_=${token}`; - const streamResponse = await fetchv2(streamUrl); - const streamData = await streamResponse.json(); - - if (!streamData.result) { - console.log("Stream result not found"); - return "error"; - } - - const decryptRequestData = [{ name: "Server1", data: streamData.result }]; - - const decryptBatchResponse = await fetchv2( - "https://ilovekai.simplepostrequest.workers.dev/iloveboobs", - {}, - "POST", - JSON.stringify(decryptRequestData) - ); - const decryptedResponse = await decryptBatchResponse.json(); - console.log("Decrypted response:" + JSON.stringify(decryptedResponse)); - const decryptedUrl = decryptedResponse[0]?.data.url; - - const subListEncoded = decryptedUrl.split("sub.list=")[1]?.split("&")[0]; - let subtitles = "N/A"; - - if (subListEncoded) { - try { - const subListUrl = decodeURIComponent(subListEncoded); - const subResponse = await fetchv2(subListUrl); - subtitles = await subResponse.json(); - } catch { - subtitles = "N/A"; - } - } - - const englishSubUrl = Array.isArray(subtitles) - ? subtitles.find(sub => sub.label === "English")?.file.replace(/\\\//g, "/") - : "N/A"; - - if (!decryptedUrl) { - console.log("Decryption failed"); - return "error"; - } - - const headers = { - "Referer": "https://1movies.bz/", - "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" - }; - - const mediaResponse = await fetchv2(decryptedUrl.replace("/e/", "/media/"), headers); - const mediaJson = await mediaResponse.json(); - - const result = mediaJson?.result; - if (!result) { - console.log("Media result not found"); - return "error"; - } - - const postData = { - "text": result, - "Useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" - }; - - const finalResponse = await fetchv2("https://ilovekai.simplepostrequest.workers.dev/iloveass", {}, "POST", JSON.stringify(postData)); - const finalJson = await finalResponse.json(); - - const m3u8Link = finalJson?.result?.sources?.[0]?.file; - - const m3u8Response = await fetchv2(m3u8Link); - const m3u8Text = await m3u8Response.text(); - - const baseUrl = m3u8Link.substring(0, m3u8Link.lastIndexOf('/') + 1); - - const streams = []; - const lines = m3u8Text.split('\n'); - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim(); - if (line.startsWith('#EXT-X-STREAM-INF:')) { - const resolutionMatch = line.match(/RESOLUTION=(\d+x\d+)/); - let quality = 'Unknown'; - - if (resolutionMatch) { - const [width, height] = resolutionMatch[1].split('x'); - quality = `${height}p`; - } - - if (i + 1 < lines.length) { - const streamPath = lines[i + 1].trim(); - const streamUrl = baseUrl + streamPath; - - streams.push({ - title: quality, - streamUrl: streamUrl - }); - } - } - } - - const returnValue = { - streams: streams, - subtitle: englishSubUrl !== "N/A" ? englishSubUrl : "" - }; - console.log("RETURN: " + JSON.stringify(returnValue)); - return JSON.stringify(returnValue); - } catch (error) { - console.log("1Movies fetch error:" + error); - return "https://error.org"; - } - } -} - -/// -/// -/// Helper functions -/// -/// - -function cleanHtmlSymbols(string) { - if (!string) { - return ""; - } - return string - .replace(/’/g, "'") - .replace(/–/g, "-") - .replace(/&#[0-9]+;/g, "") - .replace(/\r?\n|\r/g, " ") - .replace(/\s+/g, " ") - .trim(); -} - -function cleanJsonHtml(jsonHtml) { - if (!jsonHtml) { - return ""; - } - return jsonHtml - .replace(/\\"/g, "\"") - .replace(/\\'/g, "'") - .replace(/\\\\/g, "\\") - .replace(/\\n/g, "\n") - .replace(/\\t/g, "\t") - .replace(/\\r/g, "\r"); -} - -function decodeHtmlEntities(text) { - if (!text) { - return ""; - } - return text - .replace(/'/g, "'") - .replace(/"/g, "\"") - .replace(/&/g, "&") - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/ /g, " "); -} \ No newline at end of file diff --git a/.tmp.driveupload/508 b/.tmp.driveupload/508 deleted file mode 100644 index 3de7c36..0000000 --- a/.tmp.driveupload/508 +++ /dev/null @@ -1,439 +0,0 @@ -async function searchContent(input,page=0){ - function parseSearchResults(html) { - const results = []; - const regex = /
    [\s\S]*?]*class="poster"[\s\S]*?]*alt="([^"]*)"/g; - - let match; - while ((match = regex.exec(html)) !== null) { - results.push({ - title: match[3], - imageURL: match[2], - id: match[1] - }); - } - - return results; - } const vrf = generate_vrf(input); - const response = await fetch("https://mangafire.to/filter?keyword=" + encodeURIComponent(input) + "&vrf=" + vrf); - const data = await response.text(); - console.log(JSON.stringify(parseSearchResults(data))); - return parseSearchResults(data); -} - -async function getContentData(url) { - function parseHtmlData(htmlContent) { - const genreRegex = /([^<]+)<\/a>/g; - const tags = []; - let match; - - while ((match = genreRegex.exec(htmlContent)) !== null) { - if (match[1].trim()) tags.push(match[1].trim()); - } - - const uniqueTags = [...new Set(tags)]; - - const ogDescriptionRegex = - /') - .replace(/\s+/g, ' ') - .trim(); - - if (uniqueTags.length === 0) { - uniqueTags.push("Unknown"); - } - - return { - description: description, - tags: uniqueTags - }; - } - - const response = await fetch(`https://mangafire.to${url}`); - const data = await response.text(); - console.log(JSON.stringify(parseHtmlData(data))); - return parseHtmlData(data); -} - -async function getChapters(url) { - const mangaIdMatch = url.match(/\.([a-z0-9]+)$/); - const mangaId = mangaIdMatch ? mangaIdMatch[1] : null; - - vrf = generate_vrf(`${mangaId}@chapter@en`); - if (!mangaId) { - console.error("Could not extract manga ID from URL"); - return null; - } - - function parseChapters(htmlContent) { - const chapters = {}; - - const chapterRegex = - /]*>(.*?)<\/a>/gs; - - let match; - while ((match = chapterRegex.exec(htmlContent)) !== null) { - const langCode = match[1]; - const chapterNumber = match[2]; - const chapterId = match[3]; - const title = match[4].replace(/<[^>]*>/g, '').trim(); - - if (!chapters[langCode]) chapters[langCode] = []; - - chapters[langCode].push([ - chapterNumber, - [ - { - id: chapterId, - title: title, - chapter: Number(chapterNumber), - scanlation_group: "Mangafire" - } - ] - ]); - } - - Object.keys(chapters).forEach(lang => chapters[lang].reverse()); - - return chapters; - } - - try { - const response = await fetch(`https://mangafire.to/ajax/read/${mangaId}/chapter/en?vrf=${vrf}`); - const data = await response.json(); - - if (data.status === 200 && data.result && data.result.html) { - const chapters = parseChapters(data.result.html); - console.log(JSON.stringify(chapters)); - return chapters; - } else { - console.error("Invalid response from server"); - return null; - } - } catch (error) { - console.error("Error fetching chapters:" + error); - return null; - } -} - -async function getChapterImages(ID) { - vrf = generate_vrf(`chapter@${ID}`); - - try { - const response = await fetch(`https://mangafire.to/ajax/read/chapter/${ID}?vrf=${vrf}`); - const data = await response.json(); - - if (data.status === 200 && data.result && data.result.images) { - const images = data.result.images.map(img => img[0]); - console.log(JSON.stringify(images)); - return images; - } else { - console.error("Invalid response from server"); - return null; - } - - } catch (error) { - console.error("Error fetching chapters:" + error); - return null; - } -} - -function b64encode(data) { - const keystr = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - function atobLookup(chr) { - const index = keystr.indexOf(chr); - return index < 0 ? undefined : index; - } - - data = `${data}`; - data = data.replace(/[ \t\n\f\r]/g, ""); - if (data.length % 4 === 0) { - data = data.replace(/==?$/, ""); - } - if (data.length % 4 === 1 || /[^+/0-9A-Za-z]/.test(data)) { - return null; - } - let output = ""; - let buffer = 0; - let accumulatedBits = 0; - for (let i = 0; i < data.length; i++) { - buffer <<= 6; - buffer |= atobLookup(data[i]); - accumulatedBits += 6; - if (accumulatedBits === 24) { - output += String.fromCharCode((buffer & 0xff0000) >> 16); - output += String.fromCharCode((buffer & 0xff00) >> 8); - output += String.fromCharCode(buffer & 0xff); - buffer = accumulatedBits = 0; - } - } - if (accumulatedBits === 12) { - buffer >>= 4; - output += String.fromCharCode(buffer); - } else if (accumulatedBits === 18) { - buffer >>= 2; - output += String.fromCharCode((buffer & 0xff00) >> 8); - output += String.fromCharCode(buffer & 0xff); - } - return output; - } - -function b64decode(s) { - const keystr = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - function btoaLookup(index) { - if (index >= 0 && index < 64) { - return keystr[index]; - } - - return undefined; - } - - let i; - s = `${s}`; - for (i = 0; i < s.length; i++) { - if (s.charCodeAt(i) > 255) { - return null; - } - } - let out = ""; - for (i = 0; i < s.length; i += 3) { - const groupsOfSix = [undefined, undefined, undefined, undefined]; - groupsOfSix[0] = s.charCodeAt(i) >> 2; - groupsOfSix[1] = (s.charCodeAt(i) & 0x03) << 4; - if (s.length > i + 1) { - groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4; - groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2; - } - if (s.length > i + 2) { - groupsOfSix[2] |= s.charCodeAt(i + 2) >> 6; - groupsOfSix[3] = s.charCodeAt(i + 2) & 0x3f; - } - for (let j = 0; j < groupsOfSix.length; j++) { - if (typeof groupsOfSix[j] === "undefined") { - out += "="; - } else { - out += btoaLookup(groupsOfSix[j]); - } - } - } - return out; - } - -const toBytes = (str) => Array.from(str, (c) => c.charCodeAt(0) & 0xff); -const fromBytes = (bytes) => - bytes.map((b) => String.fromCharCode(b & 0xff)).join(""); - -function rc4Bytes(key, input) { - const s = Array.from({ length: 256 }, (_, i) => i); - let j = 0; - - for (let i = 0; i < 256; i++) { - j = (j + s[i] + key.charCodeAt(i % key.length)) & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - } - - const out = new Array(input.length); - let i = 0; - j = 0; - for (let y = 0; y < input.length; y++) { - i = (i + 1) & 0xff; - j = (j + s[i]) & 0xff; - [s[i], s[j]] = [s[j], s[i]]; - const k = s[(s[i] + s[j]) & 0xff]; - out[y] = (input[y] ^ k) & 0xff; - } - return out; - } - -function transform(input, initSeedBytes, prefixKeyBytes, prefixLen, schedule) { - const out = []; - for (let i = 0; i < input.length; i++) { - if (i < prefixLen) out.push(prefixKeyBytes[i]); - - out.push( - schedule[i % 10]((input[i] ^ initSeedBytes[i % 32]) & 0xff) & 0xff - ); - } - return out; - } - -const add8 = (n) => (c) => (c + n) & 0xff; -const sub8 = (n) => (c) => (c - n + 256) & 0xff; -const xor8 = (n) => (c) => (c ^ n) & 0xff; -const rotl8 = (n) => (c) => ((c << n) | (c >>> (8 - n))) & 0xff; - -function base64UrlEncodeBytes(bytes) { - const std = b64decode(fromBytes(bytes)); - return std.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); -} - -function bytesFromBase64(b64) { - return toBytes(b64encode(b64)); -} - -const rotr8 = (n) => (c) => ((c >>> n) | (c << (8 - n))) & 0xff; - -function generate_vrf(input) { - const schedule0 = [ - sub8(223), - rotr8(4), - rotr8(4), - add8(234), - rotr8(7), - rotr8(2), - rotr8(7), - sub8(223), - rotr8(7), - rotr8(6), - ]; - - const schedule1 = [ - add8(19), - rotr8(7), - add8(19), - rotr8(6), - add8(19), - rotr8(1), - add8(19), - rotr8(6), - rotr8(7), - rotr8(4), - ]; - - const schedule2 = [ - sub8(223), - rotr8(1), - add8(19), - sub8(223), - rotl8(2), - sub8(223), - add8(19), - rotl8(1), - rotl8(2), - rotl8(1), - ]; - - const schedule3 = [ - add8(19), - rotl8(1), - rotl8(1), - rotr8(1), - add8(234), - rotl8(1), - sub8(223), - rotl8(6), - rotl8(4), - rotl8(1), - ]; - - const schedule4 = [ - rotr8(1), - rotl8(1), - rotl8(6), - rotr8(1), - rotl8(2), - rotr8(4), - rotl8(1), - rotl8(1), - sub8(223), - rotl8(2), - ]; - - const CONST = { - "rc4Keys": [ - "FgxyJUQDPUGSzwbAq/ToWn4/e8jYzvabE+dLMb1XU1o=", - "CQx3CLwswJAnM1VxOqX+y+f3eUns03ulxv8Z+0gUyik=", - "fAS+otFLkKsKAJzu3yU+rGOlbbFVq+u+LaS6+s1eCJs=", - "Oy45fQVK9kq9019+VysXVlz1F9S1YwYKgXyzGlZrijo=", - "aoDIdXezm2l3HrcnQdkPJTDT8+W6mcl2/02ewBHfPzg=", - ], - "seeds32": [ - "yH6MXnMEcDVWO/9a6P9W92BAh1eRLVFxFlWTHUqQ474=", - "RK7y4dZ0azs9Uqz+bbFB46Bx2K9EHg74ndxknY9uknA=", - "rqr9HeTQOg8TlFiIGZpJaxcvAaKHwMwrkqojJCpcvoc=", - "/4GPpmZXYpn5RpkP7FC/dt8SXz7W30nUZTe8wb+3xmU=", - "wsSGSBXKWA9q1oDJpjtJddVxH+evCfL5SO9HZnUDFU8=", - ], - "prefixKeys": [ - "l9PavRg=", - "Ml2v7ag1Jg==", - "i/Va0UxrbMo=", - "WFjKAHGEkQM=", - "5Rr27rWd", - ], - }; - - // Stage 0: normalize to URI-encoded bytes - let bytes = toBytes(encodeURIComponent(input)); - - // RC4 - bytes = rc4Bytes(b64encode(CONST.rc4Keys[0]), bytes); - const prefixKey0 = bytesFromBase64(CONST.prefixKeys[0]); - bytes = transform( - bytes, - bytesFromBase64(CONST.seeds32[0]), - prefixKey0, - prefixKey0.length, - schedule0 - ); - - bytes = rc4Bytes(b64encode(CONST.rc4Keys[1]), bytes); - const prefixKey1 = bytesFromBase64(CONST.prefixKeys[1]); - bytes = transform( - bytes, - bytesFromBase64(CONST.seeds32[1]), - prefixKey1, - prefixKey1.length, - schedule1 - ); - - bytes = rc4Bytes(b64encode(CONST.rc4Keys[2]), bytes); - const prefixKey2 = bytesFromBase64(CONST.prefixKeys[2]); - bytes = transform( - bytes, - bytesFromBase64(CONST.seeds32[2]), - prefixKey2, - prefixKey2.length, - schedule2 - ); - - bytes = rc4Bytes(b64encode(CONST.rc4Keys[3]), bytes); - const prefixKey3 = bytesFromBase64(CONST.prefixKeys[3]); - bytes = transform( - bytes, - bytesFromBase64(CONST.seeds32[3]), - prefixKey3, - prefixKey3.length, - schedule3 - ); - - bytes = rc4Bytes(b64encode(CONST.rc4Keys[4]), bytes); - const prefixKey4 = bytesFromBase64(CONST.prefixKeys[4]); - bytes = transform( - bytes, - bytesFromBase64(CONST.seeds32[4]), - prefixKey4, - prefixKey4.length, - schedule4 - ); - - return base64UrlEncodeBytes(bytes); -} \ No newline at end of file diff --git a/.tmp.driveupload/530 b/.tmp.driveupload/530 deleted file mode 100644 index d8d9cae..0000000 --- a/.tmp.driveupload/530 +++ /dev/null @@ -1 +0,0 @@ -baaf3c1d221e67bbcf3ebda4bb52f4e520cd0974 diff --git a/.tmp.driveupload/560 b/.tmp.driveupload/560 deleted file mode 100644 index 47d8cdc..0000000 --- a/.tmp.driveupload/560 +++ /dev/null @@ -1 +0,0 @@ -312c50343fe37511a49ec4a312b393069fbfde08 diff --git a/.tmp.driveupload/576 b/.tmp.driveupload/576 deleted file mode 100644 index 00e49c4..0000000 --- a/.tmp.driveupload/576 +++ /dev/null @@ -1,12 +0,0 @@ -0000000000000000000000000000000000000000 09c423e95a233553b774b005d8f6e6bdb31fc8f1 50/50 <80717571+50n50@users.noreply.github.com> 1760195925 +0200 commit (initial): Upload -09c423e95a233553b774b005d8f6e6bdb31fc8f1 4bdd7bbd2beccee5506770f77db7626a69b74f12 50/50 <80717571+50n50@users.noreply.github.com> 1760196216 +0200 commit: Fix script url -4bdd7bbd2beccee5506770f77db7626a69b74f12 9eacd16f54e6f8a4a51e1ac7aa87b2e1d942c072 50/50 <80717571+50n50@users.noreply.github.com> 1760287264 +0200 pull --ff --recurse-submodules --progress origin: Fast-forward -9eacd16f54e6f8a4a51e1ac7aa87b2e1d942c072 5c721916282c3ea70c4dbec930204eccbf270d6d 50/50 <80717571+50n50@users.noreply.github.com> 1760474661 +0200 pull --ff --recurse-submodules --progress origin: Fast-forward -5c721916282c3ea70c4dbec930204eccbf270d6d b9ea9732f6939fe3cd04049c7e640654511dbed8 50/50 <80717571+50n50@users.noreply.github.com> 1760474668 +0200 commit: test -b9ea9732f6939fe3cd04049c7e640654511dbed8 9e3a7a915a80ce7500fdaf5f651d43338760a561 50/50 <80717571+50n50@users.noreply.github.com> 1761677670 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -9e3a7a915a80ce7500fdaf5f651d43338760a561 e5b8e16feb85c3fa48aac5dc68758d7b62963aa2 50/50 <80717571+50n50@users.noreply.github.com> 1762117625 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -e5b8e16feb85c3fa48aac5dc68758d7b62963aa2 7069fa8ca49507d435963f2a92f3fe1823c535d9 50/50 <80717571+50n50@users.noreply.github.com> 1762117632 +0100 revert: Revert "Update mediafusion/mediafusion.js" -7069fa8ca49507d435963f2a92f3fe1823c535d9 866a5b750628eb0612f91ec3773200b754a3a8c6 50/50 <80717571+50n50@users.noreply.github.com> 1762980132 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -866a5b750628eb0612f91ec3773200b754a3a8c6 ac2ff67c141519c770b52bbcc46c1c8323b4e053 50/50 <80717571+50n50@users.noreply.github.com> 1764355727 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -ac2ff67c141519c770b52bbcc46c1c8323b4e053 baaf3c1d221e67bbcf3ebda4bb52f4e520cd0974 50/50 <80717571+50n50@users.noreply.github.com> 1764535876 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -baaf3c1d221e67bbcf3ebda4bb52f4e520cd0974 312c50343fe37511a49ec4a312b393069fbfde08 50/50 <80717571+50n50@users.noreply.github.com> 1765037272 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward diff --git a/.tmp.driveupload/578 b/.tmp.driveupload/578 deleted file mode 100644 index 00e49c4..0000000 --- a/.tmp.driveupload/578 +++ /dev/null @@ -1,12 +0,0 @@ -0000000000000000000000000000000000000000 09c423e95a233553b774b005d8f6e6bdb31fc8f1 50/50 <80717571+50n50@users.noreply.github.com> 1760195925 +0200 commit (initial): Upload -09c423e95a233553b774b005d8f6e6bdb31fc8f1 4bdd7bbd2beccee5506770f77db7626a69b74f12 50/50 <80717571+50n50@users.noreply.github.com> 1760196216 +0200 commit: Fix script url -4bdd7bbd2beccee5506770f77db7626a69b74f12 9eacd16f54e6f8a4a51e1ac7aa87b2e1d942c072 50/50 <80717571+50n50@users.noreply.github.com> 1760287264 +0200 pull --ff --recurse-submodules --progress origin: Fast-forward -9eacd16f54e6f8a4a51e1ac7aa87b2e1d942c072 5c721916282c3ea70c4dbec930204eccbf270d6d 50/50 <80717571+50n50@users.noreply.github.com> 1760474661 +0200 pull --ff --recurse-submodules --progress origin: Fast-forward -5c721916282c3ea70c4dbec930204eccbf270d6d b9ea9732f6939fe3cd04049c7e640654511dbed8 50/50 <80717571+50n50@users.noreply.github.com> 1760474668 +0200 commit: test -b9ea9732f6939fe3cd04049c7e640654511dbed8 9e3a7a915a80ce7500fdaf5f651d43338760a561 50/50 <80717571+50n50@users.noreply.github.com> 1761677670 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -9e3a7a915a80ce7500fdaf5f651d43338760a561 e5b8e16feb85c3fa48aac5dc68758d7b62963aa2 50/50 <80717571+50n50@users.noreply.github.com> 1762117625 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -e5b8e16feb85c3fa48aac5dc68758d7b62963aa2 7069fa8ca49507d435963f2a92f3fe1823c535d9 50/50 <80717571+50n50@users.noreply.github.com> 1762117632 +0100 revert: Revert "Update mediafusion/mediafusion.js" -7069fa8ca49507d435963f2a92f3fe1823c535d9 866a5b750628eb0612f91ec3773200b754a3a8c6 50/50 <80717571+50n50@users.noreply.github.com> 1762980132 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -866a5b750628eb0612f91ec3773200b754a3a8c6 ac2ff67c141519c770b52bbcc46c1c8323b4e053 50/50 <80717571+50n50@users.noreply.github.com> 1764355727 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -ac2ff67c141519c770b52bbcc46c1c8323b4e053 baaf3c1d221e67bbcf3ebda4bb52f4e520cd0974 50/50 <80717571+50n50@users.noreply.github.com> 1764535876 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward -baaf3c1d221e67bbcf3ebda4bb52f4e520cd0974 312c50343fe37511a49ec4a312b393069fbfde08 50/50 <80717571+50n50@users.noreply.github.com> 1765037272 +0100 pull --ff --recurse-submodules --progress origin: Fast-forward