-
Notifications
You must be signed in to change notification settings - Fork 14
kickassanime video extractor #8
Copy link
Copy link
Open
Description
url:- https://kaa.mx/
video-page url:- https://kaa.mx/jujutsu-kaisen-2nd-season-fe6b/ep-2-92eb06
the issue seems to be in encryptedResponse
import axios from "axios";
import crypto from "crypto";
const headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
Accept: "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-US,en;q=0.5",
Connection: "keep-alive",
DNT: "1",
Host: "krussdomi.com",
Referer: "https://krussdomi.com/vidstreaming/player.php?id=64b0300b44c6d04c1200aedd&ln=ja-JP",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Sec-GPC": "1",
TE: "trailers",
"X-Origin": "kaa.mx",
"x-timezone": "-330",
"x-client-ts": "1741026600000",
};
const servers = {
VidStreaming: "e13d38099bf562e8b9851a652d2043d3",
DuckStream: "4504447b74641ad972980a6b8ffd7631",
BirdStream: "4b14d0ff625163e3c9c7a47926484bf2",
};
async function getVideos(url, server) {
if (!servers[server]) {
console.log("Unknown server");
return [];
}
const key = Buffer.from(servers[server], "utf8"); // Convert key to byte array
try {
// Fetch the page source
const { data: html } = await axios.get(url);
// Extract signature parameters
const cidHex = html.match(/cid: '([^']+)'/)[1];
const cid = Buffer.from(cidHex, "hex").toString().split("|");
const timestamp = Math.floor(Date.now() / 1000) + 60;
const route = cid[1].replace("player.php", "source.php");
const query = new URL(url).searchParams.get(server === "DuckStream" ? "mid" : "id");
const signatureData = [
cid[0], // IP
headers["User-Agent"],
route,
query,
timestamp,
key.toString(),
].join("");
const signature = sha1(signatureData);
const sourceUrl = `https://${new URL(url).hostname}${route}?${
server === "DuckStream" ? "mid" : "id"
}=${query}&e=${timestamp}&s=${signature}`;
console.log(sourceUrl)
// Fetch the encrypted response
const { data: encryptedResponse } = await axios.get(sourceUrl,{headers:{
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Referer': 'https://krussdomi.com/vidstreaming/player.php?id=64b0300b44c6d04c1200aedd&ln=ja-JP',
'DNT': '1',
'Sec-GPC': '1',
'Connection': 'keep-alive',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'TE': 'trailers'
}});
console.log(encryptedResponse)
const [encryptedData, ivHex] = encryptedResponse
.match(/:"([^"]+)"/)[1]
.replace(/\\/g, "")
.split(":");
const iv = Buffer.from(ivHex, "hex");
// Decrypt AES data
const decrypted = decryptAES(encryptedData, key, iv);
const videoObject = JSON.parse(decrypted);
// Process subtitles
const subtitles = videoObject.subtitles.map((sub) => ({
url: sub.src.startsWith("//") ? "https:" + sub.src : sub.src,
language: `${sub.name} (${sub.language})`,
}));
return videoObject.playlistUrl
? { type: "HLS", url: videoObject.playlistUrl, subtitles }
: { type: "DASH", url: videoObject.playlistUrl, subtitles };
} catch (err) {
console.error("Error:", err);
return [];
}
}
// AES Decryption Function
function decryptAES(encryptedText, key, iv) {
const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
let decrypted = decipher.update(encryptedText, "base64", "utf8");
decrypted += decipher.final("utf8");
return decrypted;
}
// SHA-1 Hash Function
function sha1(data) {
return crypto.createHash("sha1").update(data).digest("hex");
}
// Example Usage
(async () => {
const videoData = await getVideos(
"https://krussdomi.com/vidstreaming/player.php?id=64b0300b44c6d04c1200aedd&ln=ja-JP",
"VidStreaming"
);
console.log(videoData);
})();adapted from here
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels