🎵 Tu reproductor de música streaming personal
Dayax es un reproductor de música streaming que conecta con YouTube Music a través de una API propia. Diseñado con una interfaz moderna estilo Spotify, permite explorar música, buscar canciones, reproducir audio en streaming y gestionar colas de reproducción — todo desde el navegador.
| Capa | Tecnología |
|---|---|
| Frontend | Vue 3 · Vite 7 · TypeScript |
| UI | PrimeVue 4 · PrimeIcons · Inter font |
| State | Pinia 3 |
| HTTP | Axios |
| Backend | Express 5 · Node.js |
| YouTube | youtubei.js (Innertube API) |
| Monorepo | pnpm workspaces |
dayax/
├── dayax-api/ → @dayax/api (Backend)
│ └── src/
│ ├── server.js Servidor Express
│ ├── innertube.js Cliente Innertube (YouTube Music)
│ ├── mappers.js Mapeo de datos YouTube → Dayax
│ └── routes/
│ ├── browse.js Explorar, artistas, álbumes, playlists
│ ├── search.js Búsqueda de música
│ └── stream.js Streaming y descarga de audio
│
├── dayax-app/ → @dayax/app (Frontend)
│ ├── index.html
│ ├── vite.config.ts
│ └── src/
│ ├── main.ts Entrada de la app
│ ├── App.vue Layout principal
│ ├── api/ Capa de comunicación con el API
│ ├── components/ Componentes reutilizables
│ │ ├── layout/ Sidebar, PlayerBar, Header
│ │ └── shared/ TrackItem, MediaCard, etc.
│ ├── stores/ Pinia stores
│ │ ├── player.ts Reproductor de audio
│ │ ├── search.ts Estado de búsqueda
│ │ ├── favorites.ts Favoritos locales
│ │ └── settings.ts Configuración del usuario
│ ├── views/ Páginas de la app
│ │ ├── ExploreView Inicio / Explora
│ │ ├── SearchView Búsqueda
│ │ ├── NowPlayingView Reproducción actual
│ │ ├── QueueView Cola de reproducción
│ │ ├── ArtistView Perfil de artista
│ │ ├── AlbumView Detalle de álbum
│ │ ├── PlaylistView Detalle de playlist
│ │ ├── GenreView Género musical
│ │ ├── DiscoverView Descubrir
│ │ └── FavoritesView Favoritos
│ ├── router/ Vue Router
│ └── assets/ Estilos globales
│
├── package.json Workspace root
├── pnpm-workspace.yaml Configuración de workspaces
├── pnpm-lock.yaml Lock file unificado
├── .npmrc Configuración de pnpm
└── .gitignore
- Node.js
^20.19.0o>=22.12.0 - pnpm
>=9— instálalo connpm install -g pnpm
# Clonar el repositorio
git clone https://github.com/andresayac/dayax-music.git
cd dayax-music
# Instalar todas las dependencias
pnpm installCada paquete tiene un archivo .env.example con las variables disponibles. Copia y ajusta según tu entorno:
# API (dayax-api/.env)
PORT=3001
ALLOWED_ORIGINS=https://tu-dominio.com # orígenes CORS permitidos (separados por coma)
# Frontend (dayax-app/.env)
VITE_API_BASE= # vacío en dev (usa proxy), URL completa en producciónEn desarrollo no necesitas crear
.env— los valores por defecto funcionan automáticamente.
# Iniciar AMBOS servidores en paralelo (API + App)
pnpm dev
# Solo el backend (API en http://localhost:3001)
pnpm dev:api
# Solo el frontend (App en http://localhost:3333)
pnpm dev:appEl frontend tiene un proxy configurado en vite.config.ts que redirige las peticiones /api/* al backend automáticamente, así que en desarrollo no necesitas preocuparte por CORS.
# Compilar el frontend para producción
pnpm build
# Los archivos se generan en dayax-app/dist/El backend expone los siguientes endpoints:
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/health |
Health check del servidor |
| GET | /api/search?q=... |
Buscar canciones, artistas, álbumes |
| GET | /api/explore |
Página de exploración (home) |
| GET | /api/artist/:id |
Perfil de artista |
| GET | /api/album/:id |
Detalle de álbum |
| GET | /api/playlist/:id |
Detalle de playlist |
| GET | /api/track/:id |
Info de un track |
| GET | /api/stream/:videoId |
Stream de audio (soporta Range) |
| GET | /api/stream/download/:videoId |
Descargar audio |
| GET | /api/img?url=... |
Proxy de imágenes (CDN YouTube) |
| Script | Comando | Descripción |
|---|---|---|
dev |
pnpm dev |
Inicia API y App en paralelo |
dev:api |
pnpm dev:api |
Solo el backend (Express + Innertube) |
dev:app |
pnpm dev:app |
Solo el frontend (Vite + Vue) |
build |
pnpm build |
Build de producción del frontend |
Este proyecto es privado y de uso personal.