<?php
// stream.php - VERSÃO ORIGINAL RESTAURADA (COM FIX DE UTF-8 + VLC TOKENS)
ini_set('display_errors', 0);
error_reporting(0);

require_once 'config.php';

// 1. CONEXÃO E LIMPEZA DE CARACTERES (UTF-8)
$pdo = getConexaoAtiva();
$pdo->exec("SET NAMES 'utf8mb4'"); 
$pdo->exec("SET CHARACTER SET utf8mb4");

// Função para limpar nomes (Remove o ??)
function limparTexto($texto) {
    if (mb_detect_encoding($texto, 'UTF-8', true)) {
        return $texto;
    }
    return utf8_encode($texto);
}

// 2. CAPTURA DOS DADOS
$token = $_GET['token'] ?? '';
$user  = $_GET['user'] ?? '';
$pass  = $_GET['pass'] ?? '';
$id_raw = $_GET['id'] ?? 0;

// Limpa a extensão caso venha no ID (ex: 12345.ts -> 12345)
$stream_id = (int)str_replace(['.m3u8', '.ts', '.mp4', '.mkv'], '', $id_raw);

// DECODIFICAÇÃO DO TOKEN (NBR_) - CORRIGIDA E URL-SAFE PARA VLC
if (!empty($token) && strpos($token, 'NBR_') === 0) {
    $base64 = substr($token, 4);
    $base64 = str_replace(['-', '_'], ['+', '/'], $base64);
    $mod4 = strlen($base64) % 4;
    if ($mod4) { $base64 .= substr('====', $mod4); }
    
    $decoded = base64_decode($base64);
    if ($decoded && strpos($decoded, ':') !== false) {
        list($user, $pass) = explode(':', $decoded);
    }
}

if (!$user || !$pass || !$stream_id) {
    header("HTTP/1.0 400 Bad Request");
    die("Parametros insuficientes.");
}

// 3. VERIFICA USUÁRIO
$stmtU = $pdo->prepare("SELECT id, exp_date, enabled FROM users WHERE username = ? AND password = ?");
$stmtU->execute([$user, $pass]);
$uData = $stmtU->fetch();

if (!$uData || $uData['enabled'] == 0 || ($uData['exp_date'] != 0 && $uData['exp_date'] < time())) {
    header("HTTP/1.1 401 Unauthorized");
    die("Acesso Negado.");
}

// 4. ATUALIZA ATIVIDADE
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
$pdo->prepare("UPDATE users SET last_activity = ?, current_channel = ?, last_ip = ? WHERE id = ?")
    ->execute([time(), $stream_id, $ip, $uData['id']]);

// 5. BUSCA A FONTE DO VÍDEO
$stmtS = $pdo->prepare("SELECT stream_source, direct_source FROM streams WHERE id = ?");
$stmtS->execute([$stream_id]);
$rowS = $stmtS->fetch(PDO::FETCH_ASSOC);

if (!$rowS) {
    header("HTTP/1.0 404 Not Found");
    die("Stream nao encontrado.");
}

$link_real = $rowS['stream_source'];
if (strpos($link_real, '[') === 0) {
    $parsed = json_decode($link_real, true);
    $link_real = $parsed[0];
}
$link_real = str_replace(['\\', ' '], ['', '%20'], $link_real);

// 6. CABEÇALHOS DE DESBLOQUEIO (ORIGINAIS DO SEU ARQUIVO)
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, OPTIONS");
header("Access-Control-Allow-Headers: *");

// Remove parâmetros da URL para conseguir pegar a extensão correta
$url_path = parse_url($link_real, PHP_URL_PATH);
$ext = strtolower(pathinfo($url_path, PATHINFO_EXTENSION));

$ext_vod = ['mp4', 'mkv', 'avi', 'mov', 'flv', 'webm'];

// Verifica se é um link do Telegram ou se tem extensão de vídeo
$is_telegram = (strpos($link_real, 'telegram') !== false || strpos($link_real, 't.me') !== false);
$is_vod = (in_array($ext, $ext_vod) || $is_telegram);

if ($is_vod || $rowS['direct_source'] == 1) {
    // Limpa qualquer saída anterior para não corromper o redirecionamento
    if (ob_get_level()) ob_end_clean();
    
    // Força o header de Location para o player seguir
    header("Access-Control-Allow-Origin: *");
    header("Location: " . $link_real, true, 302);
    exit;
} else {
    // MODO PROXY PARA CANAIS AO VIVO (ORIGINAL DO SEU ARQUIVO)
    set_time_limit(0);
    if (ob_get_level()) ob_end_clean();

    header("Content-Type: video/mp2t");
    header("Cache-Control: no-cache");
    header("Access-Control-Allow-Origin: *");

    $context = stream_context_create([
        "http" => [
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\n",
            "follow_location" => 1 // Importante para links que redirecionam
        ]
    ]);
    
    $fp = @fopen($link_real, 'rb', false, $context);
    if ($fp) {
        while (!feof($fp) && connection_status() == 0) {
            echo fread($fp, 16384); // Buffer original de 16kb do seu arquivo
            flush();
        }
        fclose($fp);
    }
}