From 2a74ba7cdf59bd4e3b58c0848779d875d279cc9f Mon Sep 17 00:00:00 2001 From: Johnnybegood90 Date: Wed, 11 Mar 2026 18:47:46 +0100 Subject: [PATCH] Correction du proxy. Ajout de curl dans php. --- proxy.php | 103 +++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/proxy.php b/proxy.php index da45bc0..587d69a 100644 --- a/proxy.php +++ b/proxy.php @@ -1,8 +1,6 @@ [ - 'method' => 'GET', - 'header' => implode("\r\n", $headers), - 'follow_location' => 1, - 'timeout' => 30, - ]]); + // Segment binaire — stream via cURL chunk par chunk + header('Content-Type: video/MP2T'); + header('X-Content-Type-Options: nosniff'); - $handle = @fopen($url, 'rb', false, $opts); - if (!$handle) { http_response_code(502); die('Cannot open stream'); } - - // Récupérer le Content-Type de la réponse - $ct = 'video/MP2T'; - foreach (($http_response_header ?? []) as $h) { - if (preg_match('/^Content-Type:\s*(.+)/i', $h, $m)) { $ct = trim($m[1]); break; } - } - - header('Content-Type: ' . $ct); - header('X-Accel-Buffering: no'); - - // Désactiver le buffering PHP if (ob_get_level()) ob_end_clean(); - - while (!feof($handle)) { - $chunk = fread($handle, 65536); // 64KB par chunk - if ($chunk === false || $chunk === '') break; - echo $chunk; - flush(); + + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_TIMEOUT => 30, + CURLOPT_USERAGENT => $ua, + CURLOPT_HTTPHEADER => ['Accept: */*'], + CURLOPT_RETURNTRANSFER => false, + CURLOPT_WRITEFUNCTION => function($ch, $data) { + echo $data; + flush(); + return strlen($data); + }, + CURLOPT_HEADERFUNCTION => function($ch, $header) { + $h = trim($header); + if (preg_match('/^Content-Type:/i', $h)) { + header($h); + } + return strlen($header); + }, + ]); + + $ok = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if (!$ok || $code >= 400) { + http_response_code($code ?: 502); } - fclose($handle); + curl_close($ch); } else { - // Playlist .m3u8 — fetch complet puis réécriture - $opts = stream_context_create(['http' => [ - 'method' => 'GET', - 'header' => implode("\r\n", $headers), - 'follow_location' => 1, - 'timeout' => 15, - 'ignore_errors' => true, - ]]); + // Playlist .m3u8 — fetch + réécriture URLs + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_TIMEOUT => 15, + CURLOPT_USERAGENT => $ua, + CURLOPT_HTTPHEADER => ['Accept: */*'], + CURLOPT_RETURNTRANSFER => true, + ]); + $body = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); - $body = @file_get_contents($url, false, $opts); - if ($body === false) { http_response_code(502); die('Cannot reach upstream'); } - - $status_line = $http_response_header[0] ?? 'HTTP/1.1 200 OK'; - preg_match('#HTTP/\S+\s+(\d+)#', $status_line, $sm); - if ((int)($sm[1] ?? 200) >= 400) { http_response_code((int)$sm[1]); die('Upstream error'); } + if ($body === false || $code >= 400) { + http_response_code($code ?: 502); + die("Upstream error $code"); + } header('Content-Type: application/vnd.apple.mpegurl'); @@ -78,9 +78,8 @@ if ($is_segment) { . strtok($_SERVER['REQUEST_URI'], '?') . '?url='; - $lines = explode("\n", $body); - $out = []; - foreach ($lines as $line) { + $out = []; + foreach (explode("\n", $body) as $line) { $line = rtrim($line); if ($line === '' || $line[0] === '#') { $line = preg_replace_callback('/URI="([^"]+)"/', function($m) use ($base, $proxy_base) {