Ámbar: split lista/lectura + YouTube por transcripción + warm cache (2026-09-12)
Continuación de los pendientes de la consola ámbar en experiments-ambar; commit fdc5343.
## Hecho
- Vista split en la consola ámbar: `2` alterna lista|lector lado a lado (grid),
`1`/`Esc` vuelve a lista. n/p o j/k navega dentro del modo split; el lector
precarga el siguiente item (300 ms) para que no haya espera.
- scripts/warm_lectura.py (nuevo): pre-extrae reporte/leer_cache desde
feed-todo.rss.xml (top-N por categoría, cap global). Idempotente. Se encadena
al final de scripts/feed_rss.sh con WARM_N (env, default 12; 0 = lo salta);
si falla por red no bloquea el RSS.
- Leer YouTube por transcripción (sin API key): youtube-transcript-api
(es > en). `leer._extracto_lectura(url)` -> (titulo, texto) unifica el camino
cacheable de warm_lectura y lectura_json; el título se toma de un fetch ligero
del watch page y queda cacheado en {h}.lectura.json.
- Bug de datos: feed._normalizar_todo dejaba las URLs de YT relativas
(/v/<id>), así que 108 items del consolidado no se podían leer. Ahora las
absolutiza (`_url_absoluta_todo`) y feed-todo rss/json regenerado (0 relativos).
## Pendiente / opcional
- /lecturas amplía a YouTube: la transcripción como lectura aplica solo al
lector del feed (leer.py); la bolsa de lecturas sigue el path de trafilatura.
- Comprobar el render del split en pantalla grande (1200px+) de una sentada.
- WARM_N alto (p.ej. 30) al regenerar el feed nocturno si se quiere cubrir más
del silo; el cap total es 120 URLs por corrida.