Come posso creare una GUI di wget con più barre di avanzamento?


21

Sto scrivendo il mio script per scaricare più elementi (contemporaneamente, un elemento per comando) utilizzando wgete ho bisogno di una barra di avanzamento. Attualmente utilizzo zenity --progressper le mie barre di avanzamento, ma il problema è che genera più barre di avanzamento durante il download.

Quello che voglio ottenere è qualcosa di simile alla finestra di dialogo per il trasferimento dei file in Nautilus:

Finestra di dialogo per il trasferimento dei file di Ubuntu

Qualcuno può indicarmi la giusta direzione su quale programma (i) o lingua (e) che raggiungerà questo obiettivo.

NOTA: ho solo una conoscenza di base degli script di shell, non molto altro.


Ci hai provato axel-kapt? sudo apt-get install axel-kapt

Il dono è abbastanza vicino alla sua fine. Per favore, non dimenticare di assegnarlo, se ti senti soddisfatto della mia risposta.
Glutanimate,

Nessun problema, amico. Buona fortuna con la tua sceneggiatura!
Glutanimate,

Risposte:


28

Soluzione che utilizza YAD


Panoramica

Zenity non è stato aggiornato da un po 'di tempo. Fortunatamente c'è un fork chiamato YAD con molte funzionalità aggiunte. Non è ancora arrivato nei repository ufficiali, ma è possibile installarlo da un PPA webupd8:

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

Una delle funzionalità aggiunte a YAD è una finestra di dialogo con più barre di avanzamento. Ecco un estratto dal manuale di YAD relativo a più barre di avanzamento:

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.

Quindi uno script molto semplice con più barre di avanzamento potrebbe apparire così:

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

Ecco come sarebbe il risultato:

script yad multi avanzamento semplice


Possiamo aggiungere descrizioni alle barre 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

Risultato:

inserisci qui la descrizione dell'immagine


Se vogliamo implementarlo in uno script di download di wget, dovremo prima fare alcune cose:

  • trova un modo per estrarre l'avanzamento del download e altri dati interessanti dall'output di wget
  • trova un modo per scorrere più file
  • trova un modo per passare tutte le informazioni che abbiamo in una singola finestra di dialogo yad

Ho trovato questo progetto piuttosto interessante, quindi mi sono seduto e ho composto una sceneggiatura che dovrebbe fare tutto quanto sopra.


yad_wget

Ecco cosa mi è venuto in mente:

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

E questo è come appare:

inserisci qui la descrizione dell'immagine

           inserisci qui la descrizione dell'immagine

Assicurati di leggere tutti i commenti per scoprire come funziona lo script e se hai domande, non esitare a chiedere nei commenti qui sotto.


Modificare:

Ho aggiunto il supporto per l'impostazione del numero massimo di download simultanei. Ad esempio per MAXDLS="5":

inserisci qui la descrizione dell'immagine


Questo è un post molto completo e interessante, e mi piace quello che vedo finora. Grazie per aver dedicato del tempo ad armeggiare con questo mio piccolo progetto. :) Q1: cosa succede alla barra di avanzamento dei file completati? Rimangono nella finestra di dialogo fino a quando non viene fatto tutto il resto? Q2: Da quello che vedo, non c'è modo di annullare singole operazioni dalla finestra di dialogo, vero?
Rey Leonard Amorato,

1
+1 per yad; è un ottimo pacchetto. Essere consapevoli che --notificationil yadnon funziona su Ubuntu 13.04 e successivamente a causa di bug 1.305.835 e bug 1.119.420 (si prega di seguire i link e votare per gli insetti).
Paddy Landau,

2
Per avere controlli aggiuntivi, dovresti passare a GtkDialog che ti consente di fare praticamente qualsiasi cosa. Tuttavia, è molto più coinvolto. La comunità PuppyLinux ne fa ampio uso.
DocSalvager,

1
@Glutanimate - Una breve nota per evitare molta confusione: molti dei riferimenti nei forum PuppyLinux si riferiscono a "gtkdialog3" e "gtkdialog4". Questi sono solo sinonimi più semplici per le versioni reali di GtkDialog e non sono nemmeno coerenti. La versione 0.8.3 che hai catturato è l'ultima ed è abbastanza stabile. (Moderatori: non più su GtkDialog qui. Chiunque sia interessato dovrebbe inviare nuove domande.)
DocSalvager

1
@Glutanimate Sto usando yadda alcuni mesi e sono rimasto molto colpito dalla sua potenza. La tua risposta qui è però assolutamente brillante e anni luce avanti rispetto alle mie barre di avanzamento. Sarò molto veloce ad adattare il tuo wgetcodice a barre di avanzamento nella mia app: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.