SHOW:
|
|
- or go back to the newest paste.
| 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 E MP3GAIN |
| 5 | + | # DEPENDE DO BASH, ZENITY, BC, WC E MP3GAIN |
| 6 | ||
| 7 | - | # Verifica se sexiste ao menos um arquivo de entrada. |
| 7 | + | # Função auto explicativa. :) |
| 8 | - | if [ ! -n "$1" ]; then |
| 8 | + | erro() {
|
| 9 | - | # Emite mensagem de erro, caso nada seja encontrado como parâmetro de entrada. |
| 9 | + | zenity --info --title "Erro!" --text "$1" |
| 10 | - | zenity --info --title="Erro!" --text="Falta o arquivo de entrada.\n\nNenhum processo realizado." |
| 10 | + | exit 1 |
| 11 | - | else |
| 11 | + | } |
| 12 | - | arquivo="/home/$USER/.enviarParaMP4-pontoDeMontagem" |
| 12 | + | |
| 13 | - | # Se o arquivo $arquivo existir, carrega seu conteúdo em $dispositivo. |
| 13 | + | # Verifica se foi passado ao menos um arquivo de entrada. |
| 14 | - | [ -f "$arquivo" ]; read dispositivo < $arquivo |
| 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 | - | # Verifica que a variável $dispositovo possui qualquer coisa diferente de vazio. |
| 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 | - | if [ -n "$dispositivo" ]; then |
| 16 | + | dispositivoSerial="觛迦烶觓∑ፉ倢獓穓㨓┖슷⑲" |
| 17 | - | # Verifica se o dispositivo está montado. Lembrando que sua pasta não é fixa no /media. |
| 17 | + | # O subshel dessa linha retorna o número do dispositivo. |
| 18 | - | if [ -d "$dispositivo" ]; then |
| 18 | + | read dispositivo <<< $(find "/proc/scsi/usb-storage/" -type f -exec grep -l "$dispositivoSerial" {} \+ | awk -F '/' '{print "sd "$5}' | tail -n1)
|
| 19 | - | nok="" |
| 19 | + | # Verifica que a variável $dispositivo possui qualquer coisa diferente de vazio. |
| 20 | - | else |
| 20 | + | [ -n "$dispositivo" ] || erro "Infelizmente o dispositivo não foi encontrado. \n\nNenhuma ação tomada." |
| 21 | - | nok="nok" |
| 21 | + | # O subshel dessa linha retorna o "device" do dispositivo. |
| 22 | - | [ -f "$arquivo" ]; rm "$arquivo" |
| 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 | - | nok="nok" |
| 25 | + | # Verifica que a variável $dispositivo possui uma pasta de montagem válida. |
| 26 | - | [ -f "$arquivo" ]; rm "$arquivo" |
| 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 | - | # Se $dispositivo não foi caregada corretamente, ou a pasta de montagem do aparelho não foi encontrada, tenta encontrá-lo. |
| 28 | + | pastaDeMusicas="$dispositivo/musicas" |
| 29 | - | if [ "$nok" == "nok" ]; then |
| 29 | + | # Cria pasta de músicas na raíz do dispositivo, se ela não existir. |
| 30 | - | dispositivoSerial="觛迦烶觓∑ፉ倢獓穓㨓┖슷⑲" |
| 30 | + | mkdir -p "$pastaDeMusicas" |
| 31 | - | # O subshel dessa linha retorna o número do dispositivo. |
| 31 | + | # Verifica a quantidade de músicas contidas na pasta de música. |
| 32 | - | read dispositivo <<< $(find "/proc/scsi/usb-storage/" -type f -exec grep -l "$dispositivoSerial" {} \+ | awk -F '/' '{print "sd "$5}' | tail -n1)
|
| 32 | + | # Como foi dito na lista brasileira de Shell Script, MP4 Shing-lings suportam uma quantidade limitada de mp3 em uma pasta. |
| 33 | - | # Verifica que a variável $dispositovo possui qualquer coisa diferente de vazio. |
| 33 | + | # No meu caso, o aparelho suporta 999 arquivos mp3. :) |
| 34 | - | if [ -n "$dispositivo" ]; then |
| 34 | + | # Troquei a linha 'read quantidadeMP3 <<< $(ls "$pastaDeMusicas/*.mp3" | wc -l)' por essa abaixo. |
| 35 | - | # O subshel dessa linha retorna o "device" do dispositivo. |
| 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 dispositivo <<< $(dmesg | grep -e "$dispositivo.*\[.*Attached" | sed -e 's/^.*\[//g ; s/\].*$//g' | tail -n1) |
| 36 | + | read quantidadeMP3 <<< $(ls "$pastaDeMusicas" | grep -i "mp3" | wc -l) |
| 37 | - | # Nessa linha o subshel retorna o ponto de montagem do dispositivo. |
| 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 dispositivo <<< $(mount | grep -i "$dispositivo" | awk '{print $3}')
|
| 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 | - | # Verifica que a variável $dispositovo possui qualquer coisa diferente de vazio. |
| 39 | + | |
| 40 | - | if [ -n "$dispositivo" ]; then |
| 40 | + | while read mp3; do |
| 41 | - | echo $dispositivo>"$arquivo" |
| 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 | - | # Se a variável $dispositivo estiver vazia, uma mensagem de erro é emitida. |
| 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 | - | zenity --info --title="Erro!" --text="Infelizmente o dispositivo não foi encontrado." |
| 44 | + | # Não conhecia o raio do treco... Aí implementei. Acho que fica mais rápido assim. |
| 45 | read musicaAtual <<< $(basename "$mp3") | |
| 46 | - | else |
| 46 | + | # Aqui o subshell retorna o tamanho em MB da música.mp3. |
| 47 | - | # Se a variável $dispositivo estiver vazia, uma mensagem de erro é emitida. |
| 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 | - | zenity --info --title="Erro!" --text="Infelizmente o dispositivo não foi encontrado." |
| 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 | - | # Torna a verificar se a variável $dispositivo contém o caminho de um diretório válido. |
| 51 | + | if [ ! -f "$pastaDeMusicas/$musicaAtual" ]; then |
| 52 | - | if [ -d "$dispositivo" ]; then |
| 52 | + | # A pasta de músicas contém menos que 999 músicas? |
| 53 | - | pastaDeMusicas="$dispositivo/musicas" |
| 53 | + | if [ $quantidadeMP3 -lt 999 ]; then |
| 54 | - | # Cria pasta de músicas na raíz do dispositivo, se ela não existir. |
| 54 | + | # Copia a música. |
| 55 | - | mkdir -p "$pastaDeMusicas" |
| 55 | + | cp "$mp3" "$pastaDeMusicas" |
| 56 | - | read quantidadeMP3 <<< $(ls "$pastaDeMusicas/*.mp3" | wc -l) |
| 56 | + | # Calcula o espaço restante do dispositivo. |
| 57 | - | # 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. |
| 57 | + | let tamDispositivo=$tamDispositivo-$tamMP3 |
| 58 | - | read tamDispositivo <<< $(df |w 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");
|
| 58 | + | # Adiciona +1 na quantidade de músicas |
| 59 | - | while read mp3; do |
| 59 | + | let quantidadeMP3=$quantidadeMP3+1 |
| 60 | - | # O subshell retorna somente o nome da música.mp3. |
| 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 | - | read musicaAtual <<< $(echo "$mp3" | sed -e "s/^\/[[:alpha:][:digit:][:punct:] ]*\/\([[:alpha:][:digit:][:punct:] ]*\.mp3\)/\1/") |
| 61 | + | sleep 3 |
| 62 | - | # Aqui o subshell retorna o tamanho em MB da música.mp3. |
| 62 | + | # Normaliza a música.mp3 para volume de 89db sem que haja "pontos surdos". |
| 63 | - | 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");
|
| 63 | + | mp3gain -r -k "$pastaDeMusicas/$musicaAtual" |
| 64 | - | # Calcula o tamanho restante do dispositivo. |
| 64 | + | |
| 65 | - | let tamRestante=$tamDispositivo-$tamMP3 |
| 65 | + | # Se houver mais de 999 músicas. |
| 66 | - | # O tamanho da música.mp3 é menor que o espaço restante no dispositivo? |
| 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 | - | if [ $tamMP3 -lt $tamRestante ]; then |
| 67 | + | |
| 68 | - | # A música.mp3 já existe no dispositivo? |
| 68 | + | |
| 69 | - | if [ ! -f "$pastaDeMusicas/$musicaAtual" ]; then |
| 69 | + | |
| 70 | - | # O a pasta de músicas contém menos que 999 músicas? |
| 70 | + | |
| 71 | - | if [ $quantidadeMP3 -lt 999 ]; then |
| 71 | + | # Se a música.mp3 for maior que a capacidade do dispositivo, seta $capacidade e quebra o laço while. |
| 72 | - | # Copia a música. |
| 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 | - | cp "$mp3" "$pastaDeMusicas" |
| 73 | + | break |
| 74 | - | # Adiciona +1 na quantidade de músicas |
| 74 | + | |
| 75 | - | let $quantidadeMP3=$quantidadeMP3+1 |
| 75 | + | # O subshel da linha abaixo, retorna uma lista dos arquivos de entrada; um por caminho linha. |
| 76 | - | # 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. |
| 76 | + | done <<< $(echo "$*" | sed -e "s/ \//\n\//g" | grep ".mp3") |
| 77 | - | sleep 3 |
| 77 | + | # Se a variável $msgErro possuir o conteúdo diferente de vazio, emite mensagem de erro. |
| 78 | - | # Normaliza a música.mp3 para volume de 89db sem que haja "pontos surdos". |
| 78 | + | # Caso contrário, emite mensagem informando que o processo terminou com sucesso e chama a saída bem sucedida. :) |
| 79 | - | mp3gain -r -k "$pastaDeMusicas/$musicaAtual" |
| 79 | + | [ -n "$msgErro" ] && erro "$msgErro" || zenity --info --title="Transferência finalizada!" --text=" Os arquivos selecionados foram\ntrasnferidos e normalizados com sucesso!"; exit 0 |