файл youtube-dl загружает прогресс zenity индикатором выполнения

Как добавить, что файл youtube-dl загружает процент прогресса на zenity индикатор выполнения

пример кода (просто пример, не рабочий)

#!/bin/sh
(
   progress=$(youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E)
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."
fi

я использовал этот код получить прогресс загрузки

youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E

Это помещено

[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..
.
.

и я хочу только

Downloading video 1 of 4 [download] Downloading video 2 of 4

как $files_no

ПЕРВЫЙ ФАЙЛ

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/s

ВО-ВТОРЫХ, ТРЕТЬ... ФАЙЛЫ

Как $file отдельной переменной, $per, $time я знаю, что мы можем использовать awk но для этого сложного вывода, как я должен использовать его. если все параметры не возможны, может, по крайней мере, процент и file_no извлечены.

4
задан 17 June 2015 в 01:17

1 ответ

Да, это возможно. Вы должны

  1. Удостоверьтесь, что производит, освобожден буфер, что это печатается, как только это получено. Каналы буферизуются по умолчанию.
  2. Проанализируйте вывод загрузчика так, чтобы только проценты были распечатаны;
  3. Проанализируйте вывод так, чтобы номер документа был распечатан с a # в начале строки. Zenity автоматически обновит текст своего диалогового окна со строками, запускающимися с #.

Комбинируя вышеупомянутое, и реализовывая немного regex волшебства, мы добираемся:

#!/bin/bash
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \
           https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | 
 grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' |
    zenity --progress \
  --title="Download" \
  --text="Downloading..." \
  --percentage=0 

Объяснение

--line-buffered опция делает grep распечатайте его вывод сразу, выключив буферизацию по умолчанию. -o заставляет его распечатать только подобранную часть строки и -P включает Perl Совместимые Регулярные выражения.

regex является небольшим комплексом, поэтому давайте сломаем его:

  • ^\[download\] : строки соответствий, которые запускаются с [download].
  • .*? : 0 или больше символов, но ? заставляет его остановиться в самом коротком соответствии.
  • \K : это - в основном lookbehind, это означает, "игнорируют что-либо подобранное до сих пор".
  • (...|...) : | средства ИЛИ. Поэтому (A|B) wil соответствуют или A или B.
  • [0-9.]+\% : 1 или более чисел или . сопровождаемый a %. Это печатает процент.
  • #\d+ of \d : a # сопровождаемый одной или несколькими цифрами, of и затем одна или несколько цифр снова. Это соответствует "Видео X из Y" строка.

Взятый вместе, это grep команда распечатает:

#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%
[...]

и т.д., и это - точно вывод это zenity потребности. Наконец, можно сделать все это более полезным путем реализации способности указать несколько URL из командной строки:

#!/bin/bash
for url in "$@"
do
  youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \
           https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | 
   grep --line-buffered -oP '^\[download\].*?\K([0-9.]+\%|#\d+ of \d)' |
    zenity --progress \
  --title="Download" \
  --text="Downloading..." \
  --percentage=0 
done

Затем можно назвать сценарий как это:

myscript.sh "http://url1.com" "http://url2.com" "http://urlN.com
5
ответ дан 17 June 2015 в 01:17

Другие вопросы по тегам:

Похожие вопросы: