¿Cómo puedo crear una GUI de wget con múltiples barras de progreso?

21

Estoy escribiendo mi propio script para descargar varios elementos (simultáneamente, un elemento por comando) usando wgety necesito una barra de progreso. Actualmente lo utilizo zenity --progresspara mis barras de progreso, pero el problema es que genera múltiples barras de progreso al descargar.

Lo que quiero lograr es algo similar al diálogo de transferencia de archivos en Nautilus:

Diálogo de transferencia de archivos de Ubuntu

¿Alguien puede señalarme la dirección correcta en cuanto a qué programa (s) o idioma (s) lograrán esto?

NOTA: Solo tengo conocimientos básicos de scripting de shell, no mucho más.

Rey Leonard Amorato
fuente
¿Lo has intentado axel-kapt? sudo apt-get install axel-kapt
La recompensa está muy cerca de su fin. No olvide asignarlo, si se siente satisfecho con mi respuesta.
Glutanimate
No hay problema, hombre. ¡Mucha suerte con tu guión!
Glutanimate

Respuestas:

28

Solución usando YAD


Visión general

Zenity no se ha actualizado en mucho tiempo. Afortunadamente, hay una bifurcación llamada YAD con muchas características adicionales. Todavía no ha llegado a los repositorios oficiales, pero puede instalarlo desde un PPA webupd8:

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

Una de las características agregadas a YAD es un diálogo de barra de progreso múltiple. Aquí hay un extracto del manual de YAD sobre múltiples barras de progreso:

Multi progress bars dialog options
--bar=LABEL[:TYPE]
  Add progress bar. LABEL is a text label for progress bar. TYPE is a progress bar type. Types are:
  NORM for normal progress bar, RTL for inverted progress bar and PULSE for pulsate progress bar.
--vertical
  Set vertical orientation of progress bars.
--align=TYPE
  Set alignment of bar labels. Possible types are left, center or right. Default is left.

Initial values for bars set as extra arguments. Each lines with progress data passed to stdin must be started
from N: where N is a number of progress bar. Rest is the same as in progress dialog.

Entonces, un script muy simple con múltiples barras de progreso podría verse así:

for i in {1..100}; do
   printf "1:$i\n2:$i\n3:$i\n"
   sleep 0.2
done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM

Así es como se vería el resultado:

secuencia de comandos de progreso múltiple simple yad


Podemos agregar descripciones a las barras con #:

for i in {1..100}; do
   printf "1:$i\n2:$i\n3:$i\n"
   printf "1:#Progress 1 is at $i percent\n2:#Progress 2 is at $i percent\n3:#Progress 3 is at $i percent\n"
   sleep 0.2
done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM

Resultado:

ingrese la descripción de la imagen aquí


Si queremos implementar esto en un script de descarga de wget, primero tendremos que hacer algunas cosas:

  • encuentre una manera de extraer el progreso de descarga y otros datos interesantes de la salida de wget
  • encontrar una manera de iterar sobre múltiples archivos
  • encuentra una manera de pasar toda la información que tenemos a un solo cuadro de diálogo yad

Este proyecto me pareció bastante interesante, así que me senté y compuse un guión que debería hacer todo lo anterior.


yad_wget

Esto es lo que se me ocurrió:

#!/bin/bash

# NAME:         yad_wget
# VERSION:      0.2
# AUTHOR:       (c) 2014 Glutanimate
# DESCRIPTION:  graphical frontend to wget in form of a yad script
# FEATURES:     - display progress of multiple simultaneous downloads
#               - set maximum number of simultaneous downloads
# DEPENDENCIES: yad
#
#               Install yad on Ubuntu with:
#
#                   sudo add-apt-repository ppa:webupd8team/y-ppa-manager
#                   sudo apt-get update
#                   sudo apt-get install yad
#
# LICENSE:      GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html)
#
# NOTICE:       THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 
#               EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 
#               PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR 
#               IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
#               AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 
#               PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
#               YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
#               IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY 
#               COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS 
#               PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 
#               INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE 
#               THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 
#               INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE 
#               PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 
#               PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#
# USAGE:        yad_wget <space-delimited URLs>
#               Closing the yad dialog will terminate all downloads in progress

# Variables and settings

MAXDLS="5" # set maximum number of simultaneous downloads

URILIST="$@" # gets list of URIs from stdin
USAGE="$0 <space-delimited URLs>"

# Set GUI variables up
TITLE="YAD wget downloader"                 # dialog title
TEXT="<b>Downloads</b> in progress:"        # dialog text
ICON="emblem-downloads"                     # window icon (appears in launcher)
IMAGE="browser-download"                    # window image (appears in dialog)

#URILIST="http://proof.ovh.net/files/100Mb.dat http://speedtest.wdc01.softlayer.com/downloads/test10.zip http://cachefly.cachefly.net/100mb.test"

# Usage checks

if [[ -z "$URILIST" ]]
  then
      echo "Error: No arguments provided"
      echo "Usage: $USAGE"
      exit 1
fi


# download file and extract progress, speed and ETA from wget
# we use sed regex for this
# source: http://ubuntuforums.org/showthread.php?t=306515&page=2&p=7455412#post7455412
# modified to work with different locales and decimal point conventions
download(){
    wget  "$1" 2>&1 | sed -u \
    "s/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/$2:\1\n$2:# Downloading at \2\/s, ETA \3/"
    RET_WGET="${PIPESTATUS[0]}"             # get return code of wget
    if [[ "$RET_WGET" = 0 ]]                # check return code for errors
      then
          echo "$2:100%"
          echo "$2:#Download completed."
      else
          echo "$2:#Download error."
    fi
}


# compose list of bars for yad
for URI in $URILIST; do                     # iterate through all URIs
    FILENAME="${URI##*/}"                   # extract last field of URI as filename
    YADBARS="$YADBARS --bar=$FILENAME:NORM" # add filename to the list of URIs
done

IFS=" "
COUNTER="1"
DYNAMIC_COUNTER="1"

# main
# iterate through all URIs, download them in the background and 
# pipe all output simultaneously to yad
# source: http://pastebin.com/yBL2wjaY

for URI in $URILIST; do
    if [[ "$DYNAMIC_COUNTER" = "$MAXDLS" ]] # only download n files at a time
      then
          download "$URI" "$COUNTER"        # if limit reached wait until wget complete
          DYNAMIC_COUNTER="1"               # before proceeding (by not sending download() to bg)
      else
          download "$URI" "$COUNTER" &      # pass URI and URI number to download()
          DYNAMIC_COUNTER="$[$DYNAMIC_COUNTER+1]"
    fi
    COUNTER="$[$COUNTER+1]"                 # increment counter
done | yad --multi-progress --auto-kill $YADBARS --title "$TITLE" \
--text "$TEXT" --window-icon "$ICON" --image "$IMAGE"

# ↑ launch yad multi progress-bar window

Y así es como se ve:

ingrese la descripción de la imagen aquí

           ingrese la descripción de la imagen aquí

Asegúrese de leer todos los comentarios para saber cómo funciona el guión y si tiene alguna pregunta, no dude en preguntar en los comentarios a continuación.


Editar:

Agregué soporte para configurar la cantidad máxima de descargas simultáneas. Por ejemplo para MAXDLS="5":

ingrese la descripción de la imagen aquí

Glutanimato
fuente
Esta es una publicación muy completa e interesante, y me gusta lo que veo hasta ahora. Gracias por tomarse el tiempo para jugar con este pequeño proyecto mío. :) P1: ¿Qué sucede con la barra de progreso de los archivos completados? ¿Permanecen en el diálogo hasta que todo lo demás esté hecho? P2: Por lo que estoy viendo, no hay forma de cancelar operaciones individuales desde el cuadro de diálogo, ¿verdad?
Rey Leonard Amorato
1
+1 para yad; Es un gran paquete. Tenga en cuenta que --notificationel yadno va a funcionar en Ubuntu 13.04 y más tarde a causa de fallo 1.305.835 y fallo 1.119.420 (por favor, siga los enlaces y votar por los insectos).
Paddy Landau
2
Para tener controles adicionales, deberías pasar a GtkDialog, que te permite hacer casi cualquier cosa. Sin embargo, es mucho más complicado. La comunidad PuppyLinux lo usa ampliamente.
DocSalvager
1
@Glutanimate: una breve nota para evitar mucha confusión: muchas de las referencias en los foros de PuppyLinux se refieren a "gtkdialog3" y "gtkdialog4". Estos son sinónimos más simples para las versiones reales de GtkDialog y ni siquiera son consistentes. La versión 0.8.3 que tomaste es la última y es bastante estable. (Moderadores: No más sobre GtkDialog aquí. Cualquier persona interesada debería publicar nuevas preguntas).
DocSalvager
1
@Glutanimate que he estado usando yaddurante algunos meses y estoy muy impresionado con su poder. Sin embargo, su respuesta aquí es absolutamente brillante y años luz por delante de mis propias barras de progreso. Seré muy rápido para adaptar su wgetcódigo de barras de progreso en mi propia aplicación: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix