Aplicación full‑stack (Frontend + Backend) para catálogo musical, playlists, favoritos e historial de reproducción.
- Frontend: HTML, CSS, JavaScript (vanilla)
- Backend: Node.js + Express
- Base de datos: MySQL
- Autenticación: JWT
- Seguridad de contraseñas: bcrypt
- Integración de música: Jamendo API
Librerías principales (backend): express, mysql2, jsonwebtoken, bcrypt, axios, cors, dotenv.
frontend/: app web (HTML/CSS/JS).backend/: API REST (Node.js + Express).database/museic_db.sql: esquema MySQL con tablas de usuarios, canciones, playlists, favoritos e historial.MUSIC_LICENSES.md: fuente/licencias de la música (uso educativo).
- Windows
- XAMPP (MySQL y Apache)
- Node.js (para ejecutar el backend)
- Inicia MySQL desde XAMPP.
- Importa el esquema en tu servidor MySQL:
- Archivo:
database/museic_db.sql - Puedes importarlo desde phpMyAdmin en XAMPP.
- Archivo:
Notas:
- El script crea la base
museic_dbsi no existe. - Incluye usuarios de prueba (ADMIN y USER), listados más abajo.
cd backend
npm installCrea backend/.env :
# Recomendado: 3002
PORT=3002
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=
DB_NAME=museic_db
JWT_SECRET="ClaveSecretaDeMuseic"
# Jamendo
JAMENDO_CLIENT_ID=1ebf1a56
#habilita registro como ADMIN por código
ADMIN_REGISTRATION_CODE=webs# Desarrollo
npm run dev
Servidor por defecto: http://localhost:3002 (o el puerto que definas en PORT).
Recomendado (Apache/XAMPP): sirve el proyecto desde htdocs y abre:
http://localhost/Museic/frontend/
- Autenticación por JWT.
- Roles disponibles:
USERyADMIN. - Registro de
ADMIN:- Por defecto, el registro como admin está bloqueado.
- Si defines
ADMIN_REGISTRATION_CODEen.env, puedes registrarte como ADMIN enviandorol: "ADMIN"yadminCode.
Al importar database/museic_db.sql se crean/actualizan estos usuarios:
-
ADMIN
- Email:
admin@museic.com - Password:
admin123
- Email:
-
USER
- Email:
user@museic.com - Password:
user12345
- Email:
Base URL: /api/v1
POST /auth/registerPOST /auth/login
-
GET /songs/catalogue(requiere JWT)- Devuelve canciones del catálogo local (
Canciones).
- Devuelve canciones del catálogo local (
-
GET /songs/search?q=...(requiere JWT + ADMIN)- Busca canciones en Jamendo.
-
POST /songs/add(requiere JWT + ADMIN)- Importa/guarda una canción externa en
Canciones.
- Importa/guarda una canción externa en
-
GET /songs/stream/:id- Redirige a
url_stream. - Incrementa
Canciones.num_reproducciones. - Si envías token (header
Authorization: Bearer <JWT>o query?token=<JWT>), agrega una fila enHistorial_Reproduccion.
- Redirige a
-
POST /songs/:id/like(requiere JWT)- Toggle Like/Dislike en
Favoritos.
- Toggle Like/Dislike en
-
DELETE /songs/:id(requiere JWT + ADMIN)- Elimina una canción del catálogo.
-
POST /favorites/:songId(requiere JWT)- “Dar like” idempotente (si ya existe, no duplica).
-
GET /favorites(requiere JWT)- Lista canciones favoritas del usuario.
Nota: en el frontend se usa principalmente
POST /songs/:id/like(toggle). El endpoint/favorites/:songIdexiste para “añadir” de forma idempotente.
POST /playlists(requiere JWT)GET /playlists/me(requiere JWT)GET /playlists/:id(requiere JWT; respeta visibilidad)PUT /playlists/:id(requiere JWT; dueño)DELETE /playlists/:id(requiere JWT; dueño)POST /playlists/:id/add-song(requiere JWT; dueño) body:{ "id_cancion": number }DELETE /playlists/:id/songs/:songId(requiere JWT; dueño)PUT /playlists/:id/reorder(requiere JWT; dueño) body:{ "songIds": number[] }
-
Vista HTML:
GET /admin/songs?token=<JWT_ADMIN>- Permite importar desde Jamendo, editar título/género, y eliminar canciones.
-
API usada por el panel:
PUT /api/v1/admin/songs/:id(ADMIN)DELETE /api/v1/admin/songs/:id(ADMIN)
Tablas principales (ver database/museic_db.sql):
Usuarios: credenciales, rol (USER/ADMIN), fecha de registro.Canciones: metadatos (título, artista, duración, género, licencia/propósito si aplica), URL de streaming y contador de reproducciones.Playlists: metadatos de playlist y visibilidad (PUBLIC/PRIVATE).Playlist_Canciones: tabla pivote para el orden de canciones dentro de una playlist.Favoritos: relación usuario↔canción con timestamp.Historial_Reproduccion: reproducciones recientes por usuario.