Commits

Auto Magazine: del esqueleto al primer número paginado en una sola jornada

Segunda jornada: esqueleto desplegado en magazine.escandell.cat, ingesta desde la carpeta de entrada, extracción por capas, primer prototipo maquetado y paginación automática en múltiplos de 4.

La segunda jornada de Auto Magazine ha sido la más intensa hasta ahora: hemos pasado de no tener nada a tener la aplicación funcionando en producción, con el material entrante, los documentos de Word convertidos en artículos y el primer número paginado como una revista de verdad.

El esqueleto y el despliegue

Empezamos por la fase 1: el esqueleto de la aplicación, reutilizando el patrón de Contenidos_PX_v4 tal como indicaba la especificación. Autenticación con scrypt, un primer arranque que pide al administrador una sola vez, middleware de sesión con CSRF y la configuración guardada en una tabla de SQLite.

El panel de proveedores de IA salió del mismo molde, con Anthropic y Ollama local añadidos al catálogo. Como el equipo local no tiene Docker, el despliegue fue directo al servidor, y la aplicación ya funciona en magazine.escandell.cat con Nginx Proxy Manager delante. Fueron necesarios tres ajustes que recordaremos para próximos despliegues: los hosts de confianza y el modo HTTPS ahora se configuran mediante .env, el contenedor tiene el nombre estable auto-magazine y se encuentra en la red externa edge, que es donde vive el proxy.

El material ya entra y se convierte

La fase de ingesta llegó de inmediato: el proceso de vigilancia controla la carpeta de entrada y sincroniza la base de datos con lo que hay físicamente —si aparece una subcarpeta, se da de alta y, si desaparece, se borra—. La subida web con arrastrar y soltar crea exactamente lo mismo que dejar una subcarpeta a mano: una sola vía de entrada.

Cada .docx se convierte en bloques etiquetados con dos capas: primero los estilos de Word, que no requieren ninguna llamada, y solo cuando el documento no lleva ningún título por estilos entra la IA para etiquetar por índice sin tocar el texto.

La jornada también dejó tres correcciones que surgieron al probarlo en producción:

  • El panel se veía todo apretado debido a una hoja CSS almacenada en caché. Ahora se sirve con la fecha de modificación en la URL y cada despliegue invalida automáticamente la caché.
  • El catálogo de proveedores añadió Groq y dejó de dar error 500 cuando Ollama Cloud respondía con algo que no era JSON.
  • Los modelos de MiniMax no se quedaban seleccionados porque parse_qs agrupaba todos los elementos de selección con el mismo nombre y el código solo conservaba el primer valor.

El primer número paginado

Al final del día llegó el prototipo de maquetación: un número cero sintético de una revista de automoción con portada a sangre, editorial, índice dinámico —en el que los números de página se calculan automáticamente con target-counter—, dos artículos y contraportada. El tema está definido en YAML como variables CSS y tenemos activas las capacidades de impresión: sangrado de 3 milímetros, marcas de corte y folios.

La reacción al prototipo dejó una decisión importante: al usuario no le gusta la dirección visual y, precisamente por eso, era un prototipo. Las plantillas serán de HTML y CSS sencillos, editables a mano, con un único contrato: recibir las variables de la extracción y colocarlas donde se quiera. Llevar el prototipo dentro de la aplicación fue casi copiar y pegar, y el botón «Maquetar número» ya lanza el renderizado en segundo plano.

Para terminar, la paginación automática: los artículos fluyen sin saltos forzados y el total se ajusta al múltiplo de 4 del pliego con la cascada acordada —se mide el renderizado, se calcula el espacio vacío y se llena primero con un colofón y después con páginas en blanco—. El primer intento calculó el relleno antes de contar las páginas del anuncio y la prueba del múltiplo lo detectó al instante: nueve páginas no cuadran en ningún pliego.

Ahora toca la fase de exportación a imprenta, con el CMYK y las comprobaciones previas de impresión.