ฉันจะสร้าง wget GUI ด้วยแถบความคืบหน้าหลายแห่งได้อย่างไร


21

ฉันกำลังเขียนสคริปต์ของตัวเองเพื่อดาวน์โหลดหลายรายการ (พร้อมกันหนึ่งรายการต่อคำสั่ง) โดยใช้wgetและฉันต้องการแถบความคืบหน้า ขณะนี้ฉันใช้zenity --progressแถบความคืบหน้าของฉัน แต่ปัญหาคือมันเกิดแถบความคืบหน้าหลายแถบเมื่อดาวน์โหลด

สิ่งที่ฉันต้องการบรรลุคือสิ่งที่คล้ายกับกล่องโต้ตอบการถ่ายโอนไฟล์ใน Nautilus:

กล่องโต้ตอบการถ่ายโอนไฟล์ของ Ubuntu

ใครสามารถชี้ให้ฉันไปในทิศทางที่ถูกต้องว่าโปรแกรมหรือภาษาใดที่จะบรรลุเป้าหมายนี้

หมายเหตุ: ฉันมีความรู้พื้นฐานเกี่ยวกับการเขียนสคริปต์เชลล์ไม่มากนัก


คุณเคยลองaxel-kaptไหม sudo apt-get install axel-kapt

ค่าหัวค่อนข้างใกล้เคียงกับจุดจบของมัน โปรดอย่าลืมกำหนดถ้าคุณรู้สึกพึงพอใจกับคำตอบของฉัน
Glutanimate

ไม่มีปัญหามนุษย์ ขอให้โชคดีกับสคริปต์ของคุณ!
Glutanimate

คำตอบ:


28

วิธีแก้ปัญหาโดยใช้ YAD


ภาพรวม

Zenity ยังไม่ได้รับการปรับปรุงในขณะที่ โชคดีที่มีส้อมที่เรียกว่าYADพร้อมคุณสมบัติเพิ่มเติมมากมาย มันยังไม่มาถึงที่เก็บอย่างเป็นทางการ แต่คุณสามารถติดตั้งได้จาก webupd8 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 ง่าย


เราสามารถเพิ่มคำอธิบายลงในบาร์ด้วย#:

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: จากสิ่งที่ฉันเห็นไม่มีวิธีที่จะยกเลิกการดำเนินงานส่วนบุคคลจากกล่องโต้ตอบจะมีหรือไม่
Rey Leonard Amorato

1
+1 สำหรับyad; มันเป็นแพ็คเกจที่ยอดเยี่ยม โปรดทราบว่า--notificationในวันที่yadจะไม่ทำงานบน Ubuntu 13.04 และต่อมาเนื่องจากข้อผิดพลาด 1305835และข้อผิดพลาดที่ 1119420 (โปรดทำตามการเชื่อมโยงและการลงคะแนนสำหรับข้อบกพร่อง)
Paddy Landau

2
หากต้องการมีการควบคุมเพิ่มเติมคุณจะต้องก้าวไปถึงGtkDialogซึ่งจะช่วยให้คุณทำอะไรได้มาก อย่างไรก็ตามมีส่วนร่วมมากขึ้น PuppyLinuxชุมชนทำให้การใช้งานที่กว้างขวางของมัน
DocSalvager

1
@Glutanimate - บันทึกย่อสั้น ๆ เพื่อหลีกเลี่ยงความสับสน: การอ้างอิงจำนวนมากในฟอรัม PuppyLinux อ้างถึง "gtkdialog3" และ "gtkdialog4" สิ่งเหล่านี้เป็นคำพ้องความหมายที่ง่ายขึ้นสำหรับ GtkDialog เวอร์ชันจริงและไม่สอดคล้องกัน เวอร์ชั่น 0.8.3 ที่คุณคว้ามานั้นเป็นเวอร์ชั่นล่าสุดและค่อนข้างเสถียร (ผู้ดำเนินรายการ: ไม่มี GtkDialog ที่นี่อีกแล้วใครที่สนใจควรจะโพสต์คำถามใหม่)
DocSalvager

1
@ Glutanimate ฉันใช้yadไปสองสามเดือนแล้วและประทับใจในพลังของมันมาก คำตอบของคุณที่นี่เป็นเวลาที่ยอดเยี่ยมและสว่างไสวกว่าแถบความก้าวหน้าของฉัน ฉันจะรวดเร็วมากในการปรับตัวของคุณwgetบาร์โค้ดความคืบหน้าใน app ของตัวเอง: askubuntu.com/questions/900319/...
WinEunuuchs2Unix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.