fix: render .mp4 resources with video player

This commit is contained in:
Ricardo Monla
2026-05-03 21:24:37 -03:00
parent b096e7aeda
commit 7be651a54a
2 changed files with 55 additions and 9 deletions
+47 -7
View File
@@ -634,14 +634,24 @@ function generarHTML(datos) {
}
} catch { /* sin mapa */ }
let faltantesMd = "# Recursos Pendientes de Descarga\n\nLista de todos los materiales que faltan para alcanzar el 100% offline.\n\n";
for (const m of datos) {
totalSecciones += m.secciones.length;
for (const s of m.secciones) {
totalTemas += s.temas.length;
for (const t of s.temas) {
let isMissing = false;
let missingReason = "";
if (t.vimeoID) {
totalVideos++;
if (videosMap[t.vimeoID]) videosDescargados++;
if (videosMap[t.vimeoID]) {
videosDescargados++;
} else {
isMissing = true;
missingReason = `[Video] ${t.titulo} (Vimeo ID: ${t.vimeoID})`;
}
}
if (t.recursoURL) {
totalRecursos++;
@@ -652,21 +662,47 @@ function generarHTML(datos) {
const archivos = fs.readdirSync(secDir).filter(f => f.startsWith(`recurso_${t.recursoID}.`) || f.startsWith(`archivo_${t.recursoID}_`));
if (archivos.length > 0) downloaded = true;
}
if (downloaded) recursosDescargados++;
if (downloaded) {
recursosDescargados++;
} else {
isMissing = true;
missingReason = `[Recurso/Enlace] ${t.titulo} (ID: ${t.recursoID}) -> URL: ${t.recursoURL}`;
}
}
}
if (t.contenidoHTML) {
totalContenidos++;
contenidosDescargados++;
}
if (isMissing) {
const basePath = `descargar-curso/descargas/secciones/${m.carpeta}/${s.carpeta}/`;
if (t.vimeoID) {
faltantesMd += `- [ ] **${m.titulo}** > *${s.titulo}*\n`;
faltantesMd += ` - **Video:** ${t.titulo}\n`;
faltantesMd += ` - **Vimeo ID:** ${t.vimeoID} (Buscar en Vimeo u obtener con yt-dlp)\n`;
faltantesMd += ` - **Guardar como:** \`${basePath}${videosMap[t.vimeoID] || 'MX_video_'+t.vimeoID+'.mp4'}\`\n\n`;
} else if (t.recursoURL) {
const domain = "https://campus.somosvoley.com"; // O el dominio correspondiente al campus
faltantesMd += `- [ ] **${m.titulo}** > *${s.titulo}*\n`;
faltantesMd += ` - **Documento:** ${t.titulo}\n`;
faltantesMd += ` - **Link original:** [Abrir en el campus](${domain}${t.recursoURL})\n`;
faltantesMd += ` - **Guardar como:** \`${basePath}recurso_${t.recursoID}.pdf\` *(Si es excel o word, usar .xls o .doc)*\n\n`;
}
}
}
}
}
const docsDir = path.join(__dirname, "../docs");
if (!fs.existsSync(docsDir)) fs.mkdirSync(docsDir, { recursive: true });
fs.writeFileSync(path.join(docsDir, "FALTAN.md"), faltantesMd, "utf-8");
const totalItems = totalVideos + totalRecursos + totalContenidos;
const itemsDescargados = videosDescargados + recursosDescargados + contenidosDescargados;
const globalPct = totalItems > 0 ? Math.round((itemsDescargados / totalItems) * 100) : 0;
const css = `
* { margin: 0; padding: 0; box-sizing: border-box; }
@@ -1256,13 +1292,17 @@ body {
</div>
<iframe class="pdf-viewer" src="${recursoHref}" id="${pdfId}"></iframe>
<a href="${recursoHref}" download class="pdf-download-link">⬇ Descargar PDF</a>
</div>\n`;
} else if (recursoLocal && recursoLocal.endsWith(".mp4")) {
bodyHTML += `
<div class="video-container">
<video src="${recursoHref}" controls preload="none" poster="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 9' fill='%23111'></svg>"></video>
</div>\n`;
} else if (recursoLocal) {
// Otros archivos locales (ZIP, PPT, XLS, MP4, etc)
const isVideo = recursoLocal.endsWith(".mp4");
const icono = isVideo ? "🎬" : "📦";
const etiqueta = isVideo ? "Ver Video" : "Descargar";
bodyHTML += `<div class="nota-recurso">${icono} <strong>${etiqueta}:</strong> <a href="${recursoHref}" ${isVideo ? 'target="_blank"' : 'download'}>${tema.titulo}</a></div>\n`;
// Otros archivos locales (ZIP, PPT, XLS, etc)
const icono = "📦";
const etiqueta = "Descargar";
bodyHTML += `<div class="nota-recurso">${icono} <strong>${etiqueta}:</strong> <a href="${recursoHref}" download>${tema.titulo}</a></div>\n`;
} else {
// Faltante / no descargado
bodyHTML += `<div class="nota-recurso missing-resource" style="opacity: 0.7; background: #fdf2e9; border-left-color: #e67e22;">