Skip to content

kickassanime video extractor #8

@2004durgesh

Description

@2004durgesh

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions