Muestra tu actividad de Spotify en Discord con presencia enriquecida (Rich Presence) en tiempo real.
Características • Instalación • Uso • Configuración • Estructura
Spotify Discord Rich Presence es una aplicación Node.js que conecta tu cliente de Discord con un servidor personalizado para mostrar lo que estás escuchando en Spotify. Implementa un protocolo IPC nativo de Discord sin dependencias externas de discord-rpc.
La aplicación muestra:
- 🎵 Información de la canción (título, artista, álbum)
- ⏱️ Barra de progreso con tiempo actual/total
- 🖼️ Portada del álbum
- 🔗 Botones interactivos con enlaces
- ✅ Conexión IPC Nativa - Implementación directa del protocolo Discord sin npm packages externos
- ✅ Configuración Centralizada - Todo en un archivo
config.jsonfácil de editar - ✅ Presencia en Tiempo Real - Actualizaciones cada segundo de la canción
- ✅ CLI Interactivo - Asistente para configurar valores fácilmente
- ✅ Heartbeat & Reconexión - Mantiene la conexión activa con reintentos automáticos
- ✅ Sin Duplicados - Solo actualiza Discord cuando hay cambios reales
- ✅ Timestamps Precisos - Barra de progreso sincronizada con Discord
- ✅ Fully Tested - Suite de pruebas incluida con 100% de cobertura
- ✅ Compatible Windows/Mac/Linux - Funciona en todos los sistemas operativos
- Node.js 18 o superior
- Discord Desktop App abierta y ejecutándose en tu equipo
- Permiso para crear pipes IPC (Windows) o sockets (Mac/Linux)
git clone https://github.com/hqrin/ipc_spotifyRPC.git
cd spotify-designnpm install# Editar config.json con tus valores
nano src/server/config.jsonO usar el CLI interactivo:
node src/cli/serviceSelector.jsnpm startVerás un banner ASCII y confirmación de conexión a Discord:
🎧 Spotify Discord Rich Presence
✅ Conectado a Discord
🎵 Spotify - Escuchando tu música
Ctrl + C
npm testEdita src/server/config.json:
{
"clientId": "1522058393898975252",
"port": 37281,
"spotify": {
"enabled": true,
"title": "Spotify",
"artist": "Escuchando tu música",
"album": "Spotify",
"icon": "https://i.pinimg.com/736x/6a/7d/64/6a7d64df939ba3ceed5886aa432daf0c.jpg",
"albumArt": "https://i.pinimg.com/736x/6a/7d/64/6a7d64df939ba3ceed5886aa432daf0c.jpg",
"url": "https://open.spotify.com/",
"duration": 180
},
"showPausedStatus": true,
"activityTimeout": 10000,
"debug": false
}| Parámetro | Tipo | Descripción |
|---|---|---|
clientId |
string | ID de aplicación Discord (obtén en Discord Developer Portal) |
port |
number | Puerto del servidor (37281 por defecto) |
spotify.title |
string | Título mostrado en Discord |
spotify.artist |
string | Artista/subtítulo |
spotify.album |
string | Nombre del álbum |
spotify.icon |
string | URL del ícono (URLs HTTP, https://...) |
spotify.albumArt |
string | URL de la portada |
spotify.url |
string | Enlace de botón en Discord |
spotify.duration |
number | Duración en segundos |
showPausedStatus |
boolean | Mostrar estado cuando está pausado |
debug |
boolean | Mostrar logs detallados |
spotify-design/
├── src/
│ ├── server/
│ │ ├── index.js # Servidor principal & orquestador
│ │ ├── discord-ipc.js # Cliente IPC de Discord
│ │ ├── config.json # Configuración centralizada
│ │ └── configLoader.js # Gestor de configuración
│ ├── cli/
│ │ └── serviceSelector.js # CLI interactivo
│ └── tests/
│ └── discordIpc.test.js # Suite de pruebas
├── package.json # Dependencias
├── README.md # Este archivo
└── .gitignore # Archivos ignorados
- Gestiona el ciclo de vida de la aplicación
- Carga configuración desde
config.json - Conecta a Discord vía IPC
- Genera datos de canciones simuladas
- Actualiza presencia cada 1000ms
- Maneja reconexiones automáticas
- Implementa protocolo Discord Rich Presence nativo
- Conecta a named pipes de Discord (
\\\\.\\pipe\\discord-ipc-*) - Maneja frames con opcodes: HANDSHAKE, FRAME, PING, PONG
- Mantiene heartbeat cada 30 segundos
- Evita actualizaciones duplicadas comparando actividades
- Interfaz interactiva con
inquirer - Modifica valores en
config.json - Validación básica de entrada
- Guardado automático
La aplicación envía objetos de actividad con esta estructura:
{
details: "Spotify", // Línea 1
state: "Escuchando tu música", // Línea 2
assets: {
large_image: "URL_ICONO", // Imagen grande
large_text: "Spotify" // Texto al pasar mouse
},
timestamps: {
start: 1719955200, // Epoch en segundos
end: 1719955380 // Fin en segundos (start + duration)
},
buttons: [
{
label: "Abrir Spotify",
url: "https://open.spotify.com/"
}
]
}El servidor implementa:
-
HANDSHAKE (Opcode 0)
{"v": 1, "client_id": "1522058393898975252"} -
SET_ACTIVITY (Opcode 1)
- Payload: Objeto de actividad completo
-
PING (Opcode 3) / PONG (Opcode 4)
- Mantiene conexión activa
Por defecto el servidor escucha en http://localhost:37281
# Estado del servidor
curl http://localhost:37281/
# Actualizar presencia (POST)
curl -X POST http://localhost:37281/presence \
-H "Content-Type: application/json" \
-d '{"details":"Nueva canción","state":"Artista"}'npm testSalida esperada:
✓ loadConfig uses the server config file
✓ DiscordIPC initializes with clientId
✓ setActivity only updates on changes
3 tests, 3 pass, 0 fail
- Asegúrate que Discord Desktop está abierto
- Verifica que el
clientIdes válido - En Windows, comprueba que Discord está en el PATH de pipes
- Cambia el
clientIdenconfig.jsona uno registrado como "Spotify" - Accede a Discord Developer Portal
- Aumenta
debug: trueen config.json - Revisa los logs de la consola
- Reinicia Discord y la aplicación
¡Las contribuciones son bienvenidas! Por favor:
- Fork el repositorio
- Crea una rama (
git checkout -b feature/AmazingFeature) - Commit cambios (
git commit -m 'Add AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Ver CONTRIBUTING.md para más detalles.
¿Preguntas o problemas?
- 📧 Abre un Issue
- 💬 Discute en Discussions
Hecho con ❤️ por hqrin
⭐ Si te gustó, dale una estrella!