How to add youtube-dl file download progress percentage to zenity progress bar
sample code (just an example, not a working one)
#!/bin/sh
( progress=$(youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 )
per=$(awk '{print perc}' <<<$progress)
time=$(awk '{print time}' <<<$progress)
file_no=$(awk '{print file_no}' <<<$progress) #only for playlist, example=Downloading video 1 of 4
echo "$per" ; sleep 1
echo "# $file_no \n Time Left: $time" ; sleep 1
) |
zenity --progress \ --title="Download" \ --text="Downloading..." \ --percentage=0
if [ "$?" = -1 ] ; then zenity --error \ --text="Download cancelled."
fii have used this code to get download progress
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 This is the out put
[youtube:playlist] PL1C815DB73EC2678E: Downloading webpage
[download] Downloading playlist: Less than 1 minute
[youtube:playlist] playlist Less than 1 minute: Collected 4 video ids (downloading 4 of them)
[download] Downloading video 1 of 4
[youtube] KNLwsqzFfNg: Downloading webpage
[youtube] KNLwsqzFfNg: Extracting video information
[youtube] KNLwsqzFfNg: Downloading DASH manifest
download] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a
[download] 0.4% of 231.51KiB at 6.10KiB/s ETA 00:30
[download] 1.1% of 231.51KiB at 27.07KiB/s ETA 00:10
[download] 4.0% of 231.51KiB at 19.24KiB/s ETA 00:04
[download] 6.5% of 231.51KiB at 75.06KiB/s ETA 00:03
[download] 13.4% of 231.51KiB at 98.22KiB/s ETA 00:03
[download] 28.7% of 231.51KiB at 81.40KiB/s ETA 00:02
[download] 61.7% of 231.51KiB at 91.56KiB/s ETA 00:01
[download] 86.2% of 231.51KiB at 82.96KiB/s ETA 00:00
[download] 100.0% of 231.51KiB at 73.21KiB/s ETA 00:00
[download] 100% of 231.51KiB in 00:02
[ffmpeg] Correcting container in "_1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a"
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
[avconv] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.mp3
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
Deleting original file _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a (pass -k to keep)
[download] Downloading video 2 of 4
[youtube] wTvXkMpJflk: Downloading webpage
[youtube] wTvXkMpJflk: Extracting video information
[youtube] wTvXkMpJflk: Downloading DASH manifest
etc..
etc..
.
.and i want only
Downloading video 1 of 4 [download] Downloading video 2 of 4as $files_no
FIRST FILE
file_no= Downloading video 1 of 4
per time rate
0.40% 00:30:00 6.10KiB/s
1.10% 00:10:00 27.07KiB/s
4.00% 00:04:00 19.24KiB/s
6.50% 00:03:00 75.06KiB/s
13.40% 00:03:00 98.22KiB/s
28.70% 00:02:00 81.40KiB/s
61.70% 00:01:00 91.56KiB/s
86.20% 00:00:00 82.96KiB/s
100.00% 00:00:00 231.51KiB/sSECOND, THIRD...FILES
As separate variable $file, $per, $time
i know we can use awk but for this complicated output how should i use it. if all parameters are not possible, can at least percentage and file_no be extracted.
1 Answer
Yes, it is possible. You need to
- Make sure that output is unbuffered, that it is printed as soon as it's received. Pipes are buffered by default.
- Parse the downloader's output so that only the percentages are printed;
- Parse the output so that the file number is printed with a
#at the beginning of the line. Zenity will automatically update the text of its dialog with lines starting with#.
Combining the above, and implementing a little regex magic, we get:
#!/bin/bash
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \ | grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' | zenity --progress \ --title="Download" \ --text="Downloading..." \ --percentage=0 Explanation
The --line-buffered option makes grep print its output immediately, turning off the default buffering. The -o makes it print only the matched portion of the line and the -P turns on Perl Compatible Regular Expressions.
The regex is a little complex, so let's break it down:
^\[download\]: matches lines that start with[download]..*?: 0 or more characters, but the?makes it stop at the shortest possible match.\K: this is basically a lookbehind, it means "ignore anything matched so far".(...|...): the|means OR. Therefore,(A|B)wil match either A or B.[0-9.]+\%: 1 or more numbers or.followed by a%. This prints the percentage.#\d+ of \d: a#followed by one or more digits,ofand then one or more digits again. This matches the "Video X of Y" line.
Taken together, that grep command will print:
#1 of 4
0.1%
0.3%
0.8%
1.7%
3.4%
7.0%
14.0%
28.2%
56.5%
99.5%
100.0%
100%
#2 of 4
0.1%
0.3%
0.8%
1.6%
3.4%
6.9%
13.9%
27.8%
55.8%
[...]etc, and that's precisely the output that zenity needs. Finally, you can make the whole thing more useful by implementing the ability to specify multiple URLs from the command line:
#!/bin/bash
for url in "$@"
do youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \ | grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' | zenity --progress \ --title="Download" \ --text="Downloading..." \ --percentage=0
doneThen, you can call your script like this:
myscript.sh "" "" " 6