Autor Tópico: dbus, zenity e kdialog  (Lida 13933 vezes)

Offline Kriptolix

  • Usuário Ubuntu
  • *
  • Mensagens: 314
    • Ver perfil
    • Kriptolix
Re: dbus, zenity e kdialog
« Resposta #15 Online: 07 de Maio de 2011, 11:41 »
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

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #16 Online: 07 de Maio de 2011, 11:55 »
O mencoder dá porcentagem, sim. Veja o print do terminal no meu terceiro post.

Offline Kriptolix

  • Usuário Ubuntu
  • *
  • Mensagens: 314
    • Ver perfil
    • Kriptolix
Re: dbus, zenity e kdialog
« Resposta #17 Online: 07 de Maio de 2011, 14:54 »
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

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #18 Online: 07 de Maio de 2011, 19:55 »
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.

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #19 Online: 08 de Maio de 2011, 01:28 »
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:
Código: [Selecionar]
( 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):
Código: [Selecionar]
~/.convert/mencoder > /tmp/mencoder-log$$ 2> /dev/null &
Este lê a linha onde tem a porcentagem e joga em outro log:
Código: [Selecionar]
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:
Código: [Selecionar]
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).
« Última modificação: 08 de Maio de 2011, 03:20 por vampire_thunder »

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #20 Online: 09 de Maio de 2011, 21:58 »
Na comunidade do Ubuntu no Orkut me deram a dica do seletor de arquivos:
Código: [Selecionar]
$ zenity --file-selection --multiple | tr '|' '\n'ou
Código: [Selecionar]
$ zenity --file-selection --multiple --separator='
> '

Já a da barra de progresso... empaquei

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #21 Online: 10 de Maio de 2011, 14:46 »
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%:

Código: [Selecionar]
#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.

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #22 Online: 11 de Maio de 2011, 23:54 »
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á:

Código: [Selecionar]
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
« Última modificação: 11 de Maio de 2011, 23:59 por vampire_thunder »

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #23 Online: 13 de Maio de 2011, 01:31 »
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:

Código: [Selecionar]
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.

Offline vampire_thunder

  • Usuário Ubuntu
  • *
  • Mensagens: 735
    • Ver perfil
Re: dbus, zenity e kdialog
« Resposta #24 Online: 15 de Maio de 2011, 10:26 »
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:

Código: [Selecionar]
##############
## 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: