Comment puis-je créer une interface graphique wget avec plusieurs barres de progression?

21

J'écris mon propre script pour télécharger plusieurs éléments (simultanément, un élément par commande) à l'aide wgetet j'ai besoin d'une barre de progression. J'utilise actuellement zenity --progresspour mes barres de progression, mais le problème est qu'il génère plusieurs barres de progression lors du téléchargement.

Ce que je veux réaliser est quelque chose de similaire à la boîte de dialogue de transfert de fichiers dans Nautilus:

Boîte de dialogue de transfert de fichiers d'Ubuntu

Quelqu'un peut-il m'indiquer la bonne direction quant au (x) programme (s) ou langue (s) qui y parviendront?

REMARQUE: je n'ai qu'une connaissance de base des scripts shell, pas grand-chose d'autre.

Rey Leonard Amorato
la source
As-tu essayé axel-kapt? sudo apt-get install axel-kapt
La prime est assez proche de sa fin. N'oubliez pas de l'attribuer si vous êtes satisfait de ma réponse.
Glutanimate
Pas de problème, mec. Bonne chance avec votre script!
Glutanimate

Réponses:

28

Solution utilisant YAD


Présentation

Zenity n'a pas été mis à jour depuis longtemps. Heureusement, il existe une fourche appelée YAD avec de nombreuses fonctionnalités supplémentaires. Il n'est pas encore arrivé dans les dépôts officiels, mais vous pouvez l'installer à partir d'un PPA webupd8:

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

L'une des fonctionnalités ajoutées à YAD est une boîte de dialogue multi-barre de progression. Voici un extrait du manuel de YAD concernant plusieurs barres de progression:

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.

Ainsi, un script très simple avec plusieurs barres de progression pourrait ressembler à ceci:

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

Voici à quoi ressemblerait le résultat:

script de progression multi yad simple


Nous pouvons ajouter des descriptions aux barres avec #:

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

Résultat:

entrez la description de l'image ici


Si nous voulons implémenter cela dans un script de téléchargement wget, nous devrons d'abord faire quelques choses:

  • trouver un moyen d'extraire la progression du téléchargement et d'autres données intéressantes de la sortie wget
  • trouver un moyen d'itérer sur plusieurs fichiers
  • trouver un moyen de passer toutes les informations que nous avons à une seule boîte de dialogue Yad

J'ai trouvé ce projet assez intéressant alors je me suis assis et j'ai composé un script qui devrait faire tout ce qui précède.


yad_wget

Voici ce que j'ai trouvé:

#!/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

Et voici à quoi ça ressemble:

entrez la description de l'image ici

           entrez la description de l'image ici

Assurez-vous de lire tous les commentaires pour savoir comment fonctionne le script et si vous avez des questions, n'hésitez pas à les poser dans les commentaires ci-dessous.


Modifier:

J'ai ajouté la prise en charge de la définition du nombre maximal de téléchargements simultanés. Par exemple pour MAXDLS="5":

entrez la description de l'image ici

Glutanimate
la source
C'est un article très complet et intéressant, et j'aime ce que je vois jusqu'à présent. Merci d'avoir pris le temps de bricoler avec mon petit projet. :) Q1: Qu'advient-il de la barre de progression des fichiers terminés? Restent-ils dans la boîte de dialogue jusqu'à ce que tout le reste soit fait? Q2: D'après ce que je vois, il n'y a aucun moyen d'annuler des opérations individuelles de la boîte de dialogue, n'est-ce pas?
Rey Leonard Amorato
1
+1 pour yad; c'est un super paquet. Sachez que --notificationsur yadne fonctionnera pas sur Ubuntu 13.04 et versions ultérieures en raison du bogue 1305835 et du bogue 1119420 (veuillez suivre les liens et voter pour les bogues).
Paddy Landau
2
Pour avoir des contrôles supplémentaires, vous devez passer à GtkDialog qui vous permet de faire à peu près n'importe quoi. Cependant, c'est beaucoup plus impliqué. La communauté PuppyLinux en fait un usage intensif.
DocSalvager
1
@Glutanimate - Une brève note pour éviter toute confusion: de nombreuses références sur les forums PuppyLinux font référence à "gtkdialog3" et "gtkdialog4". Ce ne sont que des synonymes plus simples pour les vraies versions de GtkDialog et ils ne sont même pas cohérents. La version 0.8.3 que vous avez saisie est la dernière et est assez stable. (Modérateurs: Plus d'informations sur GtkDialog ici. Toute personne intéressée doit poster de nouvelles questions.)
DocSalvager
1
@Glutanimate J'utilise depuis yadquelques mois maintenant et j'ai été très impressionné par sa puissance. Votre réponse ici est cependant absolument brillante et à des années-lumière de mes propres barres de progression. Je serai très rapide pour adapter votre wgetcode à barres de progression dans ma propre application: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix