Linux slogan
Visite também: BR-Linux.org · Dicas-L · NoticiasLinux · SoftwareLivre.org · UnderLinux · BestLinux



» Screenshot
Linux: Slackware12 + KDE 4
Por jmucelli
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha

» Wallpaper


Scripts

Linux user

Publicado por Alan Ricardo Santos Bueno em 06/12/2006    [ 2422 hits ]

Login: SlackAngel, 172806 pontos

Homepage: http://alanbueno.net   


Descrição
Terceira versão do shell script mp3Gdown (busca e download de mp3 usando um script feito em bash e o Google).

Foram feitas diversas melhorias em relação a versão anterior e correções; mais detalhes no Changelog.

Veja também a dica:
http://www.vivaolinux.com.br/dicas/verDica.php?codigo=7403


[ Download: mp3Gdown ]   [ Enviar nova versão ]

[ Esconder código-fonte ]

#! /usr/local/bin/bash
# mp3Gdown - Script para busca e download de mp3  
#
# Autor: Alan R. S. Bueno
# Licença: GPL
#
#------------------------------------------------
# Changelog:
#
# 18/11/06 5:28 (p.m) - Pt.3 (3ª versão!)
#      -=-=-=-=-=-=-
#   Hoje (sábado, dia 18), a banda Angra comemora
#   seu aniversário de 15 anos, Parabéns!!! \m/
#      -=-=-=-=-=-=-
# "++" Fazer várias pesquisas ao mesmo tempo
#      (em outros terminais abertos)
# "++" Nomes de arquivos ou de fontes que estejam
#      muito longos e ultrapassaram o número de
#      colunas ("invadindo" outra linha), é
#      retirado o excedente e colocado reticências
#      "(...)" no lugar (fins estéticos...)
# --"Salvar Pesquisa" mais eficiente
# "++" Uso do sed da GNU
# --De wget para wget -c (see man wget)
# --Corrigido bug no sistema de download, que
#   fazia com que uma instrução com ':' e ','
#   ao mesmo tempo, passasse, gerando erro.
# --Mais redirecionamento e menos cat
# "++" Variável NOP para designar quantos
#      pings iram ser feitos...
# "++" Pausa entre exibição de resultados
#      determinada pela variável PAUSE
# --EXT='mp3' (sem barra-ponto)
# --Mais aspas simples =)
# "--" Variável $0 no menu de ajuda
# "--" Referências à bandas
# "++" File Size (mostra tamanho do arquivo)
#
#
# 14/09/06 11:03 - Pt.2 (2ª versão!)
# --Download de múltiplos arquivos
# Ex: 0:4 ou 4,7,1,10
# --url quebrada em linhas
#
#
# 04/09/06 7:14 - Primeira versão
#------------------------------------------------
#
#
# Programas usados
LYNX='/usr/local/bin/lynx --dump'
WGET='/usr/local/bin/wget -c'
# NOTA: sed da GNU
# (ou The Free Software Foundation's "sed" stream editor)
# O sed da GNU apresenta algumas características
# a mais em relação ao sed do FreeBSD, foi utilizado
# no script a nomenclatura GSED (para a variável), já
# que para não haver problema, no FreeBSD quando se
# instala outro programa com mesmo nome, é acrescentado
# um sufixo ou prefixo. Então: Para usuári[ao]s GNU/Linux
# vai ser necessário mudar a palavra gsed do PATH
# da variável GSED para sed (verifique o caminho correto
# do sed no seu sistema, e mude-o também).
# Para usuári[ao]s FreeBSD, apenas instalar o gsed...
# No ports está em /usr/ports/textproc/gsed
GSED='/usr/local/bin/gsed'
#
# Quantidade de Pings usados para verificar
# se o host está alcançável. 2 é suficiente =);
# Aumente ou diminua para 1 se tiver algum problema...
NOP='2'
PING="/sbin/ping -c $NOP"

# Extensão do arquivo
EXT='mp3'

# Velocidade com que os resultados serão impressos.
# Para não encher a tela de uma vez só, o valor da
# variável é 0.2, esse valor é passado para o comando
# sleep, e ocorre a pausa de 2 décimos de segundo.
# Aumente ou diminua conforme desejado...
PAUSE='0.2'

if [ $# -eq 0 ]; then
   echo -e '\e[34mUse: \e[m'
      echo -e '\t\e[32m'"mp3Gdown palavra chave"'\e[m'
      echo -e '\e[34m'ou'\e[m'
      echo -e '\t\e[32m'"mp3Gdown palavra chave:25"'\e[m'
      echo -e '\t\e[35m'"Obs: Dois pontos e quantidade de resultados"'\e[m'
   echo -e '\t\e[34m...\e[m'
      #echo -e '\t\e[32mViva o Heavy Metal e o Google!\e[m'
      echo -e '\t\e[32mViva o Metal, o Bash e o Google! :)\e[m'
      exit
fi

args=`echo $* | sed '/:/d'`

if [ "$args" ]; then
      keyword=`echo $* | sed 's/ /+/g'`
else
      # Número de resultados (definidos).
      rfp_defined=`echo $* | cut -f2 -d':'`
     keyword=`echo $* | cut -f1 -d':' | sed 's/ /+/g'`
fi

# Resultados por página (quanto maior: mais resultados, menos velocidade).
# "Último" argumento da linha de comando (depois do ':').
# Ex: mp3Gdown artista_banda_música:50 (faz uma pesquisa com até 50 resultados).
# Se não estiver definido, assume valor 15.
rfp=${rfp_defined:-15}

# Url com os dados passados para a pesquisa
url="www.google.com.br/search?hl=pt-BR\
&num=$rfp\
&q=-inurl%3Ahtm+\
-inurl%3Ahtml+\
intitle%3A%22index+of%22+\
%22Last+modified%22+$EXT+\
%22$keyword%22\
&btnG=Pesquisa+Google&meta="

# Palavra-chave
echo -e '\e[35m'"Keyword[s]?: $keyword"\
'\n'Resultados por página: "$rfp"'\n'\
'\e[m''\e[34m'...'\e[m''\e[35m'\
'\n'Buscando, Espera um pouco!'\e[m\n' \
'\n\e[32m'Key'\t'Nome do arquivo encontrado'\t\e[m'

# Fazendo a pesquisa...
QUERY=$( $LYNX $url | sed '/google/d;/cache/d;/http/!d;s/.* //g;/^http/!d' )

# Partindo da idéia de que não pode haver dois processos com mesma id
# ao mesmo tempo, atribui esse valor ao nome do contador e da lista
# dos arquivos achados; a variável $keyword acaba ajudando a ser
# uma segunda ajuda e nomeação...
# Assim, tem-se várias pesquisas ao mesmo tempo =)
ID="${keyword}_$$"

# Contador (também odeio arquivo temporário, mas foi necessário...)
# Quem tiver idéia que funcione, meche no script e manda a solução!
count_file="/tmp/count_$ID"
echo "0" > $count_file

# Lista dos arquivos achados
search_list="/tmp/search_list_$ID"
echo "" > $search_list


filesize () {
   # Número de referência do link (do arquivo) na página baixada
   number=$( echo $file_link | sed 's/\..*//g' )
   # A variável abaixo recebe o valor do tamanho do arquivo em diretórios
   # que estejam em um servidor Apache, no caso, geralmente o valor
   # está na última coluna.
   file_size=$( echo "$page" | sed "/\[$number\]/!d" | awk '{ print $NF }' )

   # NOTA: Por enquanto, o script somente pega o tamanho dos arquivos que estejam
   # em um servidor Apache, na verdade, pega a linha do link e pega a última coluna,
   # já que representa um padrão simples e amplamente usado... procurar mais
   # tipos de representação tornaria o script lento e ainda sim, alguns valores
   # não seriam obtidos, já que muitas pessoas mudam o formato dos diretórios
   # independente de qual servidor seja, sendo assim, difícil de obter um resultado
   # satisfatório.

   if [ $( echo $file_size | sed '/\([0-9][\.0-9][0-9]\)[MmKk]/d' ) ]; then
      # Valores que não casaram com o padrão; envia string "Indisponível".
      file_size='Indisponível'
   fi
}


echo "$QUERY" | while read link; do

$PING $( echo $link | cut -f3 -d'/' ) &> /dev/null

if [ "$?" -eq 0 ]; then
      page=$( $LYNX $link 2> /dev/null )
         # Procura linhas que casem com o padrão e então
   # verifica se elas tem extensão mp3...
         file=$( echo "$page" | sed "/\.$EXT$/!d;/^$/d;/http/!d" )
          if [ "$#" -gt 1 ]; then
             keyword_2=$( echo $keyword | sed 's/+/|/g' )
               match=$( echo "$file" | egrep -i $keyword_2 )
        else
               match=$( echo "$file" | egrep -i "$keyword" )
        fi

            if [ "$match" ]; then
               echo "$match" | while read file_link; do
             filesize
             file_link=$( echo $file_link | sed 's/.* //g' )
                  src=`echo $file_link | sed 's/\(.*\/\).*/\1/g'`
                  file_name=`echo $file_link | sed 's/.*\///;s/%20/ /g'`
                  count=$(< $count_file )
                       echo -e "($count)\t$file_link" >> $search_list

         column=$( tput cols )
         if [ ${#file_name} -gt $((column-8)) ]; then
                     echo -e '\e[32;1m'"$count"'\e[m''\t\e[1m'"${file_name:0:$((column-15))} (...)"'\e[m'
         else
                     echo -e '\e[32;1m'"$count"'\e[m''\t\e[1m'"$file_name"'\e[m'
         fi

             echo -e '\t\t\e[34m'Tamanho: "$file_size"'\e[m'
         
         if [ ${#src} -gt $((column-30)) ]; then
                    echo -e '\t\t\e[34m'Fonte:'   '"${src:0:$((column-32))} (...)"'\e[m'
         else
                    echo -e '\t\t\e[34m'Fonte:'   '"$src"'\e[m'
         fi

                  echo $((count+1)) > $count_file
                  sleep $PAUSE
                done
            fi
fi
done


if [ "$(< $search_list )" ]; then

total=`echo $(< $count_file ) -1 | bc`

one () {
if [ "$key" -le "$total" ] && [ "$key" -ge "0" ]; then
      $WGET $( sed "/^($key)/!d" < $search_list | cut -f2 )
   break
fi
}

more () {
for nha in $( echo "$key" | sed 's/,/ /g' ); do
   if [ "$nha" -le "$total" ] && [ "$nha" -ge "0" ]; then
            $WGET $( sed "/^($nha)/!d" < $search_list | cut -f2 )
      fi
done
break
}

range () {
before=$( echo $key | cut -f1 -d':' )
after=$( echo $key | cut -f2 -d':' )

if [ "${before:-0}" -le "${after:-10}" ] && [ "${after:-$total}" -le "$total" ]; then
   while [ ${before:-0} -le ${after:-$total} ]; do
         $WGET $( sed "/^(${before:-0})/!d" < $search_list | cut -f2 )
      let before++
      done
   break
fi
}


while : ; do
   echo ""
      #echo -n "Digite a key do arquivo a ser baixado, ou ENTER para nada. [0-$total]: "
      echo -n "Digite a[s]? key[s]? do[s]? arquivo[s]?, ou ENTER para nada. [0-$total]: "
      read key

   if [ "$key" ]; then
      echo ""
      if [ -z "$( echo $key | sed 's/[0-9]//g;s/://g;s/,//g' )" ]; then

      key=$( echo $key | $GSED 's/\<0\{2,\}\>/0/g;s/\<0\{1,\}\([0-9]\{1,\}\)/\1/g' )

         if [ $( echo $key | sed '/:/d;/,/d' ) ]; then
            one   
         elif [ $( echo $key | sed '/:/d' ) ]; then
            more
         elif [ $( echo $key | sed '/,/d' ) ]; then
            range
         fi
      fi
   else
      break  
   fi
done


   echo ""
      echo -en '\e[1m'"Salvar pesquisa? [não]: "'\e[m' ; read option
      echo ""

      case "$option" in
               [Ss][Ii][Mm]|[Ss]*)
               sed '/^$/d' $search_list | cut -f2 > "$search_list-cp"

         echo -n "Nome para o arquivo [search_list]: "
         read search_list_name   
         
         if [ "$search_list_name" ]; then
                        mv "$search_list-cp" "$search_list_name"
            echo ""
                        echo "Arquivo salvo: $search_list_name"
         else
                        mv "$search_list-cp" "$PWD/search_list"
         fi

         echo ""

              ;;
        esac

          rm $count_file $search_list

   echo -en '\e[1m'"Tchau tchau e 10 beijinhos "'\e[m'
         lips='*'
            echo -en '\e[1m'"="'\e[m'
            for ((i=0;i<=10;i++)); do
                  echo -n -e '\e[35;1m'"$lips"'\e[m'
                  sleep 0.6
            done
         echo ""
else
   echo -e '\n\t\e[31;1m'Pesquisa não retornou resultados válidos, tente outra vez!'
   Obs.: "Tente outra vez" com palavras chaves diferentes ;-) \e[m'
      echo -e '\e[34m'...'\e[m'
   rm $count_file $search_list
fi


Scripts recomendados
   Script Linux recomendado Cadastrando usuários no Squid através de Shell Script
   Script Linux recomendado Fazendo Backup com Rsync
   Script Linux recomendado WPA Supplicant
   Script Linux recomendado Convertendo man pages em arquivos pdf
   Script Linux recomendado CoDe_X - Compactador/Descompactador de arquivos e diretórios usando Xdialog

Comentários
[1] Comentário enviado por edmafer em 07/12/2006 - 09:50h:

Muito bom o script!

Tive que fazer algumas alterações para funcionar no debian.

Tirar o endereço absoluto dos programas (lynx,wget,ping,sed) e mudar de gsed para sed.

Fora isto está ótimo!

Só uma coisa... Aquele negócio de "10 beijinhos" ficou meio estranho, não?!

[2] Comentário enviado por humbhenri em 16/03/2007 - 16:45h:

Tive problemas aki. Como no comentario acima mudei os caminhos dos comandos, mas nenhuma busca deu resultado.


Contribuir com comentário
  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Copyleft 2002-2009 Viva o Linux.com.br

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.