# PRACTICE-RUNBOOK — Evento 2026-05-15

> Runbook operacional pre-evento. Ejecutar en orden. Marca cada caja al completar.
> Stack: Lenovo + HDMI + TV + WiFi tethering + Tailscale Funnel.

**Tiempo total estimado: 60 minutos (T-60 → T-0)**

---

## T-60 min · Setup hardware (10 min)

- [ ] Conectar Lenovo a corriente
- [ ] Conectar cable HDMI Lenovo ↔ TV
- [ ] Encender TV, seleccionar input HDMI correcto
- [ ] Verificar que el Lenovo extiende o espeja al TV (Super+P si Linux / Fn+F-tecla según modelo)
- [ ] Activar tethering (hotspot) en móvil de Diego
- [ ] Conectar Lenovo a esa WiFi
- [ ] Verificar internet en Lenovo:
  ```bash
  ping -c 3 8.8.8.8
  ```

**Criterio de paso**: TV muestra escritorio Lenovo + ping responde sin pérdidas.

---

## T-50 min · Setup software (15 min)

- [ ] Si el repo NO está clonado en el Lenovo:
  ```bash
  git clone https://git.zensitpro.pro/diego/lan-media.git
  cd lan-media
  ```
- [ ] Si ya está clonado:
  ```bash
  cd /home/diego/lan-media
  git pull
  ```
- [ ] Verificar dependencias Python:
  ```bash
  python3 -c "import fastapi, uvicorn, websockets" && echo OK
  ```
- [ ] Si falta algo:
  ```bash
  pip3 install -r requirements-admin.txt
  ```
- [ ] Verificar binarios del sistema:
  ```bash
  which ffmpeg && which pacat && which npx
  ```

**Criterio de paso**: los 3 `which` devuelven path; el import Python imprime `OK`.

---

## T-35 min · Arrancar el stack (10 min)

- [ ] Posicionarse en el repo:
  ```bash
  cd /home/diego/lan-media
  ```
- [ ] Crear el sink de micrófono:
  ```bash
  bash scripts/setup-mic-sink.sh
  ```
- [ ] **VERIFICACIÓN CRÍTICA** — el default sink NO debe ser `karaoke_mic`:
  ```bash
  pactl get-default-sink
  ```
  Si la salida es `karaoke_mic`, listar sinks y restaurar el HDMI:
  ```bash
  pactl list short sinks
  pactl set-default-sink <nombre-sink-hdmi>     # ej: alsa_output.pci-0000_00_1f.3.hdmi-stereo
  ```
- [ ] Arrancar player + admin + mic-server:
  ```bash
  bash scripts/start-event.sh
  ```
- [ ] Verificar puertos arriba:
  ```bash
  ss -tlnp | grep -E "8080|8081|8082"
  ```
- [ ] Activar Tailscale Funnel (si no estuviera ya):
  ```bash
  sudo tailscale serve --bg --https=443 http://localhost:8091
  sudo tailscale funnel --bg 443 on
  tailscale serve status
  ```

**Criterio de paso**: `ss` muestra los 3 puertos LISTEN + `tailscale serve status` imprime URL pública.

---

## T-25 min · Test audio LOCAL (5 min)

- [ ] Abrir Chrome en el Lenovo → `http://localhost:8080/player/`
- [ ] Pulsar **Espacio** (Play)
- [ ] **CRÍTICO**: verifica que el audio sale por la TV
  - Si no sale: revisar default sink, volumen TV, cable HDMI, fuente HDMI seleccionada
- [ ] Pulsar **F** → fullscreen
- [ ] Pulsar **D** → debug overlay
  - Verifica semáforo de sync en verde durante 30 segundos consecutivos
- [ ] Pulsar **→** → siguiente canción (cambio limpio, sin clicks)
- [ ] Pulsar **←** → vuelve a la anterior

**Criterio de paso**: audio claro por TV + sync verde estable + navegación fluida.

---

## T-20 min · Test admin tablet (5 min)

- [ ] En tablet Android: abrir Chrome → `https://<funnel-url>/admin/`
- [ ] Login: `diego` / `D13g0$$2026`
- [ ] Verifica panel STATUS: todos los servicios en ON
- [ ] Verifica AHORA SUENA refresca cada segundo
- [ ] Pulsa Play/Pause desde admin → confirma que afecta al TV
- [ ] Pulsa Next/Prev desde admin → confirma cambio en TV
- [ ] Buscador: escribe `luck` → filtra correctamente a Luck Ra
- [ ] Pulsa ▶ Play sobre una fila concreta → salta a esa canción en TV
- [ ] (Opcional) Instalar PWA: pulsa "📥 Instalar como app", confirma

**Criterio de paso**: cada acción en admin se refleja en el TV en <1s.

---

## T-15 min · Test mic desde otro móvil (10 min)

- [ ] Coge un segundo móvil (auxiliar)
- [ ] Abre Chrome → `https://<funnel-url>/karaoke` (o `/player/mic.html`)
- [ ] Si el navegador exige certificado: instalar **ZenSit Root CA** en ese móvil
- [ ] Welcome screen → pulsar **EMPEZAR**
- [ ] Escribir nombre: `Test`
- [ ] Permitir micrófono cuando lo solicite
- [ ] Pulsar **START** → estado debe pasar a **EN DIRECTO** (rojo)
- [ ] **Hablar 3 segundos al móvil**
- [ ] Verifica que la voz sale por la TV con delay ~300ms
- [ ] En la tablet admin: confirma que `Test` aparece en **Dispositivos conectados**
- [ ] Verifica VU meter animándose en `mic.html` del móvil
- [ ] Verifica que **AHORA SUENA** aparece también en `mic.html` del móvil
- [ ] Desde admin: pulsa **Mute** sobre `Test` → la voz deja de oírse
- [ ] Desde admin: pulsa **Unmute** → la voz vuelve a oírse

**Criterio de paso**: voz audible por TV + admin controla mute + VU activo + dispositivo visible.

---

## T-5 min · Limpieza pre-evento (5 min)

- [ ] Cerrar la app en el móvil auxiliar (para eliminar el dispositivo `Test`)
- [ ] Desde admin: limpiar peticiones pendientes si las hubiera
- [ ] Eliminar canciones de prueba de la cola si quedaron
- [ ] Verificar disco libre:
  ```bash
  df -h
  ```
- [ ] Cargar la canción #1 en el player (posicionar, sin Play)
- [ ] Dejar el player en **pausa** hasta que arranque el evento
- [ ] Subir volumen del TV al nivel deseado

**Criterio de paso**: panel admin limpio + cola vacía + player listo en pausa.

---

## T-0 · Empezar el evento

- [ ] Pulsar **Play** desde la tablet admin
- [ ] Compartir el acceso de mic con los cantantes vía WhatsApp:

  > Para cantar, abre desde el móvil:
  > `https://zen-admin-oclaw.tailc9332.ts.net/karaoke`
  > Pulsa EMPEZAR, escribe tu nombre, dale permiso al micro y START.

- [ ] Disfruta.

---

# CHECKLIST RESUMEN — Página imprimible

> Solo los puntos críticos. Si todos están marcados, el evento puede arrancar.

- [ ] HDMI conectado y TV en input correcto
- [ ] `pactl get-default-sink` ≠ `karaoke_mic`
- [ ] Stack arrancado: puertos `8080` + `8081` + `8082` en LISTEN
- [ ] Tailscale Funnel UP (`tailscale serve status` muestra URL pública)
- [ ] Audio sale por TV (test local con `Espacio` en `/player/`)
- [ ] Mic funciona desde móvil externo vía Funnel (test remoto end-to-end)
- [ ] Admin tablet controla play/pause/next/prev correctamente
- [ ] URL del karaoke compartida con cantantes por WhatsApp

---

## Anexo · Troubleshooting rápido

| Síntoma | Acción inmediata |
|---|---|
| No hay audio en TV | `pactl get-default-sink` → si es `karaoke_mic`, cambiar al HDMI sink. Revisar cable y volumen TV. |
| Player no abre | `ss -tlnp \| grep 8080` → si vacío, relanzar `bash scripts/start-event.sh`. |
| Admin no responde | Probar `http://localhost:8081/admin/` desde el propio Lenovo antes que vía Funnel. |
| Mic no llega al TV | Verificar que `karaoke_mic` sink existe (`pactl list short sinks`). Si no, re-ejecutar `setup-mic-sink.sh`. |
| Funnel caído | `sudo tailscale funnel --bg 443 on` + `tailscale serve status`. |
| Latencia mic >1s | Revisar señal WiFi del móvil cantante (tethering puede estar saturado si hay 4+ móviles). |
| Sync desincronizado (semáforo rojo) | Recargar `/player/` con F5. Si persiste, reiniciar stack. |

---

## Notas operativas

- **NO** uses Play del player local mientras la tablet admin esté abierta para evitar doble control.
- El tethering del móvil de Diego soporta ~5 dispositivos cómodos (Lenovo + tablet + 4 cantantes). Si va más gente, considera un router dedicado.
- Si el evento arranca tarde, **NO apagues el Lenovo**: solo pausa el player.
- Backup de URLs: anótalas en papel por si la tablet se queda sin batería.
