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
Cadastrando usuários no Squid através de Shell Script
Fazendo Backup com Rsync
WPA Supplicant
Convertendo man pages em arquivos pdf
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.