Como criar um "Progress Bar" usando o kdialog [RESOLVIDO]

1. Como criar um "Progress Bar" usando o kdialog [RESOLVIDO]

Thiago
tglima

(usa Manjaro Linux)

Enviado em 23/02/2016 - 12:30h

Olá pessoal.
Estou desenvolvendo um pequeno script para me ajudar na tarefa de conversão de vídeos com o mencoder. Gostaria de mostrar um "progress bar" indicando em quantos % a tarefa se encontra. Fiz algumas pesquisas, mas não consegui aplicar a lógica para que ele funcionasse.
Meu script é esse:

#!/bin/bash
mencoder "$file" -o "$output_file" -vf scale="$resolution" -af channels=2 -ofps "$frames_por_segundo" -srate "$txaudio" -oac mp3lame -lameopts cbr:br=128:mode="$modeaudio" -ovc xvid -ffourcc XVID -xvidencopts bitrate="$txbitrate":vhq=2:threads=1:aspect="$aspectratio" -mc 3

Gostaria de usar algo simples, como o Kdialog, já que uso o KDE. Desde já agradeço a ajuda.


  


2. Re: Como criar um "Progress Bar" usando o kdialog [RESOLVIDO]

Ricardo Fabiano Silva
madrugada

(usa Gentoo)

Enviado em 23/02/2016 - 13:00h

Essa não é a minha praia, mas essa documentação do kde deve te ajudar:
https://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs

Estando na página, procure(Ctrl+F) por "progress bar'.
Boa sorte!


3. Re: Como criar um "Progress Bar" usando o kdialog [RESOLVIDO]

Thiago
tglima

(usa Manjaro Linux)

Enviado em 23/02/2016 - 15:48h

Agradeço a ajuda madrugada. Parece que terei que entender primeiro como funciona o Dbus para dai usar o progress bar.

Caso alguém tenha alguma outra dica, pode enviar.


4. Re: Como criar um

Thiago
tglima

(usa Manjaro Linux)

Enviado em 26/02/2016 - 16:55h

Depois de quase 3 dias batendo cabeça, consegui resolver a minha dúvida. Como acredito que a solução que encontrei pode ser válida para outras inúmeras situações, vou postar o código completo. Depois tento explicar um pouco dessa bagunça que fiz.
#!/bin/bash
# Essas linhas abaixo são responsáveis pela obtenção da data e hora que serão gravados no log.
hoje=⁠⁠⁠⁠⁠⁠$(date +"%d-%m-%y");
horario=$(date +"%H:%M:%S");

# Linhas responsáveis pela criação do log. Elas copiam toda a saída do terminal
# e registram num arquivo de texto especifico.
LOGFILE=convert4xvid.$hoje.txt
exec 1> >(tee -a "$LOGFILE")
#As linhas abaixo gravaram também as saídas com ERROS
exec 2>&1

#A linha abaixo, registra o horário que o processo foi iniciado dentro do arquivo de log.
echo -e "Processo iniciado as: $horario \n" >> $LOGFILE &&

barradeprogresso() {
#Abrimos o kdialg com a função progressbar depois de dois segundos
sleep 2;
barra=$(kdialog --title "Conversão em andamento" --progressbar "Processo de conversão iniciado" 100);

# Carregamos a variavel porc com o valor obtido no log do arquivo.
# São aplicados filtros para que ele busque os valores responsáveis pela porcentagem da conversão.
porc=(`cat $LOGFILE |grep %|cut -c22-24|tr -d ‘%‘|tail -n 1`);

# A rotina de repetição abaixo, verifica a cada 1 segundo o status da conversão
# apos verificar o status ela envia esse resultado para o Kdialog através do qdbus.
# Quando o status da conversão chegar em 100% o ciclo de verificação para.
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done

# Como a conversão chegou em 100% a linha abaixo encerra o Kdialog
qdbus $barra close > /dev/null;
}

mencoder "$file" -o "$output_file" -vf scale="$resolution" -af channels=2 -ofps "$frames_por_segundo" -srate "$txaudio" -oac mp3lame -lameopts cbr:br=128:mode="$modeaudio" -ovc xvid -ffourcc XVID -xvidencopts bitrate="$txbitrate":vhq=2:threads=1:aspect="$aspectratio" -mc 3 >> $LOGFILE & barradeprogresso;


