export default {
async fetch(request, env, ctx) {
// 1. السماح بطلبات CORS (مهم لتشغيل الفيديو في المتصفحات)
if (request.method === 'OPTIONS') {
return new Response(null, {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
'Access-Control-Allow-Headers': '*',
},
});
}
const url = new URL(request.url);
// استخراج الرابط الأساسي من المتغير ?url=
const targetUrl = url.searchParams.get('url');
if (!targetUrl) {
return new Response('الرجاء إضافة الرابط بعد ?url= ', { status: 400 });
}
// 2. الترويسات (Headers) التي تريد إرسالها للسيرفر المستهدف
// قم بتعديل هذه القيم حسب ما يطلبه السيرفر
const customHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Referer': 'https://www.example.com/', // <-- ضع الرابط المطلوب هنا
'Origin': 'https://www.example.com', // <-- ضع الرابط المطلوب هنا
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.9',
// إزالة الترويسات التي قد تكشف أن الطلب من Cloudflare
'cf-connecting-ip': '',
'cf-ipcountry': '',
'cf-ray': '',
'cf-visitor': '',
};
try {
// 3. جلب المحتوى من الرابط المستهدف مع الترويسات المخصصة
const response = await fetch(targetUrl, {
headers: customHeaders,
redirect: 'follow',
});
const contentType = response.headers.get('content-type') || '';
// 4. إذا كان الملف هو M3U8، نقوم بتعديل الروابط داخله لتمريرها من البروكسي
if (contentType.includes('mpegurl') || contentType.includes('text/plain') || targetUrl.endsWith('.m3u8')) {
let text = await response.text();
const baseUrl = new URL(targetUrl);
// معالجة كل سطر في ملف الـ M3U8
const lines = text.split('\n');
const rewrittenLines = lines.map(line => {
line = line.trim();
// تجاهل الأسطر الفارغة أو أسطر التعريف (التي تبدأ بـ #)
if (!line || line.startsWith('#')) {
return line;
}
// السطر يحتوي على رابط لملف TS أو ملف M3U8 آخر
try {
// تحويل الرابط النسبي إلى رابط مطلق
const absoluteUrl = new URL(line, baseUrl).href;
// تغليف الرابط برابط البروكسي الخاص بك
const proxyUrl = `${url.origin}/?url=${encodeURIComponent(absoluteUrl)}`;
return proxyUrl;
} catch (e) {
return line; // إذا كان هناك خطأ في الرابط، اتركه كما هو
}
});
const newBody = rewrittenLines.join('\n');
return new Response(newBody, {
status: response.status,
headers: {
'Content-Type': 'application/vnd.apple.mpegurl', // ترويسة M3U8 قياسية
'Access-Control-Allow-Origin': '*',
'Cache-Control': 'no-cache', // يفضل عدم تخزين M3U8 مؤقتاً
},
});
}
// 5. إذا كان الملف هو مقطع فيديو (TS) أو ملف آخر، نمرره مباشرة كـ Stream
return new Response(response.body, {
status: response.status,
headers: {
'Content-Type': contentType,
'Access-Control-Allow-Origin': '*',
'Cache-Control': 'public, max-age=604800', // تخزين مقاطع الفيديو مؤقتاً لتسريع التحميل
},
});
} catch (error) {
return new Response(`Error: ${error.message}`, { status: 500 });
}
},
};