@weroperking/invenio-scraper 1.0.1 → 2.0.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.
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
- # 🎬 invenio-scraper
1
+ # 🎬 @weroperking/invenio-scraper
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/invenio-scraper)](https://www.npmjs.com/package/invenio-scraper)
3
+ [![npm version](https://img.shields.io/npm/v/@weroperking/invenio-scraper)](https://www.npmjs.com/package/@weroperking/invenio-scraper)
4
4
  [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)
5
5
  [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)](https://nodejs.org)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)
7
7
 
8
- **invenio-scraper - A web scraping library for extracting movie and TV show data**
8
+ **@weroperking/invenio-scraper - A web scraping library for extracting movie and TV show data**
9
9
 
10
10
  A resilient, fully-typed JavaScript SDK for interacting with Moviebox APIs.
11
11
 
@@ -23,15 +23,15 @@ A resilient, fully-typed JavaScript SDK for interacting with Moviebox APIs.
23
23
  ## 📦 Installation
24
24
 
25
25
  ```bash
26
- npm install invenio-scraper
26
+ npm install @weroperking/invenio-scraper
27
27
  ```
28
28
 
29
29
  ```bash
30
- pnpm add invenio-scraper
30
+ pnpm add @weroperking/invenio-scraper
31
31
  ```
32
32
 
33
33
  ```bash
34
- yarn add invenio-scraper
34
+ yarn add @weroperking/invenio-scraper
35
35
  ```
36
36
 
37
37
  **Requirements:** Node.js 18+
@@ -44,28 +44,60 @@ import {
44
44
  search,
45
45
  getMovieDetails,
46
46
  getMovieStreamUrl
47
- } from 'invenio-scraper';
47
+ } from '@weroperking/invenio-scraper';
48
48
 
49
- const session = new MovieboxSession();
49
+ async function main(): Promise<void> {
50
+ const session = new MovieboxSession();
50
51
 
51
- // Search for content
52
- const results = await search(session, { query: 'Inception' });
53
- const first = results.results[0];
52
+ // Search for content
53
+ const results = await search(session, { query: 'Inception' });
54
+ const first = results.results[0];
54
55
 
55
- if (first) {
56
- // Get detailed movie information
57
- const details = await getMovieDetails(session, {
58
- detailPath: first.raw.detailPath
59
- });
56
+ if (first) {
57
+ // Get detailed movie information
58
+ const details = await getMovieDetails(session, {
59
+ detailPath: first.raw.detailPath
60
+ });
60
61
 
61
- // Get stream URL
62
- const stream = await getMovieStreamUrl(session, {
63
- detailPath: first.raw.detailPath,
64
- quality: 'best'
65
- });
62
+ // Get stream URL
63
+ const stream = await getMovieStreamUrl(session, {
64
+ detailPath: first.raw.detailPath,
65
+ quality: 'best'
66
+ });
66
67
 
67
- console.log(`${details.title}: ${stream.stream?.url}`);
68
+ console.log(`${details.title}: ${stream.stream?.url}`);
69
+ }
68
70
  }
71
+
72
+ main().catch((error) => {
73
+ console.error('Error:', error);
74
+ process.exit(1);
75
+ });
76
+ ```
77
+
78
+ ## 🏃 Running TypeScript Files
79
+
80
+ This SDK is written in TypeScript. To run TypeScript files directly, use [`tsx`](https://github.com/privatenumber/tsx):
81
+
82
+ ```bash
83
+ # Install tsx globally
84
+ npm install -g tsx
85
+
86
+ # Or add to your project
87
+ npm install -D tsx
88
+
89
+ # Run a TypeScript file
90
+ tsx your-script.ts
91
+ ```
92
+
93
+ Alternatively, you can compile TypeScript to JavaScript using `tsc` and run with `node`:
94
+
95
+ ```bash
96
+ # Compile TypeScript
97
+ npx tsc your-script.ts
98
+
99
+ # Run the compiled JavaScript
100
+ node your-script.js
69
101
  ```
70
102
 
71
103
  ## 📚 API Overview
@@ -87,7 +119,7 @@ if (first) {
87
119
  ### Session Options
88
120
 
89
121
  ```typescript
90
- import { MovieboxSession, createLogger } from 'invenio-scraper';
122
+ import { MovieboxSession, createLogger } from '@weroperking/invenio-scraper';
91
123
 
92
124
  const session = new MovieboxSession({
93
125
  host: 'h5.aoneroom.com',
@@ -126,74 +158,95 @@ const session = new MovieboxSession({
126
158
  ### Basic Search
127
159
 
128
160
  ```typescript
129
- import { MovieboxSession, search } from 'invenio-scraper';
161
+ import { MovieboxSession, search } from '@weroperking/invenio-scraper';
130
162
 
131
- const session = new MovieboxSession();
163
+ async function main(): Promise<void> {
164
+ const session = new MovieboxSession();
132
165
 
133
- // Search with filters
134
- const results = await search(session, {
135
- query: 'The Matrix',
136
- type: 'movie', // 'all' | 'movie' | 'tv' | 'music'
137
- page: 1,
138
- perPage: 20
139
- });
166
+ // Search with filters
167
+ const results = await search(session, {
168
+ query: 'The Matrix',
169
+ type: 'movie', // 'all' | 'movie' | 'tv' | 'music'
170
+ page: 1,
171
+ perPage: 20
172
+ });
140
173
 
141
- console.log(`Found ${results.totalCount} results`);
142
- console.log(`Has more: ${results.hasMore}`);
174
+ console.log(`Found ${results.totalCount} results`);
175
+ console.log(`Has more: ${results.hasMore}`);
143
176
 
144
- for (const item of results.results) {
145
- console.log(`${item.title} (${item.releaseYear ?? 'N/A'}) - ${item.rating}/10`);
177
+ for (const item of results.results) {
178
+ console.log(`${item.title} (${item.releaseYear ?? 'N/A'}) - ${item.rating}/10`);
179
+ }
146
180
  }
181
+
182
+ main().catch((error) => {
183
+ console.error('Error:', error);
184
+ process.exit(1);
185
+ });
147
186
  ```
148
187
 
149
188
  ### Getting Movie Details
150
189
 
151
190
  ```typescript
152
- import { MovieboxSession, getMovieDetails } from 'invenio-scraper';
191
+ import { MovieboxSession, getMovieDetails } from '@weroperking/invenio-scraper';
153
192
 
154
- const session = new MovieboxSession();
193
+ async function main(): Promise<void> {
194
+ const session = new MovieboxSession();
155
195
 
156
- const details = await getMovieDetails(session, {
157
- detailPath: 'inception-e1BOR6f19C7'
158
- });
196
+ const details = await getMovieDetails(session, {
197
+ detailPath: 'inception-e1BOR6f19C7'
198
+ });
159
199
 
160
- console.log(`Title: ${details.title}`);
161
- console.log(`Synopsis: ${details.synopsis}`);
162
- console.log(`Rating: ${details.rating}/10 (${details.ratingCount} votes)`);
163
- console.log(`Duration: ${details.durationLabel}`);
164
- console.log(`Genres: ${details.genres.join(', ')}`);
200
+ console.log(`Title: ${details.title}`);
201
+ console.log(`Synopsis: ${details.synopsis}`);
202
+ console.log(`Rating: ${details.rating}/10 (${details.ratingCount} votes)`);
203
+ console.log(`Duration: ${details.durationLabel}`);
204
+ console.log(`Genres: ${details.genres.join(', ')}`);
165
205
 
166
- // Available download qualities
167
- for (const download of details.downloads) {
168
- console.log(`${download.quality}: ${(download.sizeBytes / 1024 / 1024).toFixed(1)} MB`);
169
- }
206
+ // Available download qualities
207
+ for (const download of details.downloads) {
208
+ console.log(`${download.quality}: ${(download.sizeBytes / 1024 / 1024).toFixed(1)} MB`);
209
+ }
170
210
 
171
- // Available subtitles
172
- for (const caption of details.captions) {
173
- console.log(`Subtitle: ${caption.language}`);
211
+ // Available subtitles
212
+ for (const caption of details.captions) {
213
+ console.log(`Subtitle: ${caption.language}`);
214
+ }
174
215
  }
216
+
217
+ main().catch((error) => {
218
+ console.error('Error:', error);
219
+ process.exit(1);
220
+ });
175
221
  ```
176
222
 
177
223
  ### Downloading with Progress
178
224
 
179
225
  ```typescript
180
- import { MovieboxSession, downloadMovie } from 'invenio-scraper';
181
-
182
- const session = new MovieboxSession();
183
-
184
- const filePath = await downloadMovie(session, {
185
- detailPath: 'inception-e1BOR6f19C7',
186
- quality: 1080, // or 'best' | 'worst' | number
187
- outputDir: './downloads',
188
- mode: 'resume', // 'auto' | 'resume' | 'overwrite'
189
- onProgress: ({ downloadedBytes, totalBytes, percentage }) => {
190
- const mb = (downloadedBytes / 1024 / 1024).toFixed(1);
191
- const total = ((totalBytes ?? 0) / 1024 / 1024).toFixed(1);
192
- process.stdout.write(`\r${mb}MB / ${total}MB (${percentage ?? 0}%)`);
193
- }
194
- });
226
+ import { MovieboxSession, downloadMovie } from '@weroperking/invenio-scraper';
227
+
228
+ async function main(): Promise<void> {
229
+ const session = new MovieboxSession();
230
+
231
+ const filePath = await downloadMovie(session, {
232
+ detailPath: 'inception-e1BOR6f19C7',
233
+ quality: 1080, // or 'best' | 'worst' | number
234
+ outputDir: './downloads',
235
+ mode: 'resume', // 'auto' | 'resume' | 'overwrite'
236
+ onProgress: ({ downloadedBytes, totalBytes, percentage }) => {
237
+ const mb = (downloadedBytes / 1024 / 1024).toFixed(1);
238
+ const total = ((totalBytes ?? 0) / 1024 / 1024).toFixed(1);
239
+ process.stdout.write(`\r${mb}MB / ${total}MB (${percentage ?? 0}%)`);
240
+ }
241
+ });
242
+
243
+ console.log(`\nSaved to: ${filePath}`);
244
+ }
195
245
 
196
- console.log(`\nSaved to: ${filePath}`);
246
+ main().catch((error) => {
247
+ console.error('Error:', error);
248
+ process.exit(1);
249
+ });
197
250
  ```
198
251
 
199
252
  ### Series & Episodes
@@ -206,58 +259,65 @@ import {
206
259
  getEpisodeQualities,
207
260
  getEpisodeStreamUrl,
208
261
  downloadEpisode
209
- } from 'invenio-scraper';
210
-
211
- const session = new MovieboxSession();
212
-
213
- // Search for a series
214
- const results = await search(session, { query: 'Breaking Bad', type: 'tv' });
215
- const series = results.results.find(r => r.type === 'tv');
216
-
217
- if (series) {
218
- // Get series details
219
- const details = await getSeriesDetails(session, {
220
- detailPath: series.raw.detailPath
221
- });
222
-
223
- console.log(`${details.title} — ${details.seasons?.length} seasons`);
224
-
225
- // Get episode qualities
226
- const qualities = await getEpisodeQualities(session, {
227
- detailPath: series.raw.detailPath,
228
- season: 1,
229
- episode: 1
230
- });
231
-
232
- console.log('Available qualities:', qualities.downloads.map(d => d.quality));
233
-
234
- // Get stream URL
235
- const stream = await getEpisodeStreamUrl(session, {
236
- detailPath: series.raw.detailPath,
237
- season: 1,
238
- episode: 1,
239
- quality: 'best'
240
- });
241
-
242
- console.log('Stream URL:', stream.stream?.url);
243
-
244
- // Download episode
245
- const filePath = await downloadEpisode(session, {
246
- detailPath: series.raw.detailPath,
247
- season: 1,
248
- episode: 1,
249
- quality: 720,
250
- outputDir: './downloads'
251
- });
252
-
253
- console.log('Downloaded:', filePath);
262
+ } from '@weroperking/invenio-scraper';
263
+
264
+ async function main(): Promise<void> {
265
+ const session = new MovieboxSession();
266
+
267
+ // Search for a series
268
+ const results = await search(session, { query: 'Breaking Bad', type: 'tv' });
269
+ const series = results.results.find(r => r.type === 'tv');
270
+
271
+ if (series) {
272
+ // Get series details
273
+ const details = await getSeriesDetails(session, {
274
+ detailPath: series.raw.detailPath
275
+ });
276
+
277
+ console.log(`${details.title} — ${details.seasons?.length} seasons`);
278
+
279
+ // Get episode qualities
280
+ const qualities = await getEpisodeQualities(session, {
281
+ detailPath: series.raw.detailPath,
282
+ season: 1,
283
+ episode: 1
284
+ });
285
+
286
+ console.log('Available qualities:', qualities.downloads.map(d => d.quality));
287
+
288
+ // Get stream URL
289
+ const stream = await getEpisodeStreamUrl(session, {
290
+ detailPath: series.raw.detailPath,
291
+ season: 1,
292
+ episode: 1,
293
+ quality: 'best'
294
+ });
295
+
296
+ console.log('Stream URL:', stream.stream?.url);
297
+
298
+ // Download episode
299
+ const filePath = await downloadEpisode(session, {
300
+ detailPath: series.raw.detailPath,
301
+ season: 1,
302
+ episode: 1,
303
+ quality: 720,
304
+ outputDir: './downloads'
305
+ });
306
+
307
+ console.log('Downloaded:', filePath);
308
+ }
254
309
  }
310
+
311
+ main().catch((error) => {
312
+ console.error('Error:', error);
313
+ process.exit(1);
314
+ });
255
315
  ```
256
316
 
257
317
  ### Proxy Configuration
258
318
 
259
319
  ```typescript
260
- import { MovieboxSession } from 'invenio-scraper';
320
+ import { MovieboxSession } from '@weroperking/invenio-scraper';
261
321
 
262
322
  // HTTP proxy
263
323
  const session = new MovieboxSession({
@@ -286,31 +346,39 @@ import {
286
346
  GeoBlockedError,
287
347
  MirrorExhaustedError,
288
348
  RetryLimitExceededError
289
- } from 'invenio-scraper';
290
-
291
- const session = new MovieboxSession();
292
-
293
- try {
294
- const results = await search(session, { query: 'Inception' });
295
- } catch (error) {
296
- if (error instanceof GeoBlockedError) {
297
- console.error('Content is geo-blocked in your region');
298
- } else if (error instanceof MirrorExhaustedError) {
299
- console.error('All mirrors failed:', error.failures);
300
- } else if (error instanceof RetryLimitExceededError) {
301
- console.error(`Failed after ${error.attempts} attempts`);
302
- } else if (error instanceof MovieboxHttpError) {
303
- console.error(`HTTP ${error.status} error for ${error.url}`);
304
- } else if (error instanceof MovieboxApiError) {
305
- console.error('API error:', error.message);
349
+ } from '@weroperking/invenio-scraper';
350
+
351
+ async function main(): Promise<void> {
352
+ const session = new MovieboxSession();
353
+
354
+ try {
355
+ const results = await search(session, { query: 'Inception' });
356
+ console.log(`Found ${results.totalCount} results`);
357
+ } catch (error) {
358
+ if (error instanceof GeoBlockedError) {
359
+ console.error('Content is geo-blocked in your region');
360
+ } else if (error instanceof MirrorExhaustedError) {
361
+ console.error('All mirrors failed:', error.failures);
362
+ } else if (error instanceof RetryLimitExceededError) {
363
+ console.error(`Failed after ${error.attempts} attempts`);
364
+ } else if (error instanceof MovieboxHttpError) {
365
+ console.error(`HTTP ${error.status} error for ${error.url}`);
366
+ } else if (error instanceof MovieboxApiError) {
367
+ console.error('API error:', error.message);
368
+ }
306
369
  }
307
370
  }
371
+
372
+ main().catch((error) => {
373
+ console.error('Error:', error);
374
+ process.exit(1);
375
+ });
308
376
  ```
309
377
 
310
378
  ### Custom Logger
311
379
 
312
380
  ```typescript
313
- import { MovieboxSession, createLogger, createNoopLogger } from 'invenio-scraper';
381
+ import { MovieboxSession, createLogger, createNoopLogger } from '@weroperking/invenio-scraper';
314
382
 
315
383
  // Enable logging
316
384
  const session = new MovieboxSession({
@@ -350,7 +418,7 @@ import type {
350
418
  StreamResult,
351
419
  DownloadProgress,
352
420
  Logger
353
- } from 'invenio-scraper';
421
+ } from '@weroperking/invenio-scraper';
354
422
  ```
355
423
 
356
424
  ## 📄 Documentation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weroperking/invenio-scraper",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "description": "invenio-scraper - A web scraping library for extracting movie and TV show data",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,126 +0,0 @@
1
- {
2
- "code": 0,
3
- "message": "ok",
4
- "data": {
5
- "downloads": [
6
- {
7
- "id": "3790310583266853480",
8
- "url": "https://bcdnw.hakunaymatata.com/bt/306d0e9a2acc0f4d192f31c9095b80a4.mp4?sign=eba469176a59ba4498d5949bd97d2fd1&t=1763025319",
9
- "resolution": 360,
10
- "size": "434972896"
11
- },
12
- {
13
- "id": "4645687748723180736",
14
- "url": "https://bcdnw.hakunaymatata.com/resource/8f5faef179e8906a2e50b3b6ffb2fb4c.mp4?sign=e711b619a98698faf961fcbfe32bee0e&t=1763026761",
15
- "resolution": 480,
16
- "size": "874797261"
17
- },
18
- {
19
- "id": "8689459235262005880",
20
- "url": "https://bcdnw.hakunaymatata.com/resource/ed322112b874e19b0c6af6239c6fdf0b.mp4?sign=58677e8952fe354e24fccae2a704560c&t=1763027663",
21
- "resolution": 720,
22
- "size": "2097433997"
23
- },
24
- {
25
- "id": "834314734957724416",
26
- "url": "https://bcdnw.hakunaymatata.com/resource/51f86f8256537ccbbdbacdf1a679961e.mp4?sign=9adc4bc891563ed6d79d2b9999f05f51&t=1763028461",
27
- "resolution": 1080,
28
- "size": "4134165328"
29
- }
30
- ],
31
- "captions": [
32
- {
33
- "id": "6174305433189499136",
34
- "lan": "ar",
35
- "lanName": "اَلْعَرَبِيَّةُ",
36
- "url": "https://cacdn.hakunaymatata.com/subtitle/948c4db26a6d345360769b06fc40b356.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=L1K8OvrL7zEKR1tk3N3FIWNSRuYMJz6PvdVqDZ1IiVzPuktlqVNKA3MJgFiYUS5F68Ck6WixgIO6hA80Dio78bjYk4ZYl-ihv1d1ZFMfWtBj4Reu2jfNe5xzkXJptpCBA0AjdjNvv5AMZfTZk8Kq~1kJpVpHpN6x1y45zc7M-xTSSMLXsaV4O7mez6XKW7Pb1IAhkNjfJ3vp9D4oHKgT-9wEMk2GixI6EV-Q9hq1qNxOk3RUlFGJLJnbNVU331JRiufEGdZwtp148sQR85sxO1vfGphjDuplH6~~ItYaCaI34wsG97WqOUaqda2ZyPo0UYm3cmhjzLODkAlGP3s9iA__&Key-Pair-Id=KMHN1LQ1HEUPL",
37
- "size": "169092",
38
- "delay": 0
39
- },
40
- {
41
- "id": "5060704399811559688",
42
- "lan": "bn",
43
- "lanName": "বাংলা",
44
- "url": "https://cacdn.hakunaymatata.com/msubt/8b7b8df83c85bc5c83041f7683fcf257.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
45
- "size": "301930",
46
- "delay": 0
47
- },
48
- {
49
- "id": "1411642237431284344",
50
- "lan": "en",
51
- "lanName": "English",
52
- "url": "https://cacdn.hakunaymatata.com/subtitle/8c36ad2a402cd9a21748596d197f5f0f.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=L1K8OvrL7zEKR1tk3N3FIWNSRuYMJz6PvdVqDZ1IiVzPuktlqVNKA3MJgFiYUS5F68Ck6WixgIO6hA80Dio78bjYk4ZYl-ihv1d1ZFMfWtBj4Reu2jfNe5xzkXJptpCBA0AjdjNvv5AMZfTZk8Kq~1kJpVpHpN6x1y45zc7M-xTSSMLXsaV4O7mez6XKW7Pb1IAhkNjfJ3vp9D4oHKgT-9wEMk2GixI6EV-Q9hq1qNxOk3RUlFGJLJnbNVU331JRiufEGdZwtp148sQR85sxO1vfGphjDuplH6~~ItYaCaI34wsG97WqOUaqda2ZyPo0UYm3cmhjzLODkAlGP3s9iA__&Key-Pair-Id=KMHN1LQ1HEUPL",
53
- "size": "189486",
54
- "delay": 0
55
- },
56
- {
57
- "id": "8698843652904419488",
58
- "lan": "fil",
59
- "lanName": "Filipino",
60
- "url": "https://cacdn.hakunaymatata.com/msubt/a051cab7be3270b66ba8c81dc2b23762.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
61
- "size": "194604",
62
- "delay": 0
63
- },
64
- {
65
- "id": "8214277814707782296",
66
- "lan": "fr",
67
- "lanName": "Français",
68
- "url": "https://cacdn.hakunaymatata.com/msubt/75ae65ef569b6cd9660e7cf6b39167b1.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
69
- "size": "194671",
70
- "delay": 0
71
- },
72
- {
73
- "id": "1130273850534626080",
74
- "lan": "in_id",
75
- "lanName": "Indonesian",
76
- "url": "https://cacdn.hakunaymatata.com/subtitle/5efa24446ba76b5b6fcaae3995c26527.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=L1K8OvrL7zEKR1tk3N3FIWNSRuYMJz6PvdVqDZ1IiVzPuktlqVNKA3MJgFiYUS5F68Ck6WixgIO6hA80Dio78bjYk4ZYl-ihv1d1ZFMfWtBj4Reu2jfNe5xzkXJptpCBA0AjdjNvv5AMZfTZk8Kq~1kJpVpHpN6x1y45zc7M-xTSSMLXsaV4O7mez6XKW7Pb1IAhkNjfJ3vp9D4oHKgT-9wEMk2GixI6EV-Q9hq1qNxOk3RUlFGJLJnbNVU331JRiufEGdZwtp148sQR85sxO1vfGphjDuplH6~~ItYaCaI34wsG97WqOUaqda2ZyPo0UYm3cmhjzLODkAlGP3s9iA__&Key-Pair-Id=KMHN1LQ1HEUPL",
77
- "size": "143431",
78
- "delay": 0
79
- },
80
- {
81
- "id": "2464300049795352128",
82
- "lan": "pa",
83
- "lanName": "ਪੰਜਾਬੀ",
84
- "url": "https://cacdn.hakunaymatata.com/msubt/c64b0ae2c824791dee9aa54ee6028b0f.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
85
- "size": "305852",
86
- "delay": 0
87
- },
88
- {
89
- "id": "9128666788744626840",
90
- "lan": "pt",
91
- "lanName": "Português",
92
- "url": "https://cacdn.hakunaymatata.com/subtitle/a64dd7891d4e8a35003d1c1e21ce87d8.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=L1K8OvrL7zEKR1tk3N3FIWNSRuYMJz6PvdVqDZ1IiVzPuktlqVNKA3MJgFiYUS5F68Ck6WixgIO6hA80Dio78bjYk4ZYl-ihv1d1ZFMfWtBj4Reu2jfNe5xzkXJptpCBA0AjdjNvv5AMZfTZk8Kq~1kJpVpHpN6x1y45zc7M-xTSSMLXsaV4O7mez6XKW7Pb1IAhkNjfJ3vp9D4oHKgT-9wEMk2GixI6EV-Q9hq1qNxOk3RUlFGJLJnbNVU331JRiufEGdZwtp148sQR85sxO1vfGphjDuplH6~~ItYaCaI34wsG97WqOUaqda2ZyPo0UYm3cmhjzLODkAlGP3s9iA__&Key-Pair-Id=KMHN1LQ1HEUPL",
93
- "size": "145936",
94
- "delay": 0
95
- },
96
- {
97
- "id": "6120448891034240320",
98
- "lan": "ru",
99
- "lanName": "Русский",
100
- "url": "https://cacdn.hakunaymatata.com/msubt/caaa6ade4896ea3dedcfc49faeac3e97.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
101
- "size": "227561",
102
- "delay": 0
103
- },
104
- {
105
- "id": "1725586977921070040",
106
- "lan": "ur",
107
- "lanName": "اُردُو",
108
- "url": "https://cacdn.hakunaymatata.com/msubt/8a68518c580cca419afc888f562a2209.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=7ZjG0d3xTz66ye1qHmBejuSXWVE252BoKS1UCQ4bgfB16eZNBl9sBRN9jY76wqJAt1u9PJapSP2BBiNsDsiWT1Z5rFW5hKODqRjJCA6Z-YqfWLEQD9R3MlQv9NecvEwmGuY1feWLb1PWD2xfhkmsNhHxSwptIWAew7y7lcUL56EUFdmjO2OXVsWrkgYiFgO02jsNdHJilvIOH4Ru7GkVrbH4LlGcQdaL6HX7zf4cJtwIPt9jOW-czAvvyZPcifyH0pyjNHuWW7sflHBPMotSp6Eiu9ywUifSo-WPK174x7qcucrDzZDJD73yM9LaNa6a~CbD-bBw7krC~VDkHBHOag__&Key-Pair-Id=KMHN1LQ1HEUPL",
109
- "size": "243647",
110
- "delay": 0
111
- },
112
- {
113
- "id": "842043474382833832",
114
- "lan": "zh",
115
- "lanName": "中文",
116
- "url": "https://cacdn.hakunaymatata.com/subtitle/7d6471b79c8ca64df92ac0ab42422056.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMzMzA0fX19XX0_&Signature=L1K8OvrL7zEKR1tk3N3FIWNSRuYMJz6PvdVqDZ1IiVzPuktlqVNKA3MJgFiYUS5F68Ck6WixgIO6hA80Dio78bjYk4ZYl-ihv1d1ZFMfWtBj4Reu2jfNe5xzkXJptpCBA0AjdjNvv5AMZfTZk8Kq~1kJpVpHpN6x1y45zc7M-xTSSMLXsaV4O7mez6XKW7Pb1IAhkNjfJ3vp9D4oHKgT-9wEMk2GixI6EV-Q9hq1qNxOk3RUlFGJLJnbNVU331JRiufEGdZwtp148sQR85sxO1vfGphjDuplH6~~ItYaCaI34wsG97WqOUaqda2ZyPo0UYm3cmhjzLODkAlGP3s9iA__&Key-Pair-Id=KMHN1LQ1HEUPL",
117
- "size": "127218",
118
- "delay": 0
119
- }
120
- ],
121
- "limited": false,
122
- "limitedCode": "",
123
- "freeNum": 6,
124
- "hasResource": true
125
- }
126
- }