Browse Source

Fix upcloud

pull/478/head
mrjvs 2 years ago
parent
commit
bb449d6dfb
  1. 60
      src/backend/embeds/upcloud.ts

60
src/backend/embeds/upcloud.ts

@ -29,6 +29,32 @@ function isJSON(json: string) {
} }
} }
function extractKey(script: string): [number, number][] | null {
const startOfSwitch = script.lastIndexOf("switch");
const endOfCases = script.indexOf("partKeyStartPosition");
const switchBody = script.slice(startOfSwitch, endOfCases);
const nums: [number, number][] = [];
const matches = switchBody.matchAll(
/:[a-zA-Z0-9]+=([a-zA-Z0-9]+),[a-zA-Z0-9]+=([a-zA-Z0-9]+);/g
);
for (const match of matches) {
const innerNumbers: number[] = [];
for (const varMatch of [match[1], match[2]]) {
const regex = new RegExp(`${varMatch}=0x([a-zA-Z0-9]+)`, "g");
const varMatches = [...script.matchAll(regex)];
const lastMatch = varMatches[varMatches.length - 1];
if (!lastMatch) return null;
const number = parseInt(lastMatch[1], 16);
innerNumbers.push(number);
}
nums.push([innerNumbers[0], innerNumbers[1]]);
}
return nums;
}
registerEmbedScraper({ registerEmbedScraper({
id: "upcloud", id: "upcloud",
displayName: "UpCloud", displayName: "UpCloud",
@ -54,23 +80,31 @@ registerEmbedScraper({
let sources: { file: string; type: string } | null = null; let sources: { file: string; type: string } | null = null;
if (!isJSON(streamRes.sources)) { if (!isJSON(streamRes.sources)) {
const decryptionKey = JSON.parse( const scriptJs = await proxiedFetch<string>(
await proxiedFetch<string>( `https://rabbitstream.net/js/player/prod/e4-player.min.js`,
`https://raw.githubusercontent.com/enimax-anime/key/e4/key.txt` {
) responseType: "text" as any,
) as [number, number][]; }
);
const decryptionKey = extractKey(scriptJs);
if (!decryptionKey) throw new Error("Key extraction failed");
let extractedKey = ""; let extractedKey = "";
const sourcesArray = streamRes.sources.split(""); let strippedSources = streamRes.sources;
for (const index of decryptionKey) { let totalledOffset = 0;
for (let i: number = index[0]; i < index[1]; i += 1) { decryptionKey.forEach(([a, b]) => {
extractedKey += streamRes.sources[i]; const start = a + totalledOffset;
sourcesArray[i] = ""; const end = start + b;
} extractedKey += streamRes.sources.slice(start, end);
} strippedSources = strippedSources.replace(
streamRes.sources.substring(start, end),
""
);
totalledOffset += b;
});
const decryptedStream = AES.decrypt( const decryptedStream = AES.decrypt(
sourcesArray.join(""), strippedSources,
extractedKey extractedKey
).toString(enc.Utf8); ).toString(enc.Utf8);
const parsedStream = JSON.parse(decryptedStream)[0]; const parsedStream = JSON.parse(decryptedStream)[0];

Loading…
Cancel
Save