rafa 7af2173014 sync_audio_bulk.sh: parada dura real en --carta + ruta absoluta
- carta_article_ids() en sync_audio_to_prod.py ahora comprueba returncode
  del docker exec y lanza RuntimeError si falla, en vez de devolver una
  lista vacía silenciosa (bug preexistente: un fallo de Docker/consulta se
  confundía con "la carta no tiene artículos").
- El wrapper resuelve --carta a fichero temporal en vez de mapfile con
  sustitución de procesos (mapfile < <(cmd) no deja comprobar el exit
  code real de cmd), captura el rc de python explícitamente y aborta con
  exit 1 sin sincronizar nada si la consulta falla.
- sys.path ya no depende del cwd ("scripts" relativo): se pasa la ruta
  absoluta de SCRIPT_DIR al script inline.

Probado: --carta real sin cambios de comportamiento (28 candidatos,
ok=21/skip=7); consulta rota a propósito (FEA_DB_CONTAINER inexistente)
aborta limpio con exit=1 y 0 sincronizaciones; invocación desde otro
directorio de trabajo da el mismo resultado que desde la raíz del repo.

Revisión de Codix en el PR #215.
2026-08-24 15:26:05 -04:00

feadulta — WordPress

Código del sitio WordPress de feadulta.com. Plugins personalizados (mu-plugins) y scripts de migración y mantenimiento.

Estructura

mu-plugins/   — plugins WordPress cargados automáticamente (sin activar)
scripts/      — scripts Python/PHP de migración, traducción, TTS y mantenimiento

mu-plugins principales

Plugin Función
fea-carta-portada.php Parser de la carta semanal → portada
fea-homepage.php Tarjetas de portada
fea-share.php Sección "Comparte FeAdulta" (Facebook, Instagram, Imprimir)
fea-ui.php Estilos globales, menú, fondo cálido en artículos
fea-accesibilidad.php Tipografía Atkinson Hyperlegible (self-hosted) + toggle claro/oscuro persistente
fea-beta-feedback.php Barra de feedback beta + endpoint /fea/v1/lang/{id}
fea-search.php Buscador móvil nativo
fea-pensamientos.php Widget de pensamientos
carta-semana-plugin.php Redirects carta vigente/semana pasada

Scripts principales

Script Función
import_new_k2_items.py Importar artículos nuevos desde Joomla/K2
import_new_cartas.py Importar cartas semanales nuevas
translate_haiku.py Traducción automática vía Claude Haiku
tts_produce.py Generación de audio TTS (MiniMax)
sync_translations_to_prod.py Sincronizar traducciones local → producción
sync_audio_to_prod.py Sincronizar UN post/carta de audio TTS local → producción (sube el mp3, verifica SHA-256 remoto y persiste fea_audio_sha256)
sync_audio_bulk.sh Envoltorio de sync_audio_to_prod.py para lotes: para en el primer fallo, sin reintentos ciegos, resumen ok/skip
detect_untranslated.php Detectar posts sin traducir

Sincronizar audio TTS a producción (local → prod)

sync_audio_to_prod.py sube el mp3 de UN post/carta y, desde el #213, calcula y verifica el SHA-256 en cada subida (reproducción verificada automática, sin backfill manual — ver #212).

Para lotes de varios posts, usar sync_audio_bulk.sh: es el envoltorio que añade "parar en el primer fallo" (el script Python no lo hace por sí solo, recorre toda la lista y acumula errores). Carga los IDs con mapfile/mediante array y redirige el stdin de cada invocación a /dev/null a propósito — un while read id; do ...ssh...; done < fichero sin esa precaución se rompe en silencio porque ssh se come el resto del fichero de IDs (ver feedback-bash-while-read-ssh-stdin en la memoria del proyecto).

export FEA_PROD_SSH_HOST="rafa@188.40.120.157"
export FEA_PROD_DOCKER_CONTAINER="wordpress-r2ssjifwj0r0ghyoqd528uaa"

# Dry-run primero, siempre
scripts/sync_audio_bulk.sh --ids 55519,55520,822 --dry-run

# Aplicar de verdad
scripts/sync_audio_bulk.sh --ids 55519,55520,822

# Desde un fichero (un ID por línea) o toda la cola de una carta
scripts/sync_audio_bulk.sh --file /tmp/ids_pendientes.txt
scripts/sync_audio_bulk.sh --carta 54254

Rollback de un post concreto: python3 scripts/sync_audio_to_prod.py --rollback --ids <id> (borra el meta en prod, no toca el mp3 local).

Servidor local de desarrollo

WordPress corre en Docker local, accesible vía Tailscale: https://farmer.taild3aaf6.ts.net/fea/

Admin: eqpyk / NuevaFeAdulta2024!

S
Description
WordPress feadulta.com — plugins, scripts y documentación
Readme 13 MiB
Languages
PHP 61%
Python 35.7%
Shell 3.3%