Playlist TV: subir en cola con resumen — «subí 5 y solo salieron 2»

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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-27 10:19:02 -05:00
co-authored by Claude Fable 5
parent 1ba6805799
commit 587c23adcd
3 changed files with 165 additions and 18 deletions
+10 -1
View File
@@ -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;
}