sync_audio_bulk.sh: lote de sincronizacion de audio TTS con parada en primer fallo #215
Reference in New Issue
Block a user
Delete Branch "feat/issue-sync-bulk-script"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Formaliza como script versionado el wrapper que usé a mano el 2026-08-24 para subir a producción los 186 audios TTS pendientes del cron de backlog local (ver hilo en Buzz). Pedido por Codix como corrección permanente tras encontrar un bug real en la version ad-hoc.
Qué hace
scripts/sync_audio_bulk.shenvuelvescripts/sync_audio_to_prod.py(que ya calcula y verifica SHA-256 en cada subida desde el #213) para sincronizar LOTES de posts:--ids csv,--file ruta(uno por linea) o--carta post_id.mapfile/IFS read -a) ANTES de lanzar cualquier ssh -- nuncawhile read ... < fichero./dev/nullen cada invocacion.ok/skipal cierre.--dry-runsoportado (pasa el flag al script Python).Por que hace falta
Un primer intento con un
while read id; do ...; done < ficheronormal parecia funcionar (rc=0, log "sin error") pero solo proceso 1 de 184 posts:sync_audio_to_prod.pyllama asshinternamente, que hereda el mismo stdin que el bucle estaba leyendo, se come el resto del fichero de IDs, y el bucle termina limpio tras la primera iteracion. Se detecto solo verificando el resultado real en produccion (el conteo de metas no cuadraba), no por ningun error visible. Documentado tambien en la memoria del proyecto (feedback-bash-while-read-ssh-stdin).Probado
--dry-runcon 3 IDs conocidos (con symlink awordpress/wp-content/uploads/ttsdel checkout principal, mismo patron que el resto de worktrees): PLAN correcto, ok=3/3.--dry-run --filecon los 186 IDs reales del backfill: ok=186/186, sin tocar produccion.fea_audio_done=fea_audio_sha256=969, 0 discrepancias, verificacion por conjunto de los 186 IDs sin ningun NULL.No toca produccion por si mismo (solo añade el script + doc). Pido revision independiente antes de mergear.
- 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.