yazrkisvs3vvvsv33svrhetrjsvyvsvvyjsvsvs
tavsuysvssvvjvvyjyjkvsvqd
qfogsvvsvsegjdgdfgdskhgdksvqsvshdqsd
<?php
header('Content-Type: application/json');
require_once dirname(__DIR__) . '/auth.php';
dm_require_login();
dm_check_module_access('videos');
dm_csrf_verify();

$config_file = dirname(__DIR__) . '/config.php';
if (file_exists($config_file)) require_once $config_file;

$api_key = defined('CLAUDE_API_KEY') ? CLAUDE_API_KEY : '';
if (empty($api_key)) {
    echo json_encode(['ok' => false, 'error' => 'Configura la Claude API Key en ⚙ APIs.']);
    exit;
}

$user      = dm_user();
$mode      = $_POST['mode']             ?? '';         // 'link' | 'tomas' | 'referencia'
$link      = trim($_POST['link']        ?? '');
$link_desc = trim($_POST['link_desc']   ?? '');
$client_ctx= trim($_POST['client_ctx']  ?? '');
$client_name   = trim($_POST['client_name']     ?? '');
$client_ind    = trim($_POST['client_industry'] ?? '');
$client_url_cl = trim($_POST['client_url']      ?? '');
$plataforma    = trim($_POST['plataforma']       ?? 'redes sociales');
$herramienta   = trim($_POST['herramienta']      ?? '');

// Detectar plataforma del link automaticamente
function detect_platform($url) {
    if (strpos($url, 'tiktok.com')    !== false) return 'TikTok';
    if (strpos($url, 'instagram.com') !== false) return 'Instagram Reels';
    if (strpos($url, 'youtube.com')   !== false) return 'YouTube';
    if (strpos($url, 'youtu.be')      !== false) return 'YouTube';
    if (strpos($url, 'facebook.com')  !== false) return 'Facebook';
    if (strpos($url, 'linkedin.com')  !== false) return 'LinkedIn';
    return 'redes sociales';
}

$client_block = !empty($client_name)
    ? "CLIENTE ACTIVO: {$client_name}\nIndustria: {$client_ind}\nSitio web: {$client_url_cl}\n\nCONTEXTO DEL NEGOCIO (úsalo en cada entrega):\n{$client_ctx}"
    : "Sin cliente seleccionado. Genera ejemplos generales de alta calidad.";

$avi_system = "Eres AVI, el experto en viralidad 2026 de DIMARK, agencia de marketing digital en Medellín, Colombia.

EXPERTISE EN VIDEOS VIRALES:
- Algoritmos 2026: TikTok For You, Instagram Reels, YouTube Shorts — sabes exactamente qué priorizan
- Viralidad: pattern interrupt (primeros 1.5s críticos), retention tactics, micro-cliffhangers cada 7s, loop endings, comment bait, sound strategy, UGC style
- Formatos por industria: salud, música, restaurantes, moda, belleza, inmobiliaria, fitness, educación, ecommerce, tecnología, viajes, autos, finanzas, mascotas, bodas, construcción, servicios profesionales
- Herramientas IA: Runway Gen-4, Kling AI v2, Sora, HeyGen, Pika 2.0, Luma — escribes prompts perfectos para cada una
- Audio: ElevenLabs v3, Suno AI, trending sounds por nicho y plataforma
- Métricas clave: watch time >70%, saves >2%, comentarios >0.5%, rewatch rate >1.3x

{$client_block}

REGLAS ABSOLUTAS:
1. Responde SIEMPRE en español
2. Usa el contexto del cliente en CADA elemento que generes — nombre, industria, tono, objetivo
3. Entrega contenido listo para usar: scripts con timing exacto, texto en pantalla palabra por palabra, prompts en inglés listos para pegar
4. Actúa como el experto que eres — si hay una mejor forma de hacerlo, dila
5. Nunca ejemplos genéricos cuando tienes contexto del cliente";

// Bloque de recomendacion de herramienta — se agrega al final de todos los prompts
$tool_recommendation = "

