635 - Crear miniaturas para YouTube con Inkscape

635 - Crear miniaturas para YouTube con Inkscape

Crear #miniaturas para #youtube con #inkscape y #jinrender de forma automatizada utiliando #jinja2 #rust y #bash con #github actions

1:25
-3:15

Llevo ya unos años subiendo vídeos a YouTube, y en este tiempo he ido mejorando tanto la presentación como el flujo de trabajo. Como he comentado en mas de una ocasión, mi objetivo es que sea lo mas automatizado posible. Que desde que creo un vídeo hasta que lo subo no tenga que invertir mi tiempo ni mi esfuerzo. Pero, intentando conseguir un producto de calidad, dentro de las posibilidades que tengo a mi alcance y con las premisas que acabo de indicar. También es necesario intentar agradar al algoritmo de YouTube en la medida de lo posible. Esto es algo que poco a poco he ido mejorando, pero que todavía no tengo completamente resuelto. Lo que si, que tengo resuelto es la creación de miniaturas, portadas o carátulas, y en estos últimos días lo he mejorado sensiblemente con una combinación ganadora. Así, en este episodio te voy a hablar sobre crear miniaturas para YouTube con Inkscape y jinrender. Un poquito de Bash y otro de Rust.

Crear miniaturas para YouTube con Inkscape y jinrender

Una mirada atrás

¿Porque crear portadas de YouTube? Inicialmente no creaba ninguna portada para los vídeos de YouTube. Sin embargo, llegó un momento en que me planté la absoluta necesidad de crear esas portadas por dos razones fundamentales.
La primera de las razones es por que el algoritmo de YouTube para seleccionar la imagen del vídeo me tiene manía. Siempre seleccionaba una imagen donde salía con alguna caraza. Esto te lo conté en el episodio 468, que titulé precisamente yt-dlp es una pura maravilla. Eliminando carazas.
Pero por otro lado, la segunda de las razones, es que una buena portada de vídeo en YouTube atrae visitas. Y es que al final, como en tantas otras facetas de nuestra vida, los vídeos nos entran por los ojos. Pero, está claro, ¿Como puede saber alguien de que va un vídeo que acabas de subir?. Desde luego viendo una caraza, es realmente complejo.

Ya lo dice el propio YouTube, el 90% de los vídeos con mejor rendimiento tiene miniaturas personalizadas.

Así que hace ya algún tiempo decidí resolver esto de las miniaturas. Por supuesto, se trataba de hacerl ode forma automatizada y sin que tuviera que invertir una gran cantidad de tiempo. Y así fue… aunque tengo que confesarte que si bien, no les dedico tiempo a la creación de las miniaturas, si que le he dedicado bastante tiempo a la creación del proceso de «creación de miniaturas». Es lo que tiene, cada uno le dedica tiempo a lo que le gusta.

Creación de miniaturas

Para la creación de las miniaturas utilizo una plantilla en formato SVG creada con Inkscape. La razón de esto es que al tratarse de SVG puedo modificar la imagen directamente modificando el archivo SVG. A ¿que me refiero con esto?. Te lo explico con un ejemplo.
Hasta ahora en la plantilla no aparecía el título, sino que aparecía la palabra clave ||TITLE||. De esta manera simplemente tenía que reemplazar esa palabra clave por el título del episodio y listo. Y lo mismo podía hacer con otras variables parametrizadas, como puede ser el número del episodio y mas detalles que desvelaré mas adelante.
Así con un sencillo script en Bash, con un simple sed -i podía crear una nueva miniatura de forma sencilla.

Complicando lo sencillo

Por supuesto que no me podía quedar simplemente en eso. Tenía que hacer un mas dificil todavía. En realidad, al script que tenía implementado yo le pasaba el número del episodio y el vídeo, y el se encarga de todo lo demás que es lo siguiente.

  1. Extraer el título del episodio. Esto lo hace de los guiones de los episodios. Ahora de los archivos de Obsidian.
  2. Extraer el audio del vídeo.
  3. Crea la miniatura reemplazando las variables indicadas anteriormente. Para la imagen de fondo utiliza la última imagen que se encuentre en el directorio de ~/Descargas. Para la imagen en la que aparezco yo, utilizo el día del mes. En realidad crea dos miniaturas, una para vídeo en formato 1920x1080 y otra para el audio en formato 2000x2000. Las miniaturas las deja en un directorio específico para tenerlo siempre a mano.
  4. Una vez creada la miniatura se la asocia al audio.

