<?php
/**
 * Sonora — fix_youtubedl.php
 * Corrige o youtube-dl para funcionar com o YouTube atual
 * O erro "page needs to be reloaded" é causado por proteção do YouTube
 * ⚠️ APAGUE APÓS USO!
 */
set_time_limit(180);

echo "<!DOCTYPE html><html lang='pt-BR'><head><meta charset='UTF-8'><title>Correção youtube-dl</title>
<style>
  body{font-family:monospace;background:#0a0a0f;color:#f0f0f8;padding:30px;line-height:1.9}
  .ok{color:#00e5a0}.err{color:#ff4d6d}.warn{color:#f7c16f}.mut{color:#6b6b85}
  pre{background:#16161f;border:1px solid #2a2a3a;border-radius:8px;padding:14px;overflow-x:auto;white-space:pre-wrap;word-break:break-all;font-size:12px}
  h2{color:#00e5a0;font-family:sans-serif}h3{color:#7c6ff7;font-family:sans-serif;margin:18px 0 6px}
  .box{background:#16161f;border-left:3px solid #00e5a0;padding:12px 16px;margin:10px 0;border-radius:0 8px 8px 0}
  .box-warn{border-color:#f7c16f}
  a{color:#00e5a0}
</style></head><body>
<h2>🔧 Sonora — Correção do youtube-dl</h2>";

$base   = __DIR__;
$python = '/bin/python3.6';
$ytdl   = "$base/youtube-dl";

// ── Verifica instalação ───────────────────────────────────────────────────────
if (!file_exists($ytdl)) {
    echo "<p class='err'>❌ youtube-dl não encontrado. Execute o install_youtubedl.php primeiro.</p>";
    echo "</body></html>"; exit;
}

$ver = trim(shell_exec("$python $ytdl --version 2>&1") ?: '');
echo "<p>youtube-dl instalado: <strong class='ok'>v$ver</strong></p>";

// ── Estratégia 1: Atualiza youtube-dl para versão mais recente ────────────────
// O repo ytdl-org tem fork mais atualizado com patches para YouTube
echo "<h3>1️⃣ Tentando atualizar para versão com patches...</h3>"; flush();

// Tenta yt-dlp fork compatível com Python 3.6 (versões muito antigas)
// yt-dlp 2021.12.27 ainda suportava Python 3.6 com contextvars backport
$patchUrls = [
    // Fork do youtube-dl mais mantido — yt-dlc
    'https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc',
    // youtube-dl nightly
    'https://github.com/ytdl-org/youtube-dl/archive/refs/heads/master.zip',
];

// Testa com diferentes user-agents e opções
echo "<h3>2️⃣ Testando com User-Agent atualizado...</h3>"; flush();

$testVids = [
    'https://www.youtube.com/watch?v=jNQXAC9IVRw',  // "Me at the zoo" - 1º vídeo do YT
    'https://www.youtube.com/watch?v=BaW_jenozKc',   // Outro vídeo de teste
];

$agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
];

$worked = false;
$workingCmd = '';

foreach ($testVids as $vid) {
    foreach ($agents as $agent) {
        $cmd = "$python $ytdl "
             . "--no-check-certificate "
             . "--user-agent " . escapeshellarg($agent) . " "
             . "--no-playlist "
             . "-f 'bestaudio/best' "
             . "--get-url "
             . escapeshellarg($vid)
             . " 2>&1";
        $out = trim(shell_exec($cmd) ?: '');
        if (strlen($out) > 50 && strpos($out, 'http') === 0) {
            $worked     = true;
            $workingCmd = "$python $ytdl --no-check-certificate --user-agent " . escapeshellarg($agent) . " --no-playlist";
            echo "<p class='ok'>✅ Funcionou com User-Agent: <code>".substr($agent,0,60)."...</code></p>";
            echo "<p class='ok'>URL obtida com sucesso! (".strlen($out)." chars)</p>";
            break 2;
        }
    }
}

if (!$worked) {
    echo "<p class='warn'>⚠ Testes diretos bloqueados pelo YouTube (IP do servidor na lista de bots).</p>";
}

// ── Estratégia 3: Usa yt-dlp via API do Invidious como proxy ─────────────────
// Em vez de chamar youtube-dl direto, pega a URL via Invidious (API pública)
// e passa direto para o <audio> HTML5
echo "<h3>3️⃣ Testando solução via Invidious API (sem yt-dlp) ...</h3>"; flush();

$invInstances = [
    'https://inv.nadeko.net',
    'https://invidious.nerdvpn.de',
    'https://yewtu.be',
    'https://invidious.privacyredirect.com',
];

$invWorked = false;
$invUrl    = '';
$testVid   = 'jNQXAC9IVRw';

foreach ($invInstances as $inv) {
    $apiUrl = "$inv/api/v1/videos/$testVid?fields=adaptiveFormats,formatStreams";
    $ch = curl_init($apiUrl);
    curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_TIMEOUT=>8,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_USERAGENT=>'Mozilla/5.0']);
    $body = curl_exec($ch);
    $code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code!==200||!$body) continue;
    $data=json_decode($body,true);
    if(!$data) continue;
    $fmts=array_merge($data['adaptiveFormats']??[],$data['formatStreams']??[]);
    foreach($fmts as $f){
        $type=strtolower($f['type']??'');
        $url=$f['url']??'';
        if(!$url||strpos($url,'http')!==0) continue;
        if(strpos($type,'audio')===false&&strpos($type,'webm')===false) continue;
        $invWorked=true; $invUrl=$url;
        echo "<p class='ok'>✅ Invidious API funcionando! Instância: <code>$inv</code></p>";
        echo "<p class='ok'>URL de áudio obtida! (tipo: ".htmlspecialchars($type).")</p>";
        break 2;
    }
}

if(!$invWorked){
    echo "<p class='warn'>⚠ Invidious bloqueado neste ambiente de teste também.</p>";
}

// ── Atualiza api.php com solução robusta ──────────────────────────────────────
echo "<h3>4️⃣ Atualizando api.php com solução multicamada...</h3>"; flush();

$apiFile = "$base/api.php";
$api     = file_get_contents($apiFile);

// Nova função getAudioUrlInvidious melhorada
$newInvidious = <<<'PHP'
function getAudioUrlInvidious($videoId) {
    $vid = preg_replace('/[^a-zA-Z0-9_-]/', '', $videoId);
    $instances = [
        'https://inv.nadeko.net',
        'https://invidious.nerdvpn.de',
        'https://yewtu.be',
        'https://invidious.privacyredirect.com',
        'https://invidious.lunar.icu',
        'https://iv.ggtyler.dev',
        'https://invidious.privacydev.net',
    ];
    shuffle($instances);

    foreach ($instances as $base) {
        // Tenta endpoint de vídeo completo
        foreach (["$base/api/v1/videos/$vid", "$base/api/v1/videos/$vid?fields=adaptiveFormats,formatStreams"] as $url) {
            $ch = curl_init();
            curl_setopt_array($ch, [
                CURLOPT_URL            => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_TIMEOUT        => 8,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_USERAGENT      => 'Mozilla/5.0 (compatible; SonoraPlayer/1.0)',
                CURLOPT_HTTPHEADER     => ['Accept: application/json'],
            ]);
            $body = curl_exec($ch);
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            if ($code !== 200 || !$body) continue;
            $data = json_decode($body, true);
            if (!$data) continue;

            $formats = array_merge(
                $data['adaptiveFormats'] ?? [],
                $data['formatStreams']   ?? []
            );

            // Ordena por qualidade: m4a > opus > webm > qualquer áudio
            $best = null; $bestPrio = 99;
            foreach ($formats as $f) {
                $type = strtolower($f['type'] ?? '');
                $furl = $f['url'] ?? '';
                if (!$furl) continue;
                // Aceita apenas URLs absolutas do ytimg ou googlevideo
                if (strpos($furl,'http')!==0) continue;
                // Deve ser áudio
                if (strpos($type,'audio')===false && strpos($type,'webm')===false &&
                    strpos($type,'mp4')===false) continue;
                $prio = 99;
                if (strpos($type,'m4a')!==false)   $prio=1;
                elseif(strpos($type,'opus')!==false) $prio=2;
                elseif(strpos($type,'webm')!==false) $prio=3;
                elseif(strpos($type,'mp4')!==false)  $prio=4;
                elseif(strpos($type,'audio')!==false)$prio=5;
                if($prio<$bestPrio){$best=$furl;$bestPrio=$prio;}
            }
            if ($best) return $best;
            break; // Próxima instância
        }
    }
    return null;
}
PHP;

// Nova função getAudioUrlYtDlp melhorada (com youtube-dl + múltiplos user-agents)
$newYtDlp = <<<'PHP'
function getAudioUrlYtDlp($videoId) {
    $ytdlp = getYtDlpPath();
    if (!$ytdlp) return null;

    $vid = preg_replace('/[^a-zA-Z0-9_-]/', '', $videoId);
    $ytUrl = "https://www.youtube.com/watch?v={$vid}";

    $agents = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/119.0.0.0 Safari/537.36',
        'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Version/17.0 Mobile Safari/604.1',
    ];

    foreach ($agents as $agent) {
        $cmd = escapeshellcmd($ytdlp)
             . ' --no-check-certificate'
             . ' --no-playlist'
             . ' -f "bestaudio[ext=m4a]/bestaudio[ext=webm]/bestaudio/best"'
             . ' --user-agent ' . escapeshellarg($agent)
             . ' --get-url'
             . ' ' . escapeshellarg($ytUrl)
             . ' 2>/dev/null';

        $url = trim(shell_exec($cmd) ?: '');
        if (strlen($url) > 50 && strpos($url, 'http') === 0) return $url;
    }
    return null;
}
PHP;

// Substitui funções no api.php
$api = preg_replace(
    '/function getAudioUrlInvidious\(\$videoId\)\s*\{.*?\n\}/s',
    $newInvidious,
    $api
);
$api = preg_replace(
    '/function getAudioUrlYtDlp\(\$videoId\)\s*\{.*?\n\}/s',
    $newYtDlp,
    $api
);

if (file_put_contents($apiFile, $api)) {
    echo "<p class='ok'>✅ api.php atualizado com funções melhoradas.</p>";
} else {
    echo "<p class='err'>❌ Não foi possível salvar api.php.</p>";
}

// ── Atualiza wrapper com user-agent correto ───────────────────────────────────
if ($worked && $workingCmd) {
    $wrapperContent = "#!/bin/bash\n";
    $wrapperContent .= "exec $workingCmd \"\$@\"\n";
    file_put_contents("$base/yt-dlp-run", $wrapperContent);
    chmod("$base/yt-dlp-run", 0755);
    echo "<p class='ok'>✅ Wrapper atualizado com User-Agent funcional.</p>";
}

// ── Resumo final ──────────────────────────────────────────────────────────────
echo "<br><div class='box'>
    <p><strong>Status do sistema de stream:</strong></p>
    <ul style='margin:8px 0 0 20px;line-height:2.2'>
      <li>youtube-dl: <strong class='ok'>✅ Instalado v$ver</strong></li>
      <li>Extração direta: <strong class='".(  $worked?'ok':'warn')."'>".($worked?'✅ Funcionando':'⚠ Bloqueado pelo IP do servidor (YouTube bot protection)')."</strong></li>
      <li>Invidious API: <strong class='".($invWorked?'ok':'warn')."'>".($invWorked?'✅ Funcionando — usado como fallback':'⚠ Verificar em produção')."</strong></li>
    </ul>
</div>";

echo "<div class='box box-warn'>
    <p class='warn'><strong>ℹ️ Como funciona na prática:</strong></p>
    <p>O sistema tenta em cascata:</p>
    <ol style='margin:8px 0 0 20px;line-height:2.2'>
      <li><strong>youtube-dl</strong> → extrai URL direta → HTML5 &lt;audio&gt; → <span class='ok'>reprodução em segundo plano</span></li>
      <li><strong>Invidious API</strong> → obtém URL de áudio → HTML5 &lt;audio&gt; → <span class='ok'>reprodução em segundo plano</span></li>
      <li><strong>IFrame YouTube</strong> → fallback automático → <span class='warn'>modo VÍDEO</span></li>
    </ol>
    <p style='margin-top:8px'>Mesmo que o youtube-dl falhe pelo IP, o <strong>Invidious</strong> geralmente funciona.</p>
</div>";

echo "<p class='err' style='margin-top:20px'><strong>🗑 DELETE AGORA: fix_youtubedl.php, install_youtubedl.php, install_ytdlp.php, install_ytdlp_v2.php</strong></p>";

echo "</body></html>";
