@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.
- package/LICENSE +15 -0
- package/README.md +407 -0
- package/dist/__fixtures__/download-avatar.json +126 -0
- package/dist/__fixtures__/download-merlin-s1e1.json +90 -0
- package/dist/__fixtures__/search-titanic.json +245 -0
- package/dist/__fixtures__/stream-merlin-s1e1.json +32 -0
- package/dist/__fixtures__/stream-titanic.json +41 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -0
- package/dist/details.d.ts +20 -0
- package/dist/details.d.ts.map +1 -0
- package/dist/details.js +273 -0
- package/dist/details.js.map +1 -0
- package/dist/details.test.d.ts +2 -0
- package/dist/details.test.d.ts.map +1 -0
- package/dist/details.test.js +65 -0
- package/dist/details.test.js.map +1 -0
- package/dist/download.d.ts +35 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +258 -0
- package/dist/download.js.map +1 -0
- package/dist/download.test.d.ts +2 -0
- package/dist/download.test.d.ts.map +1 -0
- package/dist/download.test.js +202 -0
- package/dist/download.test.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +10 -0
- package/dist/index.test.js.map +1 -0
- package/dist/logger.d.ts +10 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -0
- package/dist/search.d.ts +4 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +102 -0
- package/dist/search.js.map +1 -0
- package/dist/search.test.d.ts +2 -0
- package/dist/search.test.d.ts.map +1 -0
- package/dist/search.test.js +67 -0
- package/dist/search.test.js.map +1 -0
- package/dist/series.d.ts +15 -0
- package/dist/series.d.ts.map +1 -0
- package/dist/series.js +111 -0
- package/dist/series.js.map +1 -0
- package/dist/series.test.d.ts +2 -0
- package/dist/series.test.d.ts.map +1 -0
- package/dist/series.test.js +78 -0
- package/dist/series.test.js.map +1 -0
- package/dist/session.d.ts +64 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +417 -0
- package/dist/session.js.map +1 -0
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +111 -0
- package/dist/session.test.js.map +1 -0
- package/dist/stream.d.ts +17 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +118 -0
- package/dist/stream.js.map +1 -0
- package/dist/stream.test.d.ts +2 -0
- package/dist/stream.test.d.ts.map +1 -0
- package/dist/stream.test.js +77 -0
- package/dist/stream.test.js.map +1 -0
- package/dist/types.d.ts +293 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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
|
+
[](https://www.npmjs.com/package/invenio-scraper)
|
|
4
|
+
[](https://opensource.org/licenses/ISC)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
[](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
|
+
}
|