# BRIEFING — LAN Media Display (lan-media)

> **Sesión Claude separada via `claude-spawn lan-media`**. Toda persistencia (engram, tareas, docs) vive en este proyecto, aislado del resto.

## Objetivo

Servidor HTTP local en LAN que sirva una web app reproductor de MP3 con letras sincronizadas estilo karaoke. Cliente final: **Mecool KM1 (Android TV)** conectado por HDMI a proyector. Diego controla desde el móvil o teclado USB.

**Constraints**:
- 100% gratis (sin APIs paid, sin suscripciones)
- Debe estar listo y probado HOY (2026-05-14)
- Mañana (2026-05-15) se usa en evento real — NO PUEDE FALLAR
- Sin tocar Anthropic / OpenAI / Google paid endpoints (regla AI/LLM ABSOLUTE)

## Stack confirmado (research previo OK)

| Pieza | Tool | Justificación |
|---|---|---|
| Letras sincronizadas | [`lrcget`](https://github.com/tranxuanthang/lrcget) o [`syncedlyrics`](https://pypi.org/project/syncedlyrics/) → [lrclib.net](https://lrclib.net) | Free API, 3M canciones, sin auth. Multi-provider fallback (NetEase, Megalobiz, Genius) |
| Web player | HTML+JS vanilla custom (en `player/`) | Sin frameworks → ligero → corre fluido en ARM Cortex-A55 del Mecool KM1 |
| Servidor LAN | `python3 -m http.server 8080` (script en `scripts/serve.sh`) | Una línea, sin instalar nada, ya disponible |
| Cliente TV | Chrome/Brave en Mecool KM1 (Android TV 9/10) fullscreen | Confirmado compatible. Apuntar a `http://<lenovo-lan-ip>:8080/player/` |
| Plan B | USB con MP3+LRC + VLC Android TV nativo | VLC soporta `.lrc` automático si en mismo folder con mismo basename |

## Estructura del proyecto

```
~/projects/active/lan-media/
├── BRIEFING.md                  # este archivo
├── STATUS.md                    # progreso paso a paso
├── songs/                       # los MP3s van aquí (1 por canción)
├── lyrics/                      # los .lrc se descargan aquí (mismo basename que MP3)
├── player/                      # web player a servir
│   ├── index.html
│   ├── style.css
│   ├── app.js
│   ├── lrc-parser.js
│   └── playlist.json            # lista ordenada de canciones (se autogenera)
├── scripts/
│   ├── download-lyrics.sh       # batch descarga LRCs via syncedlyrics
│   ├── build-playlist.sh        # autogenera playlist.json desde songs/
│   ├── serve.sh                 # arranca HTTP server :8080 + imprime IP LAN
│   └── prep-usb.sh              # copia MP3+LRC al pendrive (plan B)
├── docs/
│   └── plan-b-vlc-android.md    # cómo activar plan B en 30 segundos
└── reference-mp3_karaoke/       # repo de referencia (NO usado directo, solo inspiración)
```

## Plan paso a paso (orden)

1. **(Diego)** Copiar todos los MP3 al folder `songs/`. Naming sugerido: `01 - Artista - Título.mp3` (orden + clave para lyrics search)
2. **(Sesión Claude)** Ejecutar `scripts/download-lyrics.sh` → batch descarga `.lrc` para cada MP3 desde lrclib.net
3. **(Sesión Claude)** Revisar manualmente qué canciones no tienen .lrc. Plan C: introducir lyrics a mano para 2-3 críticas (formato LRC simple, mins:segs)
4. **(Sesión Claude)** Ejecutar `scripts/build-playlist.sh` → genera `player/playlist.json` con orden + paths
5. **(Sesión Claude)** Ajustar estética del player (fondo, fuente, color resaltado) según lo que Diego pida
6. **(Sesión Claude)** Ejecutar `scripts/serve.sh` → arranca HTTP server, imprime IP LAN
7. **(Diego)** En el Mecool KM1, abrir Chrome → `http://<IP-LAN>:8080/player/`. Activar fullscreen (F11 o gesto Android TV)
8. **(Diego)** Test extremo a extremo con audio HDMI + proyector
9. **(Sesión Claude)** Preparar pendrive plan B: ejecutar `scripts/prep-usb.sh /media/<USB-mount>`

## Preguntas pendientes para Diego (cuando vuelva de la reunión)

1. **Playlist** — Pasar la lista exacta de canciones (artista + título). Sin esto, paso 2 no puede arrancar.
2. **Versión Android Mecool KM1** — Mecool → Ajustes → Sobre → "Versión Android". Si es 9 o 10 → Chrome desde Play Store. Si menor → instalamos Brave APK.
3. **Estética del player** — Fondo (color sólido / foto / slideshow), fuente (serif elegante / sans moderna / casual), tamaño letra, color de la línea actual vs siguientes, animación highlight (fade / scale / scroll)
4. **Frase de apertura / cierre** — ¿Querés que entre canciones aparezca alguna frase fija o el nombre del evento?
5. **Control playback** — ¿Avanzar manual (click / tecla) o auto-continuo (al terminar una, siguiente)?

**Defaults seguros si Diego no contesta a tiempo**:
- Fondo negro #000, fuente Inter 64px, línea actual blanca brillante con text-shadow, líneas pasadas/futuras gris #555, transición fade 300ms
- Avance automático al terminar cada canción
- Sin frases entre canciones (silencio + pantalla negra 2s)

## Reglas operativas

- **Idioma de comunicación**: español neutro, profesional, directo
- **NO mencionar destinatario, motivo, evento, persona** en NINGÚN artifact persistente (engram, git commits, wiki, scripts). Todo se nombra como "evento" o "presentación" si hay que referirse
- **NO publicar en wiki Outline** ningún doc relacionado
- **NO push a repo público** ni Forgejo tier 1+. Si Diego quiere repo: Forgejo tier 0 secret o local sin remote
- **Engram saves**: project `lan-media`, content neutro técnico
- **Architect Tip al final de cada respuesta relevante** (regla permanente CLAUDE.md global)

## Riesgos identificados

| Riesgo | Mitigación |
|---|---|
| lrclib no tiene .lrc para una canción específica | Plan C: lyrics a mano en formato LRC simple (10 min por canción) |
| Browser del Mecool KM1 limitado / lag | Test temprano. Si falla: instalar Brave APK o usar plan B (USB+VLC) |
| WiFi LAN inestable durante el evento | Plan B precargado en USB. 30 segundos para cambiar |
| Power loss / Mecool reboot | Plan C: cualquier laptop con HDMI puede tomar el relevo (USB pendrive portátil) |
| Audio no sale por HDMI | Test temprano. Fix conocido: Android TV → Ajustes → Sonido → Salida HDMI |
| Letras desincronizadas (offset) | El formato LRC soporta offset global. Player permitirá `+/-` para ajustar en vivo |

## Cómo Diego invoca esta sesión

```bash
# Desde una terminal del Lenovo (NO desde dentro de otra sesión Claude):
claude-spawn lan-media --tema "Servidor HTTP LAN media player MP3+LRC para TV"

# Después adjuntar a la sesión tmux:
tmux attach -t claude-lan-media
```

La sesión nueva debe leer este BRIEFING.md primero. Luego seguir el plan.