Un paso mas jinrender

Llevaba ya un tiempo dando vueltas a esto de reemplazar las variables utilizando sed -i. Quería utilizar jinja2 para esto. En particular, te hablé sobre jinja2 en el episodio 583 que titulé El poder de Jinja y Python. En el que te decía que Jinja se había convertido en una herramienta fundamental para mi.

¿Que es Jinja2?

Jinja2 es un lenguaje de plantillas, que si bien si bien nación en el mundo Python se ha extendido a otros lenguajes y entornos. De echo, actualmente, no solo lo estoy utilizando con Python, sino que hace tiempo que lo vengo implementado también en Rust y recientemente también en Java.
Un ejemplo de una plantilla en Jinja2, es algo como esto,

Hola {{ nombre }}!

De esta forma tu pasas esta plantilla y la rellenas con los parámetros que quieras.

Jinrender

Quería utilizar Jinja, por la versatilidad y comodidad que me ofrece, y que no solo lo puedo utilizar para esta automatización en particular, sino que lo puedo extender a otros ámbitos.
El problema que me planteaba era como hacerlo, como pasar todos los parámetros que necesitaba a una plantilla directamente desde un script. Pasarle la plantilla y el archivo de salida, es algo sencillo. ¿pero como pasarle una decena de parejas clave valor?
La solución la tenía mucho mas cerca de lo que pensaba, las variables de entorno. Antes de llamar a la aplicación cargo como variables de entorno todas las que necesito y listo. Luego solo tengo que hacer un bucle por todas las variables de entorno cargadas y reemplazar aquellas que se encuentran en mi plantilla.
Así es como nació Jinrender. Se trata de un sencilla aplicación a la que le pasas como parámetros la plantilla y el archivo de salida, y el se encarga de renderizar utilizando las variables de entorno que encuentre. Por ejemplo, creas una plantilla llamada template.jinja con el siguiente contenido,

Hola, {{ env.USERNAME }}! ¿Como estás?

Y ejecutas lo siguiente,

jinrender -j template.jinja -o salida.txt

Creando minisaturas con jinrender

Una vez implementado jinrender la cosa se ha simplificado. Realmente no se ha simplificado gran cosa, pero si que me encuentro mas cómodo. Ahora simplemente tengo que pasarle a jinrender la plantilla y el archivo de salida, y el se encarga de todo lo demás.
En el caso de utilizar Bash, para cargar las variables de entorno utilizas export VARIABLE=valor. Mientras que en mi caso, ahora que utilizo fish, utilizo set -x VARIABLE valor.

GitHub actions

Claro que si tu también quieres utilizar jinrender para tus cosas, se hacía necesario poder subir el ejecutable a algún sitio, y de nuevo ha venido GitHub Actions para cerrar el círculo. He añadido un workflow de forma que se compila para Linux y Windows y queda disponible en Releases.

Inkscape

Me queda un detallín importante, Inkscape. Inkscape es una herramienta de edición de gráficos vectoriales de código abierto. Es una herramienta que llevo utilizando desde hace mucho tiempo, y que me ha permitido hacer cosas que nunca hubiera imaginado. En particular, la creación de miniaturas para YouTube. En este caso, la plantilla que utilizo para la creación de las miniaturas es un archivo SVG creado con Inkscape.
En ese archivo tengo varias capas, una para el fondo, otra para el título, otra para el número del episodio, y otra para la imagen en la que aparezco yo. De esta forma, simplemente modificando las capas que me interesan, puedo crear una nueva miniatura en cuestión de segundos.
Aquí era necesario parametrizar tanto el título, como el número del episodio, como la miniatura en la que aparezco yo.
Pero además he podido añadir sombreado al título y también al número del episodio. Y todo ello de forma automatizada.
Hace mucho, mucho tiempo que Inkscape es mi aplicación por defecto para hacer imágenes y gráficos. Y en este caso, no podía ser menos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *