Sincroniza tus playlists entre Spotify, Tidal y Amazon Music con un solo clic.
- Sobre el Proyecto
- Desarrollo del Proyecto
- Tecnologías Utilizadas
- Arquitectura
- Instalación y Configuración
- Uso
- Configuración de Servicios
- Roadmap
- Contribuir
- Licencia
Crossfade es una aplicación web que permite a los usuarios sincronizar sus playlists entre diferentes servicios de streaming de música. El proyecto nació de la frustración común de tener playlists dispersas en diferentes plataformas y la dificultad de mantenerlas actualizadas manualmente.
Características principales:
- Autenticación de usuarios
- Conexión con Spotify, Tidal y Amazon Music mediante OAuth
- Importación de playlists desde cualquier servicio conectado
- Exportación de playlists a cualquier servicio conectado
- Almacenamiento de playlists en la nube para acceso desde cualquier dispositivo
- Sincronización automática de playlists
El proyecto Crossfade (originalmente llamado PlaylistSync) se desarrolló de forma modular y progresiva, siguiendo estos pasos:
-
Configuración inicial del proyecto:
- Creación del proyecto Nuxt 3
- Configuración de TypeScript
- Configuración de Tailwind CSS y Nuxt UI
-
Diseño de la interfaz base:
- Creación de componentes reutilizables
- Implementación de layout principal
- Desarrollo de la página de inicio
-
Diseño de la arquitectura:
- Definición de la estructura de carpetas
- Diseño de la base de datos
- Planificación de endpoints de API
-
Implementación de Supabase:
- Configuración de la base de datos
- Configuración de autenticación
- Implementación de políticas RLS (Row Level Security)
-
Desarrollo del sistema de autenticación:
- Registro de usuarios
- Inicio de sesión
- Cierre de sesión
- Persistencia de sesión
-
Gestión de perfiles de usuario:
- Creación de perfiles al registrarse
- Visualización y edición de perfiles
-
Implementación de OAuth para servicios externos:
- Configuración de OAuth para Spotify
- Configuración de OAuth para Tidal
- Configuración de OAuth para Amazon Music
-
Desarrollo de endpoints en el servidor:
- Creación de endpoints para el intercambio de tokens
- Manejo seguro de credenciales de servicios
- Renovación automática de tokens
-
Interfaz de conexión de servicios:
- Página de servicios con estado de conexión
- Manejo de errores en la autenticación
- Desconexión de servicios
-
Implementación de importación de playlists:
- Obtención de playlists desde servicios conectados
- Almacenamiento en base de datos propia
- Interfaz de selección e importación
-
Implementación de exportación de playlists:
- Creación de playlists en servicios externos
- Mapeo de canciones entre servicios
- Seguimiento de estado de exportación
-
Visualización de playlists:
- Vista de lista de playlists
- Vista detallada de playlist con canciones
- Funcionalidades de edición y eliminación
-
Optimización de rendimiento:
- Mejora de consultas a la base de datos
- Implementación de caché para llamadas a APIs externas
- Optimización de carga de componentes
-
Mejora de experiencia de usuario:
- Implementación de feedback en tiempo real
- Mejoras en el diseño responsivo
- Animaciones y transiciones
-
Robustez y manejo de errores:
- Mejora en el manejo de casos borde
- Implementación de reintentos automáticos
- Logging y monitoreo
El proyecto utiliza un stack moderno de tecnologías:
-
Frontend:
-
Backend:
- Nuxt Server - Servidor integrado de Nuxt
- Supabase - Backend as a Service con PostgreSQL
- OAuth 2.0 - Protocolo de autorización
-
Despliegue y DevOps:
- Vercel o Netlify (recomendados)
- GitHub Actions (opcional)
-
APIs de Servicios de Música:
app/
├── assets/ # Archivos estáticos (CSS, imágenes)
├── components/ # Componentes Vue reutilizables
│ ├── auth/ # Componentes relacionados con autenticación
│ ├── playlist/ # Componentes relacionados con playlists
│ └── service/ # Componentes relacionados con servicios externos
├── composables/ # Composables Vue reutilizables
├── layouts/ # Layouts de la aplicación
├── middleware/ # Middleware de autenticación y otros
├── pages/ # Páginas de la aplicación (rutas)
├── public/ # Archivos públicos (favicon, robots.txt)
├── server/ # Código del lado del servidor (API, middleware)
│ ├── api/ # Endpoints de la API
│ └── middleware/ # Middleware del servidor
├── stores/ # Stores de Pinia
│ ├── auth.ts # Store de autenticación
│ ├── playlist.ts # Store de playlists
│ └── service.ts # Store de servicios externos
└── types/ # Definiciones de tipos TypeScript
┌─────────┐ 1. Inicio auth ┌──────────────┐
│ │─────────────────────────>│ │
│ │ │ │
│ App │ │ Servicio │
│ │ │ (Spotify) │
│ │<─────────────────────────│ │
└─────────┘ 2. Redirección └──────────────┘
│ a callback ▲
│ │
│ │
│ │
│ ┌───────────────┐ │
│ │ │ │
└──────────>│ Backend Nuxt │──────────┘
3. Intercambio │ │ 4. Intercambio
de código └───────────────┘ de token
│
│
▼
┌────────────┐
│ │
│ Supabase │
│ │
└────────────┘
5. Almacenamiento
de tokens
La estructura de la base de datos en Supabase incluye las siguientes tablas:
profiles- Información de los usuariosservice_tokens- Tokens de acceso a serviciosplaylists- Playlists almacenadastracks- Canciones de las playlistsplaylist_tracks- Relación entre playlists y cancionessync_history- Historial de sincronizaciones
- Node.js (v18 o superior)
- Yarn o npm
- Cuenta en Supabase
- Cuentas de desarrollador en Spotify, Tidal y Amazon Music
-
Clonar el repositorio:
git clone https://github.com/tu-usuario/crossfade.git cd crossfade -
Instalar dependencias:
yarn install
-
Configurar variables de entorno: Crea un archivo
.enven la raíz del proyecto con el siguiente contenido:# Supabase SUPABASE_URL=https://tu-proyecto.supabase.co SUPABASE_KEY=tu-anon-key # Spotify SPOTIFY_CLIENT_ID=tu-spotify-client-id SPOTIFY_CLIENT_SECRET=tu-spotify-client-secret # Tidal TIDAL_CLIENT_ID=tu-tidal-client-id TIDAL_CLIENT_SECRET=tu-tidal-client-secret # Amazon Music AMAZON_CLIENT_ID=tu-amazon-client-id AMAZON_CLIENT_SECRET=tu-amazon-client-secret # URL del sitio (para callbacks de OAuth) SITE_URL=http://localhost:3000 -
Configurar la base de datos: Ejecuta el script SQL proporcionado en
scripts/schema.sqlen tu proyecto de Supabase. -
Iniciar el servidor de desarrollo:
yarn dev
- Visita la aplicación en
http://localhost:3000 - Regístrate con tu correo electrónico
- Inicia sesión con tus credenciales
- Ve a la página "Servicios"
- Haz clic en "Conectar" junto al servicio deseado
- Autoriza a Crossfade en la página del servicio
- Serás redirigido de vuelta a la aplicación
- En la página "Servicios", verás tus playlists disponibles
- Selecciona las playlists que deseas importar
- Haz clic en "Importar seleccionadas"
- Ve a la página "Mis Playlists"
- Selecciona una playlist
- Haz clic en "Exportar"
- Selecciona el servicio de destino
- Confirma la exportación
- Ve a Spotify Developer Dashboard
- Crea una nueva aplicación
- Configura la URL de redirección:
http://localhost:3000/callback/spotify - Obtén el Client ID y Client Secret
- Ve a Tidal Developer Portal
- Crea una nueva aplicación
- Configura la URL de redirección:
http://localhost:3000/callback/tidal - Obtén el Client ID y Client Secret
- Ve a Amazon Developer Console
- Crea una nueva aplicación
- Configura la URL de redirección:
http://localhost:3000/callback/amazon - Obtén el Client ID y Client Secret
- Sincronización automática periódica
- Soporte para más servicios (Apple Music, YouTube Music)
- Transferencia de gustos musicales (artistas/géneros favoritos)
- Reconstrucción inteligente de playlists basada en similitud
- Aplicación móvil nativa
- Modo offline
- Optimización de rendimiento
- Mejoras en la interfaz de usuario
- Soporte para múltiples idiomas
- Análisis de estadísticas de reproducciones
- Modo oscuro/claro
¡Las contribuciones son bienvenidas! Si quieres contribuir al proyecto:
- Haz un fork del repositorio
- Crea una rama para tu característica (
git checkout -b feature/amazing-feature) - Haz commit de tus cambios (
git commit -m 'Add some amazing feature') - Haz push a la rama (
git push origin feature/amazing-feature) - Abre un Pull Request
- Usamos ESLint para mantener la consistencia del código
- Sigue las convenciones de Vue 3 y Nuxt 3
- Usa TypeScript para todas las nuevas características
- Escribe tests unitarios para la lógica de negocio
- Usa mensajes de commit significativos siguiendo Conventional Commits
Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
Desarrollado con ❤️ y ☕️ por danielislas3
