export default { async fetch(request, env, ctx) { const url = new URL(request.url); let targetUrl = url.searchParams.get('url'); if (!targetUrl) { return new Response('RAKIB TV PROXY: Please provide a url parameter.', { status: 400 }); } // কিছু লিঙ্ক ডিকোড করার প্রয়োজন হতে পারে targetUrl = decodeURIComponent(targetUrl); const init = { method: request.method, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'Accept': '*/*', 'Access-Control-Allow-Origin': '*', }, redirect: 'follow' }; // ক্লায়েন্ট থেকে আসা প্রয়োজনীয় হেডার কপি করা if (request.headers.has('Range')) { init.headers['Range'] = request.headers.get('Range'); } try { const response = await fetch(targetUrl, init); const contentType = response.headers.get('content-type') || ''; // যদি এটি প্লেলিস্ট (m3u8) হয়, তবে এর ভেতরের লিঙ্কগুলোকেও প্রক্সি দিয়ে পরিবর্তন করতে হবে if (contentType.includes('mpegurl') || contentType.includes('application/x-mpegurl') || targetUrl.includes('.m3u8')) { let text = await response.text(); const rootUrl = targetUrl.substring(0, targetUrl.lastIndexOf('/') + 1); // ভেতরের লিঙ্কগুলো খুঁজে বের করে প্রক্সি লিঙ্ক যোগ করা const newText = text.split('\n').map(line => { if (line.startsWith('#') || line.trim() === '') return line; let absoluteUrl = line.startsWith('http') ? line : rootUrl + line; return `${url.origin}${url.pathname}?url=${encodeURIComponent(absoluteUrl)}`; }).join('\n'); return new Response(newText, { headers: { 'Content-Type': contentType, 'Access-Control-Allow-Origin': '*', 'Cache-Control': 'no-cache' } }); } // অন্য সব ফাইলের জন্য (TS, MPD, JPG) সরাসরি রেসপন্স পাঠানো const modifiedHeaders = new Headers(response.headers); modifiedHeaders.set('Access-Control-Allow-Origin', '*'); modifiedHeaders.set('Access-Control-Allow-Headers', '*'); return new Response(response.body, { status: response.status, headers: modifiedHeaders }); } catch (e) { return new Response('Proxy Error: ' + e.message, { status: 500 }); } } };