@vyla-entertainment/sdk 1.6.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,120 +1,229 @@
1
- import { webcrypto } from 'node:crypto';
2
- import { fetchJson, USER_AGENT } from '../utils/helpers.js';
1
+ import { USER_AGENT } from "../utils/helpers.js";
2
+
3
+ const PLAYER_ORIGIN = "https://player.vidzee.wtf";
4
+ const CORE_ORIGIN = "https://core.vidzee.wtf";
5
+
6
+ const SERVERS = [
7
+ { id: "tik", name: "TCloud" },
8
+ { id: "ipcloud", name: "IPcloud" },
9
+ { id: "v6:Hindi", name: "Hindi v3" },
10
+ ];
11
+
12
+ const WASM_B64 = "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////////////////////////////9/D/////////////////////////////////7/////8BAwAAAB8AQZwrC0ogAAAAAADPvEDX///7////////////v///////////////////////A/z///////////////////////////7///9/AP//////AQBBiCwLDP////+/IP//////5wBBqCwLDP////////////8/PwBBxCwLUP8B///////nAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAP//Pz//////Pz//qv///z/////////fX9wfzw//H9wfAEGiLQsGAoAAAP8fAEG0LQsRhPwvPlC9H/LgQwAA/////xgAQeotCzDA////////AwAA//////9///////9//////////////////////x94DAD/////vyAAQbwuCwz//////z8AAP///z8AQdguCz/8////////////////eP////////wHAAAAAGAHAAAAAAAA///////3/wH/////////////AAAAAAAAAAB/APgAQbgvCwj+//8H/v//BwBB1C8LCv////////////8AQeovCwr/////D/////8PAEGEMAsP////////BwD///////8HAEGoMAsI//////////8AQbwwCwj//////////wBB1DALiQH/////////////3///////////32Te/+vv/////////7/n39////97X/z9//////////////////////////////////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3DwAAAAAAAP//////////DwBB+jELDP///wP///8D////AwBBlDILgAQHCAkKCwwGBgYGBgYGBgYGDQYGDgYGBgYGBgYGDxAREgYTBgYGBgYGBgYGBhQVBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGFhcGBgYYBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYZBgYGBhoGBgYGBgYGGwYGBgYGBgYGBgYGHAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYdBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYeBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgBBgzcLFCQrKysrKysrKwEAVFZWVlZWVlZWAEGqNwufAxgAAAArKysrKysrBysrW1ZWVlZWVlZKVlYFMVAxUDFQMVAxUDFQMVAxUCRQeTFQMVAxOFAxUDFQMVAxUDFQMVAxUE4xAk4NDU4DTgAkbgBOMSZuUU4kUE45FIEbHR1TMVAxUA0xUDFQMVAbUyRQMQJce1x7XHtce1x7FHlce1x7XC0rSQNIA3hcexQAlgoBKygGBgAqBioqKwe7tSseACsHKysrASsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrASsrKysrKysrKysrKysrKysrKysrKysrKisrKysrKysrKysrKyvNRs0rACUrBwEGAVVWVlZWVlVWVgIkgYGBgYEVgYGBAAArALLRstGy0bLRAADNzAEA19fX19eDgYGBgYGBgYGBgaysrKysrKysrKwcAAAAAAAxUDFQMVAxUDFQMQIAADFQMVAxUDFQMVAxUDFQMVAxUE4xUDFQTjFQMVAxUDFQMVAxUDFQMQKHpoemh6aHpoemh6aHpoemKisrKysrKysrKysrKwAAAFRWVlZWVlZWVlZWVlYAQac7CyFUVlZWVlZWVlZWVlZWDAAMKisrKysrKysrKysrKysHKgEAQf07C3cqKysrKysrKysrKysrKysrKysrKysrKysrKytWVmyBFQArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysHbANBKytWVlZWVlZWVlZWVlZWVixWKysrKysrKysrKysrKysrKysrKysrAQBBnD0LCAxsAAAAAAAGAEHKPQvoAgYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlVnqeJgYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYBKytPVlYsK39WVjkrK1VWVisrT1ZWLCt/VlaBN3Vbe1wrK09WVgKsBAAAOSsrVVZWKytPVlYsKytWVjITgVcAb4F+ydd+LYGBDn45f29XAIGBfhUAfgMrKysrKysrKysrKysHKyQrlysrKysrKysrKyorKysrK1ZWVlZWgIGBgYE5uyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrAYGBgYGBgYGBgYGBgYGBgcmsrKysrKysrKysrKysrKzQDQBOMQK0wcHX1yRQMVAxUDFQMVAxUDFQMVAxUDFQMVAxUDFQMVAxUDFQMVDX11PBR9TX19cFKysrKysrKysrKysrBwEAAQBBjcEACx9OMVAxUDFQMVAxUDFQMVANAAAAAAAkUDFQMVAxUDFQAEHOwQALVisrKysrKysrKysreVx7XHtPe1x7XHtce1x7XHtce1x7XHtce1wtKyt5FFx7XC15KlwnXHtce1x7pAAKtFx7XHtPA3g4KysrKysrKysrKysrK08tKysBAEG/wgALAUgAQcnCAAsbKisrKysrKysrKysrKysrKysrKysrKysrKysrAEGFwwALFCsrKysrKysrBwBIVlZWVlZWVlYCAEHQwwALGysrKysrKysrKysrKytVVlZWVlZWVlZWVlZWDgBBisQACxokKysrKysrKysrKysHAFZWVlZWVlZWVlZWVgBB0MQACyckKysrKysrKysrKysrKysrKwcAAAAAVlZWVlZWVlZWVlZWVlZWVlYAQbHFAAsWKisrKysrKysrKytWVlZWVlZWVlZWDgBB58UACxYqKysrKysrKysrK1ZWVlZWVlZWVlYOAEGoxgALFysrKysrKysrKysrVVZWVlZWVlZWVlYOAEGBxwALCAgAAFYBAAA5AEGQxwALvAcBIAAAAOD//wC/HQAA5wIAAHkAAAIkAAABAQAAAP///wAAAAABAgAAAP7//wE5//8AGP//AYf//wDU/v8AwwAAAdIAAAHOAAABzQAAAU8AAAHKAAABywAAAc8AAABhAAAB0wAAAdEAAACjAAAB1QAAAIIAAAHWAAAB2gAAAdkAAAHbAAAAOAAAAwAAAACx//8Bn///Acj//wIoJAAAAAAAAQEAAAD///8AM///ACb//wF+//8BKyoAAV3//wEoKgAAPyoAAT3//wFFAAABRwAAAB8qAAAcKgAAHioAAC7//wAy//8ANv//ADX//wBPpQAAS6UAADH//wAopQAARKUAAC///wAt//8A9ykAAEGlAAD9KQAAK///ACr//wDnKQAAQ6UAACqlAAC7//8AJ///ALn//wAl//8AFaUAABKlAAIkTAAAAAAAASAAAADg//8BAQAAAP///wBUAAABdAAAASYAAAElAAABQAAAAT8AAADa//8A2///AOH//wDA//8Awf//AQgAAADC//8Ax///ANH//wDK//8A+P//AKr//wCw//8ABwAAAIz//wHE//8AoP//Afn//wIacAABAQAAAP///wEgAAAA4P//AVAAAAEPAAAA8f//AAAAAAEwAAAA0P//AQEAAAD///8AAAAAAMALAAFgHAAAAAAAAdCXAAEIAAAA+P//AgWKAAAAAAABQPT/AJ7n/wDCiQAA2+f/AJLn/wCT5/8AnOf/AJ3n/wCk5/8AAAAAADiKAAAEigAA5g4AAQEAAAD///8AAAAAAMX//wFB4v8CHY8AAAgAAAH4//8AAAAAAFYAAAGq//8ASgAAAGQAAACAAAAAcAAAAH4AAAAJAAABtv//Aff//wDb4/8BnP//AZD//wGA//8Bgv//AgWsAAAAAAABEAAAAPD//wEcAAABAQAAAaPi/wFB3/8But//AOT//wILsQABAQAAAP///wEwAAAA0P//AAAAAAEJ1v8BGvH/ARnW/wDV1f8A2NX/AeTV/wED1v8B4dX/AeLV/wHB1f8AAAAAAKDj/wAAAAABAQAAAP///wIMvAAAAAAAAQEAAAD///8BvFr/AaADAAH8df8B2Fr/ADAAAAGxWv8BtVr/Ab9a/wHuWv8B1lr/Aeta/wHQ//8BvVr/Ach1/wAAAAAAMGj/AGD8/wAAAAABIAAAAOD//wAAAAABKAAAANj//wAAAAABQAAAAMD//wAAAAABIAAAAOD//wAAAAABIAAAAOD//wAAAAABIgAAAN7//wBBzc4ACwUGJ1FvdwBB3M4ACxJ8AAB/AAAAAAAAAACDjpKXAKoAQfjOAAsCtMQAQfLPAAsGxskAAADbAEHL0AALDt4AAAAA4QAAAAAAAADkAEHk0AALAecAQbrRAAsB6gBBtdIACwHtAEHM0gALkAMwDDENeA5/D4AQgRGGEokTihOOFI8VkBaTE5QXlRiWGZcamhucGZ0cnh2fHqYfqR+uH7EgsiC3Ib8ixSPII8sj3STyI/Yl9yYgLTouPS8+MD8xQDFDMkQzRTRQNVE2UjdTOFQ5WTpbO1w8YT1jPmU/ZkBoQWlCakBrQ2xEb0JxRXJGdUd9SIJJh0qJS4pMi0yMTZJOnU+eUEVXex18HX0df1iGWYhaiVqKWoxbjlyPXKxdrV6uXq9ewl/MYM1hzmHPYtBj0WTVZdZm12fwaPFp8mrza/Rs9W35bv0t/i3/LVBpUWlSaVNpVGlVaVZpV2lYaVlpWmlbaVxpXWleaV9pggCDAIQAhQCGAIcAiACJAMB1z3aAiYGKgouFjIaNcJ1xnXaed554n3mfeqB7oHyhfaGzorqju6O8pL6lw6LMpNqm26blauqn66fsbvOi+Kj5qPqp+6n8pCawKrErsk6zhAhiumO7ZLxlvWa+bb9uwG/BcMJ+w3/Dfc+N0JTRq9Ks063UsNWx1rLXxNjF2cbaAEHc1QALATwAQejVAAsrAgAAACQAAABJAG4AZABlAHgAIABvAHUAdAAgAG8AZgAgAHIAYQBuAGcAZQBBnNYACwEsAEGo1gALIQIAAAAaAAAAfgBsAGkAYgAvAGEAcgByAGEAeQAuAHQAcwBBzNYACwF8AEHY1gALZQIAAABeAAAARQBsAGUAbQBlAG4AdAAgAHQAeQBwAGUAIABtAHUAcwB0ACAAYgBlACAAbgB1AGwAbABhAGIAbABlACAAaQBmACAAYQByAHIAYQB5ACAAaQBzACAAaABvAGwAZQB5AEHM1wALASwAQdjXAAsjAgAAABwAAABJAG4AdgBhAGwAaQBkACAAbABlAG4AZwB0AGgAQfzXAAsBPABBiNgACy0CAAAAJgAAAH4AbABpAGIALwBhAHIAcgBhAHkAYgB1AGYAZgBlAHIALgB0AHMAQbzYAAsBPABByNgACy0CAAAAJgAAAH4AbABpAGIALwBzAHQAYQB0AGkAYwBhAHIAcgBhAHkALgB0AHMAQfzYAAsBPABBiNkACysCAAAAJAAAAH4AbABpAGIALwB0AHkAcABlAGQAYQByAHIAYQB5AC4AdABzAEG82QALATwAQcjZAAsxAgAAACoAAABPAGIAagBlAGMAdAAgAGEAbAByAGUAYQBkAHkAIABwAGkAbgBuAGUAZABBnNoACwE8AEGo2gALLwIAAAAoAAAATwBiAGoAZQBjAHQAIABpAHMAIABuAG8AdAAgAHAAaQBuAG4AZQBkAEGA2wALIQgAAAAgAAAAIAAAACAAAAAAAAAAQgAAAAJBAABBAAAAZA==";
13
+
14
+ function base64ToU8(b64) {
15
+ const cleaned = b64.replace(/\s+/g, "");
16
+ if (typeof Buffer !== "undefined") {
17
+ const node = Buffer.from(cleaned, "base64");
18
+ const copy = new Uint8Array(node.length);
19
+ copy.set(node);
20
+ return copy;
21
+ }
22
+ const bin = atob(cleaned);
23
+ const out = new Uint8Array(bin.length);
24
+ for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
25
+ return out;
26
+ }
3
27
 
