@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
@@ -0,0 +1,64 @@
1
+ import type { Dispatcher } from 'undici';
2
+ import type { Logger } from './logger.js';
3
+ type RequestSearchParams = Record<string, string | number | boolean | undefined>;
4
+ interface BaseFetchOptions {
5
+ headers?: HeadersInit;
6
+ searchParams?: RequestSearchParams;
7
+ requireCookies?: boolean;
8
+ }
9
+ interface FetchJsonOptions extends BaseFetchOptions {
10
+ method?: 'GET' | 'POST';
11
+ body?: unknown;
12
+ }
13
+ type FetchHtmlOptions = BaseFetchOptions;
14
+ interface RetryContext {
15
+ attempt: number;
16
+ maxAttempts: number;
17
+ url: string;
18
+ baseUrl: string;
19
+ }
20
+ export interface MovieboxSessionOptions {
21
+ host?: string;
22
+ protocol?: 'https' | 'http';
23
+ baseUrl?: string;
24
+ mirrorHosts?: readonly string[];
25
+ defaultHeaders?: HeadersInit;
26
+ fetch?: typeof fetch;
27
+ maxRetries?: number;
28
+ retryDelayMs?: number;
29
+ retry?: {
30
+ maxAttempts?: number;
31
+ delayMs?: number;
32
+ shouldRetryError?: (error: Error, context: RetryContext) => boolean;
33
+ shouldRetryResponse?: (response: Response, context: RetryContext) => boolean;
34
+ };
35
+ logger?: Logger;
36
+ proxyUrl?: string;
37
+ dispatcher?: Dispatcher;
38
+ }
39
+ export declare class MovieboxSession {
40
+ readonly fetchImpl: typeof fetch;
41
+ readonly defaultHeaders: Record<string, string>;
42
+ readonly logger: Logger;
43
+ private readonly baseUrls;
44
+ private currentBaseIndex;
45
+ private readonly retryPolicy;
46
+ private readonly cookieJar;
47
+ private cookiesInitialized;
48
+ private readonly dispatcher;
49
+ constructor(options?: MovieboxSessionOptions);
50
+ get baseUrl(): string;
51
+ buildUrl(path: string, searchParams?: RequestSearchParams, baseUrl?: string): string;
52
+ fetchJson<T>(path: string, options?: FetchJsonOptions): Promise<T>;
53
+ postJson<T>(path: string, body: unknown, headers?: HeadersInit): Promise<T>;
54
+ fetchHtml(path: string, options?: FetchHtmlOptions): Promise<string>;
55
+ buildDetailUrl(detailPath: string, subjectId: string): string;
56
+ ensureSessionCookies(): Promise<boolean>;
57
+ private performRequest;
58
+ private attemptWithRetries;
59
+ private executeSingleRequest;
60
+ private storeResponseCookies;
61
+ private shouldRetryResponse;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,417 @@
1
+ import { ProxyAgent } from 'undici';
2
+ import { APP_INFO_PATH, DEFAULT_PROTOCOL, DEFAULT_REQUEST_HEADERS, ENV_HOST_KEY, ENV_PROXY_KEY, ITEM_DETAILS_PATH, MIRROR_HOSTS } from './constants.js';
3
+ import { EmptyResponseError, GeoBlockedError, MirrorExhaustedError, MovieboxApiError, MovieboxHttpError, RetryLimitExceededError, UnsuccessfulResponseError } from './errors.js';
4
+ import { createNoopLogger } from './logger.js';
5
+ const DEFAULT_MAX_RETRIES = 2;
6
+ const DEFAULT_RETRY_DELAY_MS = 200;
7
+ export class MovieboxSession {
8
+ fetchImpl;
9
+ defaultHeaders;
10
+ logger;
11
+ baseUrls;
12
+ currentBaseIndex = 0;
13
+ retryPolicy;
14
+ cookieJar = new Map();
15
+ cookiesInitialized = false;
16
+ dispatcher;
17
+ constructor(options = {}) {
18
+ const protocol = options.protocol ?? DEFAULT_PROTOCOL;
19
+ const declaredHost = options.host ?? getDeclaredHost();
20
+ const candidateHosts = uniqueStrings([
21
+ options.baseUrl ? extractHost(options.baseUrl) : undefined,
22
+ declaredHost,
23
+ ...(options.mirrorHosts ?? MIRROR_HOSTS)
24
+ ]);
25
+ const baseUrls = candidateHosts.length
26
+ ? candidateHosts.map((host) => ensureTrailingSlash(`${protocol}://${host}`))
27
+ : [ensureTrailingSlash(`${protocol}://${MIRROR_HOSTS[0]}`)];
28
+ if (options.baseUrl) {
29
+ baseUrls.unshift(ensureTrailingSlash(options.baseUrl));
30
+ }
31
+ this.baseUrls = uniqueStrings(baseUrls);
32
+ if (this.baseUrls.length === 0) {
33
+ throw new MovieboxApiError('MovieboxSession could not determine any base URLs.');
34
+ }
35
+ const fetchImplementation = options.fetch ?? globalThis.fetch;
36
+ if (!fetchImplementation) {
37
+ throw new MovieboxApiError('MovieboxSession requires a fetch implementation.');
38
+ }
39
+ this.fetchImpl = fetchImplementation;
40
+ const proxyUrl = options.proxyUrl ?? getDeclaredProxy();
41
+ this.dispatcher = options.dispatcher ?? (proxyUrl ? createProxyAgent(proxyUrl) : undefined);
42
+ this.logger = options.logger ?? createNoopLogger();
43
+ this.defaultHeaders = {
44
+ ...DEFAULT_REQUEST_HEADERS,
45
+ ...normalizeHeaderRecord(options.defaultHeaders)
46
+ };
47
+ const retryOptions = options.retry ?? {};
48
+ const configuredAttempts = retryOptions.maxAttempts ?? (options.maxRetries !== undefined
49
+ ? Math.max(0, options.maxRetries) + 1
50
+ : DEFAULT_MAX_RETRIES + 1);
51
+ const retryDelay = retryOptions.delayMs ?? options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
52
+ const errorPredicate = retryOptions.shouldRetryError ??
53
+ ((error, _context) => !(error instanceof GeoBlockedError || error instanceof MirrorExhaustedError));
54
+ const responsePredicate = retryOptions.shouldRetryResponse ??
55
+ ((response, _context) => {
56
+ if (response.status >= 500)
57
+ return true;
58
+ if (response.status === 429 || response.status === 408)
59
+ return true;
60
+ return false;
61
+ });
62
+ this.retryPolicy = {
63
+ maxAttempts: Math.max(1, configuredAttempts),
64
+ delayMs: retryDelay,
65
+ shouldRetryError: (error, context) => errorPredicate(error, context),
66
+ shouldRetryResponse: (response, context) => responsePredicate(response, context)
67
+ };
68
+ }
69
+ get baseUrl() {
70
+ return this.baseUrls[this.currentBaseIndex] ?? this.baseUrls[0];
71
+ }
72
+ buildUrl(path, searchParams, baseUrl) {
73
+ const root = baseUrl ?? this.baseUrls[this.currentBaseIndex];
74
+ const url = new URL(path, root);
75
+ if (searchParams) {
76
+ for (const [key, value] of Object.entries(searchParams)) {
77
+ if (value !== undefined) {
78
+ url.searchParams.set(key, String(value));
79
+ }
80
+ }
81
+ }
82
+ return url.toString();
83
+ }
84
+ async fetchJson(path, options = {}) {
85
+ const { method = 'GET', body, headers, searchParams, requireCookies } = options;
86
+ if (requireCookies) {
87
+ await this.ensureSessionCookies();
88
+ }
89
+ const payload = body === undefined ? undefined : JSON.stringify(body);
90
+ const requestOptions = {
91
+ method,
92
+ sendCookies: true,
93
+ captureCookies: true
94
+ };
95
+ if (payload !== undefined) {
96
+ requestOptions.body = payload;
97
+ }
98
+ if (headers) {
99
+ requestOptions.headers = headers;
100
+ }
101
+ if (searchParams) {
102
+ requestOptions.searchParams = searchParams;
103
+ }
104
+ const response = await this.performRequest(path, requestOptions);
105
+ const raw = await response.text();
106
+ if (!raw) {
107
+ throw new EmptyResponseError(response.url);
108
+ }
109
+ let parsed;
110
+ try {
111
+ parsed = JSON.parse(raw);
112
+ }
113
+ catch {
114
+ throw new MovieboxHttpError('Moviebox API returned invalid JSON', response.status, response.url);
115
+ }
116
+ return unwrapEnvelope(parsed, response.url);
117
+ }
118
+ async postJson(path, body, headers) {
119
+ const options = {
120
+ method: 'POST',
121
+ body
122
+ };
123
+ if (headers) {
124
+ options.headers = headers;
125
+ }
126
+ return this.fetchJson(path, options);
127
+ }
128
+ async fetchHtml(path, options = {}) {
129
+ const requestOptions = {
130
+ method: 'GET',
131
+ headers: {
132
+ Accept: 'text/html,application/xhtml+xml',
133
+ ...normalizeHeaderRecord(options.headers)
134
+ },
135
+ sendCookies: true,
136
+ captureCookies: true
137
+ };
138
+ if (options.searchParams) {
139
+ requestOptions.searchParams = options.searchParams;
140
+ }
141
+ const response = await this.performRequest(path, requestOptions);
142
+ const html = await response.text();
143
+ if (!html) {
144
+ throw new EmptyResponseError(response.url);
145
+ }
146
+ return html;
147
+ }
148
+ buildDetailUrl(detailPath, subjectId) {
149
+ const relative = `${ITEM_DETAILS_PATH}/${detailPath}?id=${subjectId}`;
150
+ return this.buildUrl(relative);
151
+ }
152
+ async ensureSessionCookies() {
153
+ if (this.cookiesInitialized) {
154
+ return this.cookieJar.size > 0;
155
+ }
156
+ const response = await this.performRequest(APP_INFO_PATH, {
157
+ method: 'GET',
158
+ searchParams: { app_name: 'moviebox' },
159
+ sendCookies: true,
160
+ captureCookies: true
161
+ }, { skipMirrorAdvance: false, skipRetryLoop: false });
162
+ try {
163
+ await response.arrayBuffer();
164
+ }
165
+ catch {
166
+ // ignore drain errors
167
+ }
168
+ this.cookiesInitialized = true;
169
+ return this.cookieJar.size > 0;
170
+ }
171
+ async performRequest(path, options, control = {}) {
172
+ const { skipMirrorAdvance = false, skipRetryLoop = false } = control;
173
+ const failures = [];
174
+ for (let mirrorOffset = 0; mirrorOffset < this.baseUrls.length; mirrorOffset += 1) {
175
+ const baseIndex = (this.currentBaseIndex + mirrorOffset) % this.baseUrls.length;
176
+ const baseUrl = this.baseUrls[baseIndex];
177
+ const requestUrl = this.buildUrl(path, options.searchParams, baseUrl);
178
+ this.logger.debug({ baseUrl, path, attempt: mirrorOffset + 1 }, 'attempting request via mirror');
179
+ const attemptResponse = await this.attemptWithRetries(path, baseUrl, options, skipRetryLoop).catch((error) => {
180
+ const normalized = asError(error);
181
+ if (normalized instanceof GeoBlockedError) {
182
+ throw normalized;
183
+ }
184
+ failures.push({ url: requestUrl, error: normalized });
185
+ this.logger.warn({ baseUrl, error: normalized.message }, 'request via mirror failed');
186
+ return null;
187
+ });
188
+ if (!attemptResponse) {
189
+ continue;
190
+ }
191
+ if (!skipMirrorAdvance) {
192
+ this.currentBaseIndex = baseIndex;
193
+ }
194
+ if (options.captureCookies !== false) {
195
+ this.storeResponseCookies(attemptResponse);
196
+ }
197
+ this.logger.debug({ baseUrl, path }, 'request succeeded');
198
+ return attemptResponse;
199
+ }
200
+ this.logger.error({ failures }, 'all mirrors exhausted');
201
+ throw new MirrorExhaustedError(failures);
202
+ }
203
+ async attemptWithRetries(path, baseUrl, options, skipRetryLoop) {
204
+ const maxAttempts = skipRetryLoop ? 1 : this.retryPolicy.maxAttempts;
205
+ let attempt = 0;
206
+ let lastError;
207
+ while (attempt < maxAttempts) {
208
+ attempt += 1;
209
+ try {
210
+ const response = await this.executeSingleRequest(path, baseUrl, options);
211
+ if (response.status === 451 || response.status === 403) {
212
+ this.logger.warn({ status: response.status, url: response.url }, 'geo-blocked response');
213
+ throw new GeoBlockedError(response.url, response.status);
214
+ }
215
+ if (!response.ok) {
216
+ const context = {
217
+ attempt,
218
+ maxAttempts,
219
+ url: response.url,
220
+ baseUrl
221
+ };
222
+ const shouldRetry = attempt < maxAttempts && this.shouldRetryResponse(response, context);
223
+ if (shouldRetry) {
224
+ this.logger.warn({ status: response.status, attempt, baseUrl }, 'retrying after response status');
225
+ await delay(this.retryPolicy.delayMs);
226
+ continue;
227
+ }
228
+ throw new MovieboxHttpError(`Moviebox API request failed with status ${response.status}`, response.status, response.url);
229
+ }
230
+ return response;
231
+ }
232
+ catch (error) {
233
+ lastError = asError(error);
234
+ if (lastError instanceof GeoBlockedError) {
235
+ throw lastError;
236
+ }
237
+ const context = {
238
+ attempt,
239
+ maxAttempts,
240
+ url: this.buildUrl(path, options.searchParams, baseUrl),
241
+ baseUrl
242
+ };
243
+ const shouldRetry = attempt < maxAttempts && this.retryPolicy.shouldRetryError(lastError, context);
244
+ if (shouldRetry) {
245
+ this.logger.warn({ attempt, baseUrl, error: lastError.message }, 'retrying after error');
246
+ await delay(this.retryPolicy.delayMs);
247
+ continue;
248
+ }
249
+ break;
250
+ }
251
+ }
252
+ if (lastError) {
253
+ if (!skipRetryLoop && maxAttempts > 1) {
254
+ throw new RetryLimitExceededError(lastError.message, maxAttempts - 1);
255
+ }
256
+ throw lastError;
257
+ }
258
+ throw new MovieboxApiError('Unknown error while contacting Moviebox API');
259
+ }
260
+ async executeSingleRequest(path, baseUrl, options) {
261
+ const url = this.buildUrl(path, options.searchParams, baseUrl);
262
+ const initHeaders = {
263
+ ...this.defaultHeaders,
264
+ ...normalizeHeaderRecord(options.headers)
265
+ };
266
+ if (options.sendCookies !== false && this.cookieJar.size > 0) {
267
+ initHeaders.Cookie = serializeCookies(this.cookieJar);
268
+ }
269
+ if (options.body !== undefined && !('Content-Type' in initHeaders)) {
270
+ initHeaders['Content-Type'] = 'application/json';
271
+ }
272
+ const requestInit = {
273
+ method: options.method,
274
+ headers: initHeaders
275
+ };
276
+ if (options.body !== undefined) {
277
+ requestInit.body = options.body;
278
+ }
279
+ if (this.dispatcher) {
280
+ requestInit.dispatcher = this.dispatcher;
281
+ }
282
+ const response = await this.fetchImpl(url, requestInit);
283
+ return response;
284
+ }
285
+ storeResponseCookies(response) {
286
+ const setCookieValues = getSetCookieValues(response.headers);
287
+ for (const cookie of setCookieValues) {
288
+ const [pair] = cookie.split(';');
289
+ if (!pair) {
290
+ continue;
291
+ }
292
+ const [rawName, ...rawValueParts] = pair.split('=');
293
+ const name = rawName?.trim();
294
+ const value = rawValueParts.join('=').trim();
295
+ if (!name) {
296
+ continue;
297
+ }
298
+ if (!value) {
299
+ this.cookieJar.delete(name);
300
+ continue;
301
+ }
302
+ this.cookieJar.set(name, value);
303
+ }
304
+ }
305
+ shouldRetryResponse(response, context) {
306
+ return this.retryPolicy.shouldRetryResponse(response, context);
307
+ }
308
+ }
309
+ function unwrapEnvelope(payload, url) {
310
+ if (payload &&
311
+ typeof payload === 'object' &&
312
+ 'code' in payload &&
313
+ typeof payload.code === 'number') {
314
+ const envelope = payload;
315
+ if (envelope.code === 0 && envelope.message === 'ok' && 'data' in envelope) {
316
+ return envelope.data;
317
+ }
318
+ throw new UnsuccessfulResponseError(url, payload);
319
+ }
320
+ return payload;
321
+ }
322
+ function ensureTrailingSlash(baseUrl) {
323
+ return baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
324
+ }
325
+ function getDeclaredHost() {
326
+ if (typeof process !== 'undefined' && process.env) {
327
+ return process.env[ENV_HOST_KEY];
328
+ }
329
+ return undefined;
330
+ }
331
+ function getDeclaredProxy() {
332
+ if (typeof process !== 'undefined' && process.env) {
333
+ return process.env[ENV_PROXY_KEY];
334
+ }
335
+ return undefined;
336
+ }
337
+ function extractHost(url) {
338
+ if (!url) {
339
+ return undefined;
340
+ }
341
+ try {
342
+ return new URL(url).host;
343
+ }
344
+ catch {
345
+ return undefined;
346
+ }
347
+ }
348
+ function uniqueStrings(values) {
349
+ const seen = new Set();
350
+ const result = [];
351
+ for (const value of values) {
352
+ if (!value) {
353
+ continue;
354
+ }
355
+ if (!seen.has(value)) {
356
+ seen.add(value);
357
+ result.push(value);
358
+ }
359
+ }
360
+ return result;
361
+ }
362
+ function normalizeHeaderRecord(headers) {
363
+ if (!headers) {
364
+ return {};
365
+ }
366
+ if (Array.isArray(headers)) {
367
+ return Object.fromEntries(headers);
368
+ }
369
+ if (headers instanceof Headers) {
370
+ const result = {};
371
+ headers.forEach((value, key) => {
372
+ result[key] = value;
373
+ });
374
+ return result;
375
+ }
376
+ return { ...headers };
377
+ }
378
+ function serializeCookies(jar) {
379
+ return Array.from(jar.entries())
380
+ .map(([name, value]) => `${name}=${value}`)
381
+ .join('; ');
382
+ }
383
+ function getSetCookieValues(headers) {
384
+ const headerWithRaw = headers;
385
+ const rawFn = headerWithRaw.raw;
386
+ if (typeof rawFn === 'function') {
387
+ const raw = rawFn.call(headerWithRaw);
388
+ const setCookie = raw['set-cookie'];
389
+ if (Array.isArray(setCookie)) {
390
+ return setCookie;
391
+ }
392
+ }
393
+ const single = headers.get('set-cookie');
394
+ return single ? [single] : [];
395
+ }
396
+ async function delay(ms) {
397
+ if (ms <= 0) {
398
+ return;
399
+ }
400
+ await new Promise((resolve) => setTimeout(resolve, ms));
401
+ }
402
+ function asError(value) {
403
+ if (value instanceof Error) {
404
+ return value;
405
+ }
406
+ return new Error(String(value));
407
+ }
408
+ function createProxyAgent(proxyUrl) {
409
+ try {
410
+ return new ProxyAgent(proxyUrl);
411
+ }
412
+ catch {
413
+ // if proxy URL invalid, surface error later without blocking session creation
414
+ return undefined;
415
+ }
416
+ }
417
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { GeoBlockedError, MirrorExhaustedError } from './errors.js';
3
+ import { createNoopLogger } from './logger.js';
4
+ import { MovieboxSession } from './session.js';
5
+ const envelope = (data) => ({ code: 0, message: 'ok', data });
6
+ const jsonResponse = (data, init = {}) => new Response(JSON.stringify(envelope(data)), {
7
+ status: 200,
8
+ headers: { 'Content-Type': 'application/json', ...(init.headers ?? {}) },
9
+ ...init
10
+ });
11
+ describe('MovieboxSession', () => {
12
+ let fetchMock;
13
+ beforeEach(() => {
14
+ fetchMock = vi.fn();
15
+ });
16
+ afterEach(() => {
17
+ vi.clearAllMocks();
18
+ });
19
+ it('falls back to alternate mirrors when the primary host fails', async () => {
20
+ fetchMock.mockRejectedValueOnce(new TypeError('network error'));
21
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
22
+ const session = new MovieboxSession({
23
+ host: 'primary.example',
24
+ mirrorHosts: ['primary.example', 'secondary.example'],
25
+ protocol: 'https',
26
+ fetch: fetchMock,
27
+ retry: { maxAttempts: 0, delayMs: 0 }
28
+ });
29
+ const result = await session.fetchJson('/resource');
30
+ expect(result).toEqual({ ok: true });
31
+ expect(fetchMock).toHaveBeenCalledTimes(2);
32
+ expect(fetchMock.mock.calls[1]?.[0]).toBe('https://secondary.example/resource');
33
+ });
34
+ it('stores set-cookie headers and replays cookies on subsequent requests', async () => {
35
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }, { headers: { 'Set-Cookie': 'account=test-token; Path=/' } }));
36
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
37
+ const session = new MovieboxSession({ baseUrl: 'https://moviebox.test', fetch: fetchMock });
38
+ await session.fetchJson('/first');
39
+ await session.fetchJson('/second');
40
+ const requestHeaders = fetchMock.mock.calls[1]?.[1]?.headers;
41
+ expect(requestHeaders?.Cookie).toContain('account=test-token');
42
+ });
43
+ it('ensures session cookies by calling the app info endpoint when requested', async () => {
44
+ fetchMock.mockResolvedValueOnce(jsonResponse([
45
+ { version: '1.0.0' }
46
+ ], { headers: { 'Set-Cookie': 'account=appinfo; Path=/' } }));
47
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
48
+ const session = new MovieboxSession({ baseUrl: 'https://moviebox.test', fetch: fetchMock });
49
+ const hasCookies = await session.ensureSessionCookies();
50
+ expect(hasCookies).toBe(true);
51
+ await session.fetchJson('/needs-cookies');
52
+ expect(fetchMock).toHaveBeenCalledTimes(2);
53
+ expect(fetchMock.mock.calls[0]?.[0]).toContain('/wefeed-h5-bff/app/get-latest-app-pkgs');
54
+ const secondHeaders = fetchMock.mock.calls[1]?.[1]?.headers;
55
+ expect(secondHeaders?.Cookie).toContain('account=appinfo');
56
+ });
57
+ it('throws MirrorExhaustedError when all mirrors fail', async () => {
58
+ fetchMock.mockRejectedValue(new TypeError('network failure'));
59
+ const session = new MovieboxSession({
60
+ host: 'primary.example',
61
+ mirrorHosts: ['primary.example', 'secondary.example'],
62
+ protocol: 'https',
63
+ fetch: fetchMock,
64
+ retry: { maxAttempts: 0, delayMs: 0 }
65
+ });
66
+ await expect(session.fetchJson('/resource')).rejects.toBeInstanceOf(MirrorExhaustedError);
67
+ });
68
+ it('throws GeoBlockedError on 451 responses', async () => {
69
+ fetchMock.mockResolvedValue(new Response('', {
70
+ status: 451,
71
+ headers: { 'Content-Type': 'application/json' }
72
+ }));
73
+ const session = new MovieboxSession({ baseUrl: 'https://moviebox.test', fetch: fetchMock });
74
+ await expect(session.fetchJson('/geo')).rejects.toBeInstanceOf(GeoBlockedError);
75
+ });
76
+ it('emits debug logs when logger provided', async () => {
77
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
78
+ const logger = {
79
+ ...createNoopLogger(),
80
+ debug: vi.fn(),
81
+ warn: vi.fn(),
82
+ error: vi.fn()
83
+ };
84
+ const session = new MovieboxSession({ baseUrl: 'https://moviebox.test', fetch: fetchMock, logger });
85
+ await session.fetchJson('/logging');
86
+ expect(logger.debug).toHaveBeenCalled();
87
+ expect(logger.error).not.toHaveBeenCalled();
88
+ });
89
+ it('applies proxy dispatcher when proxyUrl provided', async () => {
90
+ const dispatcher = Symbol('dispatcher');
91
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
92
+ const session = new MovieboxSession({
93
+ baseUrl: 'https://moviebox.test',
94
+ fetch: fetchMock,
95
+ dispatcher: dispatcher
96
+ });
97
+ await session.fetchJson('/proxy-check');
98
+ const init = fetchMock.mock.calls[0]?.[1];
99
+ expect(init.dispatcher).toBe(dispatcher);
100
+ });
101
+ it('reads proxy configuration from environment variable', async () => {
102
+ vi.stubEnv('MOVIEBOX_API_PROXY', 'http://proxy.local:8080');
103
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
104
+ const session = new MovieboxSession({ baseUrl: 'https://moviebox.test', fetch: fetchMock });
105
+ await session.fetchJson('/env-proxy');
106
+ const init = fetchMock.mock.calls[0]?.[1];
107
+ expect(init && 'dispatcher' in init).toBe(true);
108
+ vi.unstubAllEnvs();
109
+ });
110
+ });
111
+ //# sourceMappingURL=session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.js","sourceRoot":"","sources":["../src/session.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MovieboxSession } from './session.js';
2
+ import type { StreamResult } from './types.js';
3
+ type StreamQuality = 'best' | 'worst' | number | undefined;
4
+ interface BaseStreamParams {
5
+ detailPath: string;
6
+ subjectId?: string;
7
+ quality?: StreamQuality;
8
+ }
9
+ interface EpisodeStreamParams extends BaseStreamParams {
10
+ season: number;
11
+ episode: number;
12
+ }
13
+ type MovieStreamParams = BaseStreamParams;
14
+ export declare function getMovieStreamUrl(session: MovieboxSession, params: MovieStreamParams): Promise<StreamResult>;
15
+ export declare function getEpisodeStreamUrl(session: MovieboxSession, params: EpisodeStreamParams): Promise<StreamResult>;
16
+ export {};
17
+ //# sourceMappingURL=stream.d.ts.map