@vyla-entertainment/sdk 1.20.0 → 1.22.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.
Files changed (58) hide show
  1. package/package.json +3 -2
  2. package/src/config.js +99 -67
  3. package/src/health.js +60 -20
  4. package/src/sdk.d.ts +94 -121
  5. package/src/sdk.js +82 -78
  6. package/src/sources/111477.js +88 -100
  7. package/src/sources/123anime.js +120 -56
  8. package/src/sources/3eyedraven.js +82 -135
  9. package/src/sources/4movies.js +77 -0
  10. package/src/sources/aether.js +99 -0
  11. package/src/sources/castle.js +415 -0
  12. package/src/sources/cinecat.js +37 -18
  13. package/src/sources/cinemaarmy.js +179 -180
  14. package/src/sources/cinesrc.js +401 -397
  15. package/src/sources/cno.js +101 -94
  16. package/src/sources/dulo.js +134 -149
  17. package/src/sources/flaxmovies.js +114 -105
  18. package/src/sources/framextv.js +126 -0
  19. package/src/sources/frost.js +38 -29
  20. package/src/sources/fsonline.js +95 -47
  21. package/src/sources/hdhub.js +43 -36
  22. package/src/sources/hexa.js +60 -53
  23. package/src/sources/hyper.js +42 -35
  24. package/src/sources/kickassanime.js +117 -124
  25. package/src/sources/kisskh.js +114 -59
  26. package/src/sources/lmscript.js +72 -70
  27. package/src/sources/lookmovie.js +80 -79
  28. package/src/sources/meowtv.js +140 -0
  29. package/src/sources/movenerds.js +74 -124
  30. package/src/sources/movy.js +197 -209
  31. package/src/sources/net79.js +59 -55
  32. package/src/sources/peestream.js +126 -138
  33. package/src/sources/pengu.js +46 -49
  34. package/src/sources/pstream.js +73 -67
  35. package/src/sources/purstream.js +96 -104
  36. package/src/sources/rivestream.js +182 -176
  37. package/src/sources/rivo.js +58 -53
  38. package/src/sources/streamaggregator.js +114 -128
  39. package/src/sources/thugtv.js +70 -62
  40. package/src/sources/vidapi.js +122 -114
  41. package/src/sources/vidcore.js +14 -122
  42. package/src/sources/vidfast.js +14 -122
  43. package/src/sources/vidlink.js +78 -27
  44. package/src/sources/vidora.js +74 -42
  45. package/src/sources/vidup.js +14 -122
  46. package/src/sources/vidvault.js +133 -187
  47. package/src/sources/vidy.js +192 -187
  48. package/src/sources/vidzee.js +189 -183
  49. package/src/sources/vixsrc.js +123 -113
  50. package/src/sources/watchout.js +60 -46
  51. package/src/sources/xdownloader.js +127 -128
  52. package/src/sources/yapgrid.js +68 -62
  53. package/src/sources/yastream.js +35 -29
  54. package/src/subtitles.js +105 -122
  55. package/src/utils/helpers.js +586 -247
  56. package/src/sources/bcine.js +0 -202
  57. package/src/sources/cinezo.js +0 -55
  58. package/src/sources/vidrock.js +0 -145
@@ -1,398 +1,402 @@
1
- import { fetchJson, fetchText } from '../utils/helpers.js';
2
-
3
- const API = "https://enc-dec.app/api";
4
-
5
- async function solveStage1(challenge1, seed) {
6
- const K = [
7
- 0x46C6C721, 0x4230C311, 0x18223A1D, 0x56389BA7,
8
- 0xD4A87103, 0x07CB9E2F, 0x73085F9D, 0xD2396A1F,
9
- 0x23AE5ADD, 0x4646C48F, 0x0F4E0903, 0x808F5F31,
10
- 0x953D4E07, 0x7E238FFF, 0x634595DF, 0xCB5E4301,
11
- ];
12
-
13
- const SCHEDULES = [
14
- [0, 7, 6, 3, 2, 1, 5, 4, 0, 2, 4, 6, 5, 1, 7, 3],
15
- [5, 2, 1, 3, 0, 4, 6, 7, 4, 1, 0, 7, 3, 6, 5, 2],
16
- [4, 0, 2, 1, 5, 7, 6, 3, 2, 6, 0, 7, 4, 3, 5, 1],
17
- [5, 4, 7, 0, 2, 3, 1, 6, 5, 1, 4, 0, 7, 2, 3, 6],
18
- [4, 7, 0, 2, 1, 6, 5, 3, 6, 1, 3, 2, 0, 7, 4, 5],
19
- [0, 7, 2, 6, 3, 4, 5, 1, 6, 5, 0, 2, 7, 1, 4, 3],
20
- [0, 4, 5, 3, 1, 7, 2, 6, 3, 7, 5, 6, 1, 0, 2, 4],
21
- [7, 6, 0, 4, 2, 5, 1, 3, 7, 5, 3, 4, 2, 6, 0, 1],
22
- ];
23
-
24
- const PERMUTATIONS = [
25
- [3, 5, 1, 0, 2, 4],
26
- [2, 0, 4, 5, 3, 1],
27
- [1, 4, 5, 3, 0, 2],
28
- [2, 0, 1, 5, 4, 3],
29
- [4, 2, 1, 0, 3, 5],
30
- [5, 0, 2, 1, 3, 4],
31
- [4, 5, 1, 0, 3, 2],
32
- [4, 0, 3, 5, 1, 2],
33
- ];
34
-
35
- const u32 = x => x >>> 0;
36
- const rotl = (x, n) => u32((x << (n & 31)) | (x >>> (32 - (n & 31))));
37
- const imul = (a, b) => {
38
- const ah = (a >>> 16) & 0xffff;
39
- const al = a & 0xffff;
40
- const bh = (b >>> 16) & 0xffff;
41
- const bl = b & 0xffff;
42
- return u32((ah * bl + al * bh) << 16) + al * bl;
43
- };
44
-
45
- const b64dec = s => {
46
- const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));
47
- const bytes = new Uint8Array(bin.length);
48
- for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
49
- return bytes;
50
- };
51
-
52
- const c = b64dec(challenge1.w);
53
- const view = new DataView(c.buffer);
54
- const mode = c[21];
55
- const diffVal = c[22];
56
- const var_ = c[23];
57
- const rnd = c[24];
58
- const m_b = c[25];
59
- const s_i = c[26];
60
- const p_i = c[27];
61
-
62
- const w0 = view.getUint32(0, true);
63
- const w1 = view.getUint32(4, true);
64
- const w2 = view.getUint32(8, true);
65
- const w3 = view.getUint32(12, true);
66
- const w = [w0, w1, w2, w3];
67
-
68
- const size = 1 << m_b;
69
- const s = new Uint32Array(size);
70
- let x = u32(w[var_ & 3] ^ K[s_i] ^ imul(K[8 + s_i], var_ + 1));
71
- let y = u32(w[(var_ + 1) & 3] ^ K[15 - s_i]);
72
-
73
- for (let i = 0; i < size; i++) {
74
- x = u32(w[(i + s_i) & 3] + x + imul(K[(i + var_) & 15], i + 1));
75
- x = u32(x ^ (x << 13));
76
- x = u32(x ^ (x >>> 17));
77
- x = u32(x ^ (x << 5));
78
- y = rotl(imul(K[(i + 9) & 15], i + 3) ^ y ^ x, i + var_ + s_i);
79
- s[i] = u32(imul(K[(i + 5) & 15], i ^ var_) ^ rotl(w[(i + var_) & 3], i + s_i) ^ x ^ y);
80
- }
81
-
82
- const seedBytes = new Uint8Array(seed.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
83
- const msg = new Uint8Array(88);
84
- msg.set(c.slice(0, 16), 24);
85
-
86
- const cfg = m_b ^ 0x6B29;
87
- msg[48] = 4;
88
- msg[49] = mode;
89
- msg[50] = var_;
90
- msg[51] = s_i;
91
- msg[52] = p_i;
92
- msg[53] = rnd;
93
- msg[54] = cfg & 0xff;
94
- msg[55] = cfg >> 8;
95
- msg.set(seedBytes, 56);
96
-
97
- const mask = size - 1;
98
- const sch = SCHEDULES[s_i];
99
- const perm = PERMUTATIONS[p_i];
100
-
101
- let n = 0n;
102
- while (true) {
103
- const lo = Number(n & 0xffffffffn);
104
- const hi = Number(n >> 32n);
105
-
106
- let ma = u32(w[0] ^ K[var_] ^ lo);
107
- let mb = u32(rotl(lo, var_ + 7) ^ w[2]);
108
- let mc = u32(w[1] ^ K[8 + s_i] ^ hi);
109
- let md = u32(rotl(lo ^ hi, s_i + 11) ^ w[3]);
110
- let me = u32(K[s_i + var_] ^ lo ^ hi);
111
- let mf = u32(K[15 - var_] ^ w[s_i & 3]);
112
-
113
- for (let r = 0; r < rnd; r++) {
114
- const i1 = u32(rotl(mb, r + 1) ^ imul(K[r & 15], mf) ^ me ^ ma) & mask;
115
- const v1 = s[i1];
116
- const i2 = u32(rotl(me, var_ + r + 3) ^ imul(K[(r + 7) & 15], md) ^ mc ^ v1) & mask;
117
- const op = sch[r];
118
-
119
- if (op === 0) {
120
- ma = rotl(u32(ma + md + v1), 5);
121
- mc = u32(imul(mc ^ mf ^ ma, 1187432225) + mb);
122
- } else if (op === 1) {
123
- mb = rotl(mc ^ me ^ mb ^ v1, 11);
124
- md = u32(imul(mb ^ ma, 1110491921) + md);
125
- } else if (op === 2) {
126
- mc = rotl(u32(mc + mb + v1), 17);
127
- ma = u32(imul(md ^ mf ^ mc, 404896285) ^ ma);
128
- } else if (op === 3) {
129
- md = rotl(ma ^ md ^ v1, 23);
130
- mb = u32(imul(mc ^ me ^ md, 1446550439) + mb);
131
- } else if (op === 4) {
132
- ma = u32(imul(ma ^ me ^ v1, -727158525) + rotl(mb, 7));
133
- md = u32(rotl(u32(mc + mf + ma), 13) ^ md);
134
- } else if (op === 5) {
135
- mc = u32(imul(u32(mc + mf + v1), 130784815) ^ rotl(md, 9));
136
- mb = u32(rotl(ma ^ me ^ mc, 19) + mb);
137
- } else if (op === 6) {
138
- mb = u32(imul(mb ^ mf ^ v1, 1929928605) + rotl(ma, 3));
139
- mc = u32(rotl(u32(md + me + mb), 15) ^ mc);
140
- } else {
141
- md = u32(imul(u32(md + me + v1), -767989217) ^ rotl(mc, 21));
142
- ma = u32(rotl(mb ^ mf ^ md, 27) + ma);
143
- }
144
-
145
- const v2 = s[i2];
146
- if (((mf ^ r ^ v1) & 1) === 0) {
147
- mf = rotl(u32(v2 + mf + ma), r + 5);
148
- me = u32(imul(K[8 + op], v2 ^ me ^ mf) + md);
149
- } else {
150
- me = rotl(v2 ^ me ^ mb, r + 9);
151
- mf = u32(imul(K[(op + 11) & 15], u32(v2 + mf + me)) ^ mc);
152
- }
153
- }
154
-
155
- const mArr = [ma, mc, mb, md, mf, me];
156
- const v = perm.map(idx => mArr[idx]);
157
-
158
- const msgView = new DataView(msg.buffer);
159
- msgView.setUint32(0, v[0], true);
160
- msgView.setUint32(4, v[1], true);
161
- msgView.setUint32(8, v[2], true);
162
- msgView.setUint32(12, v[3], true);
163
- msgView.setUint32(16, v[4], true);
164
- msgView.setUint32(20, v[5], true);
165
- msgView.setBigUint64(40, n, true);
166
-
167
- const hashBuf = await crypto.subtle.digest('SHA-256', msg);
168
- const hashBytes = new Uint8Array(hashBuf);
169
-
170
- const b = Math.floor(diffVal / 8);
171
- const rBits = diffVal % 8;
172
- let ok = true;
173
- for (let i = 0; i < b; i++) {
174
- if (hashBytes[i] !== 0) {
175
- ok = false;
176
- break;
177
- }
178
- }
179
- if (ok && (rBits === 0 || (hashBytes[b] >> (8 - rBits)) === 0)) {
180
- return `m4.${n.toString(16)}`;
181
- }
182
- n++;
183
- }
184
- }
185
-
186
- async function solveStage2(data) {
187
- const target = data.pack[0].split('').reverse().join('');
188
- const salt = data.pack[3].split('').reverse().join('');
189
- const r = data.pack[4].split('').reverse().join('');
190
-
191
- const b64decStr = s => decodeURIComponent(escape(atob(s.replace(/-/g, '+').replace(/_/g, '/'))));
192
- const body = b64decStr(r.split('.')[1]);
193
- const payload = b64decStr(body.split('.')[1]);
194
- const difficulty = JSON.parse(payload).d;
195
-
196
- const width = Math.floor((difficulty + 3) / 4);
197
- const limit = 1 << difficulty;
198
-
199
- for (let counter = 0; counter < limit; counter++) {
200
- const key = counter.toString(16).padStart(width, '0');
201
- const msgUint8 = new TextEncoder().encode(salt + key);
202
- const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
203
- const hashArray = Array.from(new Uint8Array(hashBuffer));
204
- const digest = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
205
-
206
- if (digest === target) {
207
- return key;
208
- }
209
- }
210
- throw new Error('no solution found');
211
- }
212
-
213
- export async function getStream({ id, s, e }) {
214
- const isTv = s != null && e != null;
215
- const type = isTv ? 'tv' : 'movie';
216
- const url = isTv
217
- ? `https://cinesrc.st/embed/tv/${id}?s=${s}&e=${e}`
218
- : `https://cinesrc.st/embed/movie/${id}`;
219
-
220
- const headers = {
221
- "Origin": "https://cinesrc.st",
222
- "Referer": "https://cinesrc.st/",
223
- "Content-Type": "text/plain;charset=UTF-8",
224
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.37 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.37"
225
- };
226
-
227
- const fields = [type, id, s ? String(s) : null, e ? String(e) : null];
228
- const encoded = btoa(JSON.stringify(fields).replace(/ /g, '')).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
229
-
230
- const bootstrapHeaders = { ...headers, "x-cs-q": encoded };
231
- const bootstrap = await fetchJson("https://cinesrc.st/api/c/bootstrap", {
232
- method: "POST",
233
- headers: bootstrapHeaders,
234
- body: "{}"
235
- });
236
-
237
- const cookies = {
238
- "x-cs-b": "20261014-a",
239
- "x-cs-q": encoded,
240
- "x-cs-r": bootstrap.r,
241
- "x-cs-p": bootstrap.p,
242
- };
243
-
244
- const challenge1 = await fetchJson("https://cinesrc.st/api/c/issue", {
245
- headers: { ...headers, ...cookies }
246
- });
247
-
248
- const payload1 = {
249
- data: {
250
- url,
251
- user_agent: headers["User-Agent"],
252
- challenge_data: challenge1
253
- },
254
- type: "seed"
255
- };
256
-
257
- const seedRes = await fetchJson(`${API}/enc-cinesrc`, {
258
- method: "POST",
259
- headers: { "Content-Type": "application/json" },
260
- body: JSON.stringify(payload1)
261
- });
262
-
263
- const seedData = seedRes.result;
264
- const solution1 = await solveStage1(challenge1, seedData.seed);
265
-
266
- const challenge2 = await fetchJson("https://cinesrc.st/api/c/stage2/issue", {
267
- headers: { ...headers, ...cookies }
268
- });
269
- const solution2 = await solveStage2(challenge2);
270
-
271
- const payload2 = {
272
- data: {
273
- url,
274
- user_agent: headers["User-Agent"],
275
- challenge_data: {
276
- stage1: { challenge: challenge1, solution: solution1 },
277
- stage2: { challenge: challenge2, solution: solution2 }
278
- },
279
- state: seedData.state
280
- },
281
- type: "encrypt"
282
- };
283
-
284
- const encryptRes = await fetchJson(`${API}/enc-cinesrc`, {
285
- method: "POST",
286
- headers: { "Content-Type": "application/json" },
287
- body: JSON.stringify(payload2)
288
- });
289
-
290
- const encData = encryptRes.result;
291
- const token = `${encData.token}::c3::${cookies["x-cs-r"]}`;
292
- const nextActions = encData.headers;
293
-
294
- const providersText = await fetchText(url, {
295
- method: "POST",
296
- headers: { ...headers, ...cookies, "Next-Action": nextActions.getProviderList },
297
- body: JSON.stringify([])
298
- });
299
-
300
- const lines = providersText.split('\n');
301
- let providers = null;
302
- for (const rawLine of lines) {
303
- const colonIndex = rawLine.indexOf(':');
304
- if (colonIndex !== -1) {
305
- const candidate = rawLine.slice(colonIndex + 1).trim();
306
- if (candidate.startsWith('[') && candidate.endsWith(']')) {
307
- try {
308
- providers = JSON.parse(candidate);
309
- break;
310
- } catch { }
311
- }
312
- }
313
- }
314
-
315
- if (!Array.isArray(providers) || providers.length === 0) return null;
316
-
317
- const allUrls = [];
318
-
319
- for (const providerObj of providers) {
320
- const provider = providerObj.id;
321
- const streamPayload = [
322
- id,
323
- isTv ? "show" : type,
324
- isTv ? String(s) : "$undefined",
325
- isTv ? String(e) : "$undefined",
326
- token,
327
- provider
328
- ];
329
-
330
- let streamRes;
331
- try {
332
- streamRes = await fetchText(url, {
333
- method: "POST",
334
- headers: { ...headers, ...cookies, "Next-Action": nextActions.getStream },
335
- body: JSON.stringify(streamPayload)
336
- });
337
- } catch {
338
- continue;
339
- }
340
-
341
- if (!streamRes || streamRes.includes('"status":500') || streamRes.includes('invalid_challenge') || streamRes.length < 10) continue;
342
-
343
- let decryptRes;
344
- try {
345
- decryptRes = await fetchJson(`${API}/dec-cinesrc`, {
346
- method: "POST",
347
- headers: { "Content-Type": "application/json" },
348
- body: JSON.stringify({ text: streamRes, state: encData.state })
349
- });
350
- } catch {
351
- continue;
352
- }
353
-
354
- if (decryptRes && decryptRes.status === 200 && decryptRes.result) {
355
- let resultData = decryptRes.result;
356
- if (typeof resultData === 'string') {
357
- try {
358
- resultData = JSON.parse(resultData);
359
- } catch { }
360
- }
361
-
362
- let streamUrl = null;
363
- if (Array.isArray(resultData?.url)) {
364
- streamUrl = resultData.url[0]?.url;
365
- } else if (typeof resultData?.url === 'string') {
366
- streamUrl = resultData.url;
367
- } else if (resultData?.file) {
368
- streamUrl = resultData.file;
369
- } else if (Array.isArray(resultData?.sources)) {
370
- streamUrl = resultData.sources[0]?.url;
371
- }
372
-
373
- if (streamUrl) {
374
- if (streamUrl.startsWith('/')) {
375
- streamUrl = `https://cinesrc.st${streamUrl}`;
376
- }
377
-
378
- allUrls.push({
379
- url: streamUrl,
380
- server: `CineSrc - ${providerObj.name || provider}`,
381
- headers: resultData.headers || {
382
- Referer: "https://cinesrc.st/",
383
- Origin: "https://cinesrc.st"
384
- }
385
- });
386
- break;
387
- }
388
- }
389
- }
390
-
391
- if (!allUrls.length) return null;
392
-
393
- return {
394
- url: allUrls[0].url,
395
- headers: allUrls[0].headers,
396
- allUrls
397
- };
1
+ import { fetchJson, fetchText } from '../utils/helpers.js';
2
+
3
+ const API = 'https://enc-dec.app/api';
4
+
5
+ async function solveStage1(challenge1, seed) {
6
+ const K = [
7
+ 0x46C6C721, 0x4230C311, 0x18223A1D, 0x56389BA7,
8
+ 0xD4A87103, 0x07CB9E2F, 0x73085F9D, 0xD2396A1F,
9
+ 0x23AE5ADD, 0x4646C48F, 0x0F4E0903, 0x808F5F31,
10
+ 0x953D4E07, 0x7E238FFF, 0x634595DF, 0xCB5E4301,
11
+ ];
12
+
13
+ const SCHEDULES = [
14
+ [0, 7, 6, 3, 2, 1, 5, 4, 0, 2, 4, 6, 5, 1, 7, 3],
15
+ [5, 2, 1, 3, 0, 4, 6, 7, 4, 1, 0, 7, 3, 6, 5, 2],
16
+ [4, 0, 2, 1, 5, 7, 6, 3, 2, 6, 0, 7, 4, 3, 5, 1],
17
+ [5, 4, 7, 0, 2, 3, 1, 6, 5, 1, 4, 0, 7, 2, 3, 6],
18
+ [4, 7, 0, 2, 1, 6, 5, 3, 6, 1, 3, 2, 0, 7, 4, 5],
19
+ [0, 7, 2, 6, 3, 4, 5, 1, 6, 5, 0, 2, 7, 1, 4, 3],
20
+ [0, 4, 5, 3, 1, 7, 2, 6, 3, 7, 5, 6, 1, 0, 2, 4],
21
+ [7, 6, 0, 4, 2, 5, 1, 3, 7, 5, 3, 4, 2, 6, 0, 1],
22
+ ];
23
+
24
+ const PERMUTATIONS = [
25
+ [3, 5, 1, 0, 2, 4],
26
+ [2, 0, 4, 5, 3, 1],
27
+ [1, 4, 5, 3, 0, 2],
28
+ [2, 0, 1, 5, 4, 3],
29
+ [4, 2, 1, 0, 3, 5],
30
+ [5, 0, 2, 1, 3, 4],
31
+ [4, 5, 1, 0, 3, 2],
32
+ [4, 0, 3, 5, 1, 2],
33
+ ];
34
+
35
+ const u32 = x => x >>> 0;
36
+ const rotl = (x, n) => u32((x << (n & 31)) | (x >>> (32 - (n & 31))));
37
+ const imul = (a, b) => {
38
+ const ah = (a >>> 16) & 0xffff;
39
+ const al = a & 0xffff;
40
+ const bh = (b >>> 16) & 0xffff;
41
+ const bl = b & 0xffff;
42
+ return u32((ah * bl + al * bh) << 16) + al * bl;
43
+ };
44
+
45
+ const b64dec = s => {
46
+ const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));
47
+ const bytes = new Uint8Array(bin.length);
48
+ for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
49
+ return bytes;
50
+ };
51
+
52
+ const c = b64dec(challenge1.w);
53
+ const view = new DataView(c.buffer);
54
+ const mode = c[21];
55
+ const diffVal = c[22];
56
+ const var_ = c[23];
57
+ const rnd = c[24];
58
+ const m_b = c[25];
59
+ const s_i = c[26];
60
+ const p_i = c[27];
61
+
62
+ const w0 = view.getUint32(0, true);
63
+ const w1 = view.getUint32(4, true);
64
+ const w2 = view.getUint32(8, true);
65
+ const w3 = view.getUint32(12, true);
66
+ const w = [w0, w1, w2, w3];
67
+
68
+ const size = 1 << m_b;
69
+ const s = new Uint32Array(size);
70
+ let x = u32(w[var_ & 3] ^ K[s_i] ^ imul(K[8 + s_i], var_ + 1));
71
+ let y = u32(w[(var_ + 1) & 3] ^ K[15 - s_i]);
72
+
73
+ for (let i = 0; i < size; i++) {
74
+ x = u32(w[(i + s_i) & 3] + x + imul(K[(i + var_) & 15], i + 1));
75
+ x = u32(x ^ (x << 13));
76
+ x = u32(x ^ (x >>> 17));
77
+ x = u32(x ^ (x << 5));
78
+ y = rotl(imul(K[(i + 9) & 15], i + 3) ^ y ^ x, i + var_ + s_i);
79
+ s[i] = u32(imul(K[(i + 5) & 15], i ^ var_) ^ rotl(w[(i + var_) & 3], i + s_i) ^ x ^ y);
80
+ }
81
+
82
+ const seedBytes = new Uint8Array(seed.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
83
+ const msg = new Uint8Array(88);
84
+ msg.set(c.slice(0, 16), 24);
85
+
86
+ const cfg = m_b ^ 0x6B29;
87
+ msg[48] = 4;
88
+ msg[49] = mode;
89
+ msg[50] = var_;
90
+ msg[51] = s_i;
91
+ msg[52] = p_i;
92
+ msg[53] = rnd;
93
+ msg[54] = cfg & 0xff;
94
+ msg[55] = cfg >> 8;
95
+ msg.set(seedBytes, 56);
96
+
97
+ const mask = size - 1;
98
+ const sch = SCHEDULES[s_i];
99
+ const perm = PERMUTATIONS[p_i];
100
+
101
+ let n = 0n;
102
+ while (true) {
103
+ const lo = Number(n & 0xffffffffn);
104
+ const hi = Number(n >> 32n);
105
+
106
+ let ma = u32(w[0] ^ K[var_] ^ lo);
107
+ let mb = u32(rotl(lo, var_ + 7) ^ w[2]);
108
+ let mc = u32(w[1] ^ K[8 + s_i] ^ hi);
109
+ let md = u32(rotl(lo ^ hi, s_i + 11) ^ w[3]);
110
+ let me = u32(K[s_i + var_] ^ lo ^ hi);
111
+ let mf = u32(K[15 - var_] ^ w[s_i & 3]);
112
+
113
+ for (let r = 0; r < rnd; r++) {
114
+ const i1 = u32(rotl(mb, r + 1) ^ imul(K[r & 15], mf) ^ me ^ ma) & mask;
115
+ const v1 = s[i1];
116
+ const i2 = u32(rotl(me, var_ + r + 3) ^ imul(K[(r + 7) & 15], md) ^ mc ^ v1) & mask;
117
+ const op = sch[r];
118
+
119
+ if (op === 0) {
120
+ ma = rotl(u32(ma + md + v1), 5);
121
+ mc = u32(imul(mc ^ mf ^ ma, 1187432225) + mb);
122
+ } else if (op === 1) {
123
+ mb = rotl(mc ^ me ^ mb ^ v1, 11);
124
+ md = u32(imul(mb ^ ma, 1110491921) + md);
125
+ } else if (op === 2) {
126
+ mc = rotl(u32(mc + mb + v1), 17);
127
+ ma = u32(imul(md ^ mf ^ mc, 404896285) ^ ma);
128
+ } else if (op === 3) {
129
+ md = rotl(ma ^ md ^ v1, 23);
130
+ mb = u32(imul(mc ^ me ^ md, 1446550439) + mb);
131
+ } else if (op === 4) {
132
+ ma = u32(imul(ma ^ me ^ v1, -727158525) + rotl(mb, 7));
133
+ md = u32(rotl(u32(mc + mf + ma), 13) ^ md);
134
+ } else if (op === 5) {
135
+ mc = u32(imul(u32(mc + mf + v1), 130784815) ^ rotl(md, 9));
136
+ mb = u32(rotl(ma ^ me ^ mc, 19) + mb);
137
+ } else if (op === 6) {
138
+ mb = u32(imul(mb ^ mf ^ v1, 1929928605) + rotl(ma, 3));
139
+ mc = u32(rotl(u32(md + me + mb), 15) ^ mc);
140
+ } else {
141
+ md = u32(imul(u32(md + me + v1), -767989217) ^ rotl(mc, 21));
142
+ ma = u32(rotl(mb ^ mf ^ md, 27) + ma);
143
+ }
144
+
145
+ const v2 = s[i2];
146
+ if (((mf ^ r ^ v1) & 1) === 0) {
147
+ mf = rotl(u32(v2 + mf + ma), r + 5);
148
+ me = u32(imul(K[8 + op], v2 ^ me ^ mf) + md);
149
+ } else {
150
+ me = rotl(v2 ^ me ^ mb, r + 9);
151
+ mf = u32(imul(K[(op + 11) & 15], u32(v2 + mf + me)) ^ mc);
152
+ }
153
+ }
154
+
155
+ const mArr = [ma, mc, mb, md, mf, me];
156
+ const v = perm.map(idx => mArr[idx]);
157
+
158
+ const msgView = new DataView(msg.buffer);
159
+ msgView.setUint32(0, v[0], true);
160
+ msgView.setUint32(4, v[1], true);
161
+ msgView.setUint32(8, v[2], true);
162
+ msgView.setUint32(12, v[3], true);
163
+ msgView.setUint32(16, v[4], true);
164
+ msgView.setUint32(20, v[5], true);
165
+ msgView.setBigUint64(40, n, true);
166
+
167
+ const hashBuf = await crypto.subtle.digest('SHA-256', msg);
168
+ const hashBytes = new Uint8Array(hashBuf);
169
+
170
+ const b = Math.floor(diffVal / 8);
171
+ const rBits = diffVal % 8;
172
+ let ok = true;
173
+ for (let i = 0; i < b; i++) {
174
+ if (hashBytes[i] !== 0) {
175
+ ok = false;
176
+ break;
177
+ }
178
+ }
179
+ if (ok && (rBits === 0 || (hashBytes[b] >> (8 - rBits)) === 0)) {
180
+ return `m4.${n.toString(16)}`;
181
+ }
182
+ n++;
183
+ }
184
+ }
185
+
186
+ async function solveStage2(data) {
187
+ const target = data.pack[0].split('').reverse().join('');
188
+ const salt = data.pack[3].split('').reverse().join('');
189
+ const r = data.pack[4].split('').reverse().join('');
190
+
191
+ const b64decStr = s => decodeURIComponent(escape(atob(s.replace(/-/g, '+').replace(/_/g, '/'))));
192
+ const body = b64decStr(r.split('.')[1]);
193
+ const payload = b64decStr(body.split('.')[1]);
194
+ const difficulty = JSON.parse(payload).d;
195
+
196
+ const width = Math.floor((difficulty + 3) / 4);
197
+ const limit = 1 << difficulty;
198
+
199
+ for (let counter = 0; counter < limit; counter++) {
200
+ const key = counter.toString(16).padStart(width, '0');
201
+ const msgUint8 = new TextEncoder().encode(salt + key);
202
+ const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
203
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
204
+ const digest = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
205
+
206
+ if (digest === target) {
207
+ return key;
208
+ }
209
+ }
210
+ throw new Error('no solution found');
211
+ }
212
+
213
+ export async function getStream(args) {
214
+ const { id, s, e } = args || {};
215
+ const isTv = s != null && e != null;
216
+ const mediaType = isTv ? 'tv' : 'movie';
217
+ const type = isTv ? 'tv' : 'movie';
218
+ const url = isTv
219
+ ? `https://cinesrc.st/embed/tv/${id}?s=${s}&e=${e}`
220
+ : `https://cinesrc.st/embed/movie/${id}`;
221
+
222
+ const headers = {
223
+ Origin: 'https://cinesrc.st',
224
+ Referer: 'https://cinesrc.st/',
225
+ 'Content-Type': 'text/plain;charset=UTF-8',
226
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.37 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.37',
227
+ };
228
+
229
+ const fields = [type, id, s ? String(s) : null, e ? String(e) : null];
230
+ const encoded = btoa(JSON.stringify(fields).replace(/ /g, '')).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
231
+
232
+ const bootstrapHeaders = { ...headers, 'x-cs-q': encoded };
233
+ const bootstrap = await fetchJson('https://cinesrc.st/api/c/bootstrap', {
234
+ method: 'POST',
235
+ headers: bootstrapHeaders,
236
+ body: '{}',
237
+ });
238
+
239
+ const cookies = {
240
+ 'x-cs-b': '20261014-a',
241
+ 'x-cs-q': encoded,
242
+ 'x-cs-r': bootstrap.r,
243
+ 'x-cs-p': bootstrap.p,
244
+ };
245
+
246
+ const challenge1 = await fetchJson('https://cinesrc.st/api/c/issue', {
247
+ headers: { ...headers, ...cookies },
248
+ });
249
+
250
+ const payload1 = {
251
+ data: {
252
+ url,
253
+ user_agent: headers['User-Agent'],
254
+ challenge_data: challenge1,
255
+ },
256
+ type: 'seed',
257
+ };
258
+
259
+ const seedRes = await fetchJson(`${API}/enc-cinesrc`, {
260
+ method: 'POST',
261
+ headers: { 'Content-Type': 'application/json' },
262
+ body: JSON.stringify(payload1),
263
+ });
264
+
265
+ const seedData = seedRes.result;
266
+ const solution1 = await solveStage1(challenge1, seedData.seed);
267
+
268
+ const challenge2 = await fetchJson('https://cinesrc.st/api/c/stage2/issue', {
269
+ headers: { ...headers, ...cookies },
270
+ });
271
+ const solution2 = await solveStage2(challenge2);
272
+
273
+ const payload2 = {
274
+ data: {
275
+ url,
276
+ user_agent: headers['User-Agent'],
277
+ challenge_data: {
278
+ stage1: { challenge: challenge1, solution: solution1 },
279
+ stage2: { challenge: challenge2, solution: solution2 },
280
+ },
281
+ state: seedData.state,
282
+ },
283
+ type: 'encrypt',
284
+ };
285
+
286
+ const encryptRes = await fetchJson(`${API}/enc-cinesrc`, {
287
+ method: 'POST',
288
+ headers: { 'Content-Type': 'application/json' },
289
+ body: JSON.stringify(payload2),
290
+ });
291
+
292
+ const encData = encryptRes.result;
293
+ const token = `${encData.token}::c3::${cookies['x-cs-r']}`;
294
+ const nextActions = encData.headers;
295
+
296
+ const providersText = await fetchText(url, {
297
+ method: 'POST',
298
+ headers: { ...headers, ...cookies, 'Next-Action': nextActions.getProviderList },
299
+ body: JSON.stringify([]),
300
+ });
301
+
302
+ const lines = providersText.split('\n');
303
+ let providers = null;
304
+ for (const rawLine of lines) {
305
+ const colonIndex = rawLine.indexOf(':');
306
+ if (colonIndex !== -1) {
307
+ const candidate = rawLine.slice(colonIndex + 1).trim();
308
+ if (candidate.startsWith('[') && candidate.endsWith(']')) {
309
+ try {
310
+ providers = JSON.parse(candidate);
311
+ break;
312
+ } catch { }
313
+ }
314
+ }
315
+ }
316
+
317
+ if (!Array.isArray(providers) || providers.length === 0) return null;
318
+
319
+ const allUrls = [];
320
+
321
+ for (const providerObj of providers) {
322
+ const provider = providerObj.id;
323
+ const streamPayload = [
324
+ id,
325
+ isTv ? 'show' : type,
326
+ isTv ? String(s) : '$undefined',
327
+ isTv ? String(e) : '$undefined',
328
+ token,
329
+ provider,
330
+ ];
331
+
332
+ let streamRes;
333
+ try {
334
+ streamRes = await fetchText(url, {
335
+ method: 'POST',
336
+ headers: { ...headers, ...cookies, 'Next-Action': nextActions.getStream },
337
+ body: JSON.stringify(streamPayload),
338
+ });
339
+ } catch {
340
+ continue;
341
+ }
342
+
343
+ if (!streamRes || streamRes.includes('"status":500') || streamRes.includes('invalid_challenge') || streamRes.length < 10) continue;
344
+
345
+ let decryptRes;
346
+ try {
347
+ decryptRes = await fetchJson(`${API}/dec-cinesrc`, {
348
+ method: 'POST',
349
+ headers: { 'Content-Type': 'application/json' },
350
+ body: JSON.stringify({ text: streamRes, state: encData.state }),
351
+ });
352
+ } catch {
353
+ continue;
354
+ }
355
+
356
+ if (decryptRes && decryptRes.status === 200 && decryptRes.result) {
357
+ let resultData = decryptRes.result;
358
+ if (typeof resultData === 'string') {
359
+ try {
360
+ resultData = JSON.parse(resultData);
361
+ } catch { }
362
+ }
363
+
364
+ let streamUrl = null;
365
+ if (Array.isArray(resultData?.url)) {
366
+ streamUrl = resultData.url[0]?.url;
367
+ } else if (typeof resultData?.url === 'string') {
368
+ streamUrl = resultData.url;
369
+ } else if (resultData?.file) {
370
+ streamUrl = resultData.file;
371
+ } else if (Array.isArray(resultData?.sources)) {
372
+ streamUrl = resultData.sources[0]?.url;
373
+ }
374
+
375
+ if (streamUrl) {
376
+ if (streamUrl.startsWith('/')) {
377
+ streamUrl = `https://cinesrc.st${streamUrl}`;
378
+ }
379
+
380
+ allUrls.push({
381
+ url: streamUrl,
382
+ server: `CineSrc - ${providerObj.name || provider}`,
383
+ quality: 'Auto',
384
+ type: streamUrl.includes('.m3u8') ? 'hls' : 'mp4',
385
+ headers: resultData.headers || {
386
+ Referer: 'https://cinesrc.st/',
387
+ Origin: 'https://cinesrc.st',
388
+ },
389
+ });
390
+ break;
391
+ }
392
+ }
393
+ }
394
+
395
+ if (!allUrls.length) return null;
396
+
397
+ return {
398
+ url: allUrls[0].url,
399
+ headers: allUrls[0].headers,
400
+ allUrls,
401
+ };
398
402
  }