4
- const PLAYER_URL = 'https://player.vidzee.wtf';
5
- const CORE_URL = 'https://core.vidzee.wtf';
28
+ let wasmInstancePromise = null;
29
+
30
+ async function initWasmCrypto() {
31
+ if (wasmInstancePromise) return wasmInstancePromise;
32
+
33
+ wasmInstancePromise = (async () => {
34
+ if (typeof WebAssembly === "undefined") return null;
35
+ try {
36
+ const u8 = base64ToU8(WASM_B64);
37
+ const ab = new ArrayBuffer(u8.byteLength);
38
+ new Uint8Array(ab).set(u8);
39
+ const module = await WebAssembly.compile(ab);
40
+
41
+ let E;
42
+ let Q;
43
+ let s;
44
+
45
+ function L(A, B) {
46
+ try {
47
+ s.setUint32(A, B, true);
48
+ } catch {
49
+ s = new DataView(E.buffer);
50
+ s.setUint32(A, B, true);
51
+ }
52
+ }
6
53
 
7
- let cachedKey = null, cachedKeyTs = 0;
54
+ function U(A) {
55
+ try {
56
+ return s.getUint32(A, true);
57
+ } catch {
58
+ s = new DataView(E.buffer);
59
+ return s.getUint32(A, true);
60
+ }
61
+ }
8
62
 
9
- async function getDecKey(headers) {
10
- const now = Date.now();
11
- if (cachedKey && now - cachedKeyTs < 300000) return cachedKey;
63
+ function H(A) {
64
+ if (!A) return null;
65
+ const B = (A + new Uint32Array(E.buffer)[(A - 4) >>> 2]) >>> 1;
66
+ const C = new Uint16Array(E.buffer);
67
+ let I = A >>> 1;
68
+ let G = "";
69
+ while (B - I > 1024) {
70
+ G += String.fromCharCode(...C.subarray(I, (I += 1024)));
71
+ }
72
+ return G + String.fromCharCode(...C.subarray(I, B));
73
+ }
12
74
 
13
- const res = await fetch(`${CORE_URL}/api-key`, {
14
- headers,
15
- signal: AbortSignal.timeout(7000)
16
- });
17
- if (!res.ok) throw new Error(`API key fetch failed: ${res.status}`);
75
+ function i(A) {
76
+ if (A == null) return 0;
77
+ const B = A.length;
78
+ const C = Q.__new(B << 1, 2) >>> 0;
79
+ const I = new Uint16Array(E.buffer);
80
+ for (let G = 0; G < B; ++G) I[(C >>> 1) + G] = A.charCodeAt(G);
81
+ return C;
82
+ }
18
83
 
19
- const e = await res.text();
20
- const t = Buffer.from(e.replace(/\s+/g, ''), 'base64');
84
+ function F(A, B) {
85
+ return B ? new A(E.buffer, U(B + 4), s.getUint32(B + 8, true) / A.BYTES_PER_ELEMENT).slice() : null;
86
+ }
21
87
 
22
- const s = new Uint8Array(t.length - 28 + 16);
23
- s.set(t.subarray(28), 0);
24
- s.set(t.subarray(12, 28), t.length - 28);
88
+ function e(A, B, C, I) {
89
+ if (I == null) return 0;
90
+ const G = I.length;
91
+ const y = Q.__pin(Q.__new(G << C, 1)) >>> 0;
92
+ const D = Q.__new(12, B) >>> 0;
93
+ L(D + 0, y);
94
+ s.setUint32(D + 4, y, true);
95
+ s.setUint32(D + 8, G << C, true);
96
+ new A(E.buffer, y, G).set(I);
97
+ Q.__unpin(y);
98
+ return D;
99
+ }
25
100
 
26
- const keyMat = await webcrypto.subtle.digest('SHA-256', new TextEncoder().encode('c4a8f1d7e2b9a6c3d0f5e8a1b7c4d9e2'));
27
- const key = await webcrypto.subtle.importKey('raw', keyMat, { name: 'AES-GCM' }, false, ['decrypt']);
101
+ const r = new Map();
28
102
 
29
- try {
30
- const decrypted = await webcrypto.subtle.decrypt({
31
- name: 'AES-GCM',
32
- iv: t.subarray(0, 12),
33
- tagLength: 128
34
- }, key, s);
35
-
36
- cachedKey = new TextDecoder().decode(decrypted);
37
- cachedKeyTs = now;
38
- return cachedKey;
39
- } catch (err) {
40
- throw new Error('Failed to decrypt Vidzee master key');
41
- }
42
- }
103
+ function n(A) {
104
+ if (A) {
105
+ const B = r.get(A);
106
+ if (B) r.set(A, B + 1);
107
+ else r.set(Q.__pin(A), 1);
108
+ }
109
+ return A;
110
+ }
43
111
 
44
- function decrypt(enc, key) {
45
- try {
46
- const dec = Buffer.from(enc, 'base64').toString('utf8');
47
- const sep = dec.indexOf(':');
48
- if (sep === -1) return '';
49
-
50
- const ivBase64 = dec.slice(0, sep);
51
- const ciphertext = dec.slice(sep + 1);
52
- const keyPadded = key.padEnd(32, '\0');
53
-
54
- const decrypted = CryptoJS.AES.decrypt(
55
- ciphertext,
56
- CryptoJS.enc.Utf8.parse(keyPadded),
57
- {
58
- iv: CryptoJS.enc.Base64.parse(ivBase64),
59
- mode: CryptoJS.mode.CBC,
60
- padding: CryptoJS.pad.Pkcs7
112
+ function c(A) {
113
+ if (A) {
114
+ const B = r.get(A);
115
+ if (B === 1) {
116
+ Q.__unpin(A);
117
+ r.delete(A);
118
+ } else if (B) {
119
+ r.set(A, B - 1);
120
+ }
121
+ }
61
122
  }
62
- );
63
123
 
64
- return decrypted.toString(CryptoJS.enc.Utf8) || '';
65
- } catch (err) {
66
- return '';
124
+ const importObject = {
125
+ env: Object.setPrototypeOf(
126
+ {
127
+ abort(A, B, C, I) {
128
+ A = H(A >>> 0) >>> 0;
129
+ B = H(B >>> 0) >>> 0;
130
+ C = C >>> 0;
131
+ I = I >>> 0;
132
+ throw new Error(`abort: ${A} in ${B}:${C}:${I}`);
133
+ },
134
+ },
135
+ Object.create(globalThis)
136
+ ),
137
+ };
138
+
139
+ const instance = await WebAssembly.instantiate(module, importObject);
140
+ Q = instance.exports;
141
+ E = Q.memory;
142
+ s = new DataView(E.buffer);
143
+
144
+ return {
145
+ decrypt(rawPayload, domain) {
146
+ const ptrA = n(e(Uint8Array, 6, 0, rawPayload));
147
+ const ptrB = i(domain);
148
+ try {
149
+ return F(Uint8Array, Q.decrypt(ptrA, ptrB) >>> 0);
150
+ } finally {
151
+ c(ptrA);
152
+ }
153
+ },
154
+ };
155
+ } catch {
156
+ return null;
157
+ }
158
+ })();
159
+
160
+ return wasmInstancePromise;
161
+ }
162
+
163
+ async function decryptWasmPayload(payloadB64) {
164
+ const decrypter = await initWasmCrypto();
165
+ if (!decrypter) return null;
166
+ try {
167
+ const raw = base64ToU8(payloadB64);
168
+ const domain = "player.vidzee.wtf";
169
+ const decryptedBytes = decrypter.decrypt(raw, domain);
170
+ if (!decryptedBytes || !decryptedBytes.length) return null;
171
+ const jsonStr = new TextDecoder().decode(decryptedBytes);
172
+ return JSON.parse(jsonStr);
173
+ } catch {
174
+ return null;
67
175
  }
68
176
  }
69
177
 
70
- export async function getStream({ id, s, e, clientIP }) {
71
- const headers = {
72
- 'User-Agent': USER_AGENT,
73
- 'Accept': 'application/json',
74
- 'Referer': PLAYER_URL,
75
- 'Origin': PLAYER_URL,
76
- ...(clientIP && { 'X-Forwarded-For': clientIP })
77
- };
178
+ export async function getStream(args) {
179
+ const { id, s, e } = args;
180
+ const isTv = s != null && e != null;
78
181
 
79
182
  try {
80
- const decKey = await getDecKey(headers);
81
-
82
- const serversToTry = [3, 0, 1, 2, 4, 5, 6, 8];
83
-
84
- for (const sr of serversToTry) {
85
- try {
86
- const url = `${PLAYER_URL}/api/server?id=${id}&sr=${sr}${s ? `&ss=${s}&ep=${e || 1}` : ''}`;
87
- const data = await fetchJson(url, { headers, signal: AbortSignal.timeout(5000) });
88
-
89
- if (data?.url?.length) {
90
- for (const entry of data.url) {
91
- if (!entry.link) continue;
92
-
93
- const decrypted = decrypt(entry.link, decKey);
94
- if (decrypted?.startsWith('http')) {
95
-
96
- return {
97
- allUrls: [
98
- {
99
- url: decrypted,
100
- skipHlsCheck: true,
101
- headers: {
102
- 'User-Agent': USER_AGENT,
103
- 'Referer': PLAYER_URL,
104
- 'Origin': PLAYER_URL
105
- }
106
- }
107
- ]
108
- };
109
- }
110
- }
111
- }
112
- } catch (err) {
113
- continue;
114
- }
115
- }
116
- return null;
117
- } catch (err) {
183
+ const streamPromises = SERVERS.map(async (server) => {
184
+ const endpoint = isTv
185
+ ? `${CORE_ORIGIN}/streams/tv/${encodeURIComponent(id)}/${encodeURIComponent(s)}/${encodeURIComponent(e)}?s=${encodeURIComponent(server.id)}&e=1`
186
+ : `${CORE_ORIGIN}/streams/movie/${encodeURIComponent(id)}?s=${encodeURIComponent(server.id)}&e=1`;
187
+
188
+ const res = await fetch(endpoint, {
189
+ headers: {
190
+ "User-Agent": USER_AGENT,
191
+ "Accept": "application/json, text/plain, */*",
192
+ "Referer": `${PLAYER_ORIGIN}/`,
193
+ "Origin": PLAYER_ORIGIN,
194
+ },
195
+ });
196
+
197
+ if (!res.ok) return null;
198
+ const data = await res.json();
199
+ if (!data?.c) return null;
200
+
201
+ const decoded = await decryptWasmPayload(data.c);
202
+ if (!decoded?.url) return null;
203
+
204
+ const streamUrl = decoded.url;
205
+ const isM3U8 = streamUrl.toLowerCase().includes(".m3u8");
206
+
207
+ return {
208
+ quality: server.name,
209
+ url: streamUrl,
210
+ type: isM3U8 ? "hls" : "mp4",
211
+ headers: {
212
+ "User-Agent": USER_AGENT,
213
+ "Referer": `${PLAYER_ORIGIN}/`,
214
+ "Origin": PLAYER_ORIGIN,
215
+ ...(decoded.headers || {}),
216
+ },
217
+ };
218
+ });
219
+
220
+ const results = await Promise.allSettled(streamPromises);
221
+ const allUrls = results
222
+ .filter((r) => r.status === "fulfilled" && r.value)
223
+ .map((r) => r.value);
224
+
225
+ return allUrls.length ? { allUrls } : null;
226
+ } catch {
118
227
  return null;
119
228
  }
120
229
  }
@@ -13,7 +13,11 @@ const HEADERS = {
13
13
  function extract(regex, text) {
14
14
  const m = text?.match(regex);
15
15
  if (!m) return null;
16
- return m[1].replace(/\\/g, '');
16
+ let val = m[1];
17
+ val = val.replace(/\\u0026/gi, '&');
18
+ val = val.replace(/\\\//g, '/');
19
+ val = val.replace(/\\/g, '');
20
+ return val;
17
21
  }
18
22
 
19
23
  export async function getStream({ id, s, e, absoluteBase }) {
@@ -22,36 +26,40 @@ export async function getStream({ id, s, e, absoluteBase }) {
22
26
  ? `${BASE_URL}/api/tv/${id}/${s}/${e}`
23
27
  : `${BASE_URL}/api/movie/${id}`;
24
28
 
25
- const apiProxy = absoluteBase
29
+ const apiProxy = absoluteBase && absoluteBase !== '/'
26
30
  ? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(apiUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
27
31
  : apiUrl;
28
32
 
29
- const apiText = await fetchText(apiProxy).catch(() => null);
33
+ const apiText = await fetchText(apiProxy, { headers: HEADERS }).catch(() => null);
30
34
  const apiData = JSON.parse(apiText || '{}');
31
35
  if (!apiData.src) return null;
32
36
 
33
37
  const embedUrl = apiData.src.startsWith('http') ? apiData.src : `${BASE_URL}${apiData.src}`;
34
- const embedProxy = absoluteBase
38
+ const embedProxy = absoluteBase && absoluteBase !== '/'
35
39
  ? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(embedUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
36
40
  : embedUrl;
37
41
 
38
- const html = await fetchText(embedProxy).catch(() => null);
42
+ const html = await fetchText(embedProxy, { headers: HEADERS }).catch(() => null);
39
43
  if (!html) return null;
40
44
 
41
45
  const token = extract(/token["']\s*:\s*["']([^"']+)/, html);
42
46
  const expires = extract(/expires["']\s*:\s*["']([^"']+)/, html);
43
47
  let playlist = extract(/url["']\s*:\s*["']([^"']+)/, html);
48
+
44
49
  if (!token || !expires || !playlist) return null;
45
50
 
46
- playlist = playlist.replace(/\\/g, '');
51
+ if (playlist.startsWith('/')) {
52
+ playlist = `${BASE_URL}${playlist}`;
53
+ }
54
+
47
55
  const lang = extract(/lang(?:uage)?["']\s*:\s*["']([a-z]{2,5})/i, html) || 'en';
48
56
  const rawMasterUrl = `${playlist}${playlist.includes('?') ? '&' : '?'}token=${token}&expires=${expires}&h=1&lang=${lang}`;
49
57
 
50
- const masterProxy = absoluteBase
51
- ? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(rawMasterUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
58
+ const masterProxy = absoluteBase && absoluteBase !== '/'
59
+ ? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(rawMasterUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify({ ...HEADERS, Referer: embedUrl }))}`
52
60
  : rawMasterUrl;
53
61
 
54
- const playlistText = await fetchText(rawMasterUrl, { headers: HEADERS }).catch(() => null);
62
+ const playlistText = await fetchText(masterProxy, { headers: { ...HEADERS, 'Referer': embedUrl } }).catch(() => null);
55
63
  if (!playlistText?.includes('#EXTM3U')) return null;
56
64
 
57
65
  let finalUrl = null;
@@ -74,17 +82,23 @@ export async function getStream({ id, s, e, absoluteBase }) {
74
82
  if (!finalUrl) finalUrl = rawMasterUrl;
75
83
 
76
84
  if (!finalUrl.startsWith('http')) {
77
- const base = rawMasterUrl.split('/playlist/')[0];
78
- finalUrl = finalUrl.startsWith('/') ? `${base}${finalUrl}` : `${base}/${finalUrl}`;
85
+ const baseMatch = rawMasterUrl.match(/^(https?:\/\/[^\/]+)/);
86
+ const base = baseMatch ? baseMatch[1] : BASE_URL;
87
+ if (finalUrl.startsWith('/')) {
88
+ finalUrl = `${base}${finalUrl}`;
89
+ } else {
90
+ const pathParts = rawMasterUrl.split('/');
91
+ pathParts.pop();
92
+ finalUrl = `${pathParts.join('/')}/${finalUrl}`;
93
+ }
79
94
  }
80
95
 
81
- const alreadyProxied = /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?\/api\?url=/.test(finalUrl);
82
-
83
96
  return {
84
97
  allUrls: [
85
98
  {
86
99
  url: finalUrl,
87
- skipProxy: alreadyProxied,
100
+ server: 'VixSrc',
101
+ skipProxy: true,
88
102
  headers: {
89
103
  ...HEADERS,
90
104
  'Referer': `${BASE_URL}/`
package/src/subtitles.js CHANGED
@@ -3,7 +3,6 @@ import { getUA } from './utils/helpers.js';
3
3
  const SUBTITLE_BASES = [
4
4
  'https://sub.vdrk.site/v1',
5
5
  'https://sub.vdrk.site/v2',
6
- 'https://fed-subs.pstream.mov'
7
6
  ];
8
7
  const VYLIAN_MESSAGES = [
9
8
  "Thanks for using Vyla!"
@@ -63,23 +62,6 @@ export async function fetchSubtitles(paths = []) {
63
62
  : [];
64
63
  }
65
64
 
66
- if (base.includes('fed-subs.pstream.mov')) {
67
- if (!data?.subtitles || typeof data.subtitles !== 'object') return [];
68
-
69
- return Object.entries(data.subtitles)
70
- .map(([language, sub]) => {
71
- if (!sub?.subtitle_link) return null;
72
- const ext = sub.subtitle_link.split('.').pop()?.toLowerCase();
73
- return {
74
- label: sub.subtitle_name || language,
75
- file: sub.subtitle_link,
76
- type: ext === 'vtt' ? 'vtt' : 'srt',
77
- source: 'febbox'
78
- };
79
- })
80
- .filter(Boolean);
81
- }
82
-
83
65
  const v1 = Array.isArray(data) ? data : [];
84
66
  return v1.map(x => ({
85
67
  label: x.label,
@@ -67,8 +67,7 @@ function cacheGet(cache, key) {
67
67
 
68
68
  function cacheSet(cache, key, val, ttl) { cache.set(key, { val, ts: Date.now(), ttl }); }
69
69
 
70
- export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP=null) {
71
- const getAbsoluteBase = host => (host.startsWith('localhost') || host.startsWith('127.0.0.1')) ? `http://${host}` : `https://${host}`;
70
+ export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP = null) {
72
71
  const audio = /dub$/.test(source.key) ? 'dub' : 'sub';
73
72
  return {
74
73
  id: id,
@@ -83,13 +82,25 @@ export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP=nu
83
82
  }
84
83
 
85
84
  export async function validateTmdbId(tmdbApiKey, tmdbId, mediaType = 'movie') {
86
- const key = `${tmdbId}-${mediaType}`;
85
+ let apiKey = tmdbApiKey;
86
+ let id = tmdbId;
87
+ let type = mediaType;
88
+ if (id === 'movie' || id === 'tv' || !id) {
89
+ if (apiKey && apiKey !== 'movie' && apiKey !== 'tv') {
90
+ type = id || 'movie';
91
+ id = apiKey;
92
+ apiKey = process.env.TMDB_API_KEY;
93
+ }
94
+ }
95
+ if (!apiKey) {
96
+ apiKey = process.env.TMDB_API_KEY;
97
+ }
98
+ const key = `${id}-${type}`;
87
99
  const cached = cacheGet(tmdbValidationCache, key);
88
100
  if (cached !== undefined) return cached;
89
- const k = tmdbApiKey;
90
- if (!k) return { valid: false, error: 'TMDB API key not configured' };
101
+ if (!apiKey) return { valid: false, error: 'TMDB API key not configured' };
91
102
  try {
92
- const res = await fetch(`https://api.themoviedb.org/3/${mediaType}/${tmdbId}?api_key=${k}`, { signal: AbortSignal.timeout(5000) });
103
+ const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}`, { signal: AbortSignal.timeout(5000) });
93
104
  if (res.ok) {
94
105
  const data = await res.json();
95
106
  const isValid = !!(data?.id && (data?.title || data?.name));
@@ -108,15 +119,30 @@ export async function validateTmdbId(tmdbApiKey, tmdbId, mediaType = 'movie') {
108
119
  }
109
120
 
110
121
  export async function getTmdbInfo(tmdbApiKey, tmdbId, mediaType, season) {
111
- const key = `${tmdbId}-${mediaType}-${season || ''}`;
122
+ let apiKey = tmdbApiKey;
123
+ let id = tmdbId;
124
+ let type = mediaType;
125
+ let s = season;
126
+ if (apiKey === 'movie' || apiKey === 'tv') {
127
+ type = apiKey;
128
+ id = tmdbId;
129
+ apiKey = process.env.TMDB_API_KEY;
130
+ } else if (id === 'movie' || id === 'tv') {
131
+ type = id;
132
+ id = apiKey;
133
+ apiKey = process.env.TMDB_API_KEY;
134
+ }
135
+ if (!apiKey) {
136
+ apiKey = process.env.TMDB_API_KEY;
137
+ }
138
+ const key = `${id}-${type}-${s || ''}`;
112
139
  const cached = cacheGet(tmdbInfoCache, key);
113
140
  if (cached !== undefined) return cached;
114
- const k = tmdbApiKey;
115
- if (!k) return { isAnime: false, titles: [], year: null, imdbId: null };
141
+ if (!apiKey) return { isAnime: false, titles: [], year: null, imdbId: null };
116
142
  try {
117
143
  const [mainRes, seasonRes] = await Promise.all([
118
- fetch(`https://api.themoviedb.org/3/${mediaType}/${tmdbId}?api_key=${k}&append_to_response=external_ids`, { signal: AbortSignal.timeout(5000) }),
119
- season && mediaType === 'tv' ? fetch(`https://api.themoviedb.org/3/tv/${tmdbId}/season/${season}?api_key=${k}`, { signal: AbortSignal.timeout(5000) }) : Promise.resolve(null),
144
+ fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}&append_to_response=external_ids`, { signal: AbortSignal.timeout(5000) }),
145
+ s && type === 'tv' ? fetch(`https://api.themoviedb.org/3/tv/${id}/season/${s}?api_key=${apiKey}`, { signal: AbortSignal.timeout(5000) }) : Promise.resolve(null),
120
146
  ]);
121
147
  let mainData = null, seasonData = null;
122
148
  if (mainRes.ok) mainData = await mainRes.json(); else mainRes.body?.cancel();
@@ -125,10 +151,10 @@ export async function getTmdbInfo(tmdbApiKey, tmdbId, mediaType, season) {
125
151
  const isAnime = genres.some(g => g.id === 16) && ((mainData?.origin_country || []).includes('JP') || mainData?.original_language === 'ja');
126
152
  const titles = [];
127
153
  if (seasonData?.name) titles.push(seasonData.name);
128
- const t = mainData?.title || mainData?.name || '';
154
+ const titleText = mainData?.title || mainData?.name || '';
129
155
  const ot = mainData?.original_title || mainData?.original_name || '';
130
- if (t) titles.push(t);
131
- if (ot && ot !== t) titles.push(ot);
156
+ if (titleText) titles.push(titleText);
157
+ if (ot && ot !== titleText) titles.push(ot);
132
158
  const dateStr = seasonData?.air_date || mainData?.release_date || mainData?.first_air_date || '';
133
159
  const result = { isAnime, titles: [...new Set(titles.filter(Boolean))], year: dateStr ? parseInt(dateStr.slice(0, 4), 10) : null, imdbId: mainData?.imdb_id || mainData?.external_ids?.imdb_id || null };
134
160
  cacheSet(tmdbInfoCache, key, result, 600000);
@@ -178,16 +204,26 @@ export async function tmdbToAnilist(tmdbId, mediaType, season, titles = [], year
178
204
  }
179
205
 
180
206
  export async function imdbToTmdb(tmdbApiKey, imdbId, mediaType = 'movie') {
181
- const key = `imdb-${imdbId}`;
207
+ let apiKey = tmdbApiKey;
208
+ let id = imdbId;
209
+ let type = mediaType;
210
+ if (id === 'movie' || id === 'tv') {
211
+ type = id;
212
+ id = apiKey;
213
+ apiKey = process.env.TMDB_API_KEY;
214
+ }
215
+ if (!apiKey) {
216
+ apiKey = process.env.TMDB_API_KEY;
217
+ }
218
+ const key = `imdb-${id}`;
182
219
  const cached = cacheGet(tmdbInfoCache, key);
183
220
  if (cached !== undefined) return cached;
184
- const k = tmdbApiKey;
185
- if (!k) return null;
221
+ if (!apiKey) return null;
186
222
  try {
187
- const data = await fetchJson(`https://api.themoviedb.org/3/find/${imdbId}?api_key=${k}&external_source=imdb_id`, { signal: AbortSignal.timeout(5000) });
223
+ const data = await fetchJson(`https://api.themoviedb.org/3/find/${id}?api_key=${apiKey}&external_source=imdb_id`, { signal: AbortSignal.timeout(5000) });
188
224
  let result = null;
189
- if (mediaType === 'movie' && data.movie_results?.length) result = data.movie_results[0].id;
190
- else if (mediaType === 'tv' && data.tv_results?.length) result = data.tv_results[0].id;
225
+ if (type === 'movie' && data.movie_results?.length) result = data.movie_results[0].id;
226
+ else if (type === 'tv' && data.tv_results?.length) result = data.tv_results[0].id;
191
227
  if (result) cacheSet(tmdbInfoCache, key, result, 600000);
192
228
  return result;
193
229
  } catch { return null; }