From b03f550765ef55174acf203560fdb83d9f86962d Mon Sep 17 00:00:00 2001 From: tapframe Date: Sat, 13 Sep 2025 16:13:54 +0530 Subject: [PATCH] support for moviebox --- .App.tsx.swp | Bin 16384 -> 0 bytes local-scrapers-repo | 2 +- package-lock.json | 15 ++++ package.json | 8 +- src/services/localScraperService.ts | 128 +++++++++++++++++++++++----- 5 files changed, 128 insertions(+), 25 deletions(-) delete mode 100644 .App.tsx.swp diff --git a/.App.tsx.swp b/.App.tsx.swp deleted file mode 100644 index 2d308d86590f553fb5455b3b24279bb5a62b7514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 logger.log('[Scraper]', ...args), @@ -1068,32 +1073,106 @@ class LocalScraperService { case 'react-native-cheerio': if (cheerio) return cheerio; throw new Error('react-native-cheerio not available'); + case 'crypto-js': + return CryptoJS; default: throw new Error(`Module '${moduleName}' is not available in sandbox`); } }, - // Add fetch for HTTP requests (using axios as polyfill) + // Add fetch for HTTP requests (using native fetch for MovieBox, axios for others) fetch: async (url: string, options: any = {}) => { - const axiosConfig = { - url, - method: options.method || 'GET', - headers: options.headers || {}, - data: options.body, - timeout: 30000 - }; + const isMovieBoxRequest = url.includes('api.inmoviebox.com') || url.includes('themoviedb.org'); - try { - const response = await axios(axiosConfig); - return { - ok: response.status >= 200 && response.status < 300, - status: response.status, - statusText: response.statusText, - headers: response.headers, - json: async () => response.data, - text: async () => typeof response.data === 'string' ? response.data : JSON.stringify(response.data) + if (isMovieBoxRequest) { + // Always use native fetch for MovieBox requests + try { + logger.log(`[Sandbox] Using native fetch for MovieBox request: ${url}`, { + method: options.method || 'GET', + hasBody: !!options.body + }); + + const nativeResponse = await fetch(url, { + method: options.method || 'GET', + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Accept': 'application/json', + ...options.headers + }, + body: options.body + }); + + const responseData = await nativeResponse.text(); + logger.log(`[Sandbox] Native fetch successful for MovieBox:`, { + status: nativeResponse.status, + ok: nativeResponse.ok + }); + + return { + ok: nativeResponse.ok, + status: nativeResponse.status, + statusText: nativeResponse.statusText || 'OK', + headers: nativeResponse.headers, + json: async () => { + try { + return JSON.parse(responseData); + } catch (e) { + logger.error(`[Sandbox] Failed to parse JSON from native fetch: ${e}`); + throw e; + } + }, + text: async () => responseData + }; + } catch (error: any) { + logger.error(`[Sandbox] Native fetch failed for MovieBox ${url}:`, error.message); + throw new Error(`Fetch failed: ${error.message}`); + } + } else { + // Use axios for other requests + const axiosConfig = { + url, + method: options.method || 'GET', + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Accept': 'application/json', + ...options.headers + }, + data: options.body, + timeout: 30000, + validateStatus: () => true // Don't throw on HTTP error status codes }; - } catch (error: any) { - throw new Error(`Fetch failed: ${error.message}`); + + try { + logger.log(`[Sandbox] Using axios for request: ${url}`, { + method: axiosConfig.method, + headers: axiosConfig.headers, + hasBody: !!axiosConfig.data + }); + const response = await axios(axiosConfig); + logger.log(`[Sandbox] Axios response received:`, { + status: response.status, + statusText: response.statusText, + dataType: typeof response.data + }); + + return { + ok: response.status >= 200 && response.status < 300, + status: response.status, + statusText: response.statusText || 'OK', + headers: response.headers, + json: async () => { + try { + return typeof response.data === 'string' ? JSON.parse(response.data) : response.data; + } catch (e) { + logger.error(`[Sandbox] Failed to parse JSON response: ${e}`); + throw e; + } + }, + text: async () => typeof response.data === 'string' ? response.data : JSON.stringify(response.data) + }; + } catch (error: any) { + logger.error(`[Sandbox] Axios error for ${url}:`, error.message); + throw new Error(`Fetch failed: ${error.message}`); + } } }, // Add axios for HTTP requests @@ -1118,8 +1197,15 @@ class LocalScraperService { const executionPromise = new Promise((resolve, reject) => { try { // Create function from code - const func = new Function('sandbox', 'params', ` + const func = new Function('sandbox', 'params', 'PRIMARY_KEY', 'TMDB_API_KEY', ` const { console, setTimeout, clearTimeout, Promise, JSON, Date, Math, parseInt, parseFloat, encodeURIComponent, decodeURIComponent, require, axios, fetch, module, exports, global, URL_VALIDATION_ENABLED } = sandbox; + + // Inject MovieBox constants into global scope + global.PRIMARY_KEY = PRIMARY_KEY; + global.TMDB_API_KEY = TMDB_API_KEY; + window.PRIMARY_KEY = PRIMARY_KEY; + window.TMDB_API_KEY = TMDB_API_KEY; + ${code} // Call the main function (assuming it's exported) @@ -1134,7 +1220,7 @@ class LocalScraperService { } `); - const result = func(sandbox, params); + const result = func(sandbox, params, MOVIEBOX_PRIMARY_KEY, MOVIEBOX_TMDB_API_KEY); // Handle both sync and async results if (result && typeof result.then === 'function') {