fix: render .mp4 resources with video player
This commit is contained in:
@@ -1111,7 +1111,10 @@ body {
|
||||
</div>
|
||||
<p>VIDEO</p><div class="tema-separador"></div>
|
||||
<h3 class="tema-titulo" id="tema-analisis-del-opuesto-3">4. Análisis del Opuesto</h3>
|
||||
<p>Video</p><div class="nota-recurso">🎬 <strong>Ver Video:</strong> <a href="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_50262.mp4" target="_blank">Análisis del Opuesto</a></div>
|
||||
<p>Video</p>
|
||||
<div class="video-container">
|
||||
<video src="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_50262.mp4" 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>
|
||||
<div class="tema-separador"></div>
|
||||
<h3 class="tema-titulo" id="tema-evaluacion-y-estadisticas-en-el-voleibol-4">5. EVALUACION y ESTADISTICAS en el VOLEIBOL</h3>
|
||||
<p><br></p><p><u>Estadísticas:</u> (o métodos estadísticos) Su objetivo es brindar instrumentos para poder valorar los sucesos que ocurren en la realidad.</p><div class="nota-recurso">📦 <strong>Descargar:</strong> <a href="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_53180.zip" download>EVALUACION y ESTADISTICAS en el VOLEIBOL</a></div>
|
||||
@@ -1130,7 +1133,10 @@ body {
|
||||
<p><br></p><p>Programa Excel</p><div class="nota-recurso">📦 <strong>Descargar:</strong> <a href="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_53181.xls" download>Evaluación por Rotación</a></div>
|
||||
<div class="tema-separador"></div>
|
||||
<h3 class="tema-titulo" id="tema-pelota-pipe-7">8. PELOTA "PIPE"</h3>
|
||||
<p>Analisis video</p><div class="nota-recurso">🎬 <strong>Ver Video:</strong> <a href="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_50276.mp4" target="_blank">PELOTA "PIPE"</a></div>
|
||||
<p>Analisis video</p>
|
||||
<div class="video-container">
|
||||
<video src="secciones/Modulo_1_Planificacion/Analisis_Equipos_1/recurso_50276.mp4" 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>
|
||||
<div class="tema-separador"></div>
|
||||
<h3 class="tema-titulo" id="tema-la-estadistica-aplicada-a-la-evaluacion-en-voleibol-8">9. La estadística aplicada a la evaluación en VOLEIBOL</h3>
|
||||
<p>¿Se utiliza algún método estadístico en el Voleibol? ¿Cuáles son viables? ¿En qué categoría o nivel de juego? ¿Para qué sirve o se utiliza la estadística? ¿Cómo se evalúa? ¿Qué datos se evalúan? ¿Para qué evaluamos? ¿Es el proceso de recolección preciso o el que se necesita? ¿Cómo se interpretan los datos obtenidos? ¿Se utilizarán los datos recolectados?</p><div class="pdf-viewer-wrap collapsed">
|
||||
|
||||
@@ -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;">
|
||||
|
||||
Reference in New Issue
Block a user