Bagaimana saya bisa membuat GUI wget dengan beberapa progress bar?

21

Saya sedang menulis skrip saya sendiri untuk mengunduh banyak item (secara bersamaan, satu item per perintah) menggunakan wgetdan saya memerlukan bilah kemajuan. Saat ini saya gunakan zenity --progressuntuk bilah progres saya, tetapi masalahnya adalah ia memunculkan beberapa bilah progres saat mengunduh.

Yang ingin saya capai adalah sesuatu yang mirip dengan dialog transfer file di Nautilus:

Dialog transfer file Ubuntu

Adakah yang bisa mengarahkan saya ke arah yang benar untuk program atau bahasa mana yang akan mencapai ini.

CATATAN: Saya hanya memiliki pengetahuan dasar tentang skrip shell, tidak banyak lagi.

Rey Leonard Amorato
sumber
Sudahkah Anda mencoba axel-kapt? sudo apt-get install axel-kapt
Karunia itu cukup dekat dengan akhirnya. Tolong jangan lupa untuk menetapkannya, jika Anda merasa puas dengan jawaban saya.
Glutanimate
Tidak masalah, bung. Semoga berhasil dengan skrip Anda!
Glutanimate

Jawaban:

28

Solusi menggunakan YAD


Ikhtisar

Zenity belum diperbarui dalam beberapa saat. Untungnya ada garpu bernama YAD dengan banyak fitur tambahan. Belum tiba di repositori resmi, tetapi Anda dapat menginstalnya dari PPA webupd8:

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

Salah satu fitur yang ditambahkan ke YAD adalah dialog multi progress-bar. Berikut adalah kutipan dari manual YAD tentang beberapa progress bar:

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.

Jadi skrip yang sangat sederhana dengan beberapa bilah kemajuan dapat terlihat seperti ini:

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

Seperti inilah hasilnya nanti:

skrip multi kemajuan yad sederhana


Kami dapat menambahkan deskripsi ke bilah dengan #:

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

Hasil:

masukkan deskripsi gambar di sini


Jika kita ingin menerapkan ini dalam skrip unduhan wget, kita harus melakukan beberapa hal terlebih dahulu:

  • temukan cara untuk mengekstrak progres unduhan dan data menarik lainnya dari output wget
  • menemukan cara untuk beralih pada beberapa file
  • temukan cara untuk meneruskan semua info yang kita miliki ke satu dialog yad tunggal

Saya menemukan proyek ini agak menarik sehingga saya duduk dan menyusun naskah yang harus melakukan semua hal di atas.


yad_wget

Inilah yang saya pikirkan:

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

Dan seperti inilah tampilannya:

masukkan deskripsi gambar di sini

           masukkan deskripsi gambar di sini

Pastikan untuk membaca semua komentar untuk mengetahui cara kerja skrip dan jika Anda memiliki pertanyaan, jangan ragu untuk bertanya di komentar di bawah ini.


Edit:

Saya menambahkan dukungan untuk mengatur jumlah maksimum unduhan simultan. Misalnya untuk MAXDLS="5":

masukkan deskripsi gambar di sini

Glutanimate
sumber
Ini adalah posting yang sangat komprehensif dan menarik, dan saya menyukai apa yang saya lihat sejauh ini. Terima kasih telah meluangkan waktu untuk mengutak-atik proyek kecil saya ini. :) T1: Apa yang terjadi pada bilah progres dari file yang sudah selesai? Apakah mereka tetap pada dialog sampai semuanya selesai? T2: Dari apa yang saya lihat, tidak ada cara untuk membatalkan operasi individu dari dialog, kan?
Rey Leonard Amorato
1
+1 untuk yad; ini paket yang bagus. Ketahuilah bahwa --notificationpada yadtidak akan berfungsi di Ubuntu 13.04 dan yang lebih baru karena bug 1305835 dan bug 1119420 (ikuti tautan dan pilih bug).
Paddy Landau
2
Untuk memiliki kontrol tambahan, Anda perlu melangkah ke GtkDialog yang memungkinkan Anda melakukan hampir semua hal. Namun, ini jauh lebih terlibat. The PuppyLinux masyarakat membuat ekstensif menggunakan itu.
DocSalvager
1
@Glutanimate - Satu catatan singkat untuk menghindari banyak kebingungan: Banyak referensi di forum PuppyLinux merujuk ke "gtkdialog3" dan "gtkdialog4". Ini hanya sinonim yang lebih sederhana untuk versi GtkDialog yang sebenarnya dan bahkan tidak konsisten. Versi 0.8.3 yang Anda raih adalah yang terbaru dan cukup stabil. (Moderator: Tidak ada lagi di GtkDialog di sini. Siapa pun yang tertarik dengan hal itu harus memposting pertanyaan baru.)
DocSalvager
1
@Glutanimate Saya telah menggunakan yadselama beberapa bulan sekarang dan telah sangat terkesan dengan kekuatannya. Namun jawaban Anda di sini benar-benar cemerlang dan tahun-tahun terang di depan bilah kemajuan saya sendiri. Saya akan sangat cepat untuk mengadaptasi wgetkode batang kemajuan Anda ke dalam aplikasi saya sendiri: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix