@weroperking/invenio-scraper 1.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.
Files changed (80) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +407 -0
  3. package/dist/__fixtures__/download-avatar.json +126 -0
  4. package/dist/__fixtures__/download-merlin-s1e1.json +90 -0
  5. package/dist/__fixtures__/search-titanic.json +245 -0
  6. package/dist/__fixtures__/stream-merlin-s1e1.json +32 -0
  7. package/dist/__fixtures__/stream-titanic.json +41 -0
  8. package/dist/constants.d.ts +14 -0
  9. package/dist/constants.d.ts.map +1 -0
  10. package/dist/constants.js +22 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/details.d.ts +20 -0
  13. package/dist/details.d.ts.map +1 -0
  14. package/dist/details.js +273 -0
  15. package/dist/details.js.map +1 -0
  16. package/dist/details.test.d.ts +2 -0
  17. package/dist/details.test.d.ts.map +1 -0
  18. package/dist/details.test.js +65 -0
  19. package/dist/details.test.js.map +1 -0
  20. package/dist/download.d.ts +35 -0
  21. package/dist/download.d.ts.map +1 -0
  22. package/dist/download.js +258 -0
  23. package/dist/download.js.map +1 -0
  24. package/dist/download.test.d.ts +2 -0
  25. package/dist/download.test.d.ts.map +1 -0
  26. package/dist/download.test.js +202 -0
  27. package/dist/download.test.js.map +1 -0
  28. package/dist/errors.d.ts +31 -0
  29. package/dist/errors.d.ts.map +1 -0
  30. package/dist/errors.js +53 -0
  31. package/dist/errors.js.map +1 -0
  32. package/dist/index.d.ts +11 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +9 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/index.test.d.ts +2 -0
  37. package/dist/index.test.d.ts.map +1 -0
  38. package/dist/index.test.js +10 -0
  39. package/dist/index.test.js.map +1 -0
  40. package/dist/logger.d.ts +10 -0
  41. package/dist/logger.d.ts.map +1 -0
  42. package/dist/logger.js +15 -0
  43. package/dist/logger.js.map +1 -0
  44. package/dist/search.d.ts +4 -0
  45. package/dist/search.d.ts.map +1 -0
  46. package/dist/search.js +102 -0
  47. package/dist/search.js.map +1 -0
  48. package/dist/search.test.d.ts +2 -0
  49. package/dist/search.test.d.ts.map +1 -0
  50. package/dist/search.test.js +67 -0
  51. package/dist/search.test.js.map +1 -0
  52. package/dist/series.d.ts +15 -0
  53. package/dist/series.d.ts.map +1 -0
  54. package/dist/series.js +111 -0
  55. package/dist/series.js.map +1 -0
  56. package/dist/series.test.d.ts +2 -0
  57. package/dist/series.test.d.ts.map +1 -0
  58. package/dist/series.test.js +78 -0
  59. package/dist/series.test.js.map +1 -0
  60. package/dist/session.d.ts +64 -0
  61. package/dist/session.d.ts.map +1 -0
  62. package/dist/session.js +417 -0
  63. package/dist/session.js.map +1 -0
  64. package/dist/session.test.d.ts +2 -0
  65. package/dist/session.test.d.ts.map +1 -0
  66. package/dist/session.test.js +111 -0
  67. package/dist/session.test.js.map +1 -0
  68. package/dist/stream.d.ts +17 -0
  69. package/dist/stream.d.ts.map +1 -0
  70. package/dist/stream.js +118 -0
  71. package/dist/stream.js.map +1 -0
  72. package/dist/stream.test.d.ts +2 -0
  73. package/dist/stream.test.d.ts.map +1 -0
  74. package/dist/stream.test.js +77 -0
  75. package/dist/stream.test.js.map +1 -0
  76. package/dist/types.d.ts +293 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +2 -0
  79. package/dist/types.js.map +1 -0
  80. package/package.json +86 -0
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2024 Makaveli
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,407 @@
1
+ # 🎬 invenio-scraper
2
+
3
+ [![npm version](https://img.shields.io/npm/v/invenio-scraper)](https://www.npmjs.com/package/invenio-scraper)
4
+ [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)
5
+ [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)](https://nodejs.org)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)
7
+
8
+ **invenio-scraper - A web scraping library for extracting movie and TV show data**
9
+
10
+ A resilient, fully-typed JavaScript SDK for interacting with Moviebox APIs.
11
+
12
+ ## ✨ Features
13
+
14
+ - 🔍 **Search** — Find movies, TV series, and music with filtering and pagination
15
+ - 🎥 **Details** — Get full metadata including ratings, subtitles, and quality options
16
+ - 📡 **Streaming** — Extract direct stream URLs with quality selection
17
+ - ⬇️ **Downloads** — Parallel chunked downloads with resume support and progress tracking
18
+ - 🔄 **Session Management** — Automatic mirror fallback (7 mirrors), retry policies, cookie handling
19
+ - 🌐 **Proxy Support** — HTTP/HTTPS/SOCKS proxy routing via undici
20
+ - 📦 **Pure ESM** — Modern JavaScript module format with tree-shaking support
21
+ - 🛡️ **Fully Typed** — Complete TypeScript type definitions included
22
+
23
+ ## 📦 Installation
24
+
25
+ ```bash
26
+ npm install invenio-scraper
27
+ ```
28
+
29
+ ```bash
30
+ pnpm add invenio-scraper
31
+ ```
32
+
33
+ ```bash
34
+ yarn add invenio-scraper
35
+ ```
36
+
37
+ **Requirements:** Node.js 18+
38
+
39
+ ## 🚀 Quick Start
40
+
41
+ ```typescript
42
+ import {
43
+ MovieboxSession,
44
+ search,
45
+ getMovieDetails,
46
+ getMovieStreamUrl
47
+ } from 'invenio-scraper';
48
+
49
+ const session = new MovieboxSession();
50
+
51
+ // Search for content
52
+ const results = await search(session, { query: 'Inception' });
53
+ const first = results.results[0];
54
+
55
+ if (first) {
56
+ // Get detailed movie information
57
+ const details = await getMovieDetails(session, {
58
+ detailPath: first.raw.detailPath
59
+ });
60
+
61
+ // Get stream URL
62
+ const stream = await getMovieStreamUrl(session, {
63
+ detailPath: first.raw.detailPath,
64
+ quality: 'best'
65
+ });
66
+
67
+ console.log(`${details.title}: ${stream.stream?.url}`);
68
+ }
69
+ ```
70
+
71
+ ## 📚 API Overview
72
+
73
+ | Capability | Function | Description |
74
+ |------------|----------|-------------|
75
+ | 🔍 Search | [`search(session, params)`](docs/api-reference.md) | Search movies, series, and music |
76
+ | 🎬 Movie Details | [`getMovieDetails(session, params)`](docs/api-reference.md) | Get full movie metadata |
77
+ | 📺 Series Details | [`getSeriesDetails(session, params)`](docs/api-reference.md) | Get series metadata & seasons |
78
+ | 📺 Episode Qualities | [`getEpisodeQualities(session, params)`](docs/api-reference.md) | Get episode download options |
79
+ | 📡 Movie Stream | [`getMovieStreamUrl(session, params)`](docs/api-reference.md) | Extract movie stream URL |
80
+ | 📡 Episode Stream | [`getEpisodeStreamUrl(session, params)`](docs/api-reference.md) | Extract episode stream URL |
81
+ | ⬇️ Movie Download | [`downloadMovie(session, params)`](docs/api-reference.md) | Download a movie file |
82
+ | ⬇️ Episode Download | [`downloadEpisode(session, params)`](docs/api-reference.md) | Download an episode file |
83
+ | ⬇️ Media Download | [`downloadMediaFile(session, option, destination, options)`](docs/api-reference.md) | Download with progress tracking |
84
+
85
+ ## ⚙️ Configuration
86
+
87
+ ### Session Options
88
+
89
+ ```typescript
90
+ import { MovieboxSession, createLogger } from 'invenio-scraper';
91
+
92
+ const session = new MovieboxSession({
93
+ host: 'h5.aoneroom.com',
94
+ mirrorHosts: ['h5.aoneroom.com', 'movieboxapp.in'],
95
+ proxyUrl: process.env.INVENIO_API_PROXY,
96
+ logger: createLogger({ level: 'info' }),
97
+ retry: {
98
+ maxAttempts: 3,
99
+ delayMs: 500
100
+ }
101
+ });
102
+ ```
103
+
104
+ ### Options Table
105
+
106
+ | Option | Type | Default | Description |
107
+ |--------|------|---------|-------------|
108
+ | `host` | `string` | First mirror | Primary API host |
109
+ | `mirrorHosts` | `readonly string[]` | 7 built-in mirrors | List of fallback mirrors |
110
+ | `protocol` | `'http' \| 'https'` | `'https'` | Protocol to use |
111
+ | `proxyUrl` | `string` | — | HTTP/HTTPS/SOCKS proxy URL |
112
+ | `logger` | `Logger` | No-op logger | Custom logger instance |
113
+ | `retry.maxAttempts` | `number` | `2` | Maximum retry attempts |
114
+ | `retry.delayMs` | `number` | `200` | Delay between retries (ms) |
115
+ | `defaultHeaders` | `HeadersInit` | Built-in headers | Custom request headers |
116
+
117
+ ### Environment Variables
118
+
119
+ | Variable | Description |
120
+ |----------|-------------|
121
+ | `INVENIO_API_HOST` | Override the default mirror host |
122
+ | `INVENIO_API_PROXY` | Route requests through an HTTP/S/SOCKS proxy |
123
+
124
+ ## 📖 Usage Examples
125
+
126
+ ### Basic Search
127
+
128
+ ```typescript
129
+ import { MovieboxSession, search } from 'invenio-scraper';
130
+
131
+ const session = new MovieboxSession();
132
+
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
+ });
140
+
141
+ console.log(`Found ${results.totalCount} results`);
142
+ console.log(`Has more: ${results.hasMore}`);
143
+
144
+ for (const item of results.results) {
145
+ console.log(`${item.title} (${item.releaseYear ?? 'N/A'}) - ${item.rating}/10`);
146
+ }
147
+ ```
148
+
149
+ ### Getting Movie Details
150
+
151
+ ```typescript
152
+ import { MovieboxSession, getMovieDetails } from 'invenio-scraper';
153
+
154
+ const session = new MovieboxSession();
155
+
156
+ const details = await getMovieDetails(session, {
157
+ detailPath: 'inception-e1BOR6f19C7'
158
+ });
159
+
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(', ')}`);
165
+
166
+ // Available download qualities
167
+ for (const download of details.downloads) {
168
+ console.log(`${download.quality}: ${(download.sizeBytes / 1024 / 1024).toFixed(1)} MB`);
169
+ }
170
+
171
+ // Available subtitles
172
+ for (const caption of details.captions) {
173
+ console.log(`Subtitle: ${caption.language}`);
174
+ }
175
+ ```
176
+
177
+ ### Downloading with Progress
178
+
179
+ ```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
+ });
195
+
196
+ console.log(`\nSaved to: ${filePath}`);
197
+ ```
198
+
199
+ ### Series & Episodes
200
+
201
+ ```typescript
202
+ import {
203
+ MovieboxSession,
204
+ search,
205
+ getSeriesDetails,
206
+ getEpisodeQualities,
207
+ getEpisodeStreamUrl,
208
+ 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);
254
+ }
255
+ ```
256
+
257
+ ### Proxy Configuration
258
+
259
+ ```typescript
260
+ import { MovieboxSession } from 'invenio-scraper';
261
+
262
+ // HTTP proxy
263
+ const session = new MovieboxSession({
264
+ proxyUrl: 'http://proxy.example.com:8080'
265
+ });
266
+
267
+ // SOCKS5 proxy
268
+ const sessionWithSocks = new MovieboxSession({
269
+ proxyUrl: 'socks5://user:password@proxy.example.com:1080'
270
+ });
271
+
272
+ // Or use environment variable
273
+ // INVENIO_API_PROXY=socks5://proxy.example.com:1080
274
+ ```
275
+
276
+ See [docs/proxy.md](docs/proxy.md) for detailed proxy configuration.
277
+
278
+ ### Error Handling
279
+
280
+ ```typescript
281
+ import {
282
+ MovieboxSession,
283
+ search,
284
+ MovieboxApiError,
285
+ MovieboxHttpError,
286
+ GeoBlockedError,
287
+ MirrorExhaustedError,
288
+ 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);
306
+ }
307
+ }
308
+ ```
309
+
310
+ ### Custom Logger
311
+
312
+ ```typescript
313
+ import { MovieboxSession, createLogger, createNoopLogger } from 'invenio-scraper';
314
+
315
+ // Enable logging
316
+ const session = new MovieboxSession({
317
+ logger: createLogger({ level: 'debug' })
318
+ });
319
+
320
+ // Disable logging (default)
321
+ const silentSession = new MovieboxSession({
322
+ logger: createNoopLogger()
323
+ });
324
+ ```
325
+
326
+ ## 🛡️ Error Classes
327
+
328
+ | Error Class | Description |
329
+ |-------------|-------------|
330
+ | `MovieboxApiError` | Base error class for all SDK errors |
331
+ | `MovieboxHttpError` | HTTP errors with status code and URL |
332
+ | `EmptyResponseError` | API returned an empty response |
333
+ | `UnsuccessfulResponseError` | API reported failure in response |
334
+ | `GeoBlockedError` | Content not available in region |
335
+ | `MirrorExhaustedError` | All mirror hosts failed |
336
+ | `RetryLimitExceededError` | Maximum retry attempts exceeded |
337
+
338
+ ## 📘 TypeScript Support
339
+
340
+ This SDK is written in TypeScript and provides full type definitions. All types are exported:
341
+
342
+ ```typescript
343
+ import type {
344
+ SearchParams,
345
+ SearchResultPage,
346
+ NormalizedSearchResult,
347
+ MovieDetails,
348
+ SeriesDetails,
349
+ EpisodeQualities,
350
+ StreamResult,
351
+ DownloadProgress,
352
+ Logger
353
+ } from 'invenio-scraper';
354
+ ```
355
+
356
+ ## 📄 Documentation
357
+
358
+ - [API Reference](docs/api-reference.md) — Detailed API documentation
359
+ - [Proxy Configuration](docs/proxy.md) — Proxy setup guide
360
+
361
+ ## 🤝 Contributing
362
+
363
+ Contributions are welcome! Please follow these steps:
364
+
365
+ 1. Fork the repository
366
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
367
+ 3. Run checks: `pnpm lint && pnpm test`
368
+ 4. Commit your changes (`git commit -m 'Add amazing feature'`)
369
+ 5. Push to the branch (`git push origin feature/amazing-feature`)
370
+ 6. Open a Pull Request
371
+
372
+ Please include tests and update fixtures when applicable.
373
+
374
+ ## 🛠️ Development
375
+
376
+ ```bash
377
+ # Install dependencies
378
+ pnpm install
379
+
380
+ # Build the project
381
+ pnpm build
382
+
383
+ # Run tests
384
+ pnpm test
385
+
386
+ # Run tests in watch mode
387
+ pnpm test:watch
388
+
389
+ # Lint code
390
+ pnpm lint
391
+
392
+ # Format code
393
+ pnpm format
394
+
395
+ # Type check
396
+ pnpm typecheck
397
+ ```
398
+
399
+ ## 📜 License
400
+
401
+ This project is licensed under the ISC License.
402
+
403
+ ---
404
+
405
+ <p align="center">
406
+ ⭐ Star this repo if you find it useful!
407
+ </p>
@@ -0,0 +1,126 @@
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
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "code": 0,
3
+ "message": "ok",
4
+ "data": {
5
+ "downloads": [
6
+ {
7
+ "id": "6137440414628036776",
8
+ "url": "https://bcdnw.hakunaymatata.com/bt/a4eeb6aa317742ea2ddea90a770450b7.mp4?sign=d34b9add50aa8f3feb086f03d412e16d&t=1763025873",
9
+ "resolution": 360,
10
+ "size": "127075023"
11
+ },
12
+ {
13
+ "id": "7798793688104550480",
14
+ "url": "https://bcdnw.hakunaymatata.com/resource/a1498e259db8f8e1a0b8c0c0e054d898.mp4?sign=fae1a09585e7a09797049f6157503733&t=1763025566",
15
+ "resolution": 480,
16
+ "size": "588771202"
17
+ }
18
+ ],
19
+ "captions": [
20
+ {
21
+ "id": "5040295438386185208",
22
+ "lan": "ar",
23
+ "lanName": "اَلْعَرَبِيَّةُ",
24
+ "url": "https://cacdn.hakunaymatata.com/msubt/2fe99ffcf1bb3f15bf7bc972847c821c.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
25
+ "size": "42842",
26
+ "delay": 0
27
+ },
28
+ {
29
+ "id": "2153036774963134528",
30
+ "lan": "bn",
31
+ "lanName": "বাংলা",
32
+ "url": "https://cacdn.hakunaymatata.com/msubt/0278bc2c56376be81950ff4c8ee023ef.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
33
+ "size": "60702",
34
+ "delay": 0
35
+ },
36
+ {
37
+ "id": "2544218822870024320",
38
+ "lan": "en",
39
+ "lanName": "English",
40
+ "url": "https://cacdn.hakunaymatata.com/subtitle/85633276b95979818cf875985fbf9a42.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9zdWJ0aXRsZS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=MVUG-9~J8-BUMoj9jfkTReD5VIx9st-gtZqCczW2-EFss6tyMp0wJQ1iDkfaVdCu6B6ZPk0Z9tgAvKLZQAW79b5qw5p9h3s1m69WZp2ETh2tbzFs-eR6hChLzhR2MODYhqozQma2J2X00WVI6MkLkMTyPyecpa1z-YR6qeh9ard5l4K3RVF09ueVASFudvDW6D1A5-BsBNBdhIak25KV931yOnhHjerG41ykaJgROPL03At4lQ6p7XqPN~nf43pZx-GTPSXlikTVxhTcADBa4I24WLpDZp3u4cTEjGbarc-YszKYGCHTnZrPkZlY2M6Txqqb5ubTwXbx35DsKlRLzA__&Key-Pair-Id=KMHN1LQ1HEUPL",
41
+ "size": "37031",
42
+ "delay": 0
43
+ },
44
+ {
45
+ "id": "6645880979590727352",
46
+ "lan": "fil",
47
+ "lanName": "Filipino",
48
+ "url": "https://cacdn.hakunaymatata.com/msubt/63f372cf87b02766869a16a107471142.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
49
+ "size": "38500",
50
+ "delay": 0
51
+ },
52
+ {
53
+ "id": "3672942275572777096",
54
+ "lan": "fr",
55
+ "lanName": "Français",
56
+ "url": "https://cacdn.hakunaymatata.com/msubt/580eaaa337058c0fb5ee2f0f336bc467.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
57
+ "size": "38859",
58
+ "delay": 0
59
+ },
60
+ {
61
+ "id": "4365166209118224456",
62
+ "lan": "in_id",
63
+ "lanName": "Indonesian",
64
+ "url": "https://cacdn.hakunaymatata.com/msubt/8cfae5d1087a070867fcf1fc998bfa8f.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
65
+ "size": "37171",
66
+ "delay": 0
67
+ },
68
+ {
69
+ "id": "7874203611491189864",
70
+ "lan": "ru",
71
+ "lanName": "Русский",
72
+ "url": "https://cacdn.hakunaymatata.com/msubt/929f5be024d3b21083e9e60095fa0e30.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
73
+ "size": "48596",
74
+ "delay": 0
75
+ },
76
+ {
77
+ "id": "5556229772092620864",
78
+ "lan": "ur",
79
+ "lanName": "اُردُو",
80
+ "url": "https://cacdn.hakunaymatata.com/msubt/cb137de5ba8042cda4b8fed8a1716b29.srt?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYWNkbi5oYWt1bmF5bWF0YXRhLmNvbS9tc3VidC8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzYzNjMwOTMyfX19XX0_&Signature=JztNkWFh56orhUbOIZRwlH1N6s7WwAYsQUXkqs8wJV3V4~~n2xR65JMIYhn5168RYH4vCHkwSsf4BTSA2BBicWQbqMUCCUg3RbapdoUKfemAE-oNpzIMO07VKpz0JOQg0G5o3A5eDetk80uk8tmoKoz52USF~t-KtZZIQuuEx7AZlGHvhxQEfpGve6wrk4wtGpu~i6lvWVWSWI6xDp6HesPsJePcsX~NulQiQhKjRup9hVqClLJ-q-7LjvKao1l75LF3U7FrJu6fz9n~C7ASTR-K-9P5~wkMrvoUOmQIGIZ0ScqyUu-tG8~pPc1FcDZgzdi0ZAO1Y5ZQvx4QRLauqQ__&Key-Pair-Id=KMHN1LQ1HEUPL",
81
+ "size": "48687",
82
+ "delay": 0
83
+ }
84
+ ],
85
+ "limited": false,
86
+ "limitedCode": "",
87
+ "freeNum": 6,
88
+ "hasResource": true
89
+ }
90
+ }