Skip to content
compilandoPublic

About

Descarga, organiza y reproduce podcasts de iVoox desde la terminal

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

ivx · iVoox desde la terminal

CI Python 3.11+ Licencia MIT

Descarga, organiza, busca y reproduce podcasts de iVoox sin salir de la terminal. Incluye una TUI con biblioteca local, streaming, suscripciones y reanudación de descargas. Funciona en Linux, macOS y Windows.

Demo de ivx: búsqueda y reproducción desde la TUI

Aviso. Proyecto personal y no oficial, sin relación con iVoox. Está pensado para uso privado de contenido al que ya tienes acceso. Respeta las condiciones de uso de iVoox y los derechos de los autores; no redistribuyas los audios. No elude restricciones de acceso ni DRM.

Instalación

Necesitas Python 3.11 o posterior. mpv reproduce el audio y fzf solo es necesario para el selector de ivx play; la TUI no depende de fzf.

Linux

sudo apt install mpv fzf pipx && pipx ensurepath && pipx install ivoox-cli

En Arch: sudo pacman -S mpv fzf python-pipx && pipx install ivoox-cli.

macOS

brew install mpv fzf pipx && pipx ensurepath && pipx install ivoox-cli

Windows (PowerShell)

winget install --id Python.Python.3.13
winget install --id shinchiro.mpv
winget install --id junegunn.fzf
py -m pip install --user pipx
py -m pipx ensurepath
pipx install ivoox-cli

Reabre la terminal después de ensurepath. Como alternativa multiplataforma:

uv tool install ivoox-cli

Comprueba la instalación con ivx --help y abre la interfaz con ivx tui. Los datos se guardan en las carpetas nativas de configuración y música del sistema; IVX_CFG e IVX_DIR permiten cambiarlas.

La demo está descrita como código en docs/demo.tape y se regenera con make demo usando VHS.

Biblioteca interactiva

ivx tui

Una interfaz de teclado con colecciones a la izquierda, episodios a la derecha y estado/progreso de reproducción abajo. Con cookies.txt válido carga automáticamente Mis listas, Escuchar más tarde, Episodios favoritos y todas las suscripciones de la cuenta. Nuevos Episodios reúne en una sola portada los episodios pendientes de todas esas suscripciones, igual que la vista de la app; Toda la biblioteca sigue siendo la opción inicial. También incorpora las fuentes de sources.txt y los audios descargados en IVX_DIR.

La lista de colecciones se guarda 15 minutos en $(CFG)/account-collections.json para no consultar iVoox en cada arranque. Pulsa r para actualizarla. Al abrir una colección se cargan sus 20 episodios visibles más recientes; al llegar al final se consulta automáticamente la siguiente página AJAX, o puedes pedirla con m. El botón Cargar toda la lista recorre de una vez todas las páginas restantes sin descargar audio. ☁ identifica contenido de la cuenta, ⌂ una fuente local, ↓ un episodio para streaming y ● uno descargado.

Tecla Acción
Tab / Shift+Tab Cambiar de panel
↑ / ↓, j / k Navegar
Enter Cargar/abrir colección o reproducir episodio
Espacio Pausar/reanudar; tras stop, reinicia el episodio
s Detener reproducción
← / → Retroceder/avanzar 10 segundos
Shift+← / Shift+→ Retroceder/avanzar 1 minuto
0–9 Ir a una posición absoluta (0%–90%)
+ / - Subir/bajar volumen
n / p Siguiente/anterior en la lista seleccionada al empezar a reproducir
/ Buscar en el panel activo: podcasts a la izquierda, episodios a la derecha
f Enfocar el filtro de podcasts; admite iniciales o fragmentos del nombre
o Alternar orden: más nuevos, más antiguos y título A–Z
Esc Limpiar búsqueda o volver a colecciones
a Añadir URL de episodio, lista o programa
u Descargar todos los episodios, previa confirmación y con 2 audios simultáneos
U Atajo alternativo para la misma descarga completa
m Cargar manualmente la siguiente página de una colección de la cuenta
M Igual que el botón: cargar todas las páginas restantes
r Actualizar Mis listas y Mis suscripciones desde iVoox
? Mostrar ayuda de teclas
q Salir y detener el mpv de esta interfaz

La búsqueda conserva el filtro al pulsar Enter; Esc lo quita. Al cambiar de podcast se limpia automáticamente el filtro de episodios para evitar una lista vacía por un término de la colección anterior. Los controles por letras no interfieren cuando escribes en un campo de texto. También puedes seleccionar con ratón. Se recomienda una terminal de al menos 80×24.

La descarga completa desde la TUI mantiene la paginación que sirve iVoox (normalmente 20 episodios por página), pero procesa hasta dos audios simultáneamente. Al terminar muestra una notificación con el nombre del podcast, aunque entretanto hayas navegado a otra colección. La TUI controla una instancia propia de mpv mediante un socket privado en un temporal; no modifica otros reproductores ni la configuración de mpv. Un episodio remoto se reproduce en streaming con las cookies de iVoox. u lo descarga a la biblioteca usando el CLI en segundo plano, con los mismos bloqueos y reanudación. Salir durante una descarga la interrumpe y conserva los parciales.

