recycleactor commited on
Commit
b8c5695
Β·
verified Β·
1 Parent(s): 88db761

Upload cinemar.js

Browse files
Files changed (1) hide show
  1. cinemar.js +96 -11
cinemar.js CHANGED
@@ -109,25 +109,65 @@ async function getEmbedHtmlViaPuppeteer(embedUrl) {
109
  const browser = await getBrowser();
110
  const page = await browser.newPage();
111
  try {
112
- await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120 Safari/537.36');
113
- await page.setExtraHTTPHeaders({ 'Accept-Language': 'ru-RU,ru;q=0.9' });
 
 
 
 
 
 
 
 
 
 
 
114
 
115
- // Intercept the file data from window object after JS executes
116
- let fileData = null;
 
 
 
 
 
117
 
118
  await page.setRequestInterception(true);
119
- page.on('request', req => req.continue());
 
 
 
 
 
 
 
 
120
 
 
 
121
  await page.goto(embedUrl, {
122
- waitUntil: 'networkidle2',
123
- timeout: 25000,
124
- referer: 'https://uakinogo.io/'
125
  });
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  // Wait for player to initialize and extract file data
128
  await new Promise(r => setTimeout(r, 2000));
129
 
130
- fileData = await page.evaluate(() => {
131
  // Try to find file data in window variables
132
  for (const k of Object.keys(window)) {
133
  try {
@@ -147,6 +187,9 @@ async function getEmbedHtmlViaPuppeteer(embedUrl) {
147
  });
148
 
149
  console.log('[cinemar] puppeteer got data, length:', fileData ? fileData.length : 0);
 
 
 
150
  return fileData || '';
151
  } finally {
152
  await page.close();
@@ -243,12 +286,23 @@ function parseCinemarData(html) {
243
 
244
  // ── Main: get stream for a uakinogo page URL ──────────────────────────────────
245
  async function getCinemarStream(pageUrl) {
 
 
246
  // Step 1: get embed URL from uakinogo page
247
  const pageHtml = await fetchRaw(pageUrl, {
248
  'user-agent': 'Mozilla/5.0 Chrome/120', 'referer': 'https://uakinogo.io/'
249
  });
 
 
 
 
 
250
  const em = pageHtml.match(/"embedUrl"\s*:\s*"(https:\/\/cinemar\.cc\/embed\/[^"]+)"/);
251
- if (!em) throw new Error('embed_url not found');
 
 
 
 
252
  const embedUrl = em[1];
253
  console.log('[cinemar] embed URL:', embedUrl.substring(0, 80));
254
 
@@ -261,12 +315,43 @@ async function getCinemarStream(pageUrl) {
261
 
262
  if (!embedHtml || !embedHtml.includes('"file"')) {
263
  console.log('[cinemar] no file in plain HTML, trying Puppeteer...');
264
- embedHtml = await getEmbedHtmlViaPuppeteer(embedUrl);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  } else {
266
  console.log('[cinemar] got file data via plain HTTP');
267
  }
268
 
269
  if (!embedHtml || !embedHtml.includes('"file"')) {
 
 
 
270
  throw new Error('no file data in embed (Cloudflare blocked?)');
271
  }
272
 
 
109
  const browser = await getBrowser();
110
  const page = await browser.newPage();
111
  try {
112
+ // More realistic browser fingerprint
113
+ await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
114
+ await page.setExtraHTTPHeaders({
115
+ 'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8',
116
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
117
+ 'Referer': 'https://uakinogo.io/',
118
+ 'Sec-Fetch-Dest': 'iframe',
119
+ 'Sec-Fetch-Mode': 'navigate',
120
+ 'Sec-Fetch-Site': 'cross-site',
121
+ });
122
+
123
+ // Set viewport to look like real browser
124
+ await page.setViewport({ width: 1920, height: 1080 });
125
 
126
+ // Disable automation detection
127
+ await page.evaluateOnNewDocument(() => {
128
+ Object.defineProperty(navigator, 'webdriver', { get: () => false });
129
+ window.chrome = { runtime: {} };
130
+ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5] });
131
+ Object.defineProperty(navigator, 'languages', { get: () => ['ru-RU', 'ru', 'en-US', 'en'] });
132
+ });
133
 
134
  await page.setRequestInterception(true);
135
+ page.on('request', req => {
136
+ // Block unnecessary resources to speed up
137
+ const resourceType = req.resourceType();
138
+ if (['image', 'stylesheet', 'font', 'media'].includes(resourceType)) {
139
+ req.abort();
140
+ } else {
141
+ req.continue();
142
+ }
143
+ });
144
 
145
+ console.log('[cinemar] puppeteer navigating to:', embedUrl.substring(0, 80));
146
+
147
  await page.goto(embedUrl, {
148
+ waitUntil: 'domcontentloaded',
149
+ timeout: 30000,
 
150
  });
151
 
152
+ // Wait longer for Cloudflare challenge to complete
153
+ console.log('[cinemar] waiting for Cloudflare challenge...');
154
+ await new Promise(r => setTimeout(r, 5000));
155
+
156
+ // Check if we're still on Cloudflare challenge page
157
+ const currentUrl = page.url();
158
+ const title = await page.title().catch(() => '');
159
+ console.log('[cinemar] current URL:', currentUrl.substring(0, 80));
160
+ console.log('[cinemar] page title:', title);
161
+
162
+ if (title.includes('Just a moment') || title.includes('Checking your browser')) {
163
+ console.log('[cinemar] still on Cloudflare challenge, waiting more...');
164
+ await new Promise(r => setTimeout(r, 5000));
165
+ }
166
+
167
  // Wait for player to initialize and extract file data
168
  await new Promise(r => setTimeout(r, 2000));
169
 
170
+ const fileData = await page.evaluate(() => {
171
  // Try to find file data in window variables
172
  for (const k of Object.keys(window)) {
173
  try {
 
187
  });
188
 
189
  console.log('[cinemar] puppeteer got data, length:', fileData ? fileData.length : 0);
190
+ console.log('[cinemar] has "file":', fileData ? fileData.includes('"file"') : false);
191
+ console.log('[cinemar] has "W3s":', fileData ? fileData.includes('W3s') : false);
192
+
193
  return fileData || '';
194
  } finally {
195
  await page.close();
 
286
 
287
  // ── Main: get stream for a uakinogo page URL ──────────────────────────────────
288
  async function getCinemarStream(pageUrl) {
289
+ console.log('[cinemar] getCinemarStream called with:', pageUrl);
290
+
291
  // Step 1: get embed URL from uakinogo page
292
  const pageHtml = await fetchRaw(pageUrl, {
293
  'user-agent': 'Mozilla/5.0 Chrome/120', 'referer': 'https://uakinogo.io/'
294
  });
295
+
296
+ console.log('[cinemar] page HTML length:', pageHtml.length);
297
+ console.log('[cinemar] page has embedUrl:', pageHtml.includes('embedUrl'));
298
+ console.log('[cinemar] page has cinemar.cc:', pageHtml.includes('cinemar.cc'));
299
+
300
  const em = pageHtml.match(/"embedUrl"\s*:\s*"(https:\/\/cinemar\.cc\/embed\/[^"]+)"/);
301
+ if (!em) {
302
+ console.log('[cinemar] ERROR: embedUrl not found in page');
303
+ console.log('[cinemar] Page snippet:', pageHtml.substring(0, 500));
304
+ throw new Error('embed_url not found');
305
+ }
306
  const embedUrl = em[1];
307
  console.log('[cinemar] embed URL:', embedUrl.substring(0, 80));
308
 
 
315
 
316
  if (!embedHtml || !embedHtml.includes('"file"')) {
317
  console.log('[cinemar] no file in plain HTML, trying Puppeteer...');
318
+
319
+ // Try Puppeteer multiple times with delays
320
+ let attempts = 0;
321
+ const maxAttempts = 3;
322
+
323
+ while (attempts < maxAttempts) {
324
+ attempts++;
325
+ console.log(`[cinemar] Puppeteer attempt ${attempts}/${maxAttempts}`);
326
+
327
+ try {
328
+ embedHtml = await getEmbedHtmlViaPuppeteer(embedUrl);
329
+
330
+ if (embedHtml && embedHtml.includes('"file"') && embedHtml.includes('W3s')) {
331
+ console.log('[cinemar] Puppeteer success on attempt', attempts);
332
+ break;
333
+ }
334
+
335
+ console.log('[cinemar] Puppeteer attempt', attempts, 'failed, no file data');
336
+
337
+ if (attempts < maxAttempts) {
338
+ const delay = 2000 * attempts; // Increasing delay
339
+ console.log(`[cinemar] waiting ${delay}ms before retry...`);
340
+ await new Promise(r => setTimeout(r, delay));
341
+ }
342
+ } catch(e) {
343
+ console.log(`[cinemar] Puppeteer attempt ${attempts} error:`, e.message);
344
+ if (attempts >= maxAttempts) throw e;
345
+ }
346
+ }
347
  } else {
348
  console.log('[cinemar] got file data via plain HTTP');
349
  }
350
 
351
  if (!embedHtml || !embedHtml.includes('"file"')) {
352
+ console.log('[cinemar] ERROR: no file data after all attempts');
353
+ console.log('[cinemar] embed HTML length:', embedHtml ? embedHtml.length : 0);
354
+ console.log('[cinemar] embed HTML snippet:', embedHtml ? embedHtml.substring(0, 500) : 'null');
355
  throw new Error('no file data in embed (Cloudflare blocked?)');
356
  }
357