Як я можу створити графічний інтерфейс Wget з кількома смужками прогресу?


21

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

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

Діалогове вікно передачі файлів Ubuntu

Хто-небудь може вказати мені на правильний напрямок щодо програми (програм) чи мови (-ів), які досягнуть цього.

ПРИМІТКА: Я маю лише базові знання про сценарій оболонок, не багато іншого.


Ви пробували axel-kapt? sudo apt-get install axel-kapt

Баунті досить близько до свого кінця. Будь ласка, не забудьте призначити його, якщо ви відчуваєте задоволення моєю відповіддю.
Глутанімація

Без проблем, чоловіче. Успіхів у вашому сценарії!
Глутанімат

Відповіді:


28

Рішення за допомогою YAD


Огляд

Зеніт не оновлювався досить давно. На щастя, є вилка під назвою YAD з великою кількістю додаткових функцій. Він ще не прибув до офіційних сховищ, але ви можете встановити його з веб-сайту PPA:

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

Ось як виглядав би результат:

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


Описи до барів можна додати за допомогою #:

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

Мені здався цей проект досить цікавим, тому я сів і склав сценарій, який повинен робити все вищезазначене.


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":

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


Це дуже вичерпний і цікавий пост, і мені подобається те, що я бачу поки що. Дякуємо, що знайшли час познайомитися з цим моїм маленьким проектом. :) Q1: Що відбувається з панеллю прогресу готових файлів? Чи залишаються вони в діалозі, поки все інше не буде зроблено? Q2: З того, що я бачу, немає способу скасувати окремі операції з діалогового вікна, чи є?
Рей Леонард Аморато

1
+1 для yad; це чудовий пакет. Майте на увазі, що --notificationна yadUbuntu 13.04 та пізніших версіях не працюватиме через помилки 1305835 та помилку 1119420 (будь ласка, перейдіть за посиланнями та голосуйте за помилки).
Падді Ландау

2
Щоб мати додатковий контроль, вам потрібно буде перейти до GtkDialog, який дозволяє вам робити майже все. Однак це значно більше. PuppyLinux співтовариство широко використовує його.
DocSalvager

1
@Glutanimate - Одне коротке зауваження, щоб уникнути великої плутанини: Багато посилань на форумах PuppyLinux відносяться до "gtkdialog3" та "gtkdialog4". Це просто простіші синоніми реальних версій GtkDialog, і вони навіть не є послідовними. Версія 0.8.3, яку ви схопили, є останньою і досить стабільною. (Модератори: Більше про GtkDialog тут немає. Кожен, хто її зацікавив, повинен
надсилати

1
@Glutanimate, яким я користуюсь yadвже кілька місяців, був дуже вражений його потужністю. Ваша відповідь тут, проте, абсолютно блискуча і світла років попереду моїх власних барів прогресу. Я буду дуже швидко адаптувати свій wgetштрих - код в ході мого програми: askubuntu.com/questions/900319 / ... .
WinEunuuchs2Unix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.