Làm cách nào tôi có thể tạo GUI wget với nhiều thanh tiến trình?


21

Tôi đang viết tập lệnh của riêng mình để tải xuống nhiều mục (đồng thời, một mục cho mỗi lệnh) bằng cách sử dụng wgetvà tôi cần một thanh tiến trình. Tôi hiện đang sử dụng zenity --progresscho các thanh tiến trình của mình, nhưng vấn đề là nó sinh ra nhiều thanh tiến trình khi tải xuống.

Những gì tôi muốn đạt được là một cái gì đó tương tự như hộp thoại chuyển tập tin trong Nautilus:

Hộp thoại chuyển tập tin của Ubuntu

Bất cứ ai cũng có thể chỉ cho tôi đi đúng hướng về chương trình hoặc ngôn ngữ nào sẽ đạt được điều này.

LƯU Ý: Tôi chỉ có kiến ​​thức cơ bản về kịch bản shell, không nhiều.


Bạn đã thử axel-kaptchưa sudo apt-get install axel-kapt

Tiền thưởng là khá gần với kết thúc của nó. Xin đừng quên gán nó, nếu bạn cảm thấy hài lòng với câu trả lời của tôi.
Glutimate

Không có gì. Tốt nhất của may mắn với kịch bản của bạn!
Glutimate

Câu trả lời:


28

Giải pháp sử dụng YAD


Tổng quan

Zenity đã không được cập nhật trong một thời gian dài. May mắn thay, có một ngã ba gọi là YAD với rất nhiều tính năng được thêm vào. Nó chưa đến kho chính thức, nhưng bạn có thể cài đặt nó từ PPA webupd8:

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

Một trong những tính năng được thêm vào YAD là hộp thoại nhiều thanh tiến trình. Đây là một đoạn trích từ hướng dẫn của YAD liên quan đến nhiều thanh tiến trình:

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.

Vì vậy, một tập lệnh rất đơn giản với nhiều thanh tiến trình có thể trông như thế này:

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

Đây là kết quả sẽ như thế nào:

kịch bản đa tiến trình yad đơn giản


Chúng tôi có thể thêm mô tả vào các thanh với #:

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

Kết quả:

nhập mô tả hình ảnh ở đây


Nếu chúng tôi muốn thực hiện điều này trong một kịch bản tải xuống wget, chúng tôi sẽ phải làm một số điều trước tiên:

  • tìm cách trích xuất tiến trình tải xuống và dữ liệu thú vị khác ra khỏi đầu ra wget
  • tìm cách lặp lại qua nhiều tập tin
  • tìm cách chuyển tất cả thông tin chúng ta có vào một hộp thoại yad

Tôi thấy dự án này khá thú vị nên tôi ngồi xuống và soạn một kịch bản nên làm tất cả những điều trên.


yad_wget

Đây là những gì tôi nghĩ ra:

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

Và đây là những gì nó trông giống như:

nhập mô tả hình ảnh ở đây

           nhập mô tả hình ảnh ở đây

Hãy chắc chắn đọc qua tất cả các ý kiến ​​để tìm hiểu làm thế nào kịch bản hoạt động và nếu bạn có bất kỳ câu hỏi nào xin vui lòng hỏi trong các ý kiến ​​dưới đây.


Chỉnh sửa:

Tôi đã thêm hỗ trợ để thiết lập số lượng tải xuống đồng thời tối đa. Ví dụ MAXDLS="5":

nhập mô tả hình ảnh ở đây


Đây là một bài viết rất toàn diện và thú vị, và tôi thích những gì tôi thấy cho đến nay. Cảm ơn đã dành thời gian để tinker với dự án nhỏ này của tôi. :) Q1: Điều gì xảy ra với thanh tiến trình của các tập tin đã hoàn thành? Họ có ở lại trên hộp thoại cho đến khi mọi thứ khác được thực hiện? Câu 2: Từ những gì tôi đang thấy, không có cách nào để hủy các hoạt động riêng lẻ khỏi hộp thoại, phải không?
Rey Leonard Amorato

1
+1 cho yad; đó là một gói tuyệt vời. Xin lưu ý rằng --notificationtrên yadsẽ không hoạt động trên Ubuntu 13.04 trở lên vì lỗi 1305835lỗi 1119420 (vui lòng theo các liên kết và bỏ phiếu cho các lỗi).
Paddy Landau

2
Để có các điều khiển bổ sung, bạn sẽ cần phải bước lên GtkDialog , cho phép bạn thực hiện khá nhiều thứ. Tuy nhiên, nó liên quan nhiều hơn. Các Puppylinux cộng đồng làm cho sử dụng rộng rãi của nó.
DocSalvager

1
@Glutanimate - Một lưu ý ngắn gọn để tránh nhiều nhầm lẫn: Nhiều tài liệu tham khảo trên diễn đàn PuppyLinux đề cập đến "gtkdialog3" và "gtkdialog4". Đây chỉ là những từ đồng nghĩa đơn giản hơn cho các phiên bản GtkDialog thực sự và chúng thậm chí không nhất quán. Phiên bản 0.8.3 mà bạn lấy là phiên bản mới nhất và khá ổn định. (Người điều hành: Không còn nữa trên GtkDialog tại đây. Bất kỳ ai quan tâm đến nó nên vui lòng gửi câu hỏi mới.)
DocSalvager

1
@Glutanimate Tôi đã sử dụng yadmột vài tháng nay và đã rất ấn tượng với sức mạnh của nó. Câu trả lời của bạn ở đây là hoàn toàn rực rỡ và nhiều năm trước các thanh tiến bộ của riêng tôi. Tôi sẽ rất nhanh chóng để điều chỉnh wgetmã vạch tiến trình của bạn vào ứng dụng của riêng tôi: askubfox.com/questions/900319/ mẹo .
WinEunuuchs2Unix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.