#Essa linha abaixo, registra o horário em que processo terminou.
echo "Conclusão do processo as: $horario" >> $LOGFILE
exit 0

Agora vamos para uma breve explicação de como consegui chegar ao resultado esperado.

Criei uma maneira de gerar um log em tempo real das saídas mostradas pelo mencoder, para isso usei essa parte do código:
hoje=⁠⁠⁠⁠⁠⁠$(date +"%d-%m-%y");
horario=$(date +"%H:%M:%S");
LOGFILE=convert4xvid.$hoje.txt
exec 1> >(tee -a "$LOGFILE")
exec 2>&1

Durante a conversão, o mencoder vai exibindo o status da conversão desse modo:
Pos:   0.1s      1f ( 1%)  0.00fps Trem:   0min   1mb  A-V:0.000 [0:0] 

Para que a barra de progresso exibisse o valor que me interessava, criei um filtro com a ajuda do grep, do cut, e do tr. O Comando abaixo acessa o log gerado e busca na última linha correspondente a informação que eu precisava.
cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1 

Depois com a ajuda de um laço de repetição, fiz com que a cada 1 segundo fosse verificado o status da conversão e fosse passado para o kdialog através do qdbus. As linhas responsáveis por isso são essas abaixo:
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done


O laço de repetição funcionará até o status da conversão chegar em 100. Depois como a conversão chegou em 100%, envio um sinal para encerrar o kdialog.
qdbus $barra close > /dev/null; 


Inicialmente tive que criar 2 scripts, um fazia a conversão do arquivo e outro carregava as informações para o kdialog. Resolvi isso criando uma função e colocando todos os parâmetros referentes ao Kdialog dentro dele, chamei essa função de "barradeprogresso". Veja abaixo o código referente a função:
barradeprogresso() {

#Abrimos o kdialg com a função progressbar depois de dois segundos
sleep 2;
barra=$(kdialog --title "Conversão em andamento" --progressbar "Processo de conversão iniciado" 100);

# Carregamos a variavel porc com o valor obtido no log do arquivo.
# São aplicados filtros para que ele busque os valores responsáveis pela porcentagem da conversão.
porc=(`cat $LOGFILE |grep %|cut -c22-24|tr -d ‘%‘|tail -n 1`);

# A rotina de repetição abaixo, verifica a cada 1 segundo o status da conversão
# apos verificar o status ela envia esse resultado para o Kdialog através do qdbus.
# Quando o status da conversão chegar em 100% o ciclo de verificação para.
while [ $porc != 100 ];
do
sleep 1;
porc=(`cat $LOGFILE |grep % |cut -c22-24|tr -d ‘%‘|tail -n 1`);
qdbus $barra Set "" value $porc > /dev/null;
done

# Como a conversão chegou em 100% a linha abaixo encerra o Kdialog
qdbus $barra close > /dev/null;
}


Agora bastava carregar o mencoder e seus parâmetros + a função barradeprogresso simultaneamente.
mencoder "$file" -o "$output_file" -vf scale="$resolution" -af channels=2 -ofps "$frames_por_segundo" -srate "$txaudio" -oac mp3lame -lameopts cbr:br=128:mode="$modeaudio" -ovc xvid -ffourcc XVID -xvidencopts bitrate="$txbitrate":vhq=2:threads=1:aspect="$aspectratio" -mc 3 >> $LOGFILE & barradeprogresso; 


Para terminar com chave de ouro, registro o horário final do processo dentro do log e encerro tudo com o status 0
#Essa linha abaixo, registra o horário em que processo terminou.
echo "Conclusão do processo as: $horario" >> $LOGFILE
exit 0


Sei que o script pode ser melhorado, mas fiquei muito feliz de ver ele funcionando da forma como eu queria.

Agradeço ao madrugada pela força. Mesmo tendo que pesquisar em muitos outros lugares depois, ele dedicou 5 minutos para tentar me ajudar. Valeu mesmo! :)



5. Re: Como criar um "Progress Bar" usando o kdialog [RESOLVIDO]

Ricardo Fabiano Silva
madrugada

(usa Gentoo)

Enviado em 27/02/2016 - 14:08h

Disponha!
Aliás, a solução daria um belo artigo, inclusive com o mesmo título do tópico.
Parabéns pela solução, é assim que se evolui.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts