From 587c23adcd52dfc0759a545bc080fd98a379ba81 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:19:02 -0500 Subject: [PATCH] =?UTF-8?q?Playlist=20TV:=20subir=20en=20cola=20con=20resu?= =?UTF-8?q?men=20=E2=80=94=20=C2=ABsub=C3=AD=205=20y=20solo=20salieron=202?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El reproductor no se saltaba nada: en la base solo había 2 videos. El defecto estaba en la subida: los archivos elegidos se mandaban TODOS EN PARALELO (inp.files.forEach), peleándose el ancho de banda de subida. Los primeros alcanzaban a entrar y el resto moría por timeout — avisando con un toast que desaparece en segundos y con una barra de progreso que además era la misma para todos, pisándose entre sí. El cliente veía «subí 5», la playlist tenía 2. Ahora los archivos van de a uno (secuencial a propósito), un fallo no frena a los que siguen, y al terminar queda un RESUMEN FIJO: «3 de 5 agregados», con el nombre de cada rechazado y su motivo en cristiano. Los videos de iPhone (.mov) —causa probable del resto de los faltantes— se rechazan de inmediato con la instrucción de convertirlos a MP4, en el navegador y en el servidor. Y los límites de PHP (INI_SIZE, FORM_SIZE, PARTIAL) dejan de caer en «error de subida desconocido». Verificado además que nginx acepta cuerpos de 90 MB o más: el límite del web server no era la causa. scripts/test_tv_playlist.js: 11 pruebas contra el código real — nunca dos subidas a la vez, los 5 se intentan pese a fallos, el resumen cuenta y nombra, y los pre-chequeos rechazan sin tocar la red. Co-Authored-By: Claude Fable 5 --- modules/turnero/api/save_tv_media.php | 11 ++- modules/turnero/views/configuracion.php | 76 +++++++++++++++----- scripts/test_tv_playlist.js | 96 +++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 18 deletions(-) create mode 100644 scripts/test_tv_playlist.js diff --git a/modules/turnero/api/save_tv_media.php b/modules/turnero/api/save_tv_media.php index 76c2051..c97b6ad 100644 --- a/modules/turnero/api/save_tv_media.php +++ b/modules/turnero/api/save_tv_media.php @@ -40,6 +40,11 @@ if ($file['error'] !== UPLOAD_ERR_OK) { 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', + // Antes estos dos caían en «error desconocido», que no le dice nada a + // quien sube: son los límites de PHP, no del código. + UPLOAD_ERR_INI_SIZE => 'El archivo supera el límite de subida del servidor (php.ini)', + UPLOAD_ERR_FORM_SIZE => 'El archivo supera el límite del formulario', + UPLOAD_ERR_PARTIAL => 'La subida se cortó a medias: intente de nuevo', ]; echo json_encode(['ok' => false, 'error' => $errores[$file['error']] ?? 'Error de subida desconocido']); exit; @@ -63,7 +68,11 @@ $mimeMap = [ $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']); + // El caso más común es el video de iPhone: merece su propio mensaje + $msg = ($mime === 'video/quicktime') + ? 'Es un video de iPhone (.mov): conviértalo a MP4 antes de subirlo' + : 'Formato no admitido (' . $mime . '). Use MP4, WebM, JPG, PNG o WEBP'; + echo json_encode(['ok' => false, 'error' => $msg]); exit; } diff --git a/modules/turnero/views/configuracion.php b/modules/turnero/views/configuracion.php index a782ea1..c1e4419 100644 --- a/modules/turnero/views/configuracion.php +++ b/modules/turnero/views/configuracion.php @@ -1198,6 +1198,7 @@ $tab = $_GET['tab'] ?? 'lugares'; +