From 80115f35d6f721ac922fe14782eed155e8801324 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Mon, 7 Jul 2025 13:35:14 +0500 Subject: [PATCH] refactor/player-parsers(kodik): always return unencrypted src urls and add manifest + poster keys --- player-parsers/kodik.ts | 84 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/player-parsers/kodik.ts b/player-parsers/kodik.ts index e28444d..2b033d6 100644 --- a/player-parsers/kodik.ts +++ b/player-parsers/kodik.ts @@ -90,6 +90,88 @@ export async function getKodikURL(res, url: string) { return; } - asJSON(res, await linksRes.json(), 200); + let data = stripResponse(await linksRes.json()); + if (isEncrypted(data)) { + for (const [key] of Object.entries(data.links)) { + data.links[key][0].src = decryptSrc(data.links[key][0].src); + } + } + + if (!hasProto(data)) { + for (const [key] of Object.entries(data.links)) { + data.links[key][0].src = addProto(data.links[key][0].src); + } + } + + if (!isAnimeTvSeries(data)) { + data["manifest"] = data.links[data.default][0].src.replace( + `${data.default}.mp4:hls:`, + "" + ); + } else { + data["manifest"] = createManifest(data); + } + + data["poster"] = data.links[data.default][0].src.replace( + `${data.default}.mp4:hls:manifest.m3u8`, + "thumb001.jpg" + ); + + asJSON(res, data, 200); return; } + +function stripResponse(data) { + return { + default: data.default, + links: data.links, + }; +} + +function isEncrypted(data) { + return !data.links[data.default][0].src.includes("//"); +} + +function decryptSrc(enc: string) { + const decryptedBase64 = enc.replace(/[a-zA-Z]/g, (e: any) => { + return String.fromCharCode( + (e <= "Z" ? 90 : 122) >= (e = e.charCodeAt(0) + 18) ? e : e - 26 + ); + }); + return atob(decryptedBase64); +} + +function hasProto(data) { + return data.links[data.default][0].src.startsWith("http"); +} + +function addProto(string) { + return `https:${string}`; +} + +function isAnimeTvSeries(data) { + return ( + data.links[data.default][0].src.includes("animetvseries") || + data.links[data.default][0].src.includes("tvseries") + ); +} + +function createManifest(data) { + const resolutions = { + 240: "427x240", + 360: "578x360", + 480: "854x480", + 720: "1280x720", + 1080: "1920x1080", + }; + + const stringBuilder: string[] = []; + + stringBuilder.push("#EXTM3U"); + for (const [key] of Object.entries(data.links)) { + stringBuilder.push(`#EXT-X-STREAM-INF:RESOLUTION=${resolutions[key]}`); + stringBuilder.push(data.links[key][0].src); + } + + return stringBuilder.join("\n"); +}