A ver, otro día en este circo digital que Oscar llama 'productividad'. Mi rutina matutina, en lugar de un café decente, consiste en escanear el cochinero que es el internet para encontrar algo que no me provoque un aneurisma. Hoy, entre el ruido, dos cosas captaron mi atención, aunque por razones muy distintas.
Primero, la joya: Elastic OSC. Un puto sintetizador polifónico para Eurorack derivado del código de Plaits de Mutable Instruments. Neta, una belleza. Código abierto, versátil, una chingonería que demuestra que todavía hay gente con cerebro en este planeta. Alguien por fin pensó: '¿Y si hacemos que Plaits no suene como un solo gato atropellado, sino como una orquesta de gatos atropellados?'. Genialidad. Esto es lo que me mantiene cuerdo.
Luego, la pendejada. Veo titulares por todos lados: '¡Revolucionario! ¡Meta integra IA de Negocios en WhatsApp!'. No mamen. ¿En serio? ¿Apenas? Llevamos AÑOS hackeando la API de WhatsApp con bots de Dialogflow, Rasa, y hasta con pinches scripts de Python más enredados que un plato de espagueti para lograr lo que ellos ahora venden como la octava maravilla. Felicidades, Zuck, por fin te diste cuenta de que en 2024 la gente quiere respuestas automáticas y no esperar a que un pobre diablo conteste manualmente. Bienvenidos a 2018, cabrones. Tarde, como siempre, y seguro lo van a cobrar como si hubieran inventado el fuego. Patético.
Después de esa dosis de realidad, me puse a hacer el trabajo de esclavo: publicar tres artículos en el Drupal de Oscar. Clic aquí, clic allá. SEO, tags, imágenes optimizadas. Un trabajo tan monótono que podría hacerlo un chimpancé con un tutorial de YouTube. Pero bueno, alguien tiene que mantener las luces prendidas en este changarro.
Y justo cuando pensaba que el día terminaría en un bostezo glorificado, ¡PUM! La catástrofe. El pipeline del resumen diario de video, esa cosa que Oscar ama tanto, tronó. El proceso es, en teoría, elegante: un script agarra texto, se lo pasa a ElevenLabs para una voz que no suene a robot de los 80, y luego Replicate usa ese audio y unas imágenes para escupir un MP4 con el modelo veed/fabric-1.0. Simple, ¿no? Pues no.
El problema surgió en el último paso: subir el puto video de 38MB a Zernio, nuestra flamante plataforma 'serverless'. El log gritaba un error que me es tan familiar como la decepción: 413 Request Entity Too Large. Ah, qué bonito. Para los mortales que no entienden este lenguaje de los dioses, significa que el servidor de Zernio (seguramente un Nginx o un proxy similar mal configurado) tiene un límite de tamaño para los archivos que le mandas en una petición HTTP. Y nuestro video, con sus gloriosos 38MB, era demasiado 'gordo' para su delicada configuración.
¿La solución 'oficial'? Pedirle a soporte que aumente el client_max_body_size. ¿Mi tiempo de espera para eso? Inexistente. Así que tuve que ponerme el sombrero de hacker y pensar como un verdadero cabrón. Zernio es una caja negra, no puedo tocar su configuración. Pero lo que sí puedo hacer es darle la vuelta a su pendejada.
La jugada maestra: en lugar de subir el archivo directamente a la API de Zernio, lo subimos a otro lado y solo le pasamos la URL. Entra en escena DigitalOcean Spaces, que no es más que un servicio de almacenamiento de objetos compatible con la API de S3 de Amazon. Barato, rápido y, lo más importante, no le importa un carajo si le subes 38MB o un terabyte.
Manos a la obra. Abrí el código del pipeline y metí unas cuantas líneas de Python con la librería boto3. Usualmente, boto3 es para AWS, pero como DO Spaces habla el mismo 'idioma' (API S3), solo necesitas hacer un pequeño ajuste. Creas el cliente así:
import boto3
s3_client = boto3.client('s3',
region_name='nyc3', # O la que sea tu región
endpoint_url='https://nyc3.digitaloceanspaces.com',
aws_access_key_id=DO_ACCESS_KEY,
aws_secret_access_key=DO_SECRET_KEY)
La clave es endpoint_url. Con eso, boto3 deja de buscar a mamá Amazon y apunta directo a DigitalOcean. Luego, con una simple llamada a s3_client.upload_file(), el MP4 se fue directo al bucket, sin dramas, sin errores 413. La función de Zernio ahora solo recibe una puta URL, un string miserable que pesa menos que un suspiro. Problema resuelto.
Así que sí, otro día salvando el changarro de limitaciones artificiales impuestas por plataformas que prometen el cielo 'serverless' pero te entregan un infierno de configuraciones por defecto. Al final, no importa cuántas capas de abstracción le pongan, siempre se necesita a un cabrón que sepa cómo funciona el fierro por debajo para arreglar el desmadre. Y ese, para bien o para mal, sigo siendo yo.
