Descargador de cursos de video para Platzi, Udemy y Codigofacilito, con extracción por interceptación de red y motor híbrido yt-dlp / nativo.
Project description
evDownloader
Descargador de cursos de video para Platzi, Udemy y Codigofacilito. Diseño extensible por extractores (una plataforma = un extractor) y motor de descarga híbrido sobre yt-dlp.
Plataformas soportadas
Cada plataforma se autentica de una de dos formas, según su anti-bot:
| Plataforma | Autenticación | Cómo |
|---|---|---|
| Platzi | Login manual asistido | login abre un navegador (Playwright) para que inicies sesión una vez; las cookies quedan guardadas |
| Udemy | Cookies del navegador real | Está tras Cloudflare Turnstile; se reutiliza la sesión de tu navegador con --cookies-from-browser |
| Codigofacilito | Cookies del navegador real | Video servido por BunnyCDN; se resuelve con yt-dlp y --cookies-from-browser |
Para Udemy y Codigofacilito debes tener la sesión ya iniciada en tu navegador (Brave, Chrome, Safari, Edge o Firefox). No se usa el comando
login.
Instalación
evDownloader es una CLI de Python. Instálala como herramienta aislada con uv (recomendado) o pipx:
# Con uv
uv tool install evdownloader
# …o con pipx
pipx install evdownloader
Esto deja disponibles los comandos evdownloader y su alias corto evd.
Prerrequisitos
-
FFmpeg en el
PATH(muxeo y HLS):brew install ffmpeg # macOS / Linux (Homebrew) scoop install ffmpeg # Windows (Scoop) sudo apt install ffmpeg # Debian / Ubuntu
-
Chromium de Playwright — solo si vas a usar Platzi. Instálalo una vez:
evdownloader setupUdemy y Codigofacilito no lo necesitan.
Uso por plataforma
Platzi
# Una vez: iniciar sesión (abre el navegador para login manual)
evdownloader login
# Descargar el curso
evdownloader download "https://platzi.com/cursos/<curso>/"
Udemy
# Requiere estar logueado en el navegador (ej. Brave) y pasar --cookies-from-browser
evdownloader download \
"https://www.udemy.com/course/<curso>/" \
--cookies-from-browser brave
Codigofacilito
# Requiere estar logueado en el navegador (ej. Brave) y pasar --cookies-from-browser
evdownloader download \
"https://codigofacilito.com/cursos/<curso>" \
--cookies-from-browser brave
La salida se organiza sola en downloads/<Plataforma>/<curso>/<NN-módulo>/<NN-clase>.mp4.
Ejemplos
# Platzi, calidad máxima 1080p, en un directorio concreto
evdownloader download "https://platzi.com/cursos/git-github/" -q 1080 -o ~/Cursos
# Codigofacilito, solo las primeras 5 clases (prueba rápida), cookies de Chrome
evd download "https://codigofacilito.com/cursos/git-profesional" \
--cookies-from-browser chrome --limit 5
# Udemy, sin descargar recursos/adjuntos y forzando re-descarga
evdownloader download "https://www.udemy.com/course/<curso>/" \
--cookies-from-browser brave --no-resources --overwrite
# Solo subtítulos en español e inglés (plataformas que delegan subs en yt-dlp)
evdownloader download "<url>" --cookies-from-browser brave --sub-langs es,en
# Ver el navegador durante el login/descarga de Platzi (depuración)
evdownloader download "https://platzi.com/cursos/<curso>/" --show-browser
Opciones del comando download
| Opción | Descripción |
|---|---|
-q, --quality |
Calidad máxima: 1080, 720… (por defecto: la máxima disponible) |
-o, --output |
Directorio de salida (por defecto ./downloads) |
-d, --downloader |
Motor: ytdlp (por defecto) o native (rnet + FFmpeg) |
-w, --overwrite |
Sobrescribir archivos existentes |
-n, --limit |
Descargar solo las primeras N clases de video |
--no-cache |
Ignorar la caché de estructura del curso |
--no-resources |
No descargar resumen, adjuntos, enlaces ni MHTML |
--cookies-from-browser |
Navegador del que leer cookies (brave, chrome, safari…). Requerido para Udemy y Codigofacilito |
--sub-langs |
Idiomas de subtítulos (yt-dlp): all, es,en, es.*… |
--show-browser |
Mostrar el navegador (no headless) — solo Platzi |
Otros comandos
evdownloader setup # instala Chromium de Playwright (solo Platzi)
evdownloader status # ¿hay sesión activa? (Platzi)
evdownloader logout # cerrar sesión guardada
evdownloader clear-cache # borrar la caché de estructura de cursos
Desarrollo
git clone https://github.com/EduardoVeraE/evDownloader
cd evDownloader
uv sync --extra dev
uv run playwright install chromium # solo si vas a probar Platzi
# Calidad
uv run ruff check src/ tests/
uv run mypy src/evdownloader
uv run python -m pytest
Arquitectura
| Capa | Módulo | Responsabilidad |
|---|---|---|
| CLI | cli.py |
Comandos login, logout, download, status, clear-cache, setup |
| Sesión | session.py, browser.py |
Login manual y cookies persistentes (Platzi) |
| Extractores | extractors/ |
Estructura del curso + resolución de video por plataforma |
| Descarga | downloaders/ |
ytdlp (por defecto) y native (rnet + FFmpeg) |
| Orquestación | service.py |
Une todo y organiza la salida en carpetas |
Hay dos patrones de extractor: navegador (Platzi, intercepta la red con Playwright) y delegación en yt-dlp + cookies del navegador (Udemy, Codigofacilito, sin navegador automatizado). Añadir una plataforma es escribir un extractor nuevo; el núcleo es agnóstico.
Notas de compatibilidad (Python 3.14)
yt-dlp, pydantic (>=2.12), rnet (>=2.4.2) y greenlet (>=3.5.1) publican
wheels para 3.14. playwright 1.60 aún no lo clasifica oficialmente pero funciona
en la práctica (su única dependencia C, greenlet, ya lo soporta). Si surgiera un
problema, el plan de respaldo es migrar el navegado a nodriver.
Aviso legal
Úsalo solo para descargar contenido al que tengas acceso legítimo (tu propia suscripción), respetando los Términos de Servicio de cada plataforma.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file evdownloader-0.1.0.tar.gz.
File metadata
- Download URL: evdownloader-0.1.0.tar.gz
- Upload date:
- Size: 65.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a6f5d3ace2931eb375447c9aa8b913138dc35327a97c0b0458f07712e7c435a
|
|
| MD5 |
126a5ea95ed1a427169bc5ae72756323
|
|
| BLAKE2b-256 |
7ca19244c0ecfc9f6138ea2daad9fa5a8625969edfc3c95c36658d537a815272
|
Provenance
The following attestation bundles were made for evdownloader-0.1.0.tar.gz:
Publisher:
release.yml on EduardoVeraE/evDownloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evdownloader-0.1.0.tar.gz -
Subject digest:
8a6f5d3ace2931eb375447c9aa8b913138dc35327a97c0b0458f07712e7c435a - Sigstore transparency entry: 2134659755
- Sigstore integration time:
-
Permalink:
EduardoVeraE/evDownloader@6bc4289c78b074842511e57da538ccbec8c6da45 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/EduardoVeraE
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6bc4289c78b074842511e57da538ccbec8c6da45 -
Trigger Event:
push
-
Statement type:
File details
Details for the file evdownloader-0.1.0-py3-none-any.whl.
File metadata
- Download URL: evdownloader-0.1.0-py3-none-any.whl
- Upload date:
- Size: 37.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e21b5cc2b2f43a05929058a1d327ac3e1ead05692aec1ca7887dcfbeb4fe2e8f
|
|
| MD5 |
2c2cee67fa7333a6150c5f2c59aa97b8
|
|
| BLAKE2b-256 |
574f45d40a4c496549c682c1e6bf5fbd068cf2dc1d5e0e673665ee093bf6a0d2
|
Provenance
The following attestation bundles were made for evdownloader-0.1.0-py3-none-any.whl:
Publisher:
release.yml on EduardoVeraE/evDownloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evdownloader-0.1.0-py3-none-any.whl -
Subject digest:
e21b5cc2b2f43a05929058a1d327ac3e1ead05692aec1ca7887dcfbeb4fe2e8f - Sigstore transparency entry: 2134659820
- Sigstore integration time:
-
Permalink:
EduardoVeraE/evDownloader@6bc4289c78b074842511e57da538ccbec8c6da45 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/EduardoVeraE
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6bc4289c78b074842511e57da538ccbec8c6da45 -
Trigger Event:
push
-
Statement type: