Как создать графический интерфейс wget с несколькими индикаторами выполнения?

21

Я пишу свой собственный скрипт для загрузки нескольких элементов (одновременно, по одному элементу на команду) с использованием wgetи мне нужен индикатор выполнения. В настоящее время я использую его zenity --progressдля индикаторов выполнения, но проблема в том, что при загрузке он создает несколько индикаторов.

Я хочу добиться чего-то похожего на диалог передачи файлов в Nautilus:

Диалог передачи файлов в Ubuntu

Может ли кто-нибудь указать мне правильное направление относительно того, какие программы или язык (ы), которые будут достигать этого.

ПРИМЕЧАНИЕ. У меня есть только базовые знания по написанию сценариев оболочки, но не более того.

Рей Леонард Аморато
источник
Ты пробовал axel-kapt? sudo apt-get install axel-kapt
Щедрость довольно близка к концу. Пожалуйста, не забудьте назначить его, если вы удовлетворены моим ответом.
Glutanimate
Нет проблем, чувак. Желаем удачи в вашем сценарии!
Glutanimate

Ответы:

28

Решение с использованием YAD


обзор

Zenity давно не обновлялся. К счастью, есть вилка под названием YAD с множеством дополнительных функций. Он еще не прибыл в официальные репозитории, но вы можете установить его из PPA webupd8:

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

Одной из функций, добавленных в YAD, является диалоговое окно с несколькими индикаторами выполнения. Вот выдержка из руководства YAD относительно нескольких индикаторов выполнения:

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.

Так что очень простой скрипт с несколькими индикаторами выполнения может выглядеть так:

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

Вот как будет выглядеть результат:

простой сценарий прогресса


Мы можем добавить описания к барам с #:

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

Результат:

введите описание изображения здесь


Если мы хотим реализовать это в скрипте загрузки wget, нам нужно сначала сделать несколько вещей:

  • найти способ извлечь ход загрузки и другие интересные данные из вывода wget
  • найти способ перебрать несколько файлов
  • найти способ передать всю информацию, которую мы имеем, в один диалог Яд

Я нашел этот проект довольно интересным, поэтому я сел и составил сценарий, который должен выполнять все вышеперечисленное.


yad_wget

Вот что я придумал:

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

И вот как это выглядит:

введите описание изображения здесь

           введите описание изображения здесь

Обязательно прочитайте все комментарии, чтобы узнать, как работает скрипт, и, если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать в комментариях ниже.


Редактировать:

Я добавил поддержку для установки максимального количества одновременных загрузок. Например, для MAXDLS="5":

введите описание изображения здесь

Glutanimate
источник
Это очень всеобъемлющий и интересный пост, и мне нравится то, что я вижу до сих пор. Спасибо, что нашли время, чтобы возиться с этим маленьким моим проектом. :) Q1: Что происходит с индикатором выполнения завершенных файлов? Они остаются в диалоге, пока все остальное не будет сделано? Q2: Из того, что я вижу, нет способа отменить отдельные операции из диалогового окна, не так ли?
Рей Леонард Аморато
1
+1 за yad; это отличный пакет. Имейте в виду, что --notificationon yadне будет работать в Ubuntu 13.04 и более поздних версиях из-за ошибки 1305835 и 1119420 (следуйте по ссылкам и проголосуйте за ошибки).
Пэдди Ландау
2
Чтобы иметь дополнительные элементы управления, вам нужно перейти на GtkDialog, который позволяет вам делать практически все что угодно. Тем не менее, это намного сложнее. PuppyLinux сообщество широко использует его.
DocSalvager
1
@Glutanimate - одно краткое замечание, чтобы избежать путаницы: многие ссылки на форумах PuppyLinux ссылаются на «gtkdialog3» и «gtkdialog4». Это просто более простые синонимы для реальных версий GtkDialog, и они даже не согласованы. Версия 0.8.3, которую вы взяли, является последней и довольно стабильной. (Модераторы: здесь больше нет информации о GtkDialog. Всем, кто заинтересован в этом, следует публиковать новые вопросы.)
DocSalvager
1
@Glutanimate, которым я пользуюсь yadуже несколько месяцев, и был впечатлен его силой. Ваш ответ здесь, однако, абсолютно блестящий и светлые годы впереди моих собственных индикаторов прогресса. Я очень быстро адаптирую ваш wgetиндикатор выполнения в свое собственное приложение: askubuntu.com/questions/900319/… .
WinEunuuchs2Unix