false, 'error' => 'No autenticado']); exit; } $pdo = Database::getInstance()->getConnection(); $uploadDir = dirname(__DIR__, 3) . '/uploads/turnero/tv_media/'; $publicBase = rtrim(BASE_URL, '/') . '/uploads/turnero/tv_media/'; if (!is_dir($uploadDir) && !mkdir($uploadDir, 0755, true)) { echo json_encode(['ok' => false, 'error' => 'No se pudo crear el directorio de uploads']); exit; } if (!isset($_FILES['media'])) { echo json_encode(['ok' => false, 'error' => 'No se recibió ningún archivo']); exit; } $file = $_FILES['media']; if ($file['error'] !== UPLOAD_ERR_OK) { $errores = [ UPLOAD_ERR_INI_SIZE => 'El archivo supera upload_max_filesize en php.ini', UPLOAD_ERR_FORM_SIZE => 'El archivo supera MAX_FILE_SIZE del formulario', UPLOAD_ERR_PARTIAL => 'El archivo se subió parcialmente', UPLOAD_ERR_NO_FILE => 'No se seleccionó ningún archivo', UPLOAD_ERR_NO_TMP_DIR => 'Falta la carpeta temporal', UPLOAD_ERR_CANT_WRITE => 'Error al escribir el archivo', ]; echo json_encode(['ok' => false, 'error' => $errores[$file['error']] ?? 'Error de subida desconocido']); exit; } $maxBytes = 500 * 1024 * 1024; if ($file['size'] > $maxBytes) { echo json_encode(['ok' => false, 'error' => 'El archivo supera el límite de 500 MB']); exit; } $mimeMap = [ 'video/mp4' => ['video', 'mp4'], 'video/webm' => ['video', 'webm'], 'video/ogg' => ['video', 'ogv'], 'image/jpeg' => ['imagen', 'jpg'], 'image/png' => ['imagen', 'png'], 'image/webp' => ['imagen', 'webp'], ]; $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($file['tmp_name']); if (!isset($mimeMap[$mime])) { echo json_encode(['ok' => false, 'error' => 'Formato no admitido. Usa MP4, WebM, JPG, PNG o WEBP']); exit; } [$tipo, $ext] = $mimeMap[$mime]; $destFilename = uniqid('tv_', true) . '.' . $ext; $destPath = $uploadDir . $destFilename; if (!move_uploaded_file($file['tmp_name'], $destPath)) { echo json_encode(['ok' => false, 'error' => 'No se pudo guardar el archivo']); exit; } $publicUrl = $publicBase . $destFilename; $maxOrden = (int)($pdo->query("SELECT COALESCE(MAX(orden),-1) FROM turnero_tv_media")->fetchColumn()); $stmt = $pdo->prepare( "INSERT INTO turnero_tv_media (tipo, url, orden, duracion_segundos, activo) VALUES (?, ?, ?, 8, 1)" ); $stmt->execute([$tipo, $publicUrl, $maxOrden + 1]); echo json_encode([ 'ok' => true, 'item' => [ 'id' => (int)$pdo->lastInsertId(), 'tipo' => $tipo, 'url' => $publicUrl, 'orden' => $maxOrden + 1, 'duracion_segundos' => 8, ], ]);