Versão 0.2: Integrar/Sincronizar Firefox/Thunderbird com o KDE

Publicado por Claudio Polegato Junior 12/04/2005

[ Hits: 6.111 ]

Download criar_mime.types-0.2




Quando clico sobre um arquivo em uma página no Firefox ou anexo no Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já tem um padrão no KDE. Pensando nisso (e no usuário final), li um pouco da documentação de como é feita a associaçao no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE para ser uma opção pronta no Firefox e no Thunderbird. Pode executar automaticamente (cron).

  



Esconder código-fonte

#!/bin/bash

######################################################
#                                                    #
#  Programa: criar_mime.types                        #
#     Autor: Claudio Polegato Junior                 #
#    e-mail: cpolegatojr_lsts@pop.com.br             #
#    Versão: 0.2                                     #
#      Data: 12 de Abril de 2004                     #
#                                                    #
######################################################

################################################################################
#                                                                              #
#     Quando clico sobre um arquivo em uma página no Firefox ou anexo no       #
# Thunderbird sempre preciso escolher um programa para abrí-lo, mas este já    #
# tem um padrão no KDE. Pensando nisso (e na impossibilidade de um usuário     #
# final - mas final mesmo - encontrar o programa correto no sistema de         #
# arquivos do linux), li um pouco da documentação de como é feita a associaçao #
# no KDE e nos Mozilla's Softwares, dei uma raqueada e construi um script que  #
# sincroniza o programa padrão que escolho ou já vem pré-configurado no KDE    #
# para ser uma opção pronta no Firefox e no Thunderbird.                       #
#                                                                              #
################################################################################
#                                                                              #
# Versão 0.1:                                                                  #
#                                                                              #
#     Este script faz basicamente uma varredura sobre os "mime types" (tipos   #
# que especificam o conteúdo o arquivo) com .desktop contidos nos diretórios   #
# $HOME/.kde/share/mimelnk (tipos definidos ou alterados pelo usuário),        #
# $KDEDIR/share/mimelnk (tipos padrões do KDE) e /usr/share/mimelnk (tipos que #
# alguns outros softwares definem no Linux). Dessa varredura são então         #
# encontrados os "mime types" e as extensões que estão associadas (isso é uma  #
# tentativa que faço e aparentemente dá certo).                                #
#     Para cada "mime type" encontrado, primeiramente é verificado se este     #
# consta no arquivo $HOME/.kde/share/config/profilerc (definido pelo usuário e #
# contém uma lista dos "mime types" seguida por um traço e um número e então   #
# propriedade associadas a esta prioridade de "mime type") ou no arquivo       #
# $KDEDIR/share/config/profilerc (global para o KDE e características ídem ao  #
# anterior). Se for encontrado em um destes arquivos, é escolhido o link para  #
# aplicativo (.desktop) de prioridade 1, senão realiza uma varredura nos links #
# para aplicativos definidos no KDE constantes nos diretórios                  #
# $HOME/.kde/share/applnk (links definidos pelo usuário) e em                  #
# $KDEDIR/share/applnk (links globais do KDE), ondem é verificado em cada link #
# se há uma referencia para o "mime type" em questão e cria-se uma lista       #
# destes links. A partir desta lista, verifica-se qual tem o maior valor na    #
# propriedade InitialPreference e este então é dado como o link padrão. Caso   #
# houver empate na ordenaçao por InitialPreference, pega o primeiro da lista   #
# como link padrão. Caso não encontre InitialPreference em nenhum, pega o      #
# primeiro da lista para ser o link padrão.                                    #
#     A partir deste arquivo de link padrão encontrado, procura-se a propriede #
# Exec, a qual indica o programa a ser usado para abrir o arquivo que casa com #
# o "mime type" que está sendo analisado.                                      #
#     Ufa! Neste ponto tenho um "mime type", as extensões associadas com ele e #
# o programa padrão utilizado pelo KDE. Então crio uma entrada no arquivo      #
# $HOME/.mime.types (primeiro o "mime type" e depois as extensões separadas    #
# por espaço) e no arquivo $HOME/.mailcap (primeiro o "mime type" e depois o   #
# programa separados por ponto e vírgula - ; - e terminado por %s).            #
#     Fazendo-se isso para cada "mime type" do KDE consigo associar os         #
# programas padrões do KDE para ser o padrão no Firefox e no Thunderbird. Cada #
# vez que se altera o programa padrão no KDE ou insere um tipo novo deve-se    #
# rodar este script para fazer o sincronismo real sem ser necessário sair e/ou #
# reiniciar o Firefox e/ou o Thunderbird.                                      #
#                                                                              #
#     Espero que seja útil para a comunidade...                                #
#                                                                              #
################################################################################
#                                                                              #
# Versão 0.2:                                                                  #
#                                                                              #
# - Sanado o problema econtrado quando existia 10 (dez) ou mais referências à  #
#     um "mime type" em algum dos arquivos profilerc.                          #
# - Alterada a estrutura do script para se ter apenas um bloco de              #
#     processamento de procura e construção dos arquivos $HOME/.mime.types e   #
#     $HOME/.mailcap a patir de uma lista de diretórios inicialmente fornecida.#
# - Verificação se há pelo menos um arquivo com data mais recente que          #
#     $HOME/.mailcap nos diretórios que contém os links para então, caso haja  #
#     algum realizar o sincronismo somente neste caso.                         #
# - Após sincronicação de "mime types" com o KDE, o usuário será perguntado se #
#     deseja fazer esta sincronicação automaticamente a cada minutos e,        #
#     caso queira, cria uma entrada no cron para isto. Repare que, para tanto, #
#     o usuário precisa logar como root (será perguntada a senha). Atenção:    #
#     "Cuidado! Talves isso torne seu sistema muito lento.". O usuário pode    #
#     escolher o tempo entre sincronizações em minutos sendo válidos 1, 2, 3,  #
#     4, 5, 6, 10, 12, 15, 20 e 30, isto é, divisores de 60. Também é possível #
#     escolher o arquivo de log que conterá a saída da última execução pelo    #
#     cron, sendo este arquivo colocado em $HOME.                              #
# - Foi detectado um problema quanto o KDE escreve informações para o arquivo  #
#     $HOME/.kde/share/config/profilerc notado quando exitem várias entradas   #
#     para um mesmo aplicativo "A", uma entrada para o aplicativo que quermos  #
#     como padrão "B" e este com InitialPreference presente ou não. Este       #
#     problema consiste em que quando "B" estiver entre os "A" ele se torna    #
#     padrão para o KDE mesmo não estando no topo, porém no                    #
#     $HOME/.kde/share/config/profilerc ele fica na posição correta, e, além   #
#     disso, se tentarmos tirar do meio e colocar no topo não é atualizado o   #
#     $HOME/.kde/share/config/profilerc. Assim sendo, para o aplicativo "B"    #
#     ficar no topo no arquivo $HOME/.kde/share/config/profilerc é preciso     #
#     colocá-lo primeiro abaixo de todos os "A", aplicar esta alteração e      #
#     então colocar acima de todos.                                            #
#     Este teste foi feito no KDE 3.1.5 do Conectiva Linux 9: "Dado um arquivo #
#     .zip, este tem 3 entradas para Ark. Cliquei com o botão direito do       #
#     mouse sobre o arquivo e depois em 'Editar tipo de arquivo...', depois no #
#     botão 'Adicionar' e digitei 'unzip' na janela para escolha do            #
#     novo aplicativo que quero adicionar e marquei a caixa 'Executar no       #
#     Terminal'. Este agora aparece em último na lista. Clico em 'Ok'. Clico   #
#     com o botão direito do mouse sobre o arquivo e passo este sobre 'Abrir   #
#     com' e vejo que 'unzip' é o quarto. Clico sobre 'Editar tipo de          #
#     arquivo...', novo ele para terceiro e dou 'Ok'. Percebo que em           #
#     $HOME/.kde/share/config/profilerc ele fica em terceiro dos               #
#     application/x-zip porém quando novamente clico com o botão direito do    #
#     mouse sobre o arquivo .zip e passo este sobre 'Abrir com', vejo que      #
#     'unzip' é o primeiro quando creio eu que deveira ser o terceiro. Clico   #
#     sobre 'Editar tipo de arquivo...', e vejo que 'unzip' é o primeiro mas   #
#     em $HOME/.kde/share/config/profilerc continua em terceiro e então não    #
#     tenho como movê-lo para primeiro, pois para o KDE ele já é o primeiro.   #
#     Dá no mesmo se movê-lo para segundo. O único jeito e movê para último,   #
#     clicar em 'Aplicar' e depois mover para primeiro e então clicar em 'Ok', #
#     daí sim em $HOME/.kde/share/config/profilerc ele fica em primeiro e é    #
#     possível sincronizar corretamente o comportamento do KDE para com os     #
#     programas que abrem os arquivos com os Mozilla's Software."              #
#                                                                              #
################################################################################

########################################
# Função que insere uma linha no cron. #
########################################

function cron(){
  while true; do
    echo
    echo -n "Deseja colocar uma entrada no cron [S/n]? "
    read -n 1 RESPOSTA
    echo
    if [ "$RESPOSTA" != "" ]; then
      echo
    fi
    if [ "$RESPOSTA" == "" ] || [ "$RESPOSTA" == "S" ] || [ "$RESPOSTA" == "s" ]; then
      while true; do
        echo "De quantos em quantos minutos deseja sincronizar?"
        echo "    São válidos: 1 2 3 4 5 6 10 12 15 20 e 30."
        echo "    Somente pressione [Enter] para cancelar."
        echo -n "    Tempo: "
        read TEMPO
        if [ -z "$TEMPO" ]; then
          echo
          exit 0;
        else
          ACHOU="`expr " 1 2 3 4 5 6 10 12 15 20 30 " : ".* $TEMPO .*"`"
          if [ "$ACHOU" == "0" ]; then
            echo
            echo "Tempo inválido!"
            echo
            continue
          fi
          break
        fi
      done
      echo
      echo "Digite o nome do arquivo de log do cron que ficará em $HOME..."
      echo "    Por padrão, se pressionar [Enter], o nome será criar_mime.types.log."
      echo "    Para anular a saída de log, digite \"/dev/null\" sem as aspas."
      echo -n "    Nome do arquivo: "
      read ARQUIVO_LOG
      if [ -z "$ARQUIVO_LOG" ]; then
        ARQUIVO_LOG="$HOME/criar_mime.types.log"
      elif [ "$ARQUIVO_LOG" != "/dev/null" ]; then
        ARQUIVO_LOG="$HOME/$ARQUIVO_LOG"
      fi
      export ARQUIVO_LOG TEMPO DIR_USER="$HOME $KDEDIR" PROG_PATH="$0"
      echo
      echo "Quando aparecer 'Password: ' digite a senha do root."
      if `su -c 'cp -f $PROG_PATH /usr/local/bin/criar_mime.types ; SAIDA="\`sed /usr.local.bin.criar_mime.types/d /etc/crontab\`\`echo -e "\n*/$TEMPO * * * * $USER /usr/local/bin/criar_mime.types $DIR_USER 2>&1 > $ARQUIVO_LOG"\`"; echo "$SAIDA" > /etc/crontab'`; then
        echo "Atualização gerenciada pelo cron efetuada com sucesso!"
        echo
      else
        echo "Erro em fazer a atualização ser gerenciada pelo cron!"
        echo
      fi
      break
    fi
    if [ "$RESPOSTA" == "N" ] || [ "$RESPOSTA" == "n" ]; then
      break
    fi
    echo "Resposta inválida!"
  done
}

#####################################################################
# Função que verifica se existe algum arquivo relevante modificado. #
#####################################################################

function Verificar(){
  if [ ! -e $HOME/.mailcap ]; then
    MODIF_MIME="Tudo"
    MODIF_APP="Tudo"
  else
    # Zerando MODIF_MIME e procurando arquivos em DIR_MIME com mudanças
    #     mais recentes que em $HOME/.mailcap
    MODIF_MIME=""
    MODIF_MIME="`find $DIR_MIME -cnewer $HOME/.mailcap -name \"*.desktop\"`"
    # Zerando MODIF_APP e procurando arquivos em DIR_APP com mudanças
    #     mais recentes que em $HOME/.mailcap
    MODIF_APP=""
    MODIF_APP="`find $DIR_APP -cnewer $HOME/.mailcap -name \"*.desktop\"`"
  fi
}

#####################################
# Função que realiza o sincronismo. #
#####################################

function Sincronizar(){

  # Fazendo cópia dos arquivos $HOME/.mime.types e $HOME/.mailcap.
  if [ -e $HOME/.mime.types ]; then
    mv $HOME/.mime.types $HOME/.mime.types_`date +"%Y.%m.%d_%H.%M.%S"`
  fi
  if [ -e $HOME/.mailcap ]; then
    mv $HOME/.mailcap $HOME/.mailcap_`date +"%Y.%m.%d_%H.%M.%S"`
  fi

  PASSEDS=""

  # Para cada diretório ONE_MIME_DIR de "mime types" encontrado em DIR_MIME
  for ONE_MIME_DIR in $DIR_MIME; do
    echo
    echo "*****************************************************"
    echo "$ONE_MIME_DIR"
    echo "*****************************************************"
    echo
    # Lista em MIME_DESKTOPS todos os arquivo .desktop no diretório ONE_MIME_DIR
    MIME_DESKTOPS=`find $ONE_MIME_DIR -name "*.desktop"`
    # Para cada .desktop MIME_DESKTOP encontrado em MIME_DESKTOPS
    for MIME_DESKTOP in $MIME_DESKTOPS; do
      MIME=`expr "$MIME_DESKTOP" : '.*mimelnk/\(.*\).desktop'`
      echo "Mime: $MIME"
      EXTS=`grep "Patterns\=" "$MIME_DESKTOP" | sed s/Patterns=// | sed s/'*'//g | sed s/'\.'//g | sed y/\;/' '/`
      # Verificando se já foi passada por uma entrada para este "mime type"
      PASSED="`expr "$PASSEDS" : ".* $MIME .*"`"
      if [ "$PASSED" == "0" ]; then
        PASSED="`expr "$PASSEDS" : "$MIME .*"`"
      fi
      if [ "$PASSED" != "0" ]; then
        echo "Exts: ***  Modified  *** $EXTS"
        echo
        continue
      fi
      PASSEDS="$PASSEDS$MIME "
      echo "Exts: $EXTS"
      PROFILE=""
      PROFILERC="$HOME/.kde/share/config/profilerc"
      if [ -a "$PROFILERC" ]; then
        PROFILE=`expr "\`grep -n "\[$MIME - 1\]" "$PROFILERC"\`" : '\(.*\):.*'`
        if [ -z "$PROFILE" ]; then
          PROFILERC="$KDEDIR/share/config/profilerc"
          if [ -a "$PROFILERC" ]; then
            PROFILE=`expr "\`grep -n "\[$MIME - 1\]" "$PROFILERC"\`" : '\(.*\):.*'`
          fi
        fi
      fi
      if [ -z "$PROFILE" ]; then
        DESKTOPS=`grep -rl $MIME $DIR_APP`
        if [ -n "$DESKTOPS" ]; then
          LEVELS=`grep "InitialPreference" $DESKTOPS | rev | sort -r | rev`
          if [ -z "$LEVELS" ]; then
            for DESKTOP in $DESKTOPS; do
              break
            done
          else
            POS=`expr index "$LEVELS" ':'`
            if [ $POS == 0 ]; then
              DESKTOP=`grep -l "InitialPreference" $DESKTOPS`
            else
              DESKTOP=`expr substr "$LEVELS" 1 \`expr $POS \- 1\``
            fi
          fi
        else
        DESKTOP=""
        fi
      else
        PROFILE=`expr $PROFILE \+ 2`
        DESKTOP=`expr "\`sed -n ${PROFILE}p "$PROFILERC"\`" : 'Application=\(.*\)'`
        DESKTOP="$HOME/.kde/share/applnk/$DESKTOP"
      fi
      if [ -n "$DESKTOP" ]; then
        PROG=`expr "\`grep '^Exec' "$DESKTOP"\`" : 'Exec=\(.*\)'`
        POS=`expr index "$PROG" ' '`
        if [ "$POS" != "0" ]; then
          PROG=`expr substr "$PROG" 1 \`expr $POS \- 1\``
        fi
        PROG=`echo "$PROG" | sed s/"'"//g | sed s/'"'//g`
      fi
      echo "Prog: $PROG"
      echo
      if [ -n "$PROG" ]; then
        if [ -z "$EXTS" ]; then
          echo "$MIME" >> $HOME/.mime.types
        else
          echo "$MIME $EXTS" >> $HOME/.mime.types
        fi
        echo "$MIME;$PROG %s" >> $HOME/.mailcap
      fi
    done
  done
}

###############################
# Corpor principal do script. #
###############################

  # O argumento que aceita é diretório HOME, que é passado pelo cron.
  if [ "$1" != "" ]; then
    HOME="$1"
    KDEDIR="$2"
  fi
  # Diretórios em DIR_MIME onde estão os "mime types" no KDE.
  DIR_MIME="$HOME/.kde/share/mimelnk $KDEDIR/share/mimelnk /usr/share/mimelnk"
  # Diretórios em DIR_APP onde estão os atalhos para aplicativos no KDE.
  DIR_APP="$HOME/.kde/share/applnk $KDEDIR/share/applnk"
  # Chamada à função Verificar que retorna as mudanças em MODIF_MIME e MODIF_APP
  Verificar
  # Se não houve mudanças para por aqui mesmo.
  if [ -z "$MODIF_MIME" ] && [ -z "$MODIF_APP" ];then
    echo
    echo "*********************************************"
    echo "*                                           *"
    echo "*     A sincronização não é necessária!     *"
    echo "*                                           *"
    echo "*********************************************"
    echo "Data: `date +"%Y.%m.%d_%H.%M.%S"`"
    echo
  else
    echo
    echo "*****************************************"
    echo "*                                       *"
    echo "*     A sincronização é necessária!     *"
    echo "*                                       *"
    echo "*****************************************"
    echo "Data: `date +"%Y.%m.%d_%H.%M.%S"`"
    echo
    Sincronizar
  fi
  if [ "$1" == "" ]; then
    cron
  fi

Scripts recomendados

Script para Gerenciamento de Pacotes no Slackware

Mantendo seus repositórios Git e SVN atualizados

Tire screenshots com Scrot facilmente com Zscrot

Alternador de wallpaper para GNOME

PkgBuild - um gerenciador de construção de pacotes


  

Comentários
[1] Comentário enviado por cpolegatojr em 13/04/2005 - 09:13h

Olá pessoal! Esta versão veio em substituição à versão 0.1 publicada anteriormente, sendo o processo de execução o mesmo descrito em comentário na versão 0.1. Além desse, pretendo publicar em muito breve outro para fazer interação do Firefox e Thunderbird entre si no KDE e outro para eliminar um probleminha de substituição de página no Firefox quando clica-se sobre um link no Thunderbird e/ou sobre um arquivo que está como padrão ser aberto pelo Firefox.

[]'s

Claudio


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts