@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,187 +1,192 @@
1
- import { getUA } from "../utils/helpers.js";
2
-
3
- const API_URL = "https://api.wecollege.net";
4
- const SERVERS = ["miami", "atlanta", "seattle", "denver", "dallas", "tampa"];
5
- const MAGIC = [109, 118, 109, 49];
6
-
7
- function imul(a, b) {
8
- return Math.imul(a | 0, b | 0) >>> 0;
9
- }
10
-
11
- function pFn(e) {
12
- e = e >>> 0;
13
- e = (e ^ (e >>> 16)) >>> 0;
14
- e = imul(e, 2246822507);
15
- e = (e ^ (e >>> 13)) >>> 0;
16
- e = imul(e, 3266489909);
17
- e = (e ^ (e >>> 16)) >>> 0;
18
- return e;
19
- }
20
-
21
- function gFn(e, t) {
22
- e = e >>> 0;
23
- t = t & 31;
24
- if (t === 0) return e;
25
- return ((e << t) | (e >>> (32 - t))) >>> 0;
26
- }
27
-
28
- function decryptVidy(ciphertext, seedStr, mediaId) {
29
- let padded = ciphertext.replace(/-/g, "+").replace(/_/g, "/");
30
- while (padded.length % 4) padded += "=";
31
-
32
- const raw = new Uint8Array(Buffer.from(padded, "base64"));
33
- const length = raw.length;
34
-
35
- let tFnv = 2166136261;
36
- for (let i = 0; i < seedStr.length; i++) {
37
- tFnv = imul((tFnv ^ seedStr.charCodeAt(i)) >>> 0, 16777619);
38
- }
39
- const fnvRes = pFn(tFnv);
40
-
41
- const innerArg = (((mediaId >>> 0) ^ 2654435769) >>> 0);
42
- const inner = pFn(innerArg);
43
- let n = pFn(((fnvRes ^ inner) >>> 0));
44
-
45
- const S = {};
46
- for (let e = 0; e < 8; e++) {
47
- const t = n % 61;
48
- n = gFn((n + 2654435769) >>> 0, 7 + (7 & e));
49
- S[t] = ((n ^ pFn(n)) >>> 0);
50
- n = pFn((n + t) >>> 0);
51
- }
52
-
53
- let acc = pFn(((2779096485 ^ n) >>> 0));
54
- const keystream = new Uint8Array(length);
55
- let sCnt = 0;
56
- let idx = 0;
57
-
58
- while (idx < length) {
59
- const sVal = acc;
60
- const o = sVal % 61;
61
- const hasO = Object.prototype.hasOwnProperty.call(S, o);
62
- const iVal = hasO ? -1 : 0;
63
- const d = hasO ? S[o] : 0;
64
- const nTerm = ((d ^ imul(2654435769, sCnt + 1)) >>> 0);
65
- sCnt += 1;
66
- const aTerm = sVal;
67
- let lVal = (((aTerm ^ nTerm) | (aTerm & nTerm & iVal)) >>> 0);
68
- const term1 = gFn((lVal + sVal) >>> 0, 31 & o);
69
- const term2 = gFn(sVal, (31 & imul(o, 7)) >>> 0);
70
- lVal = ((term1 ^ term2) >>> 0);
71
- const newS = pFn((lVal + 2654435769) >>> 0);
72
- S[o] = newS;
73
- acc = newS;
74
- const tVal = newS;
75
-
76
- keystream[idx++] = tVal & 0xFF;
77
- if (idx < length) keystream[idx++] = (tVal >>> 8) & 0xFF;
78
- if (idx < length) keystream[idx++] = (tVal >>> 16) & 0xFF;
79
- if (idx < length) keystream[idx++] = (tVal >>> 24) & 0xFF;
80
- }
81
-
82
- for (let i = 0; i < length; i++) {
83
- raw[i] ^= keystream[i];
84
- }
85
-
86
- for (let i = 0; i < MAGIC.length; i++) {
87
- if (raw[i] !== MAGIC[i]) {
88
- throw new Error("Vidy decrypt failed: magic header mismatch");
89
- }
90
- }
91
-
92
- return new TextDecoder().decode(raw.slice(MAGIC.length));
93
- }
94
-
95
- export async function getStream(args) {
96
- const { id, s = null, e = null } = args;
97
- const isTv = s != null && e != null;
98
- const mediaId = Number(id);
99
-
100
- const headers = {
101
- "User-Agent": getUA(),
102
- Referer: "https://www.vidy.st/",
103
- Origin: "https://www.vidy.st",
104
- };
105
-
106
- try {
107
- const seedUrl = new URL(`${API_URL}/seed`);
108
- seedUrl.searchParams.set("mediaId", String(id));
109
-
110
- const seedRes = await fetch(seedUrl.toString(), {
111
- headers,
112
- signal: AbortSignal.timeout(6000),
113
- });
114
- if (!seedRes.ok) return null;
115
-
116
- const seedData = await seedRes.json();
117
- const seed = seedData?.seed;
118
- if (!seed) return null;
119
-
120
- for (const server of SERVERS) {
121
- try {
122
- const srcUrl = new URL(`${API_URL}/${server}/sources`);
123
- srcUrl.searchParams.set("mediaType", isTv ? "tv" : "movie");
124
- srcUrl.searchParams.set("tmdbId", String(id));
125
- srcUrl.searchParams.set("enc", "2");
126
- srcUrl.searchParams.set("seed", seed);
127
- if (isTv) {
128
- srcUrl.searchParams.set("seasonId", String(s));
129
- srcUrl.searchParams.set("episodeId", String(e));
130
- }
131
-
132
- const res = await fetch(srcUrl.toString(), {
133
- headers,
134
- signal: AbortSignal.timeout(6000),
135
- });
136
- if (!res.ok) continue;
137
-
138
- const text = await res.text();
139
-
140
- let data;
141
- try {
142
- data = JSON.parse(decryptVidy(text, seed, mediaId));
143
- } catch {
144
- continue;
145
- }
146
-
147
- const sources = data?.sources || [];
148
- const playlist = data?.playlist || "";
149
- if (!sources.length && !playlist) continue;
150
-
151
- let streamUrl = playlist;
152
- let quality = "1080p";
153
-
154
- for (const src of sources) {
155
- if (src?.quality === "1080p" && src?.url) {
156
- streamUrl = src.url;
157
- quality = "1080p";
158
- break;
159
- }
160
- }
161
- if (!streamUrl && sources.length) {
162
- streamUrl = sources[0]?.url || "";
163
- quality = sources[0]?.quality || "";
164
- }
165
- if (!streamUrl) continue;
166
-
167
- return {
168
- url: streamUrl,
169
- headers: {
170
- "User-Agent": getUA(),
171
- Referer: "https://www.vidy.st/",
172
- Origin: "https://www.vidy.st",
173
- },
174
- server: "Vidy",
175
- quality,
176
- type: streamUrl.includes(".m3u8") ? "hls" : "mp4",
177
- };
178
- } catch {
179
- continue;
180
- }
181
- }
182
-
183
- return null;
184
- } catch {
185
- return null;
186
- }
187
- }
1
+ import { getUA } from '../utils/helpers.js';
2
+
3
+ const API_URL = 'https://api.wecollege.net';
4
+ const SERVERS = ['miami', 'atlanta', 'seattle', 'denver', 'dallas', 'tampa'];
5
+ const MAGIC = [109, 118, 109, 49];
6
+
7
+ function imul(a, b) {
8
+ return Math.imul(a | 0, b | 0) >>> 0;
9
+ }
10
+
11
+ function pFn(e) {
12
+ e = e >>> 0;
13
+ e = (e ^ (e >>> 16)) >>> 0;
14
+ e = imul(e, 2246822507);
15
+ e = (e ^ (e >>> 13)) >>> 0;
16
+ e = imul(e, 3266489909);
17
+ e = (e ^ (e >>> 16)) >>> 0;
18
+ return e;
19
+ }
20
+
21
+ function gFn(e, t) {
22
+ e = e >>> 0;
23
+ t = t & 31;
24
+ if (t === 0) return e;
25
+ return ((e << t) | (e >>> (32 - t))) >>> 0;
26
+ }
27
+
28
+ function decryptVidy(ciphertext, seedStr, mediaId) {
29
+ let padded = ciphertext.replace(/-/g, '+').replace(/_/g, '/');
30
+ while (padded.length % 4) padded += '=';
31
+
32
+ const raw = new Uint8Array(Buffer.from(padded, 'base64'));
33
+ const length = raw.length;
34
+
35
+ let tFnv = 2166136261;
36
+ for (let i = 0; i < seedStr.length; i++) {
37
+ tFnv = imul((tFnv ^ seedStr.charCodeAt(i)) >>> 0, 16777619);
38
+ }
39
+ const fnvRes = pFn(tFnv);
40
+
41
+ const innerArg = (((mediaId >>> 0) ^ 2654435769) >>> 0);
42
+ const inner = pFn(innerArg);
43
+ let n = pFn(((fnvRes ^ inner) >>> 0));
44
+
45
+ const S = {};
46
+ for (let e = 0; e < 8; e++) {
47
+ const t = n % 61;
48
+ n = gFn((n + 2654435769) >>> 0, 7 + (7 & e));
49
+ S[t] = ((n ^ pFn(n)) >>> 0);
50
+ n = pFn((n + t) >>> 0);
51
+ }
52
+
53
+ let acc = pFn(((2779096485 ^ n) >>> 0));
54
+ const keystream = new Uint8Array(length);
55
+ let sCnt = 0;
56
+ let idx = 0;
57
+
58
+ while (idx < length) {
59
+ const sVal = acc;
60
+ const o = sVal % 61;
61
+ const hasO = Object.prototype.hasOwnProperty.call(S, o);
62
+ const iVal = hasO ? -1 : 0;
63
+ const d = hasO ? S[o] : 0;
64
+ const nTerm = ((d ^ imul(2654435769, sCnt + 1)) >>> 0);
65
+ sCnt += 1;
66
+ const aTerm = sVal;
67
+ let lVal = (((aTerm ^ nTerm) | (aTerm & nTerm & iVal)) >>> 0);
68
+ const term1 = gFn((lVal + sVal) >>> 0, 31 & o);
69
+ const term2 = gFn(sVal, (31 & imul(o, 7)) >>> 0);
70
+ lVal = ((term1 ^ term2) >>> 0);
71
+ const newS = pFn((lVal + 2654435769) >>> 0);
72
+ S[o] = newS;
73
+ acc = newS;
74
+ const tVal = newS;
75
+
76
+ keystream[idx++] = tVal & 0xFF;
77
+ if (idx < length) keystream[idx++] = (tVal >>> 8) & 0xFF;
78
+ if (idx < length) keystream[idx++] = (tVal >>> 16) & 0xFF;
79
+ if (idx < length) keystream[idx++] = (tVal >>> 24) & 0xFF;
80
+ }
81
+
82
+ for (let i = 0; i < length; i++) {
83
+ raw[i] ^= keystream[i];
84
+ }
85
+
86
+ for (let i = 0; i < MAGIC.length; i++) {
87
+ if (raw[i] !== MAGIC[i]) {
88
+ throw new Error('Vidy decrypt failed: magic header mismatch');
89
+ }
90
+ }
91
+
92
+ return new TextDecoder().decode(raw.slice(MAGIC.length));
93
+ }
94
+
95
+ export async function getStream(args) {
96
+ const { id, s, e } = args || {};
97
+ const isTv = s != null && e != null;
98
+ const mediaId = Number(id);
99
+
100
+ const headers = {
101
+ 'User-Agent': getUA(),
102
+ Referer: 'https://www.vidy.st/',
103
+ Origin: 'https://www.vidy.st',
104
+ };
105
+
106
+ try {
107
+ const seedUrl = new URL(`${API_URL}/seed`);
108
+ seedUrl.searchParams.set('mediaId', String(id));
109
+
110
+ const seedRes = await fetch(seedUrl.toString(), {
111
+ headers,
112
+ signal: AbortSignal.timeout(6000),
113
+ });
114
+ if (!seedRes.ok) return null;
115
+
116
+ const seedData = await seedRes.json();
117
+ const seed = seedData?.seed;
118
+ if (!seed) return null;
119
+
120
+ for (const server of SERVERS) {
121
+ try {
122
+ const srcUrl = new URL(`${API_URL}/${server}/sources`);
123
+ srcUrl.searchParams.set('mediaType', isTv ? 'tv' : 'movie');
124
+ srcUrl.searchParams.set('tmdbId', String(id));
125
+ srcUrl.searchParams.set('enc', '2');
126
+ srcUrl.searchParams.set('seed', seed);
127
+ if (isTv) {
128
+ srcUrl.searchParams.set('seasonId', String(s));
129
+ srcUrl.searchParams.set('episodeId', String(e));
130
+ }
131
+
132
+ const res = await fetch(srcUrl.toString(), {
133
+ headers,
134
+ signal: AbortSignal.timeout(6000),
135
+ });
136
+ if (!res.ok) continue;
137
+
138
+ const text = await res.text();
139
+
140
+ let data;
141
+ try {
142
+ data = JSON.parse(decryptVidy(text, seed, mediaId));
143
+ } catch {
144
+ continue;
145
+ }
146
+
147
+ const sources = data?.sources || [];
148
+ const playlist = data?.playlist || '';
149
+ if (!sources.length && !playlist) continue;
150
+
151
+ let streamUrl = playlist;
152
+ let quality = '1080p';
153
+
154
+ for (const src of sources) {
155
+ if (src?.quality === '1080p' && src?.url) {
156
+ streamUrl = src.url;
157
+ quality = '1080p';
158
+ break;
159
+ }
160
+ }
161
+ if (!streamUrl && sources.length) {
162
+ streamUrl = sources[0]?.url || '';
163
+ quality = sources[0]?.quality || '';
164
+ }
165
+ if (!streamUrl) continue;
166
+
167
+ const allUrls = [{
168
+ url: streamUrl,
169
+ headers,
170
+ server: 'Vidy',
171
+ quality,
172
+ type: streamUrl.includes('.m3u8') ? 'hls' : 'mp4',
173
+ }];
174
+
175
+ return {
176
+ url: streamUrl,
177
+ headers,
178
+ server: 'Vidy',
179
+ quality,
180
+ type: streamUrl.includes('.m3u8') ? 'hls' : 'mp4',
181
+ allUrls,
182
+ };
183
+ } catch {
184
+ continue;
185
+ }
186
+ }
187
+
188
+ return null;
189
+ } catch {
190
+ return null;
191
+ }
192
+ }