Los saludo y quedo a disposición ante cualquier tipo de consultas!
Seguimientos de Equipos
1. SEGUIMIENTO DE EQUIPOS
▶
Video en proceso de descarga
SEGUIMIENTO DE EQUIPOS
Clase en vivo
2. . MODULO 1
-
Planteamientos de trabajos para la preparación de partidos
+
Planteamientos de trabajos para la preparación de partidos
3. LA ESTADISTICA APLICADA A LA EVALUACION
-
MATERIAL LECTURA
+
MATERIAL LECTURA
4. Cambio de Pala. Conceptos
-
MATERIAL LECTURA
+
MATERIAL LECTURA
5. PORCENTAJE ZONA ARMADOR
-
PLANILLAS
+
PLANILLAS
6. BLOQUEO
-
PLANILLA SEGUIMIENTO
+
PLANILLA SEGUIMIENTO
7. Saque Seguimientos
-
SAQUE. Planilla
+
SAQUE. Planilla
8. Recepción y Ataque de Rotación
-
Planilla de seguimiento
+
Planilla de seguimiento
9. Planilla de Estadisticas
-
Saque-Recepcion-Ataque
+
Saque-Recepcion-Ataque
10. SEGUIMIENTO ROTACION por ROTACION
-
Planilla
+
Planilla
11. Obtención de Puntos
Planilla
-
+
12. PLANILLA SEGUIMIENTO TECNICO EXCEL
-
MATERIAL LECTURA y APLICACION
+
MATERIAL LECTURA y APLICACION
-
ATENCION: Este es un ejemplo de realización, que a través de la observación (estadísticas, videos, observación directa, etc.) se puede realizar un análisis para determinar cómo planificar el juego y entrenar al Equipo Propio.
+
ATENCION: Este es un ejemplo de realización, que a través de la observación (estadísticas, videos, observación directa, etc.) se puede realizar un análisis para determinar cómo planificar el juego y entrenar al Equipo Propio.
14. Ranking Equipo Liga Nacional LAF 21
-
Material de Lectura
+
Material de Lectura
15. Equipo Club Rosario Voleibol Rama Caballeros
-
INFORME ESTADISTICO
Gentileza Cuerpo Técnico Club Rosario Voleibol (Liga Argentina de Clubes – EX A2- 2019-2020) Material complementario.
+
INFORME ESTADISTICO
Gentileza Cuerpo Técnico Club Rosario Voleibol (Liga Argentina de Clubes – EX A2- 2019-2020) Material complementario.
16. Por: Jim Miret, voleibol de primera línea
-
Copyright y proporcionado por: Asociación Estadounidense de Entrenadores de Voleibol
En este artículo, queríamos probar el paradigma que sirve en el juego femenino para llegar a los pasadores tan rápido que es virtualmente imposible ponerse detrás del balón para pasarlo de manera efectiva.
+
Copyright y proporcionado por: Asociación Estadounidense de Entrenadores de Voleibol
En este artículo, queríamos probar el paradigma que sirve en el juego femenino para llegar a los pasadores tan rápido que es virtualmente imposible ponerse detrás del balón para pasarlo de manera efectiva.
Análisis de Equipos de Voleibol 1
1. ANÁLISIS DE EQUIPO 1
▶
Video en proceso de descarga
ANÁLISIS DE EQUIPO 1
Clase en vivo
2. ANALISIS Y SEGUIMIENTO 2
-
Análisis del Scout Gestión del Entrenador Dirección Estratégica
+
Análisis del Scout Gestión del Entrenador Dirección Estratégica
3. Armado K1 .De Checco
▶
Video en proceso de descarga
Armado K1 .De Checco
VIDEO
4. Análisis del Opuesto
-
Video
+
Video
5. EVALUACION y ESTADISTICAS en el VOLEIBOL
-
Estadísticas: (o métodos estadísticos) Su objetivo es brindar instrumentos para poder valorar los sucesos que ocurren en la realidad.
+
Estadísticas: (o métodos estadísticos) Su objetivo es brindar instrumentos para poder valorar los sucesos que ocurren en la realidad.
6. Estrategia . Táctica
-
MATERIAL DE LECTURA
+
MATERIAL DE LECTURA
7. Evaluación por Rotación
-
Programa Excel
+
Programa Excel
8. PELOTA "PIPE"
-
Analisis video
+
Analisis video
9. La estadística aplicada a la evaluación en VOLEIBOL
-
¿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?
+
¿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?
10. CONDUCCION DE EQUIPOS
-
•Programar
• Plan para el partido
• Preparación del equipo.
• Actividades previas al partido.
• C onducción del equipo durante el partido.
+
•Programar
• Plan para el partido
• Preparación del equipo.
• Actividades previas al partido.
• C onducción del equipo durante el partido.
11. Análisis de: Bloqueo, defensa y contraataque en el voleibol femenino
-
¿Qué sugiere el juego?
(SAQUE) - bloqueo - defensa - contraataque 4 fundamentos del juego que interactúan 2 sistemas (secuencias de acciones sintéticas y exhaustivas a nivel táctico): SAQUE - BLOQUEO - DEFENSA DEFENSA - reconstrucción - contraataque
+
¿Qué sugiere el juego?
(SAQUE) - bloqueo - defensa - contraataque 4 fundamentos del juego que interactúan 2 sistemas (secuencias de acciones sintéticas y exhaustivas a nivel táctico): SAQUE - BLOQUEO - DEFENSA DEFENSA - reconstrucción - contraataque
12. “la cultura de las excusas” Artículo de Julio Velasco
-
También hay que aprender a perder 26/01/22
+
También hay que aprender a perder 26/01/22
13. ¿Qué es una estrategia motivacional?
-
Es una herramienta que utiliza el docente/entrenador para estimular a sus alumnos y/o dirigidos en beneficio del equipo y la institución a la que representan a través de métodos o procedimientos con la intención de ser más eficientes y creativos en el juego.
+
Es una herramienta que utiliza el docente/entrenador para estimular a sus alumnos y/o dirigidos en beneficio del equipo y la institución a la que representan a través de métodos o procedimientos con la intención de ser más eficientes y creativos en el juego.
14. ESTADISTICAS INDIVIDUAL CON GRAFICOS
-
Programa de EXcel
+
Programa de EXcel
-
MATERIAL DE LECTURA
+
MATERIAL DE LECTURA
16. SEGUIMIENTOS Y ANÁLISIS de PARTIDOS
-
Planteamientos de trabajos para la preparación de partidos.
+
Planteamientos de trabajos para la preparación de partidos.
17. Articulo de Lectura
-
Por: Jim Miret, Voleibol de primera línea
Copyright y proporcionado por: Asociación Estadounidense de Entrenadores de Voleibol
+
Por: Jim Miret, Voleibol de primera línea
Copyright y proporcionado por: Asociación Estadounidense de Entrenadores de Voleibol
18. ANALISIS DE CRITERIO POR FUNDAMENTOS (ENTRENAMIENTOS)
-
MATERIAL COMPLEMENTARIO
+
MATERIAL COMPLEMENTARIO
19. Conocimiento de las tendencias de ataques rivales
-
Articulo de Lectura: Rev.int.med.cienc.act.fís.deporte - vol. 22 - número 88
El objetivo del estudio fue investigar los efectos de proporcionar información probabilística, obtenida del análisis en vídeo de las tendencias de pase de las colocadoras oponentes, sobre el rendimiento en el bloqueo de una jugadora de alto nivel de voleibol.
+
Articulo de Lectura: Rev.int.med.cienc.act.fís.deporte - vol. 22 - número 88
El objetivo del estudio fue investigar los efectos de proporcionar información probabilística, obtenida del análisis en vídeo de las tendencias de pase de las colocadoras oponentes, sobre el rendimiento en el bloqueo de una jugadora de alto nivel de voleibol.
20. Análisis Tokio 2022 Masc
-
JJOO
+
JJOO
21. ARTICULO LECTURA ESTADISTICAS
-
MATERIAL DE LECTURA (Autores italianos)
+
MATERIAL DE LECTURA (Autores italianos)
22. ANALISIS DIRECCION DE ATAQUE- LIGA POLONIA
-
MATERIAL DE LECTURA
+
MATERIAL DE LECTURA
23. BLOQUEO-DEFENSA Pelota de valoración Admiración (Data Volley)
-
Artículo: Bloqueo y Defensa de “Las Panteras" (Selección Argentina Femenina de Voleibol) de la pelota admiración (Data Volley)
+
Artículo: Bloqueo y Defensa de “Las Panteras" (Selección Argentina Femenina de Voleibol) de la pelota admiración (Data Volley)
Análisis de Equipos de Voleibol 2
1. SEGUIMIENTOS Y ANALISIS III
-
- Planteamientos de trabajos para la preparación de partidos
- Gestión táctica
- Sin información PREVIA del Rival
- La forma deportiva
+
- Planteamientos de trabajos para la preparación de partidos
- Gestión táctica
- Sin información PREVIA del Rival
- La forma deportiva
2. BLOQUEO - DEFENSA - CONTRATAQUE
-
MATERIAL LECTURA
+
MATERIAL LECTURA
3. Entrevista a Karcht Kiraly
-
Material de Lectura
+
Material de Lectura
4. Gestión táctica de un juego BONITTA
-
MATERIAL DE LECTURA
+
MATERIAL DE LECTURA
5. CONDUCCION DE EQUIPOS
-
Material Lectura
+
Material Lectura
6. La Gestión táctica de un juego. Prof. Marco Bonitta
-
MATERIAL LECTURA
+
MATERIAL LECTURA
7. Análisis Psicología Deportiva. materialde lectura
-
¿Es necesario dar feedback o reforzar en el entrenamiento?
By Cristhian Fernandez Otero access
+
¿Es necesario dar feedback o reforzar en el entrenamiento?
By Cristhian Fernandez Otero access
Trabajo Práctico Final de la Unidad
1. ANÁLISIS Y SEGUIMIENTO 3 - EXPLICACIÓN DEL TP
▶
Video en proceso de descarga
ANÁLISIS Y SEGUIMIENTO 3 - EXPLICACIÓN DEL TP
clase en vivo
2. TRABAJO PRACTICO ANALISIS Y SEGUIMIENTO
-
PLANIFICACIÓNDEL PARTIDO: SISTEMA BLOQUEO-DEFENSA
+
PLANIFICACIÓNDEL PARTIDO: SISTEMA BLOQUEO-DEFENSA
3. TRABAJO PRACTICO ANALISIS Y SEGUIMIENTO
-
en PDF
PLANIFICACIÓNDEL PARTIDO: SISTEMA BLOQUEO-DEFENSA
+
en PDF
PLANIFICACIÓNDEL PARTIDO: SISTEMA BLOQUEO-DEFENSA
Módulo 2 — Entrenamiento
Entrenamiento de Centrales y Opuestos/as
1. EL OPUESTO
CARACTERISTICAS Y DESARROLLO DEL OPUESTO
-
+
2. DESARROLLO DE LOS CENTRALES
-
EL DESARROLLO DE LAS CENTRALES EN ATAQUE Y BLOQUEO
+
EL DESARROLLO DE LAS CENTRALES EN ATAQUE Y BLOQUEO
3. PRIORIDAD EN EL BLOQUEO
Tu navegador no soporta video HTML5.
@@ -920,7 +1273,14 @@ body {
▶
Video en proceso de descarga
SPLIT STEP
SPLIT STEP
3. LOS PUNTAS RECEPTORES Y EL LIBERO
-
PUNTAS RECEPTORES Y LIBEROS
+
PUNTAS RECEPTORES Y LIBEROS
4. CARRERA DE ATAQUE DESDE 6 A 4
▶
Video en proceso de descarga
CARRERA DE ATAQUE DESDE 6 A 4
diff --git a/descargar-curso/generar_dashboard.mjs b/descargar-curso/generar_dashboard.mjs
index 05b2c2d..5da2994 100644
--- a/descargar-curso/generar_dashboard.mjs
+++ b/descargar-curso/generar_dashboard.mjs
@@ -1040,6 +1040,58 @@ body {
color: var(--color-primary);
font-weight: 600;
}
+.pdf-viewer-wrap {
+ margin: 1rem 0;
+ border: 1px solid #d5e8f0;
+ border-radius: 8px;
+ overflow: hidden;
+ background: #f8fbfd;
+}
+.pdf-viewer-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.7rem 1rem;
+ background: linear-gradient(135deg, #eaf2f8, #d4e6f1);
+ cursor: pointer;
+ user-select: none;
+ font-size: 0.9rem;
+ transition: background 0.2s;
+}
+.pdf-viewer-header:hover {
+ background: linear-gradient(135deg, #d4e6f1, #aed6f1);
+}
+.pdf-toggle {
+ transition: transform 0.3s;
+ font-size: 0.8rem;
+ opacity: 0.6;
+}
+.pdf-viewer-wrap.collapsed .pdf-toggle {
+ transform: rotate(-90deg);
+}
+.pdf-viewer {
+ width: 100%;
+ height: 70vh;
+ border: none;
+ display: block;
+}
+.pdf-viewer-wrap.collapsed .pdf-viewer,
+.pdf-viewer-wrap.collapsed .pdf-download-link {
+ display: none;
+}
+.pdf-download-link {
+ display: block;
+ text-align: center;
+ padding: 0.5rem;
+ font-size: 0.82rem;
+ color: var(--color-primary);
+ text-decoration: none;
+ background: #eaf2f8;
+ border-top: 1px solid #d5e8f0;
+}
+.pdf-download-link:hover {
+ background: #d4e6f1;
+}
.nota-vacio {
color: var(--color-text-muted);
font-style: italic;
@@ -1121,18 +1173,35 @@ body {
// Recurso descargable o enlace
if (tema.recursoURL) {
- const icono = tema.recursoTexto === "Abrir Archivo" ? "📄" : "🔗";
- const etiqueta = tema.recursoTexto === "Abrir Archivo" ? "Archivo" : "Enlace";
// Buscar archivo local descargado
let recursoHref = tema.recursoURL;
+ let recursoLocal = null;
if (tema.recursoID) {
const secDir = path.join(__dirname, "descargas", "secciones", modulo.carpeta, seccion.carpeta);
const archivos = fs.existsSync(secDir) ? fs.readdirSync(secDir).filter(f => f.startsWith(`recurso_${tema.recursoID}.`)) : [];
if (archivos.length > 0) {
- recursoHref = `secciones/${modulo.carpeta}/${seccion.carpeta}/${archivos[0]}`;
+ recursoLocal = archivos[0];
+ recursoHref = `secciones/${modulo.carpeta}/${seccion.carpeta}/${recursoLocal}`;
}
}
- bodyHTML += `
\n`;
+
+ if (recursoLocal && recursoLocal.endsWith(".pdf")) {
+ // PDF inline con visor embebido
+ const pdfId = `pdf-${tema.id}-${tema.recursoID}`;
+ bodyHTML += `
\n`;
+ } else {
+ // Otros archivos (ZIP, BIN) o enlaces — link normal
+ const icono = recursoLocal ? "📦" : "🔗";
+ const etiqueta = recursoLocal ? "Descargar" : "Enlace";
+ bodyHTML += `
\n`;
+ }
}
// Separador entre temas
diff --git a/descargar-curso/sync.log b/descargar-curso/sync.log
index 03ee5b3..1a28316 100644
--- a/descargar-curso/sync.log
+++ b/descargar-curso/sync.log
@@ -4,3 +4,93 @@
🔄 Sincronización iniciada — 2026-05-03 03:40:01
/home/rmonla/Documentos/GitHub/rm-KSALDIS-DT/descargar-curso/sync_and_deploy.sh: línea 26: node: orden no encontrada
+🔄 Sincronización iniciada — 2026-05-03 03:50:01
+
+/home/rmonla/Documentos/GitHub/rm-KSALDIS-DT/descargar-curso/sync_and_deploy.sh: línea 26: node: orden no encontrada
+🔄 Sincronización iniciada — 2026-05-03 04:00:01
+ Registro: 30 | Mapa: 15
+📊 Mapa actualizado: 30 videos
+📝 Regenerando libro...
+ 📂 Planificación (9 temas)
+ 📂 Preparación Atlética (15 temas)
+ 📂 Explicación del Trabajo Práctico (2 temas)
+ 📂 Seguimientos de Equipos (16 temas)
+ 📂 Análisis de Equipos de Voleibol 1 (23 temas)
+ 📂 Análisis de Equipos de Voleibol 2 (7 temas)
+ 📂 Trabajo Práctico Final de la Unidad (3 temas)
+ 📂 Entrenamiento de Centrales y Opuestos/as (25 temas)
+ 📂 Puntas y Liberos/as (13 temas)
+ 📂 Entrenamiento de Armadoras (1 temas)
+ 📂 Explicación del Trabajo Práctico (1 temas)
+ ✓ /home/rmonla/Documentos/GitHub/rm-KSALDIS-DT/descargar-curso/descargas/LIBRO_DE_ESTUDIO.md (33 KB)
+ ✓ /home/rmonla/Documentos/GitHub/rm-KSALDIS-DT/descargar-curso/descargas/LIBRO_DE_ESTUDIO.html (73 KB)
+ 115 temas de estudio
+📤 Subiendo cambios...
+ Sin cambios en git.
+🚀 Desplegando...
+Permission denied, please try again.
+Permission denied, please try again.
+📹 Sincronizando videos al servidor...
+ 📤 Subiendo M1_Explicacion_TP_video_1173576229.mp4...
+ ❌ Error scp
+ 📤 Subiendo M1_Planificacion_PLANIFICACIÓN.mp4...
+ ❌ Error scp
+ 📤 Subiendo M1_Preparacion_Atletica_PREPARACIÓN_ATLÉTICA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M1_Preparacion_Atletica_video_1063655414.mp4...
+ ❌ Error scp
+ 📤 Subiendo M1_Preparacion_Atletica_video_1063657248.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_APOYO_0.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_ATAQUE_B.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_BETI_A_UN_PIE_ATRAS.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_BETI_EN_JUEGO.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HANA_POSITIVA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HANA_RECEPCION_A_2.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HATU_BIEN_HECHA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HATU_CON_PELOTA_SEPARADA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HATUMARCADA_BIEN_ATACADA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HATU_MARCADA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_HATU_RECEPCION_PERFECTA.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_PRIORIDAD_EN_EL_BLOQUEO.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_SKIPPED_STEP.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_1179197191.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919342668.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919346562.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919355668.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919359386.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919359855.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919360318.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919363728.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919365485.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Centrales_y_Oponentes_video_919366263.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Entrenamiento_Armadoras_video_1181188693.mp4...
+ ❌ Error scp
+ 📤 Subiendo M2_Explicacion_TP_video_1181892359.mp4...
+ ❌ Error scp
+
+✅ Sincronización completada — 0 videos nuevos subidos
+ 2026-05-03 04:00:07
diff --git a/descargar-curso/sync_and_deploy.sh b/descargar-curso/sync_and_deploy.sh
index f4af92b..ecf14bd 100755
--- a/descargar-curso/sync_and_deploy.sh
+++ b/descargar-curso/sync_and_deploy.sh
@@ -4,7 +4,8 @@
#
# Uso: bash descargar-curso/sync_and_deploy.sh
-set -e
+# Asegurar que node esté en el PATH (nvm no carga en cron)
+export PATH="/home/rmonla/.nvm/versions/node/v20.20.1/bin:$PATH"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
@@ -17,13 +18,25 @@ SUDO_PASS='lhsurnm$77WEB'
cd "$PROJECT_DIR"
echo "🔄 Sincronización iniciada — $(date '+%Y-%m-%d %H:%M:%S')"
-echo ""
-# 1. Actualizar mapa de videos desde registro
-if [ -f "$REGISTRO" ]; then
- PREV_COUNT=$(cat "$MAPA" 2>/dev/null | grep -c '"' || echo 0)
-
- node -e "
+# 1. Verificar que exista el registro
+if [ ! -f "$REGISTRO" ]; then
+ echo " ❌ No existe $REGISTRO"
+ exit 0
+fi
+
+# Contar videos en registro vs mapa
+REG_COUNT=$(wc -l < "$REGISTRO" 2>/dev/null || echo 0)
+MAPA_COUNT=0
+if [ -f "$MAPA" ]; then
+ MAPA_COUNT=$(grep -c '"' "$MAPA" 2>/dev/null || true)
+ MAPA_COUNT=$((MAPA_COUNT / 2)) # cada entry tiene 2 líneas con comillas
+fi
+
+echo " Registro: $REG_COUNT | Mapa: $MAPA_COUNT"
+
+# 2. Actualizar mapa
+node -e "
const fs = require('fs');
const lines = fs.readFileSync('$REGISTRO', 'utf-8').trim().split('\n');
const map = {};
@@ -32,56 +45,51 @@ for (const line of lines) {
if (id && archivo) map[id.trim()] = archivo.trim();
}
fs.writeFileSync('$MAPA', JSON.stringify(map, null, 2));
-console.log('📊 Mapa: ' + Object.keys(map).length + ' videos');
+console.log('📊 Mapa actualizado: ' + Object.keys(map).length + ' videos');
"
-
- NEW_COUNT=$(cat "$MAPA" | grep -c '"' || echo 0)
-
- if [ "$PREV_COUNT" = "$NEW_COUNT" ]; then
- echo " Sin cambios. Nada que hacer."
- exit 0
- fi
-fi
-# 2. Regenerar libro
+# 3. Regenerar libro
echo "📝 Regenerando libro..."
-cd "$SCRIPT_DIR" && node generar_dashboard.mjs 2>&1 | grep -E "✓|módulos|secciones|temas"
+cd "$SCRIPT_DIR"
+node generar_dashboard.mjs 2>&1 | grep -E "✓|temas" || true
cd "$PROJECT_DIR"
-# 3. Git push
+# 4. Git push
echo "📤 Subiendo cambios..."
-git add descargar-curso/descargas/LIBRO_DE_ESTUDIO.html descargar-curso/descargas/LIBRO_DE_ESTUDIO.md 2>/dev/null
-if git diff --cached --quiet; then
+git add descargar-curso/descargas/LIBRO_DE_ESTUDIO.html descargar-curso/descargas/LIBRO_DE_ESTUDIO.md 2>/dev/null || true
+if git diff --cached --quiet 2>/dev/null; then
echo " Sin cambios en git."
else
- git commit -m "build: actualizar videos descargados (auto-sync)" --quiet
- git push origin main --quiet
+ git commit -m "build: actualizar videos descargados (auto-sync)" --quiet 2>/dev/null || true
+ git push origin main --quiet 2>/dev/null || true
echo " ✅ Push completado"
fi
-# 4. Deploy en servidor
+# 5. Deploy en servidor
echo "🚀 Desplegando..."
-ssh "$SERVER" "echo '$SUDO_PASS' | sudo -S bash $WEB_DIR/deploy_ksaldis.sh" 2>&1 | grep -v "password"
+ssh "$SERVER" "echo '$SUDO_PASS' | sudo -S bash $WEB_DIR/deploy_ksaldis.sh" 2>&1 | grep -v "password" || true
-# 5. Sincronizar videos nuevos al servidor
+# 6. Sincronizar videos nuevos al servidor
echo "📹 Sincronizando videos al servidor..."
LOCAL_VIDEOS="$SCRIPT_DIR/descargas/videos_offline"
REMOTE_VIDEOS="$WEB_DIR/videos_offline"
# Obtener lista de videos en el servidor
-REMOTE_LIST=$(ssh "$SERVER" "ls $REMOTE_VIDEOS/ 2>/dev/null" || echo "")
+REMOTE_LIST=$(ssh "$SERVER" "ls $REMOTE_VIDEOS/ 2>/dev/null" 2>/dev/null || echo "")
-# Copiar solo los que faltan
+# Copiar solo los que faltan (solo .mp4 completos, no parciales .fhls-*)
COPIED=0
for mp4 in "$LOCAL_VIDEOS"/*.mp4; do
[ -f "$mp4" ] || continue
BASENAME=$(basename "$mp4")
+ # Saltar archivos parciales de yt-dlp
+ echo "$BASENAME" | grep -q "\.fhls-" && continue
if echo "$REMOTE_LIST" | grep -qF "$BASENAME"; then
continue # Ya existe
fi
echo " 📤 Subiendo $BASENAME..."
- scp -q "$mp4" "$SERVER:/tmp/$BASENAME"
- ssh "$SERVER" "echo '$SUDO_PASS' | sudo -S cp '/tmp/$BASENAME' '$REMOTE_VIDEOS/' && rm '/tmp/$BASENAME'" 2>&1 | grep -v "password"
+ scp -q "$mp4" "$SERVER:/tmp/$BASENAME" 2>/dev/null || { echo " ❌ Error scp"; continue; }
+ ssh "$SERVER" "echo '$SUDO_PASS' | sudo -S cp '/tmp/$BASENAME' '$REMOTE_VIDEOS/' && rm '/tmp/$BASENAME'" 2>&1 | grep -v "password" || true
COPIED=$((COPIED + 1))
done