La barra inferior muestra la posición absoluta y permite saltar a cualquier punto con un clic. El comando ivx play también abre los controles gráficos de mpv, incluida su barra de posición. Puedes usar otra biblioteca con ivx --dir /ruta/a/biblioteca tui. Para trabajar sin consultar la cuenta:

ivx tui --local

Para desarrollo, make test-tui prueba navegación, búsqueda, alta de fuente y mpv real.

Estas pruebas no acceden a iVoox ni a tus cookies: generan páginas y audio de prueba en temporales y verifican parseo de cuenta, navegación, play, pausa, seek, volumen, stop y cierre de mpv con salida de audio nula. make test mantiene la verificación real de descargas.

Automatización para Linux y desarrollo

make                         # ayuda; no instala ni descarga nada
make deps                    # dependencias del sistema en Arch
make install                 # herramienta aislada mediante uv
make get URL='https://www.ivoox.com/…_rf_123456_1.html' N=2 J=1
make archive URL='https://www.ivoox.com/…_sq_f112345_1.html' PLAN=1
make archive URL='https://www.ivoox.com/…_sq_f112345_1.html' J=2
make add URL='https://www.ivoox.com/…_sq_f112345_1.html'
make sync N=2
make sources
make ls
make play Q='ciencia'         # selección múltiple con Tab; Enter reproduce

Sustituye las URLs de ejemplo por URLs reales. make help lista todos los objetivos. Los identificadores _rf_, _bk_list_ y _sq_f1 distinguen episodio, lista y programa. Se admiten las páginas completas, no enlaces cortos go.ivoox.com.

Variables sobreescribibles:

Variable Valor por defecto Uso
PREFIX $(HOME)/.local Instala en $(PREFIX)/bin/ivx
IVX_DIR $(HOME)/Podcasts/ivoox Biblioteca
CFG $(HOME)/.config/ivx Fuentes, cookies y cachés de uv
INTERVAL 6h Intervalo del temporizador
URL — Obligatoria para get, archive y add
N get: sin límite; sync: 10 Máximo de episodios examinados por fuente
J get: 1; archive: 2 Descargas simultáneas
PLAN vacío Con 1, archive cuenta todo sin descargar
Q vacío Filtro de título/ruta para reproducir

Sin N, get descarga la URL completa. N permite acotar expresamente la operación y cuenta episodios seleccionados, incluidos los ya descargados: repetir get N=2 sobre una fuente sin cambios descarga cero, no los dos siguientes. sync conserva un límite predeterminado de 10 por fuente para que la actualización automática sea gradual. archive también descarga el programa completo, usa dos descargas simultáneas, guarda el progreso de la cola y permite consultar antes el total con PLAN=1. Se pausa 1,5 segundos entre páginas HTML.

make install PREFIX="$HOME/.local" CFG="$HOME/.config/ivx"
make get URL='https://www.ivoox.com/…_bk_list_12345_1.html' N=20 J=2
make sync IVX_DIR="$HOME/Podcasts/ivoox" N=5

La biblioteca tiene una carpeta por fuente (episode-ID, list-ID, program-ID). Los audios nuevos se llaman podcast--titulo-del-episodio--ID.mp3: el texto se acorta y slugifica, y el ID final evita colisiones. Los metadatos usan el mismo nombre con extensión .json; las bibliotecas antiguas con ID.mp3 siguen funcionando sin renombrados. Cada carpeta incluye una playlist.m3u con rutas relativas. Un episodio presente en dos fuentes puede ocupar dos archivos. make ls muestra sus títulos y rutas.

El archivado acepta tanto un programa público como una suscripción de tu cuenta y guarda archive-state.json con tareas completadas y fallidas. Es seguro relanzarlo: omite los MP3 terminados y reanuda los .part. Conserva el MP3 original servido por iVoox, sin recodificar ni perder calidad; convertirlo a otro códec solo aumentaría tiempo o degradaría el audio.

Solo make deps necesita sudo. La primera ejecución de uv necesita red. El Makefile es una comodidad para Linux; la CLI instalada y su paquete son multiplataforma. Las cachés de sus tareas se mantienen en CFG. ffprobe es opcional: se usa si está disponible para confirmar el contenido cuando file devuelve un MIME genérico.

Cookies opcionales

Las pruebas públicas no necesitan iniciar sesión. Para contenido al que tu cuenta tenga acceso, exporta manualmente cookies en formato Netscape a ~/.config/ivx/cookies.txt y ejecuta:

make cookies

Comprueba cabecera, estructura y dominios de iVoox; aplica permisos 600 y avisa de cookies caducadas por su campo expires (0 significa sesión). No imprime valores de cookies. La configuración tiene permisos 700. Las cookies no permiten recuperar audios eliminados ni eludir restricciones de acceso.

systemd de usuario

make timer-install INTERVAL=6h
make timer-enable             # instala las unidades y habilita el timer
make timer-status
make logs                     # Ctrl-C deja de seguir el diario
make timer-disable

