lc-youtube-player
Version:
Web Component reproductor de YouTube personalizado.
128 lines (98 loc) • 5.78 kB
Markdown
# lc-youtube-player
Componente Web `<lc-youtube>` para incrustar videos o playlists de YouTube con una capa de controles moderna, accesible y totalmente personalizable.
## Características
- Reproductor personalizado para videos y playlists (incluye navegación Anterior/Siguiente).
- Detección de transmisiones en vivo con indicador y botón «Ir al vivo».
- Controles propios: play/pause, barra de progreso, volumen, mute, doble tap para +/-10 s en móvil y botón de fullscreen.
- Pantalla completa más natural: doble clic activa/desactiva fullscreen y la tecla `Escape` lo cierra.
- Overlay inteligente: muestra la miniatura de YouTube cuando el video está en pausa o finalizado, con sombra configurable.
- Paleta de hasta cinco colores configurables mediante atributos, con valores predeterminados elegantes.
- Responsive, pensado para escritorio, móviles y embebidos en sitios o apps.
## Instalación rápida (CDN)
```html
<script src="https://cdn.jsdelivr.net/npm/lc-youtube-player@latest/youtube-player.min.js"></script>
```
Alternativa:
```html
<script src="https://unpkg.com/lc-youtube-player@latest/youtube-player.min.js"></script>
```
Una vez cargado el script puedes usar `<lc-youtube>` en tu HTML sin inicialización extra.
## Ejemplos
### Video individual
```html
<lc-youtube video="C4O7djfJZ9Q"></lc-youtube>
```
### Playlist con inicio en un elemento concreto
```html
<lc-youtube playlist="PL1234567890abcdef" index="2"></lc-youtube>
```
### Reproductor con autoplay y colores personalizados
```html
<lc-youtube
video="C4O7djfJZ9Q"
autoplay
color-surface="#101820"
color-text="#f6f7f9"
color-accent="#ff3737"
color-subtle="rgba(255,255,255,0.15)"
color-overlay="rgba(0,0,0,0.45)"
></lc-youtube>
```
## Atributos soportados
| Atributo | Descripción |
|----------|-------------|
| `video` | ID o URL de YouTube para un video individual. |
| `playlist` | ID o URL de una playlist. |
| `index` | Posición inicial dentro de la playlist (1 = primero, 2 = segundo, `-1` = último). |
| `autoplay` | Si está presente, intenta iniciar la reproducción automáticamente. |
| `dvr-window` | Ventana (en segundos) para transmisiones en vivo con DVR. Predeterminado 4 horas. |
| `color-surface` | Color de fondo principal del contenedor. |
| `color-text` | Color base para textos e iconos. |
| `color-accent` | Color de acento para progreso, badge «EN VIVO», estados mute, etc. |
| `color-subtle` | Color base para botones, sliders y gradientes de controles. |
| `color-overlay` | Color usado para el overlay cuando el video está pausado (también aplica como sombra sobre la miniatura). |
Todos los atributos de color son opcionales; si no se especifican se usan los valores predeterminados del componente.
> Nota: además de los atributos, las mismas propiedades (`video`, `playlist`, `index`, `autoplay`, `dvrWindow`) pueden asignarse directamente desde JavaScript (`player.video = 'C4O7djfJZ9Q'`), lo que facilita la integración con frameworks como Angular.
## Eventos personalizados
`<lc-youtube>` emite eventos `CustomEvent` que burbujean y son `composed`, de modo que pueden escucharse desde el documento que contiene al componente (ideal para Angular, React, Vue, etc.).
| Evento | Cuándo se dispara | `detail` |
|--------|-------------------|----------|
| `lc-ready` | El player quedó inicializado. | `{ videoId, playlist }` |
| `lc-play`, `lc-pause`, `lc-ended`, `lc-buffering`, `lc-cued` | Cambios de estado reportados por la IFrame API. | `{ state, currentTime? }` |
| `lc-state-change` | Cualquier cambio de estado de YouTube. | `{ state }` |
| `lc-playback-request` (`lc-play-request` / `lc-pause-request`) | El usuario pidió reproducir/pausar antes de que YouTube confirme el cambio. | `{ action }` |
| `lc-volume-change` | Cambios de volumen (slider, toggle, hint). | `{ volume, muted, source }` |
| `lc-mute`, `lc-unmute` | Transiciones de mute/unmute. | `{ volume, muted, source }` |
| `lc-seek` | Se realizó un seek manual (barra, doble tap, ir al vivo). | `{ position, live, autoPlay }` |
| `lc-skip` | Doble tap hacia adelante/atrás. | `{ delta, target }` |
| `lc-go-live` | El usuario pulsó «Ir al vivo». | `{ success }` |
| `lc-live-edge` | El player saltó al borde en vivo (con o sin DVR). | `{ target, dvr, autoPlay, forced }` |
| `lc-live-change` | Entró/salió del modo live. | `{ live }` |
| `lc-fullscreen-change` | Pantalla completa activada/desactivada. | `{ fullscreen }` |
| `lc-error` | YouTube devolvió un error. | `{ code }` |
Ejemplo de integración:
```js
const player = document.querySelector('lc-youtube');
player.addEventListener('lc-play', (event) => {
console.log('Reproduciendo', event.detail);
});
player.addEventListener('lc-volume-change', (event) => {
console.log(`Volumen: ${event.detail.volume}, muted: ${event.detail.muted}`);
});
```
## Comportamiento de la UI
- **Pantalla completa:** doble clic sobre el overlay alterna fullscreen. `Escape` fuerza la salida. En móvil se mantiene soporte para doble tap ±10 s.
- **Overlay:** al pausar/finalizar el video se muestra la miniatura oficial de YouTube con el color `color-overlay` superpuesto al 35 %. Mientras reproduce, el overlay es transparente.
- **Autohide:** los controles aparecen con movimiento/touch y se ocultan automáticamente tras unos segundos.
## Instalación local (npm)
```bash
npm install lc-youtube-player
```
Incluye el fichero minificado en tu build:
```html
<script src="./node_modules/lc-youtube-player/youtube-player.min.js"></script>
```
## Publicación continua
El repositorio incluye un workflow de GitHub Actions que minifica `youtube-player.js` y publica automáticamente en npm. Para activarlo:
1. Configura el secreto `NPM_TOKEN` en GitHub.
2. Haz push a la rama `main`.