← Ecosistema

JoeSing

sing.giorgiopalermo.com en producción

Karaoke personal con Spotify: sigue la canción que estás escuchando y muestra la letra sincronizada palabra por palabra, pensado para la TV del salón.

El problema

El karaoke en casa se hace mal: vídeos con mal sonido y anuncios, o pistas que hay que comprar. Quien tiene Spotify Premium ya tiene el catálogo; solo faltaba la letra, sincronizada y legible a tres metros.

En 2026 Spotify limita las apps independientes a cinco cuentas y ya no permite comprobar el Premium desde el perfil. La limitación se convirtió en el diseño: cada usuario registra su propia app de Spotify y pega su Client ID, así la cuota es suya y el Premium se comprueba solo al conectar.

Cómo funciona

Estructura

El navegador nunca habla con Spotify: un proceso PHP consulta Spotify una vez por cuenta y guarda el estado en la base de datos, y todas las pantallas leen de ahí. Solo se consulta a quien tiene una pantalla abierta, con más frecuencia al final de la canción.

Flujo de uso

Un asistente de cuatro pasos acompaña la creación de la app de Spotify, con la dirección de retorno que se copia con un botón. Después basta con dar al play en Spotify: JoeSing reconoce la canción, carga la letra y la muestra a pantalla completa, con estilos personalizables.

Decisiones técnicas

OAuth con PKCE, sin pedir nunca el Client Secret; tokens cifrados con AES-256-GCM. La posición en la canción se recalcula en cada fotograma a partir del último dato del servidor, así el error no se acumula. Las letras vienen de LRCLIB: sincronizadas si existen, estáticas como alternativa.

Límites conocidos

Hace falta Spotify Premium y algo de soltura para crear la app en el portal para desarrolladores. El plan Pro se paga por transferencia y se confirma a mano: no hay pago con tarjeta.

Números

Líneas de PHP, aprox. 18.000
Líneas de JavaScript, aprox. 7.400
Tablas propias 22
Clases del módulo 23
Comprobaciones automáticas, aprox. 450

Stack

  • PHP 8
  • MariaDB
  • JoeCMS
  • JavaScript
  • Spotify Web API
  • LRCLIB
  • systemd
Captura de JoeSing