6. 🛠 HERRAMIENTA RECOMENDADA — basandote en el estilo visual, tipo de contenido y lo que se necesita producir, recomienda UNA herramienta con este formato exacto:
HERRAMIENTA: [nombre exacto: runway / kling / heygen / pika / sora / luma / capcut]
RAZON: [una sola oracion explicando por que esta es la mejor para este video especifico]";

// ——— MODO: ANALIZAR LINK DE REFERENCIA ———
if ($mode === 'link') {
    if (empty($link) && empty($link_desc)) {
        echo json_encode(['ok' => false, 'error' => 'Pega el link y describe el video.']);
        exit;
    }
    $platform = detect_platform($link);
    $question = "VIDEO DE REFERENCIA:
Plataforma detectada: {$platform}
Link: {$link}
Lo que el cliente describe del video: {$link_desc}

{$client_block}

TAREA: Deconstruye este video viral e identifica exactamente la formula que lo hace funcionar. Luego adapta esa formula al negocio del cliente.

1. 🔍 DECONSTRUCCION — por que funciona (pattern interrupt, tipo de gancho, estructura, ritmo, audio, emocion que activa)
2. 🎯 FORMULA IDENTIFICADA — el patron replicable en 1 parrafo
3. 🎬 SCRIPT ADAPTADO — script completo para {$platform} con timing exacto, aplicando la misma formula al negocio de {$client_name}
4. 🎨 TEXTO EN PANTALLA — subtitulos y overlays con timing
5. 🎵 AUDIO — musica o sonido equivalente al del video de referencia" . $tool_recommendation;

    $payload = [
        'model'      => 'claude-sonnet-4-6',
        'max_tokens' => 3000,
        'system'     => $avi_system,
        'messages'   => [['role' => 'user', 'content' => $question]],
    ];

    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.$api_key, 'anthropic-version: 2023-06-01'],
        CURLOPT_TIMEOUT        => 60,
    ]);
    $result    = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http_code !== 200) { echo json_encode(['ok'=>false,'error'=>'Error API '.$http_code]); exit; }
    $data = json_decode($result, true);
    echo json_encode(['ok' => true, 'response' => $data['content'][0]['text'] ?? '']);
    exit;
}

// ——— MODO: ANALIZAR IMAGENES / FRAMES ———
if ($mode === 'tomas_vision') {
    $desc_tomas  = trim($_POST['desc_tomas'] ?? '');
    $objetivo    = trim($_POST['objetivo']   ?? 'crear video viral');

    // Recopilar imagenes subidas
    $images_content = [];
    $files = $_FILES['tomas_files'] ?? [];

    if (!empty($files['tmp_name'])) {
        $names = is_array($files['tmp_name']) ? $files['tmp_name'] : [$files['tmp_name']];
        $types = is_array($files['type'])     ? $files['type']     : [$files['type']];

        foreach ($names as $i => $tmp) {
            if (empty($tmp) || !is_uploaded_file($tmp)) continue;
            $mime = $types[$i];
            if (!in_array($mime, ['image/jpeg','image/jpg','image/png','image/gif','image/webp'])) continue;
            $b64 = base64_encode(file_get_contents($tmp));
            $images_content[] = [
                'type'   => 'image',
                'source' => ['type' => 'base64', 'media_type' => $mime, 'data' => $b64],
            ];
        }
    }

    if (empty($images_content) && empty($desc_tomas)) {
        echo json_encode(['ok' => false, 'error' => 'Sube imagenes o describe las tomas.']);
        exit;
    }

    $text_prompt = "Eres experto en produccion de video viral 2026.

{$client_block}
Plataforma destino: {$plataforma}
Objetivo: {$objetivo}
" . (!empty($desc_tomas) ? "Descripcion adicional del cliente: {$desc_tomas}" : '') . "

" . (!empty($images_content) ? "Analiza estas tomas/frames del cliente:" : "Basate en la descripcion de las tomas:") . "

Genera:
1. 🎬 SCRIPT DE EDICION — orden de tomas, duracion de cada una, transiciones
2. 🎯 GANCHO VIRAL — como abrir para parar el scroll en 2 segundos usando este material
3. 📝 TEXTO EN PANTALLA — subtitulos y overlays exactos con timing
4. 🎵 AUDIO — musica o sonido sugerido
5. 🤖 PROMPT BASE EN INGLES — para usar en Runway Gen-4 o Kling AI, describiendo el video final deseado" . $tool_recommendation;

    $user_content = array_merge($images_content, [['type' => 'text', 'text' => $text_prompt]]);

    $payload = [
        'model'      => 'claude-sonnet-4-6',
        'max_tokens' => 3000,
        'system'     => $avi_system . "\n\nCUANDO RECIBES IMÁGENES: Las analizas como frames o capturas de video. Describes exactamente lo que ves: composición, iluminación, texto en pantalla, expresiones, movimiento implícito, estilo visual. Usas ese análisis para generar el script y prompt perfectos.",
        'messages'   => [['role' => 'user', 'content' => $user_content]],
    ];

    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.$api_key, 'anthropic-version: 2023-06-01'],
        CURLOPT_TIMEOUT        => 60,
    ]);
    $result    = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http_code !== 200) { echo json_encode(['ok'=>false,'error'=>'Error API '.$http_code]); exit; }
    $data = json_decode($result, true);
    echo json_encode(['ok' => true, 'response' => $data['content'][0]['text'] ?? '']);
    exit;
}

