[ 'method' => 'GET', 'header' => "User-Agent: Mozilla/5.0\r\n", 'timeout' => 5 // Quick check ] ]); $content = @file_get_contents($streamUrl, false, $context); if ($content !== false && !empty($content)) { // Check if it looks like a valid m3u8 if (str_starts_with($content, '#EXTM3U')) { $online = true; } } echo json_encode(['online' => $online]); exit; } // Handle proxy requests for the stream if (isset($_GET['proxy']) && $_GET['proxy'] === 'stream') { $streamUrl = 'http://38.64.28.91:23456/stream.m3u8'; // Set appropriate headers for m3u8 content header('Content-Type: application/vnd.apple.mpegurl'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, OPTIONS'); header('Access-Control-Allow-Headers: Range'); // Fetch and output the m3u8 content $context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "User-Agent: Mozilla/5.0\r\n", 'timeout' => 10 ] ]); $content = @file_get_contents($streamUrl, false, $context); if ($content !== false) { // Parse and update the m3u8 content to use our proxy for .ts segments $lines = explode("\n", $content); $updatedContent = []; foreach ($lines as $line) { $line = trim($line); if (!empty($line) && !str_starts_with($line, '#')) { // This is a .ts segment URL if (strpos($line, 'http') === 0) { // Absolute URL $updatedContent[] = '?proxy=segment&url=' . urlencode($line); } else { // Relative URL $baseUrl = 'http://38.64.28.91:23456/'; $updatedContent[] = '?proxy=segment&url=' . urlencode($baseUrl . $line); } } else { $updatedContent[] = $line; } } echo implode("\n", $updatedContent); } else { http_response_code(500); echo "Failed to fetch stream"; } exit; } // Handle proxy requests for .ts segments if (isset($_GET['proxy']) && $_GET['proxy'] === 'segment' && isset($_GET['url'])) { $segmentUrl = urldecode($_GET['url']); // Validate URL to prevent abuse if (strpos($segmentUrl, 'http://38.64.28.91:23456/') !== 0) { http_response_code(403); exit; } header('Content-Type: video/mp2t'); header('Access-Control-Allow-Origin: *'); $context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "User-Agent: Mozilla/5.0\r\n", 'timeout' => 10 ] ]); $content = @file_get_contents($segmentUrl, false, $context); if ($content !== false) { echo $content; } else { http_response_code(500); } exit; } // Handle chat actions if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { header('Content-Type: application/json'); // Admin actions if ($_POST['action'] === 'delete_message' && $isAdmin && isset($_POST['message_id'])) { $messages = file_exists($chatFile) ? json_decode(file_get_contents($chatFile), true) : []; $messages = array_filter($messages, function($msg) { return $msg['id'] !== $_POST['message_id']; }); $messages = array_values($messages); // Re-index array file_put_contents($chatFile, json_encode($messages)); echo json_encode(['success' => true]); exit; } if ($_POST['action'] === 'clear_chat' && $isAdmin) { file_put_contents($chatFile, json_encode([])); echo json_encode(['success' => true]); exit; } if ($_POST['action'] === 'ban_user' && $isAdmin && isset($_POST['user_id'])) { $banned = file_exists($bannedFile) ? json_decode(file_get_contents($bannedFile), true) : []; if (!in_array($_POST['user_id'], $banned)) { $banned[] = $_POST['user_id']; file_put_contents($bannedFile, json_encode($banned)); } echo json_encode(['success' => true]); exit; } if ($_POST['action'] === 'heartbeat') { $userId = $_SESSION['user_id']; $nickname = isset($_POST['nickname']) ? htmlspecialchars(substr($_POST['nickname'], 0, 20)) : 'Anonymous'; $viewers = file_exists($viewersFile) ? json_decode(file_get_contents($viewersFile), true) : []; // Update or add viewer $found = false; foreach ($viewers as &$viewer) { if ($viewer['user_id'] === $userId) { $viewer['last_seen'] = time(); $viewer['nickname'] = $nickname; $viewer['is_admin'] = $isAdmin; $found = true; break; } } if (!$found) { $viewers[] = [ 'user_id' => $userId, 'nickname' => $nickname, 'last_seen' => time(), 'is_admin' => $isAdmin ]; } file_put_contents($viewersFile, json_encode($viewers)); $viewerCount = cleanupViewers(); echo json_encode(['success' => true, 'viewer_count' => $viewerCount]); exit; } if ($_POST['action'] === 'send' && isset($_POST['message']) && isset($_POST['nickname'])) { $nickname = htmlspecialchars(substr($_POST['nickname'], 0, 20)); $message = htmlspecialchars(substr($_POST['message'], 0, 1000)); $userId = $_SESSION['user_id']; // Check if user is banned $banned = file_exists($bannedFile) ? json_decode(file_get_contents($bannedFile), true) : []; if (in_array($userId, $banned)) { echo json_encode(['success' => false, 'error' => 'You are banned from chat']); exit; } if (!empty($nickname) && !empty($message)) { $messages = file_exists($chatFile) ? json_decode(file_get_contents($chatFile), true) : []; $newMessage = [ 'id' => uniqid(), 'user_id' => $userId, 'nickname' => $nickname, 'message' => $message, 'timestamp' => time(), 'time' => date('M j, H:i'), 'is_admin' => $isAdmin ]; array_push($messages, $newMessage); // Keep only last N messages if (count($messages) > $maxMessages) { $messages = array_slice($messages, -$maxMessages); } file_put_contents($chatFile, json_encode($messages)); echo json_encode(['success' => true, 'message' => $newMessage]); } else { echo json_encode(['success' => false, 'error' => 'Invalid input']); } exit; } if ($_POST['action'] === 'fetch') { $lastId = isset($_POST['last_id']) ? $_POST['last_id'] : ''; $messages = file_exists($chatFile) ? json_decode(file_get_contents($chatFile), true) : []; // Find new messages only $newMessages = []; $foundLast = empty($lastId); foreach ($messages as $msg) { if ($foundLast) { $newMessages[] = $msg; } if ($msg['id'] === $lastId) { $foundLast = true; } } // If lastId wasn't found, return all messages (initial load or refresh) if (!$foundLast && !empty($lastId)) { $newMessages = $messages; } // Get viewer count $viewerCount = cleanupViewers(); // Determine if we should send all messages (for initial load or after admin actions) $sendAllMessages = empty($lastId) || !$foundLast; echo json_encode([ 'success' => true, 'messages' => $newMessages, 'all_messages' => $sendAllMessages ? $messages : null, 'message_count' => count($messages), 'viewer_count' => $viewerCount, 'is_admin' => $isAdmin ]); exit; } if ($_POST['action'] === 'get_user_id') { echo json_encode(['success' => true, 'user_id' => $_SESSION['user_id'], 'is_admin' => $isAdmin]); exit; } } ?>