mirror of
https://github.com/movie-web/movie-web.git
synced 2024-12-26 17:11:50 +01:00
commit
e3569c7ed7
@ -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": {
|
||||||
|
@ -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…
Reference in New Issue
Block a user