Sim, é possível. Você precisa
- Verifique se a saída está sem buffer e se é impressa assim que é recebida. Pipes são armazenados em buffer por padrão.
- Analise a saída do download de modo que apenas as porcentagens sejam impressas;
- 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