Wie kann ich eine wget-GUI mit mehreren Fortschrittsbalken erstellen?

21

Ich schreibe mein eigenes Skript, um mehrere Elemente (gleichzeitig ein Element pro Befehl) mithilfe von herunterzuladen, wgetund ich benötige eine Fortschrittsleiste. Ich verwende derzeit zenity --progressfür meine Fortschrittsbalken, aber das Problem ist, dass beim Herunterladen mehrere Fortschrittsbalken angezeigt werden.

Was ich erreichen möchte, ist etwas Ähnliches wie der Dateiübertragungsdialog in Nautilus:

Ubuntus Dateiübertragungsdialog

Kann mir jemand die richtige Richtung weisen, in welche (n) Programm (e) oder Sprache (n) dies gelingen wird?

HINWEIS: Ich habe nur Grundkenntnisse in Shell-Skripten, sonst nicht viel.

Rey Leonard Amorato
quelle
Hast du es versucht axel-kapt? sudo apt-get install axel-kapt
Das Kopfgeld steht kurz vor dem Ende. Vergessen Sie bitte nicht, es zuzuweisen, wenn Sie mit meiner Antwort zufrieden sind.
Glutanimate
Kein Problem, Mann. Viel Glück mit Ihrem Skript!
Glutanimate

Antworten:

28

Lösung mit YAD


Überblick

Zenity wurde seit einiger Zeit nicht mehr aktualisiert. Zum Glück gibt es eine Gabel namens YAD mit vielen zusätzlichen Funktionen. Es ist noch nicht in den offiziellen Repositories angekommen, aber Sie können es von einem webupd8-PPA installieren:

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

Eine der Funktionen, die YAD hinzugefügt wurde, ist ein Dialogfeld mit mehreren Fortschrittsbalken. Hier ist ein Auszug aus dem YAD-Handbuch zu mehreren Fortschrittsbalken:

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.

Ein sehr einfaches Skript mit mehreren Fortschrittsbalken könnte also so aussehen:

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

So würde das Ergebnis aussehen:

einfaches yad multi progress script


Wir können den Balken Beschreibungen hinzufügen mit #:

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

Ergebnis:

Bildbeschreibung hier eingeben


Wenn wir dies in einem wget-Download-Skript implementieren möchten, müssen wir zuerst ein paar Dinge tun:

  • Finden Sie eine Möglichkeit, den Download-Fortschritt und andere interessante Daten aus der wget-Ausgabe zu extrahieren
  • Finden Sie eine Möglichkeit, mehrere Dateien zu durchlaufen
  • Finden Sie einen Weg, alle Informationen, die wir haben, an einen einzigen Dialog weiterzuleiten

Ich fand dieses Projekt ziemlich interessant, also setzte ich mich hin und verfasste ein Skript, das all das tun sollte.


yad_wget

Folgendes habe ich mir ausgedacht:

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

Und so sieht es aus:

Bildbeschreibung hier eingeben

           Bildbeschreibung hier eingeben

Lesen Sie alle Kommentare durch, um herauszufinden, wie das Skript funktioniert, und wenn Sie Fragen haben, können Sie diese gerne in den Kommentaren unten nachfragen.


Bearbeiten:

Ich habe die Unterstützung für das Festlegen der maximalen Anzahl gleichzeitiger Downloads hinzugefügt. ZB für MAXDLS="5":

Bildbeschreibung hier eingeben

Glutanimate
quelle
Dies ist ein sehr umfassender und interessanter Beitrag, und mir gefällt, was ich bisher gesehen habe. Vielen Dank, dass Sie sich die Zeit genommen haben, an meinem kleinen Projekt zu basteln. :) F1: Was passiert mit dem Fortschrittsbalken der fertigen Dateien? Bleiben sie im Dialog, bis alles andere erledigt ist? F2: Nach dem, was ich sehe, gibt es keine Möglichkeit, einzelne Vorgänge im Dialogfeld abzubrechen.
Rey Leonard Amorato
1
+1 für yad; Es ist ein tolles Paket. Beachten Sie, dass --notificationon yadunter Ubuntu 13.04 und höher aufgrund des Fehlers 1305835 und des Fehlers 1119420 nicht funktioniert (folgen Sie den Links und stimmen Sie für die Fehler ab).
Paddy Landau
2
Um zusätzliche Steuerelemente zu haben, müssten Sie zu GtkDialog wechseln, mit dem Sie so ziemlich alles tun können. Es ist jedoch viel mehr beteiligt. Die PuppyLinux- Community nutzt es in großem Umfang.
DocSalvager
1
@Glutanimate - Ein kurzer Hinweis, um viel Verwirrung zu vermeiden: Viele der Verweise in PuppyLinux-Foren verweisen auf "gtkdialog3" und "gtkdialog4". Dies sind nur einfachere Synonyme für die echten GtkDialog-Versionen und sie sind nicht einmal konsistent. Die Version 0.8.3, die Sie gepackt haben, ist die neueste und ziemlich stabile. (Moderatoren: Kein GtkDialog mehr hier. Wer daran interessiert ist, sollte bitte neue Fragen stellen.)
DocSalvager
1
@Glutanimate Ich benutze es seit yadeinigen Monaten und bin sehr beeindruckt von seiner Leistung. Ihre Antwort hier ist jedoch absolut brillant und meinen eigenen Fortschrittsbalken um Lichtjahre voraus. Ich werde Ihren wgetFortschrittsbarcode sehr schnell in meine eigene App integrieren: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix