Merge pull request #478 from movie-web/fix-upcloud

Fix upcloud
This commit is contained in:
William Oldham 2023-11-07 20:10:22 +00:00 committed by GitHub
commit 94d6d7b37e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 14 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "movie-web", "name": "movie-web",
"version": "3.2.2", "version": "3.2.3",
"private": true, "private": true,
"homepage": "https://movie-web.app", "homepage": "https://movie-web.app",
"dependencies": { "dependencies": {

View File

@ -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];