sábado, 3 de marzo de 2018

Scripting con Zenity... para newbies (II)

Bien, pues tras los conceptos generales sobre cómo dialogar en Bash con la consola, podríamos empezar a crear algún script de cierta (pero poca…) complejidad.
Por ejemplo, crearé el siguiente ‘guión’:
#!/bin/bash
read -p "introduce (copia y pega) la dirección web de un video: " VIDEO
youtube-dl --list-formats $VIDEO
read -p "Elija un codigo y escríbalo: " COD
youtube-dl -f $COD $VIDEO
Y la explicación del ‘guión’ creado es esta:
En primer lugar, me pide que copie y pegue la dirección web de un video (por ejemplo de youtube) en la consola. Y esto ‘que lee’ la consola es la variable VIDEO.
En segundo lugar, esta variable, invocada ($…) e introducida en el comando youtube-dl --list-formats me dará una lista de formatos disponibles para bajarme el video.
En tercer lugar, debo elegir uno (un número, como código identificativo, de la lista) y lo debo escribir. Y como antes, lo que ‘lea’ ahora el intérprete será la variable COD
Y finalmente, la orden ‘youtube-dl -f $COD $VIDEO’ hará que se descargue el video elegido, en el formato igualmente elegido.
Y, poniendo un nombre a este script (por ejemplo ‘script_bajarVideos’, si lo ejecutamos, por consola, con la sencilla orden
sh script_bajarVideos
haría su trabajo, con muy poco esfuerzo por nuestra parte.

Pero, visto (y probado) esto, ya es hora de empezar a hablar de Zenity
Zenity es un software que, a través de GTK, permite ‘dialogar’ con la consola a través de sencillas ‘ventanas gráficas’ para introducir (o presentar) cosas. Es decir, nos permite añadir diálogos gráficos a nuestros scripts bash.
Una cuestión interesante de los diálogos zenity es que, formulados, se pueden copiar y pegar en una consola y, dando a ENTER, veremos su resultado.
Hay diversos tipos de diálogos, lo que ofrece puede verse aquí (por ejemplo)… y lo pretendo es ver cómo se utilizan algunos de estos diálogos (los que me parezcan más útiles). 
Voy a empezar por dos muy sencillos: uno (Dialogo A) genera una ventana para introducir un texto (input) al sistema El segundo (Dialogo B), genera una ventana para presentar el texto (ouput) que te da el sistema.

DIALOGO A- Ventana para introducir un texto en la consola
Su formulación típica es muy sencilla:
zenity --entry --title= “...” --text “…”
es decir que al mandato principal ('zenity --entry') le añadimos el título de la ventana y el texto descriptivo de lo que queremos introducir. Y con esto, si en la ventana un dato (copiar y pegar algo, escribir un número, o un texto, etc.), podrá ser ser usado como ‘input’ (invocándolo como variable) en otro comando, si a esa formulación de la ventana zenity le asignamos una variable. O sea, como el ‘read -p… que decía arriba.
Dos observaciones: la primera, en este diálogo zenity ‘de introducción de texto’, el ancho de la ventana se adaptará al ancho que ocupe este texto (hay un ancho estandar ‘mínimo’) Veremos en otros diálogos que se puede personalizar en tamaño de las ventanas pero aquí tendremos que ingeniarnos un texto ‘proporcionado’ con lo que introduzcamos.
Y la segunda: cuando introduzcamos varios parametros de zenity en una sola línea, solo hace falta poner zenity al principio de esa línea. Y si preferimos ponerlos en varias lineas, encerrándolos entre paréntesis, también.
Por ejemplo, para crear una ventana de diálogo pondríamos poner esto...
(zenity --entry --title="Dirección del video" \
--text "Copie y pegue aquí la dirección web del video a descargar")
Y, si seleccionamos estas dos líneas y las pegamos, por las buenas, en la consola, el ‘ intérprete’ lo entendería como un solo comando zenity y nos devolvería esto:

Y vamos con el segundo dialogo, el inverso (mostrar un texto de información)

DIALOGO B- Ventana para mostrar el texto de la información obtenida
Si el anterior diálogo zenity se usaba para introducir un dato (una variable), este se emplea para ver el texto que te genera esa variable. Su formulación más sencilla es esta:
zenity --text-info --width=... --height=… --filename=...
es decir damos al orden principal (zenity --text-info), definimos el tamaño de la ventana (también, con --font=… podríamos definir la tipografía) e indicamos (filename) qué es lo que queremos ver (filename puede ser un archivo de texto, una variable invocada, etc.)
Como siempre, un ejemplo práctico:
Con el comando indicado se obtendría un dato, que vamos a llamar ‘códigos’
youtube-dl --list-formats $VIDEO> $codigos
y con la instrucción…
zenity --width=800 --height=600 --text-info --filename=$codigos
veríamos en una ventana lo que genera, en consola, esa variable códigos.
Bien pues, para terminar, podríamos diseñar el script del principio empleando estos dos diálogos zenity que acabamos de ver (y alguna sencilla cosita más, que comentaré otro día).. Sobre el diseño de script de cierta complejidad, una buena regla es pensar, primeramente, y tener clara, la ‘estrategia’ del script y finalmente escribir los comandos, propiamente dichos, del ‘guión’.
Por ejemplo…
#!/bin/bash

codigos=`tempfile`
VIDEO=$(zenity --entry --title="Dirección del video" --text "Copie y pegue aquí la dirección web del video a descargar")
youtube-dl --list-formats $VIDEO> $codigos
zenity --width=800 --height=600 --text-info --filename=$codigos
COD=$(zenity --entry --title="Código" --text "Ingrese codigo elegido")
youtube-dl -f $COD $VIDEO 2>&1|zenity --width=500 --height=500 --text-info="Progreso de descarga"
# guardar este script por ejemplo como 'bajarVideos.sh' y ejecutarlo con la orden 'sh bajarVideos.sh'
cuyo ‘argumento del guión’ es el siguiente:
1-primero ‘declaro’ que la variable ‘codigos’ que voy a obtener será temporal,
2-luego defino la variable VIDEO por medio de un dialogo zenity de introducción de texto,
3-obtengo la variable codigos por medio del comando youtube-dl –list-formats y la visualizo en una ventana zenity de mostrar información de salida
4-defino la variable COD por medio de otro dialogo zenity de introducción de texto,
5 y finalmente aplico el comando, propiamente dicho, para generar la descarga elegida, con el formato elegido… y he añadido, mediante una ‘tubería’ otra sencilla utilidad con zenity: que me enseñe en otra ventana el progreso de la descarga que, como dije, ya lo veré otro día.
Así que queda probar.

Bueno, espera, voy a ver si funciona este ‘invento’ que se me acaba de ocurrir...

Vale, queda bastante bien... 
(por cierto, ese 'GTK-Message que sale, que parece un error, no tiene importancia, leo que es un viejo 'bug' de zenity con Debian, que se puede corregir manualmente incorporando una instrucción... pero no merece la pena)

No hay comentarios:

Publicar un comentario