dbus, zenity e kdialog

Iniciado por vampire_thunder, 05 de Maio de 2011, 14:43

tópico anterior - próximo tópico

Kriptolix

certo, venho lendo esse topico por que ha tempos ando procurando coisas sobre o d-bus, mas ate agora nao ache nada simples que desse pra entender. o que pude compreender desse script indica que o qdbus é usado para enviar progresso do mencoder para o dbus, de onde ele é lido pelo kdialog. Com certeza deve ser possivel fazer o mesmo com o zenity mas é complicado, tem que entender de d-bus.

acho que o primeiro passo é ver que tipo de saida o mencoder da quando esta convertendo, ele da alguma saida? se der vamos analiza-la e ver como poderiamos usar pra abastecer o zenity, talvez seja possivel fazer isso wsem necessidade de mexer no d-bus, tudo vai depender de que tipo de saida o mencoder da, se ele desse uma percentagem seria facilimo, se ele nao der nenhuma ae complica, so atraves de d-bus mesmo.
Ubuntu Linux 10.10

vampire_thunder

O mencoder dá porcentagem, sim. Veja o print do terminal no meu terceiro post.

Kriptolix

certo, é que aqui nao apareceu a imgem no forum, so quando cliquei em cima. sendo assim fica facil, basta pegar a saida padrao do mencoder, fazer um pipe rederecionando ela para um sed feito pra pegar so a percentagem, depois disso voce faz outro pipe jogando o resultado desse sed para o progress do zenity.

so testando pra ver, talvez possa ser feito assim direto "comando-do-mencoder | sed pra pegar a percentagem | zenity --progres ...etc", caso nao de certo assim direto é possivel tambem redirecionar a saida do mencoder para um arquivo dando um "tail -f" nesse arquivo e redirecionar o resultado do tail com um pipe para o progress do zenity.

eu ja fiz isso antes de ambas as formas, tou sem tempo de trabalhar nesse script diretamente agora mas creio que isso resolvera.

Ubuntu Linux 10.10

vampire_thunder

O problema é que eu n tenho a mínima ideia de como se faz isso  :-\

Eu pensei em algo do tipo cut "parâmetro" para sumir com tudo q não é a porcentagem e jogar isso para o --percentage do zenity.

vampire_thunder

#19
Encontrei uma informação que pode ajudar:

Citar
A opção --pulsate é útil aqui porque só estou dizendo "agüente aí que estou trabalhando". Não tenho nenhuma porcentagem real a oferecer, então essa opção faz a barra de progresso se mover de uma lado para o outro, que nem a luz no capô da Super Máquina. Se precisar exibir informações quanto ao nível de progresso, "ecoe" as porcentagens para o zenity:
( for FILE in find $START_DIR --name $FILE_NAME;
do
echo 1;
echo $FILE >> $OUTPUT_FILE;
done
echo 100;
echo "#Todos os arquivos estão listados em $OUTPUT_FILE"
) | zenity --progress --percentage=0 --text "Procurando arquivos..." --title "Encontrar e listar arquivos";

http://www.hardware.com.br/artigos/zenity2/

Edit: agora está quente!

Este comando joga a saída do mencoder para um log (comando do script original):
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &

Este lê a linha onde tem a porcentagem e joga em outro log:
cat /tmp/mencoder-log$$ | sed '$!d' /tmp/mencoder-log$$ |  grep Pos  > /tmp/mencoder-percent$$ 2> /dev/null

E este lê o log da porcentagem e mostra apenas o valor numérico:
cat /tmp/mencoder-percent$$ | sed '$!d;s/.*(//; s/%.*//'

Agora só faltam duas coisas: passar essa saída para a porcentagem do zenity e garantir que esses logs sejam atualizados (loop).

vampire_thunder

Na comunidade do Ubuntu no Orkut me deram a dica do seletor de arquivos:
$ zenity --file-selection --multiple | tr '|' '\n'
ou
$ zenity --file-selection --multiple --separator='
> '


Já a da barra de progresso... empaquei

vampire_thunder

Progresso, progresso...

Quase não dormi ontem. Fiquei direto tentando resolver essa questão da barra. Consegui deixar ela finalmente 90%.
Vou postar tudo do jeito que está. Assim vocês podem me apontar o que está faltando para ficar 100%:


#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &

IFS=$ORI_IFS

#Aguarda 4 segundos para assegurar que o log ja foi criado
sleep 4

# Cria o log da porcentagem
while [ -n "`pidof mencoder`" ] ; do
     cat /tmp/mencoder-log$$ |  grep Pos | sed '$!d;s/.*(//; s/%.*//' > /tmp/mencoder-percent$$ # 2> /dev/null
done &

# Lê a porcentagem e joga para a barra
while [ -e "/tmp/mencoder-log$$" ] ; do
(
echo "00"; sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo "100"
) |
zenity --progress --title "Mencoder" --auto-close --text "Convertendo, aguarde por favor. \n $i \n $(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)"; done

 #Remove o arquivo de log
rm -f /tmp/mencoder-log$$
rm -f /tmp/mencoder-percent$$

 IFS=$'\n'
fi
done
IFS=$ORI_IFS


Do jeito que está, a barra vai enchendo até um certo ponto, depois o zenity fecha sozinho e abre aonde parou. Acho que se eu colocar 100 linhas "echo $(cat /tmp/mencoder-percent$$)", ele vai até o fim, mas penso que deve haver algo mais simples.

Dois problemas: o botão de cancelar não cancelou o processo e o zenity não fechou depois que a conversão terminou, pois o log não foi deletado. Tentei colocar um "&" depois do done, na linha do zenity, mas com isso o log foi deletado logo de cara.

Print:


PS: o vídeo "cobaia" foi o do galactus, rsrsrs.

vampire_thunder

#22
Na comunidade do Orkut, um camarada me passou uma que funciona. Só que o botão de cancelar não está funcionando. Acredito que um "if alguma coisa" antes dos parâmetros da conversão (no original tinha um) e um elif ou else, não sei, para o cancelamento, o fariam funcionar.

O código como está:

ORI_IFS=$IFS
IFS=$'\n'
for i in $(cat ~/.convert/videos); do
IFS=$ORI_IFS

# if [ "$cancelado" != "yes" ]; then <---- esse era o original
#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder 2> /dev/null |
tr '\r' '\n' 2> /dev/null |
grep "^Pos:" 2> /dev/null|
sed -e 's/( *//;s/)//' 2> /dev/null|
awk '{ print $4 "\n#Aguarde (" $4 " " NR ")" }' 2> /dev/null |
zenity --progress --title=Conversão --auto-kill

 IFS=$'\n'
# fi
done
IFS=$ORI_IFS

vampire_thunder

Ainda não consegui mas agora tenho certeza que estou quase lá.

Fiz uma coisa aqui que quase funcionou. "Quebrei" a primeira versão que me passaram na Ubuntu Brasil com um if:

ORI_IFS=$IFS
IFS=$'\n'
for i in $(cat ~/.convert/videos); do
IFS=$ORI_IFS

#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder 2> /dev/null |

if [ -n "`mencoder`" ] ; then
tr '\r' '\n' 2> /dev/null |
grep "^Pos:" 2> /dev/null|
sed -e 's/( *//;s/)//' 2> /dev/null|
awk '{ print $4 "\n#Aguarde (" $4 " " NR ")" }' 2> /dev/null |
zenity --progress --title=Conversão --auto-kill

IFS=$'\n'
fi
done
IFS=$ORI_IFS

if [ $? = 0 ] ; then
zenity --title="Ops !" --info --text "Operação cancelada pelo operador !"
exit 2;
fi


Agora falta só acertar o tipo de "if", pois do jeito que está, o aviso de cancelamento aparece também quando o vídeo é concluído.

vampire_thunder

Finalmente funcionou, graças a dica do usuário Passageiro, da comunidade do Ubuntu. Ele me indiciou a colocar o "if" na linha do zenity.
O código ficou assim:

##############
## CONVERTENDO
##############


ORI_IFS=$IFS
IFS=$'\n'
for i in $(cat ~/.convert/videos); do
IFS=$ORI_IFS

#Executa o mencoder
IFS=$'\n'
/usr/share/lineduccontrolpanel/categories/others/convert/mencoder "$i" 2> /dev/null
chmod +x ~/.convert/mencoder
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &

IFS=$ORI_IFS

#Aguarda 4 segundos para assegurar que o log ja foi criado
sleep 4

# Cria o log da porcentagem
while [ -n "`pidof mencoder`" ] ; do
      cat /tmp/mencoder-log$$ |  grep Pos | sed '$!d;s/.*(//; s/%.*//' > /tmp/mencoder-percent$$ # 2> /dev/null
done &

# Lê a porcentagem e joga para a barra de progresso
while [ -n "`pidof mencoder`" ] ; do

(
echo "00"; sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3 
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo $(cat /tmp/mencoder-percent$$); sleep 3
echo "100"
) |
   if zenity --progress --title "Mencoder" --auto-close --text "Convertendo, aguarde por favor. \n $i \n $(sed '$!d;s/(.*)//;s/A.*//;s/V//' /tmp/mencoder-log$$)"; then
     zenity --title="Fim" --info --text "Fim normal de operação"
   else
     zenity --title="Ops !" --error --text "Operação cancelada pelo operador !"
     killall mencoder
   fi
done

  #Remove o arquivo de log
rm -f /tmp/mencoder-log$$
rm -f /tmp/mencoder-percent$$

  IFS=$'\n'
done
IFS=$ORI_IFS


Resultado:


A parte do echo que enche a barra ainda precisa melhorar, pois se o vídeo for grande, a mensagem "Fim normal de operação" aparece várias vezes antes da conversão realmente terminar.
Outro pequeno problema é que está demorando muito para a tela de conversão concluída aparecer: