const BASE_URL = 'https://vidoraplayer.duckdns.org'; const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'; const HEADERS = { 'User-Agent': UA, Referer: `${BASE_URL}/`, Origin: BASE_URL, Accept: 'application/x-ndjson, text/plain, */*', 'Accept-Language': 'en-US,en;q=0.9', }; function parseNdjson(text) { if (!text) return []; const normalized = text.replace(/\}\s*\{/g, '}\n{'); const lines = normalized.split('\n'); const items = []; for (const raw of lines) { const line = raw.trim(); if (!line) continue; try { items.push(JSON.parse(line)); } catch { } } return items; } export async function getStream(args) { const { id, s, e } = args || {}; const isTv = s != null && e != null; const query = isTv ? `type=tv&id=${id}&season=${s}&episode=${e}` : `type=movie&id=${id}`; const urls = [ `${BASE_URL}/api/sources?${query}`, `${BASE_URL}/api/sources?${query}&gen=2`, ]; const responses = await Promise.all( urls.map(url => fetch(url, { headers: HEADERS }) .then(r => (r.ok ? r.text() : '')) .catch(() => '') ) ); const allUrls = []; const seen = new Set(); for (const text of responses) { const events = parseNdjson(text); for (const item of events) { const list = []; if (item?.event === 'source' && item?.source) { list.push(item.source); } else if (item?.event === 'done' && Array.isArray(item?.sources)) { list.push(...item.sources); } else if (item?.url) { list.push(item); } for (const src of list) { if (!src?.url) continue; const fullUrl = src.url.startsWith('http') ? src.url : `${BASE_URL}${src.url.startsWith('/') ? '' : '/'}${src.url}`; if (!seen.has(fullUrl)) { seen.add(fullUrl); allUrls.push({ url: fullUrl, server: `Vidora - ${src.label || src.server || src.providerGroup || 'Default'}`, quality: src.quality || 'Auto', type: src.type || (fullUrl.includes('.m3u8') ? 'hls' : 'mp4'), headers: { Referer: `${BASE_URL}/`, Origin: BASE_URL, 'User-Agent': UA, }, }); } } } } if (!allUrls.length) return null; return { url: allUrls[0].url, headers: allUrls[0].headers, allUrls, }; }