Este proyecto es un servidor proxy creado en Express para obtener el contenido de la fuente RSS de Spotify Podcasters (o cualquier fuente RSS a priori) y ser utilizada en el reproductor web personalizado de podcasts de Creatyum Media.
- Obtención del contenido: Obtiene el contenido completo de la fuente RSS de tu proveedor de podcast.
- Resolución de CORS: Resuelve el problema de CORS generado cuando tu front-end solicita directamente a la fuente el contenido empleando una técnica de proxy.
- API propia: Al realizar la implementación obtienes el contenido exacto como lo proporciona tu proveedor con tu propio dominio y servidor, lo que te permite emplear tu propia API para alimentar tu proyecto.
- Node.js v20
- NPM 10*
- Git
- Nginx Proxy Manager + Certbot*
- PM2*
(*) Puedes usar PNPM, Yarn o el gestor de paquetes de Node.js que más prefieras. Nginx Proxy Manager y Certbot pueden ser reemplazados por Apache u otra tecnología de servidor para tus dominios y certificados SSL. PM2 es muy común para gestionar procesos en segundo plano en proyectos de Node.js pero puedes usar cualquiera que te guste más.
- Clona el repositorio
git clone https://github.com/martirale/podcast-server-proxy.git
- Instala los paquetes de NPM
npm install
- Ajusta el puerto (o déjalo por defecto en 3010)
// server.js
const port = process.env.PORT || 3010;
- Ajusta tu fuente RSS (URL)
// server.js
const rssUrl = "YOUR RSS SOURCE";
- Ejecuta el servidor proxy (asegúrate de tener PM2 instalado globalmente en tu servidor)
npm install -g pm2
- En el directorio raíz del proyecto de Express ejecuta el siguiente comando
pm2 start server.js --name podcast-proxy
- Guarda el proceso con PM2
pm2 save
- Configura un dominio (o sub-dominio) para tu servidor proxy utilizando
Nginx Proxy Manager
yCertbot
para el SSL y así poder utilizar la API en tu front-end sin riesgos de seguridad al utilizar directamente la IP del servidor o un protocolo HTTP plano.
Express actúa como intermediario (proxy) entre el front-end (en mi caso, mi reproductor web) y la fuente de datos de Spotify (o el feed RSS de tu podcast).
Este servidor Express hace lo siguiente:
- Solicita el feed RSS desde Spotify utilizando
rss-parser
. - Aplica
cors
para permitir que nuestro dominio acceda a la API sin restricciones. - Reenvía el contenido al front-end como si fuera una API interna desde nuestro servidor.
Por lo que, estamos creando un intermediario que omite las restricciones de CORS. De esta forma, el navegador no interactúa directamente con Spotify (que no permite acceder a sus datos directamente), sino que con nuestro servidor, el cual está autorizado para hacer la petición y devolvernos los datos sin el mencionado problema de CORS.
La razón de esta solución es debido a un problema de CORS (Cross-Origin Resource Sharing). Este problema ocurre cuando el navegador bloquea solicitudes hechas desde nuestro dominio hacia otro dominio, ya que el otro dominio no está autorizado explícitamente para compartir recursos con nuestro dominio.
Tras una búsqueda bastante grande en foros y blogs e innumerables iteraciones con ChatGPT y Claude, logré una amalgama de configuraciones que tras limpiarlas y probarlas logré dar con esta solución y espero que pueda servir como solución para otros pérdidos como yo.
Esta solución está hecha y probada para funcionar correctamente con fuentes RSS y ha sido probada únicamente con la de Spotify Podcasters para ser usada en mi reproductor de podcast web propio y no doy garantía de que funcione con otras fuentes RSS. A priori, sí debería funcionar con cualquier fuente RSS ya que el servidor hace únicamente la función de proxy, por lo que dependerá de la lógica en tu front-end y en la estructura de la fuente RSS que estés empleando el cómo vas a trabajar los datos. Este servidor proxy es únicamente un intermediario que resuelve el problema de CORS mencionado con anterioridad.