progresso do download do arquivo youtube-dl com a barra de progresso do zenity

3

Como adicionar a porcentagem de progresso do download do arquivo youtube-dl à barra de progresso do zenity

exemplo de código (apenas um exemplo, não um em funcionamento)

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

eu usei este código para obter o progresso do download

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

Esta é a saída

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

e eu quero apenas

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

como $ files_no

PRIMEIRO ARQUIVO

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

SEGUNDO, TERCEIRO ... ARQUIVOS

Como variável separada $ file, $ per, $ time Eu sei que podemos usar awk , mas para esta saída complicada, como devo usá-lo. se todos os parâmetros não forem possíveis, pelo menos porcentagem e file_no podem ser extraídos.

    
por potholiday 12.06.2015 / 12:36

1 resposta

3

Sim, é possível. Você precisa

  1. Verifique se a saída está sem buffer e se é impressa assim que é recebida. Pipes são armazenados em buffer por padrão.
  2. Analise a saída do download de modo que apenas as porcentagens sejam impressas;
  3. Analise a saída para que o número do arquivo seja impresso com um # no início da linha. O Zenity atualizará automaticamente o texto de sua caixa de diálogo com linhas começando com # .

Combinando o acima e implementando um pouco de mágica regex, obtemos:

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

Explicação

A opção --line-buffered faz com que grep imprima sua saída imediatamente, desativando o buffer padrão. O -o faz com que ele imprima apenas a parte correspondente da linha e o -P ativa as Expressões regulares compatíveis com Perl.

O regex é um pouco complexo, então vamos dividi-lo:

  • ^\[download\] : corresponde a linhas que começam com [download] .
  • .*? : 0 ou mais caracteres, mas o ? faz com que pare na correspondência mais curta possível.
  • \K : basicamente é um lookbehind , significa "ignorar tudo que foi combinado até agora".
  • (...|...) : o | significa OR. Portanto, (A|B) corresponderá a A ou B.
  • [0-9.]+\% : 1 ou mais números ou . seguidos por % . Isso imprime a porcentagem.
  • #\d+ of \d : a # seguido por um ou mais dígitos, of e, em seguida, um ou mais dígitos novamente. Isso corresponde à linha "Vídeo X de Y".

Juntos, esse comando grep será impresso:

#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, e essa é precisamente a saída que o zenity precisa. Finalmente, você pode tornar a coisa toda mais útil implementando a capacidade de especificar várias URLs na linha de comando:

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

Depois, você pode chamar seu script assim:

myscript.sh "http://url1.com" "http://url2.com" "http://urlN.com
    
por terdon 12.06.2015 / 21:23