Se generan ~/.config/systemd/user/ivx-sync.service y ivx-sync.timer. El servicio oneshot ejecuta ivx sync con PATH, IVX_DIR, IVX_CFG y la caché de uv configurados. El temporizador usa OnBootSec=5min, OnUnitActiveSec=6h y Persistent=true. Systemd solo aplica la recuperación de eventos de Persistent a temporizadores OnCalendar; con estos intervalos monotónicos no garantiza recuperar cada ejecución perdida durante el apagado. El temporizador depende del gestor de usuario; no se activa linger ni se cambia configuración global del sistema.

Después de cambiar PREFIX, IVX_DIR, CFG o INTERVAL, vuelve a ejecutar make timer-install con las mismas variables. sync descarga como máximo 10 episodios por fuente por ejecución salvo que indiques N. Sin sources.txt termina correctamente sin crear la biblioteca. Añade tus programas con make add URL=....

Verificación real

cp -n test.env.example test.env   # URLs públicas de prueba
make test
make lint

test.env contiene TEST_EPISODE, TEST_LIST, TEST_PROGRAM; está excluido de Git y se lee como datos, sin ejecutar comandos de shell. También se pueden sobreescribir con variables de entorno o de make. No pongas credenciales ahí.

Las fuentes elegidas son un episodio de 69 segundos de Feedback Ciencia, la lista pública Unidad de vigilancia y el programa Feedback Ciencia con RSS. La lista es larga, pero solo se descargan dos audios de su primera página y uno de la segunda; la inspección se limita a dos páginas. Se prefirió una lista con audios disponibles tras encontrar enlaces rotos en listas pequeñas. Los episodios del programa duran unos 47 minutos: una prueba completa puede transferir varios cientos de MB, ya que también comprueba el camino HTML.

Las pruebas ejecutan el ivx del proyecto con -n 2, comprueban audio real con file/ffprobe, las playlists y que repetir no descargue ni modifique los archivos. Después recorren dos páginas distintas de la lista, fuerzan --no-rss y descargan por HTML. Finalmente interrumpen un proceso mientras descarga y verifican que el siguiente continúa con HTTP 206, preservando los bytes iniciales. Se guarda report.json y un registro de comandos.

Todo queda en directorios únicos .test-runs/run-*; no se usa tu biblioteca, fuentes ni cookies personales. Los temporales se conservan para inspección y se retiran con make clean, previa confirmación. Una URL retirada o un fallo del servidor hace fallar la prueba explícitamente; no se sustituye por mocks.

Descarga y recuperación

Las descargas acotadas de programas usan el RSS publicado en su página. Una descarga completa recorre además todas las páginas HTML, porque el RSS puede contener solo una ventana reciente, y reutiliza de él las URLs directas de audio. Si falta o no se puede leer, se recorre el HTML. Las listas usan los módulos de episodios clásicos; los programas actuales usan enlaces de títulos en el contenedor que incluye #tabs. Se deduplican IDs y se sigue el enlace a la siguiente página de la misma fuente.

Para episodios se obtiene la ruta listen_mn publicada en el HTML. El endpoint vcore-web.ivoox.com/v1/public/audios/ID/download-url queda como último recurso: en la inspección real devolvió un error incluso para contenido reproducible. No se ejecuta JavaScript recibido del sitio.

La descarga escribe .mp3.part y conserva la URL final del CDN, tamaño y validador HTTP en .part.json. Al repetir, usa Range/If-Range y verifica 4 KiB de solapamiento para evitar mezclar versiones con publicidad distinta. Si el servidor ignora Range, empieza de nuevo; si cambia el audio o caduca la URL del CDN, informa del error y conserva el parcial. Puedes decidir eliminarlo con make clean para reiniciar. Solo se renombra a .mp3 tras validar tamaño y tipo de archivo. Un bloqueo por biblioteca impide descargas/limpiezas simultáneas.

Uso directo y diagnóstico:

UV_CACHE_DIR="$HOME/.config/ivx/uv-cache" UV_PYTHON=/usr/bin/python ivx --help
ivx --dir /ruta/temporal get 'URL' -n 2 --no-rss
ivx inspect 'URL' --pages 2        # solo metadatos, sin descargar audio

Fuera del Makefile, uv utiliza sus valores de entorno y caché habituales. IVX_DIR y IVX_CFG permiten configurar el script directamente; también existen --dir y --config, antes del subcomando.

Limpieza y desinstalación

make clean muestra los .part y sus metadatos, y los directorios de prueba marcados por ivx. Solo borra tras escribir BORRAR; rechaza una biblioteca o una prueba activa. No borra MP3 completados de la biblioteca. Los parciales son reanudables: limpiarlos descarta esa posibilidad.

make uninstall también pide BORRAR, detiene/retira las unidades y elimina el binario instalado. Conserva la biblioteca y toda la configuración, incluidas las cachés. No desinstala paquetes de pacman.

Licencia

MIT.

About

Descarga, organiza y reproduce podcasts de iVoox desde la terminal

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages