<?php
// proxy.php - Advanced IPTV Proxy Tunnel (Binary-Safe)
header("Access-Control-Allow-Origin: *");

if (!isset($_GET['url'])) {
    http_response_code(400);
    exit("Error: URL is required.");
}

$url = $_GET['url'];

// ১. এক্সটেনশন সনাক্তকরণ ও সঠিক মিডিয়া টাইপ (MIME Type) সেট করা
$is_m3u8 = preg_match('/\.m3u8(\?|$)/i', $url);
$is_ts   = preg_match('/\.ts(\?|$)/i', $url);
$is_key  = preg_match('/\.key(\?|$)/i', $url);

if ($is_m3u8) {
    header("Content-Type: application/vnd.apple.mpegurl");
} elseif ($is_ts) {
    header("Content-Type: video/MP2T");
} elseif ($is_key) {
    header("Content-Type: application/octet-stream");
} else {
    header("Content-Type: application/octet-stream");
}

// ২. ভিপিএন প্রক্সি নোড কালেকশন লোড করা
$vpn_file = "vpn.json";
$proxies = [];
if (file_exists($vpn_file)) {
    $proxies = json_decode(file_get_contents($vpn_file), true);
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 12); // ১২ সেকেন্ড টাইমআউট
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36');

// অটোমেটিক সবচেয়ে ফাস্ট প্রক্সি নোড নির্বাচন
if (is_array($proxies) && count($proxies) > 0) {
    $fastest_proxy = null;
    $best_latency = 999;

    foreach ($proxies as $proxy) {
        $start_time = microtime(true);
        // প্রক্সির কানেক্টিভিটি টেস্ট
        $fp = @fsockopen($proxy['host'], $proxy['port'], $errno, $errstr, 1.2); 
        if ($fp) {
            fclose($fp);
            $latency = microtime(true) - $start_time;
            if ($latency < $best_latency) {
                $best_latency = $latency;
                $fastest_proxy = $proxy;
            }
        }
    }

    // ফাস্টেস্ট নোডটির মাধ্যমে কানেকশন রুট করা
    if ($fastest_proxy) {
        $proxy_str = $fastest_proxy['host'] . ":" . $fastest_proxy['port'];
        curl_setopt($ch, CURLOPT_PROXY, $proxy_str);
        if (isset($fastest_proxy['type']) && $fastest_proxy['type'] === 'SOCKS5') {
            curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        }
    }
}

$response = curl_exec($ch);
curl_close($ch);

if ($response === false) {
    http_response_code(502);
    exit("Error: Proxy Connection Failed.");
}

// ৩. শুধুমাত্র .m3u8 প্লেলিস্ট টেক্সট ফাইল হলে লিংক রিরাইট করা হবে
if ($is_m3u8) {
    $base_url = substr($url, 0, strrpos($url, '/') + 1);
    $lines = explode("\n", $response);
    $output = [];

    foreach ($lines as $line) {
        $line = trim($line);
        if (empty($line)) continue;

        if (strpos($line, '#') === 0) {
            if (preg_match('/URI="([^"]+)"/', $line, $matches)) {
                $rel_uri = $matches[1];
                if (strpos($rel_uri, 'http') !== 0) {
                    $abs_uri = $base_url . $rel_uri;
                    $proxied_uri = "proxy.php?url=" . urlencode($abs_uri);
                    $line = str_replace($rel_uri, $proxied_uri, $line);
                }
            }
            $output[] = $line;
        } else {
            if (strpos($line, 'http') !== 0) {
                $line = $base_url . $line;
            }
            // প্রতিটি ভিডিও সেগমেন্টকে প্রক্সি টানেলের আন্ডারে আনা
            $output[] = "proxy.php?url=" . urlencode($line);
        }
    }
    echo implode("\n", $output);
} else {
    // ৪. বাইনারি ভিডিও ফাইল (.ts) বা .key ফাইল হলে কোনো পরিবর্তন ছাড়া সরাসরি র-ডাটা আউটপুট করা হবে (Binary-Safe)
    echo $response;
}