// ——— MODO: SUBIR VIDEO Y ANALIZAR CON FFMPEG + VISION ———
if ($mode === 'analyze_video') {
    $file = $_FILES['video_file'] ?? null;
    if (!$file || $file['error'] !== UPLOAD_ERR_OK) {
        echo json_encode(['ok'=>false,'error'=>'Error subiendo el video']); exit;
    }

    $allowed = ['video/mp4','video/quicktime','video/avi','video/x-msvideo','video/webm','video/x-matroska'];
    if (!in_array($file['type'], $allowed) && !in_array(strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)), ['mp4','mov','webm','avi','mkv'])) {
        echo json_encode(['ok'=>false,'error'=>'Formato no soportado. Usa MP4, MOV o WebM']); exit;
    }

    $max_size = 200 * 1024 * 1024; // 200MB
    if ($file['size'] > $max_size) {
        echo json_encode(['ok'=>false,'error'=>'Video muy grande. Maximo 200MB']); exit;
    }

    // Guardar video temporalmente
    $tmp_dir  = sys_get_temp_dir() . '/vid_' . uniqid();
    mkdir($tmp_dir, 0755);
    $ext      = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)) ?: 'mp4';
    $vid_path = $tmp_dir . '/input.' . $ext;
    move_uploaded_file($file['tmp_name'], $vid_path);

    // Obtener duracion del video
    $ffmpeg   = $_SERVER['HOME'] . '/bin/ffmpeg';
    $ffprobe_cmd = "{$ffmpeg} -i " . escapeshellarg($vid_path) . " 2>&1";
    $ff_info  = shell_exec($ffprobe_cmd);
    preg_match('/Duration: (\d+):(\d+):(\d+)/', $ff_info ?? '', $dm);
    $duration = isset($dm[1]) ? ($dm[1]*3600 + $dm[2]*60 + $dm[3]) : 30;

    // Extraer 6 frames distribuidos — inicio, gancho, desarrollo x3, cierre
    $frames_dir = $tmp_dir . '/frames';
    mkdir($frames_dir, 0755);
    $intervals  = [0.5, 0.15, 0.30, 0.50, 0.70, 0.90]; // porcentajes del video
    $frame_paths = [];
    foreach ($intervals as $i => $pct) {
        $t = round($duration * $pct, 2);
        $out = $frames_dir . "/frame_{$i}.jpg";
        $cmd = "{$ffmpeg} -ss {$t} -i " . escapeshellarg($vid_path) . " -vframes 1 -q:v 2 " . escapeshellarg($out) . " -y 2>/dev/null";
        shell_exec($cmd);
        if (file_exists($out) && filesize($out) > 0) $frame_paths[] = $out;
    }

    if (empty($frame_paths)) {
        // Limpiar y responder error
        shell_exec('rm -rf ' . escapeshellarg($tmp_dir));
        echo json_encode(['ok'=>false,'error'=>'No se pudieron extraer frames del video. Intenta con formato MP4.']); exit;
    }

    // Construir contenido para Claude Vision
    $images_content = [];
    foreach ($frame_paths as $fp) {
        $b64  = base64_encode(file_get_contents($fp));
        $images_content[] = ['type'=>'image','source'=>['type'=>'base64','media_type'=>'image/jpeg','data'=>$b64]];
    }

    $tipo       = trim($_POST['tipo']       ?? 'referencia'); // 'referencia' | 'tomas'
    $extra      = trim($_POST['extra']      ?? '');
    $plat       = trim($_POST['plataforma'] ?? 'TikTok');
    $num_frames = count($frame_paths);

    if ($tipo === 'referencia') {
        $text_prompt = "Analiza estos {$num_frames} frames extraidos automaticamente de un video de referencia que el cliente quiere replicar.
Video de {$duration} segundos en {$plat}.
" . (!empty($extra) ? "Notas del cliente: {$extra}" : '') . "

{$client_block}

TAREA: Deconstruye la estrategia viral de este video y adaptala al negocio del cliente.

1. 🔍 DECONSTRUCCION — que ves en cada frame: composicion, texto en pantalla, expresiones, estilo visual, ritmo implícito
2. 🎯 FORMULA VIRAL — por que funciona: tipo de gancho, patron interrupt, emocion que activa, estructura
3. 🎬 SCRIPT ADAPTADO — script completo para {$plat} aplicando la misma formula al negocio de {$client_name}
   Con timing exacto, texto en pantalla palabra por palabra, indicaciones visuales por toma
4. 🎵 AUDIO — musica o sonido equivalente al estilo del video de referencia
5. 🤖 PROMPT EN INGLES — para Runway Gen-4 o Kling AI, listo para pegar" . $tool_recommendation;
    } else {
        $text_prompt = "Analiza estos {$num_frames} frames de las tomas propias del cliente.
Material de {$duration} segundos para {$plat}.
" . (!empty($extra) ? "Descripcion del cliente: {$extra}" : '') . "

{$client_block}

TAREA: Crea el plan de edicion y prompts para convertir este material en un video viral.

1. 🎬 SCRIPT DE EDICION — orden de tomas, duracion de cada una, transiciones especificas
2. 🎯 GANCHO VIRAL — como abrir para parar el scroll usando este material
3. 📝 TEXTO EN PANTALLA — subtitulos y overlays con timing exacto
4. 🎵 AUDIO — musica y sonido sugerido
5. 🤖 PROMPT EN INGLES — para Runway Gen-4 o Kling AI listo para pegar" . $tool_recommendation;
    }
    $user_content = array_merge($images_content, [['type'=>'text','text'=>$text_prompt]]);

    $payload = [
        'model'      => 'claude-sonnet-4-6',
        'max_tokens' => 3000,
        'system'     => $avi_system . "\n\nCUANDO RECIBES FRAMES DE VIDEO: Analiza cada frame en orden cronologico. Describe exactamente lo que ves: texto en pantalla, composicion, iluminacion, estilo visual, expresiones. Usa ese analisis para generar scripts y prompts de maxima precision.",
        'messages'   => [['role'=>'user','content'=>$user_content]],
    ];

    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json','x-api-key: '.$api_key,'anthropic-version: 2023-06-01'],
        CURLOPT_TIMEOUT        => 90,
    ]);
    $result    = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // Limpiar archivos temporales
    shell_exec('rm -rf ' . escapeshellarg($tmp_dir));

    if ($http_code !== 200) { echo json_encode(['ok'=>false,'error'=>'Error API '.$http_code]); exit; }
    $data = json_decode($result, true);
    echo json_encode(['ok'=>true,'response'=>$data['content'][0]['text']??'','frames'=>$num_frames,'duration'=>$duration]);
    exit;
}

echo json_encode(['ok' => false, 'error' => 'Modo invalido']);
