Por qué nació
El proyecto comenzó con una necesidad sencilla de explicar y difícil de resolver bien: poder consultar sin conexión cursos adquiridos legalmente, conservando su estructura, sus vídeos y sus materiales. Una descarga de archivos sueltos no era suficiente. El resultado tenía que seguir siendo un curso navegable, con sus lecciones ordenadas y sin depender de scripts, reproductores o recursos remotos.
El primer obstáculo fue el acceso autenticado. Algunas plataformas protegían el contenido con sesiones de navegador y controles que hacían poco fiable una descarga HTTP directa. La solución fue trabajar con un Edge real dentro de un entorno Docker con Selenium, reutilizando exclusivamente una sesión autorizada del usuario.
Inventariar antes de descargar
Antes de mover archivos, la herramienta recorre el curso y construye un inventario. Registra módulos, lecciones, vídeos, adjuntos y rutas de destino. Esta fase separada permitió detectar cambios, calcular el trabajo pendiente y reanudar una ejecución sin empezar de cero.
Cada recurso descargado deja constancia en un manifiesto. Las comprobaciones de existencia, tamaño y hash permiten distinguir lo que ya está completo de lo que debe repetirse. Gracias a ello, una interrupción de red o el cierre de la aplicación no obliga a volver a descargar cientos de elementos.
De una copia de archivos a un portal realmente offline
La siguiente fase consistió en reconstruir la experiencia de navegación. Se guardaron localmente HTML, hojas de estilo, imágenes, tipografías, vídeos y adjuntos; después se reescribieron enlaces y referencias para que cada lección apuntara a esos recursos locales.
También se retiraron dependencias remotas que ya no aportaban nada fuera de Internet, como scripts de seguimiento o reproductores externos. El resultado se validó recorriendo 490 páginas generadas y comprobando que la navegación y los recursos principales podían abrirse sin conexión.
Por qué hacía falta una interfaz gráfica
La primera solución resolvía la descarga, pero su operación seguía demasiado ligada a comandos y archivos de configuración. Para convertirla en una herramienta mantenible nació CourseVault, una aplicación de escritorio para Windows que coloca encima del motor existente una interfaz clara y un protocolo de eventos en tiempo real.
La aplicación organiza el trabajo en cinco áreas:
- Un panel resume cursos, descargas activas, espacio ocupado y errores.
- El catálogo agrupa los cursos por plataforma, URL y categoría.
- Cada tarjeta muestra portada, número de lecciones y vídeos, tamaño, estado y progreso de la cola.
- La vista de errores conserva qué falló y permite reintentar sin perder lo ya completado.
- La configuración reúne perfiles, credenciales locales, almacenamiento, adaptadores y concurrencia de fragmentos.
Pausar, reanudar y continuar después de un fallo
Pausar una descarga detiene el contenedor que está procesando el curso. Al reanudar, el motor vuelve a consultar los manifiestos y conserva todos los vídeos que ya estaban completos. La cola tampoco se cancela por el fallo de un único curso: registra el error, continúa con el siguiente elemento y ofrece después un resumen para decidir qué reintentar.
Este comportamiento fue especialmente importante en bibliotecas grandes. La migración del almacenamiento anterior validó una estructura con 25 cursos —18 de una plataforma basada en Kajabi y 7 de Platzi— y 782 vídeos, sin volver al antiguo diseño plano de carpetas.
Arquitectura y aislamiento
CourseVault.exe inicia la interfaz y se comunica con el motor mediante eventos estructurados. Docker Compose coordina un navegador Edge aislado, el descargador y, cuando la plataforma lo necesita, un proveedor local de tokens. El almacenamiento persistente queda fuera de los contenedores para que una actualización no elimine cursos ni manifiestos.
Los adaptadores separan las particularidades de cada plataforma. Hay soporte específico para sitios basados en Kajabi, para Platzi y un adaptador genérico todavía experimental. Cuando aparece un hCaptcha, la aplicación abre una sesión noVNC para que la persona lo resuelva manualmente; no intenta eludirlo ni automatizar esa verificación.
Distribución en Windows
La aplicación se empaqueta con PyInstaller en un ejecutable autocontenido situado en la raíz del proyecto. No exige instalar Python en el equipo de uso, aunque sí necesita Docker Desktop y los archivos Docker del proyecto para levantar los servicios de descarga.
Las credenciales permanecen en un archivo local, se montan en los contenedores como solo lectura y no se escriben en los logs. El proyecto está pensado para contenido al que el usuario tiene acceso legítimo y no incorpora mecanismos para saltarse DRM.
Resultado y aprendizaje
Lo que empezó como una automatización para reconstruir un portal terminó evolucionando hacia un gestor visual de formación offline. La parte más valiosa no fue solo descargar más rápido, sino poder ver qué está ocurriendo, detener y recuperar el trabajo y mantener separadas las reglas de cada plataforma.
- Inventariar primero convierte una descarga larga en un proceso verificable.
- Los manifiestos son la base real de la reanudación, no un simple indicador de progreso.
- Una interfaz útil debe reflejar el estado del motor, incluidos fallos y reintentos.
- El aislamiento por plataforma evita que un cambio específico rompa todo el catálogo.
- El acceso autorizado y la resolución humana de controles deben formar parte del diseño, no tratarse como obstáculos que haya que eludir.
