// ضع رابط القناة الأصلي هنا const STREAM_URL = "http://ibo.lynxiptv.com:80/live/153305389477/AgcUeANPHA/67338.m3u8"; export default { async fetch(request) { const url = new URL(request.url); const proxyHost = url.origin; // تحديد الهدف: إما الرابط المثبت أو الرابط المطلوب في الخلفية (لقطع الـ TS) const targetUrl = url.searchParams.get('url') || STREAM_URL; // 1. عرض المشغل عند فتح رابط الـ Worker المباشر const accept = request.headers.get("Accept") || ""; if (!url.searchParams.has('url') && accept.includes("text/html")) { const proxiedStreamUrl = `${proxyHost}/?url=${encodeURIComponent(STREAM_URL)}`; return new Response(generatePlayerHTML(proxiedStreamUrl), { headers: { "Content-Type": "text/html; charset=utf-8" } }); } // 2. معالجة جلب البيانات (البروكسي) try { const response = await fetch(targetUrl, { headers: { "User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36", "Referer": new URL(targetUrl).origin, "Accept": "*/*", "Connection": "keep-alive" } }); if (!response.ok) return new Response("Error: " + response.status, { status: response.status }); // إذا كان الملف m3u8، نقوم بتعديل الروابط لتمر عبر هذا البروكسي if (targetUrl.includes(".m3u8")) { let text = await response.text(); const baseUrl = targetUrl.split('?')[0].substring(0, targetUrl.lastIndexOf("/") + 1); const newText = text.split('\n').map(line => { if (!line.trim() || line.startsWith("#")) return line; let fullUrl = line.startsWith('http') ? line.trim() : (line.startsWith('/') ? new URL(line, targetUrl).href : baseUrl + line.trim()); return `${proxyHost}/?url=${encodeURIComponent(fullUrl)}`; }).join('\n'); return new Response(newText, { headers: { "Content-Type": "application/x-mpegURL", "Access-Control-Allow-Origin": "*" } }); } // تمرير قطع الفيديو (TS) مباشرة return new Response(response.body, { headers: { "Content-Type": "video/mp2t", "Access-Control-Allow-Origin": "*", "Cache-Control": "public, max-age=10" // تخزين بسيط لزيادة الأداء } }); } catch (e) { return new Response("Error: " + e.message, { status: 500 }); } } }; function generatePlayerHTML(streamUrl) { return `