Cliente de escritorio para Linux que permite gestionar varios podcasts alojados en un servidor EasyPodcast directamente desde el escritorio, sin necesidad de acceder al panel web.
┌──────────────────────────────────────────────────────────────┐
│ EasyPodcast Manager [─][□][✕] │
├──────────────────────────────────────────────────────────────┤
│ Episodios │ Podcast │ Páginas │ Redes sociales │ Herramientas│
├──────────────────────────────────────────────────────────────┤
│ Filtro: [Todos ▾] [+ Nuevo] [✎ Editar] │
│ ┌────┬──────┬────────────────────────┬────────────┬───────┐ │
│ │ T. │ Nº │ Título │ Estado │ Fecha │ │
│ ├────┼──────┼────────────────────────┼────────────┼───────┤ │
│ │ 1 │ 1 │ Episodio piloto │ publicado │ ... │ │
│ │ 1 │ 2 │ Entrevista con... │ borrador │ ... │ │
│ └────┴──────┴────────────────────────┴────────────┴───────┘ │
└──────────────────────────────────────────────────────────────┘
| Módulo | Funcionalidades |
|---|---|
| Perfiles | Varios podcasts y usuarios, migración de la configuración antigua y cambio inmediato desde el selector principal |
| Episodios | Crear, editar, eliminar, cambiar estado (borrador ↔ publicado), programar, filtrar y cargar automáticamente todas las páginas de resultados |
| Audio | Grabación en directo desde micrófono (WAV → MP3 vía ffmpeg), selector de dispositivo de entrada, vúmetro LED en tiempo real, reproductor integrado, subida de archivo o URL remota con tamaño y MIME |
| Editor HTML | Editor de código + vista previa en tiempo real, barra de herramientas con atajos |
| Podcast | Edición de metadatos, portada, imagen Hero de la web, categoría, datos de iTunes... |
| Páginas | Gestión de páginas estáticas con contenido HTML completo, jerarquía padre/hijo y orden en menú |
| Redes sociales | 9 plataformas: Blog, LinkedIn, Mastodon, X, Instagram, YouTube, GitHub, Bluesky, Pixelfed |
| Herramientas | Limpiar caché, regenerar feed RSS, regenerar imágenes y consultar estadísticas de episodios, caché, descargas y reproducciones |
| Actualizaciones | Comprobación y actualización del servidor remoto desde la interfaz |
- Python 3.10 o superior
- ffmpeg instalado en el sistema
# Debian / Ubuntu / KDE Neon
sudo apt install ffmpeg
# Arch / Manjaro
sudo pacman -S ffmpeg
# Fedora
sudo dnf install ffmpeg| Paquete | Uso |
|---|---|
PySide6 |
Interfaz gráfica Qt6 |
requests |
Llamadas a la API REST |
mutagen |
Lectura de metadatos de audio (duración) |
sounddevice |
Captura de audio del micrófono |
numpy |
Procesamiento de audio en la grabación |
# 1. Clonar el repositorio
git clone https://github.com/educollado/EasyPodcast-Manager-Linux.git
cd EasyPodcast-Manager-Linux
# 2. Crear entorno virtual
python -m venv venv
source venv/bin/activate
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Ejecutar
python main.py# Generar el paquete
./build_deb.sh
# Instalar
sudo apt install ./easypodcast-manager_0.0.7_amd64.deb
# Desinstalar
sudo apt remove easypodcast-managerAl lanzar la aplicación por primera vez aparece el diálogo de configuración. Cada perfil contiene:
- Nombre del perfil: nombre reconocible para mostrar en el selector.
- URL del podcast: URL que incluye el directorio del podcast (p.ej.
https://www.mipodcast.com/mi-podcast). No se debe añadir/api/v1. - Token de acceso: token de API generado en el panel de EasyPodcast. El
alcance
contentpermite gestionar los podcasts asignados al usuario; actualizar el servidor requiere alcanceadmin.
La aplicación prueba la conexión antes de guardar. Se pueden crear tantos
perfiles como sean necesarios y cambiar entre ellos desde la barra superior.
Los datos se almacenan en ~/.config/easypodcast/config.ini; una configuración
antigua de un único podcast se detecta y migra al editarla.
Para reconfigurar: menú Preferencias → Configuración.
EasyPodcast-Manager-Linux/
├── main.py # Punto de entrada, estilos QSS, lógica de arranque
├── config.py # Lectura y escritura de ~/.config/easypodcast/config.ini
├── api.py # Cliente REST (EasyPodcastAPI + APIError)
├── build_deb.sh # Script para generar el paquete .deb
├── requirements.txt # Dependencias de producción
├── requirements-dev.txt # Dependencias de desarrollo (pytest, pytest-qt)
├── pytest.ini # Configuración de pytest
└── ui/
├── main_window.py # QMainWindow: pestañas, menú, barra de estado
├── setup_dialog.py # Diálogo de configuración inicial (URL + token)
├── episodes_tab.py # Pestaña episodios: tabla + filtro + CRUD
├── episode_dialog.py # Formulario completo de episodio
├── podcast_tab.py # Formulario de metadatos del podcast
├── pages_tab.py # Pestaña páginas: tabla + CRUD
├── page_dialog.py # Formulario de página
├── social_tab.py # Formulario de redes sociales
├── tools_tab.py # Herramientas, estadísticas y actualizaciones
├── html_editor.py # Widget HtmlEditorField (editor HTML + vista previa)
├── image_preview.py # Widget ImagePreviewField (URL + miniatura)
├── audio_player.py # Widget AudioPlayerField (URL + controles)
└── audio_recorder.py # Diálogo de grabación (WAV → MP3)
Todos los endpoints siguen el patrón {base_url}/api/v1/{recurso}.
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /episodes |
Lista de episodios (filtrable por status) |
| GET / POST / DELETE | /episodes/{id} |
Obtener / crear+actualizar / eliminar episodio |
| GET / POST | /podcast |
Metadatos del podcast |
| GET / POST | /pages |
Lista / crear página |
| GET / POST / DELETE | /pages/{id} |
Obtener / actualizar / eliminar página |
| GET / POST | /social |
Redes sociales |
| POST | /cache/clear |
Limpiar caché |
| POST | /feed/regenerate |
Regenerar feed RSS |
| POST | /cache/regenerate-images |
Regenerar imágenes |
| GET | /stats |
Estadísticas del servidor |
| GET | /system/version |
Versión actual y última disponible |
| POST | /system/update |
Actualizar el servidor |
La autenticación es mediante cabecera Authorization: Bearer {token}. Todos los errores HTTP se convierten en APIError y se muestran al usuario.
Los endpoints administrativos /users y /users/podcasts pertenecen a la
administración global del servidor y no forman parte de este cliente de
contenidos. Los permisos multiusuario sí se respetan automáticamente mediante
el token de cada perfil.
Los listados paginados de episodios y páginas se recorren automáticamente hasta recuperar todos los resultados. Al crear un episodio se exige título, contenido y audio, también si comienza como borrador. Con una URL de audio remota también debe indicarse su tamaño en bytes; el botón «Detectar desde URL» intenta obtener automáticamente el tamaño y el tipo MIME, tal como requiere la API actual de EasyPodcast.
# Instalar dependencias de desarrollo
pip install -r requirements-dev.txt
# Ejecutar todos los tests
python -m pytest
# Con detalle
python -m pytest -v| Fichero | Tests | Cobertura |
|---|---|---|
tests/test_config.py |
19 | Perfiles, migración, selección y credenciales |
tests/test_api.py |
45 | URLs, cabeceras, paginación, multipart, _handle y endpoints |
tests/test_tools_tab.py |
36 | Formateo de valores, estadísticas y permisos de actualización |
tests/test_episode_dialog.py |
60 | Validación por estado, audio remoto, autor, explícito y get_data |
tests/test_page_dialog.py |
36 | Validación, jerarquía, orden y get_data |
tests/test_podcast_tab.py |
7 | Metadatos avanzados e imagen Hero |
tests/test_profiles_ui.py |
3 | Alta, selección y cambio de perfiles desde la interfaz |
| Total | 206 |
GNU General Public License v3.0 — Software libre.
Más información en https://www.easypodcast.eu.