Advertisement
darsinqauros

Enviar para MP4 - v2.1

Jan 24th, 2012
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2.  
  3. # SCRIPT FEITO PARA SER USADO NAS AÇÕES PERSONALISADAS DO THUNAR.
  4. # SEGUNDA VERSÃO DEPOIS DE DISCUÇÃO EM LISTA DE SHELL SCRIPT
  5. # DEPENDE DO BASH, ZENITY, BC, WC E MP3GAIN
  6.  
  7. # Função auto explicativa. :)
  8. erro() {
  9.        zenity --info --title "Erro!" --text "$1"
  10.        exit 1
  11. }
  12.  
  13. # Verifica se foi passado ao menos um arquivo de entrada.
  14. [ -f "$1" ] || erro "O arquivo de entrada não foi passado como argumento ou ele não existe.\n\n-> USO: $0 \"Arquivo.mp3\" \n\nNenhum processo realizado."
  15. # Somente o serial do meu dispositivo MP4. Coloque aqui o seu. Não é necessário dizer que ele tem que estar correto, certo? :)
  16. dispositivoSerial="觛迦烶觓∑ፉ倢獓穓㨓┖슷⑲"
  17. # O subshel dessa linha retorna o número do dispositivo.
  18. read dispositivo <<< $(find "/proc/scsi/usb-storage/" -type f -exec grep -l "$dispositivoSerial" {} \+ | awk -F '/' '{print "sd "$5}' | tail -n1)
  19. # Verifica que a variável $dispositivo possui qualquer coisa diferente de vazio.
  20. [ -n "$dispositivo" ] || erro "Infelizmente o dispositivo não foi encontrado. \n\nNenhuma ação tomada."
  21. # O subshel dessa linha retorna o "device" do dispositivo.
  22. read dispositivo <<< $(dmesg | grep -e "$dispositivo.*\[.*Attached" | sed -e 's/^.*\[//g ; s/\].*$//g' | tail -n1)
  23. # Nessa linha o subshel retorna o ponto de montagem do dispositivo.
  24. read dispositivo <<< $(mount | grep -i "$dispositivo" | awk '{print $3}')
  25. # Verifica que a variável $dispositivo possui uma pasta de montagem válida.
  26. [ -d "$dispositivo" ] || erro "Infelizmente o ponto de montagem não foi encontrado. \nVerifique se o dispositivo está montado, além de inserido. \n\nNenhuma ação tomada."
  27. # Variável que contém o caminho da pasta de músicas. Altere a seu gosto.
  28. pastaDeMusicas="$dispositivo/musicas"
  29. # Cria pasta de músicas na raíz do dispositivo, se ela não existir.
  30. mkdir -p "$pastaDeMusicas"
  31. # Verifica a quantidade de músicas contidas na pasta de música.
  32. # Como foi dito na lista brasileira de Shell Script, MP4 Shing-lings suportam uma quantidade limitada de mp3 em uma pasta.
  33. # No meu caso, o aparelho suporta 999 arquivos mp3. :)
  34. # Troquei a linha 'read quantidadeMP3 <<< $(ls "$pastaDeMusicas/*.mp3" | wc -l)' por essa abaixo.
  35. # Porque por algum motivo o ls parou de reconhecer "*.algumacoisa" como filtro, passando a tratá-lo como arquivo. Deve ser algo de nova versão. Não sei bem.
  36. read quantidadeMP3 <<< $(ls "$pastaDeMusicas" | grep -i "mp3" | wc -l)
  37. # Na linha abaixo, o subshell retorna o tamanho livre, em MB, do dispositivo - 100KB. Solucão encontrada para reservar 100KB para os arquivos de configuração do aparelho.
  38. read tamDispositivo <<< $(df | grep "$dispositivo" | sed -e "s/\([a-z0-9/]* *\)\{4\}[0-9a-zA-Z/% -]*/\1\/1024-0.1/" | bc -l | sed -e "s/\([0-9]*\.[0-9]\{3\}\)[0-9]*/\1/; s/\.//g");
  39.  
  40. while read mp3; do
  41.     # O subshell retorna somente o nome da música.mp3.
  42.     # read musicaAtual <<< $(echo "$mp3" | sed -e "s/^\/[[:alpha:][:digit:][:punct:] ]*\/\([[:alpha:][:digit:][:punct:] ]*\.mp3\)/\1/")
  43.     # Algum tempo depois, na própria lista de shell, eu vi um tópico tratando algo parecido. Vi que o basename fazia a mesma coisa que a linha de cima.
  44.     # Não conhecia o raio do treco... Aí implementei. Acho que fica mais rápido assim.
  45.     read musicaAtual <<< $(basename "$mp3")
  46.     # Aqui o subshell retorna o tamanho em MB da música.mp3.
  47.     read tamMP3 <<< $(stat -c "%s" "$mp3" | sed -e "s/[0-9]*/&\/1024\/1024/g" | bc -l | sed -e "s/\([0-9]*\.[0-9]\{3\}\)[0-9]*/\1/; s/\.//g");
  48.     # O tamanho da música.mp3 é menor que o espaço restante no dispositivo?
  49.     if [ $tamMP3 -lt $tamDispositivo ]; then
  50.         # A música.mp3 já existe no dispositivo?
  51.         if [ ! -f "$pastaDeMusicas/$musicaAtual" ]; then
  52.             # A pasta de músicas contém menos que 999 músicas?
  53.             if [ $quantidadeMP3 -lt 999 ]; then
  54.                 # Copia a música.
  55.                 cp "$mp3" "$pastaDeMusicas"
  56.                 # Calcula o espaço restante do dispositivo.
  57.                 let tamDispositivo=$tamDispositivo-$tamMP3
  58.                 # Adiciona +1 na quantidade de músicas
  59.                 let quantidadeMP3=$quantidadeMP3+1
  60.                 # Sleep 3: Tentativa de corrigir erro em que depois de copiada a música.mp3 o mp3gain não encontra. Acho que é algum atraso de cópia. Ainda estou testando.
  61.                 sleep 3
  62.                 # Normaliza a música.mp3 para volume de 89db sem que haja "pontos surdos".
  63.                 mp3gain -r -k "$pastaDeMusicas/$musicaAtual"
  64.             else
  65.                 # Se houver mais de 999 músicas.
  66.                 msgErro=" Infelizmente houve o seguinte erro:\nO número máximo de arquivos foi atingido. Há 999 músicas.\n\nOperação cancelada."
  67.                 break
  68.             fi
  69.         fi
  70.     else
  71.         # Se a música.mp3 for maior que a capacidade do dispositivo, seta $capacidade e quebra o laço while.
  72.         msgErro=" Infelizmente houve o seguinte erro:\nSeu dispositivo não possui espaço\nsuficiente para executar a cópia \ndo arquivo $musicaAtual e os demais.\n\nOperação cancelada."
  73.         break
  74.     fi
  75. # O subshel da linha abaixo, retorna uma lista dos arquivos de entrada; um por caminho linha.
  76. done <<< $(echo "$*" | sed -e "s/ \//\n\//g" | grep ".mp3")
  77. # Se a variável $msgErro possuir o conteúdo diferente de vazio, emite mensagem de erro.
  78. # Caso contrário, emite mensagem informando que o processo terminou com sucesso e chama a saída bem sucedida. :)
  79. [ -n "$msgErro" ] && erro "$msgErro" || zenity --info --title="Transferência finalizada!" --text=" Os arquivos selecionados foram\ntrasnferidos e normalizados com sucesso!"; exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement