Introdução
Lendo alguns artigos sobre o yad [1][2] tive a idéia de criar uma simples aplicação gráfica que pudesse servir como front-end para o eyeD3. Para quem não sabe, o eyeD3 é um programa de linha de comando que etiqueta um arquivo de áudio com valores do tipo nome do artista, álbum, música, número da faixa e imagem do álbum.[3]
Nesse post de hoje iremos aprender mostrar como usar o script deye.
O código
O código do deye está disponível logo abaixo. Confira a página de Downloads para obter a versão atual do script.
#!/bin/bash # [deye] # Programa que seta tags ID3 em arquivos # de música usando a interface gráfica # fornecida pelo YAD. # # [Autor] # Daemonio (Marcos Paulo Ferreira) # undefinido at gmail com # https://daemoniolabs.wordpress.com # # [uso] # ./deye arquivo1.mp3 arquivo2.mp3 ... # # Após a execução preencha as tags, selecione # a imagem do album e escolha a versão de tags # ID3 a ser utilizada. # # [Dependências] # -- eyeD3 # -- yad # # Versao 1, by daemonio # Versão 2.0 by daemonio @ Sun Dec 15 11:49:24 BRST 2013 # + Muita coisa mudou com a nova versão do eyeD3 # + RENAMEMASK agora usa anotação de '$' ao # invés da antiga '%'. # Exemplo: artista é $artist ao invés de %a # + Não existe a opção --year mais. Aqui usamos # a opção --recording-date como equivalente. # + Corrigido o erro de renomear mesmo clicando # em cancelar. # + Corrigido o erro de leitura de arquivos inválidos. # + Acrescentado a funcionalidade de preencher as # tags já no arquivo nos campos da tela gráfica. # + Acrescentada a função encontrar_dependencia que # finaliza o script caso alguma dependência não foi # encontrada. # + Acrescentada a opção de 'Deletar todas tags no arquivo' # # Abaixo alguns TODO's caso você queira me ajudar a # melhorar o script: # # TODO: O script gera erro em arquivos contendo # aspas (simples ou duplas). O erro ocorre # por causa do eval que tenta casa um par # de aspas # TODO: Mostrar a imagem do album na própria # tela do yad (na janela principal) -- se possível # TODO: ler e gerar arquivos info.txt. # Veja o script dtag.sh no blog. # # Arquivo temporário que armazena a saída do yad INFOFILE="/tmp/infofile$$" # Arquivo temporário que armazena as tags já # existentes no arquivo de música TAGSFILE="/tmp/tagsfile$$" # Armazena o caminho da imagem do album APICFILE= # Armazena as opções do eyeD3 EYEOPTIONS= # Indica qual versão será utilizada FLAGVERSION= # O valor TRUE indica que as tags antigas # serão removidas (opção --remove-all # do eyeD3). DELETEOLDTAGS= # Máscara usada para renomear o arquivo RENAMEMASK='$track:num-$artist-$album-$title' # Se TRUE, renomeia o arquivo de acordo com # a máscara em RENAMEMASK. Essa variável # também controla o valor da checkbox no yad. RENAMEFLAG='TRUE' # Valor TRUE indica que a tela de confirmação # será mostrada. Essa variável tambem controla # o valor da checkbox no yad. ASKFLAG='TRUE' # Armazena o valor de $? da janela de confirmação ASKRET= # Armazena o nome do arquivo atual MUSICFILE= # Armazena o ano YEAR= # Hash que armazena tags já no arquivo declare -A TAGS # Função que retorna erro caso uma dependência não foi # encontrada function encontrar_dependencia { local A=`whereis "$1"` if ! [[ $A =~ '/' ]] then tput setaf 1; tput bold echo "O programa $1 parece não estar instalado. Instale-o antes" echo "de usar." tput sgr0 exit 1; fi } # # MAIN # # Testa linha de comando [ -z "$1" ] && echo '[uso] deye [FILE...]' && exit 1 # Checa as dependências. O script é finalizado se # uma delas não é encontrada. encontrar_dependencia 'yad' encontrar_dependencia 'eyeD3' # O exec desliga tanto stdout quanto stderr. # Para fins de debug essas linhas devem ser # comentadas #exec 1> /dev/null #exec 2> /dev/null # Processa cada arquivo passado # pela linha de comando for MUSICFILE in "$@" do # Testa se arquivo existe [ -e $MUSICFILE ] || { echo 'Erro: arquivo '"$MUSICFILE"' não encontrado.'; continue ; } # Obtém as tags det texto já no arquivo eyeD3 "$MUSICFILE" | sed '1,5d;/genre:/s/genre: \(.*\)(.*/\ngenre: \1/' > $TAGSFILE while read LINHA do chave=$(echo "$LINHA" | cut -f1 -d ':') valor=$(echo "$LINHA" | cut -f2- -d ':') # Armazena tags no hash. valor=$(sed 's/^ *//'<<<"$valor") [ "$chave" ] && TAGS["$chave"]="$valor" #[ "$chave" = "add-image" ] && TAGS["$chave"]="${valor}:FRONT_COVER" done < $TAGSFILE rm -f $TAGSFILE # Apresenta a tela do yad [ -z ${TAGS['release date']} ] && YEAR="${TAGS['recording date']}" || YEAR=${TAGS['release date']} yad --form \ --title "`basename "$MUSICFILE"`" \ --width=350 \ --columns=2 \ --field='Banda:' "${TAGS[artist]}" \ --field='Album:' "${TAGS[album]}" \ --field='Musica:' "${TAGS[title]}" \ --field='Track:':NUM "${TAGS[track]}" \ --field='Genero:' "${TAGS[genre]}" \ --field='Ano:' "$YEAR" \ --field='[ Selecionar Imagem do Album ]':BTN "yad --width 600 --height 500 --file --file-filter 'Imagem|*.jpg *.png *.jpeg'" \ --field='Renomear usando a mascara abaixo':CHK $RENAMEFLAG \ --field='Mascara: ' "$RENAMEMASK" \ --field='Escolha a versão ID3v2':LBL '' \ --field='2.3':CHK TRUE --field='2.4':CHK FALSE --field='Deletar todas tags no arquivo':CHK FALSE \ --field='Confirmar antes de salvar':CHK $ASKFLAG > $INFOFILE # Se clicou em 'Cancelar', pula para o próximo arquivo [ "$?" = "1" ] && continue # Se há 2 linhas em $INFOFILE é porque uma imagem # para o album foi selecionada. O caminho dessa imagem # está na primeira linha do arquivo e variável APICFILE # armazenará tal caminho if [ `wc -l "$INFOFILE" | awk '{print $1}'` -gt 1 ] then APICFILE=$(sed -n 1p $INFOFILE) sed -i '1d' $INFOFILE fi # Armazena todas as opções do programa eyeD3. # Para cada arquivo de audio é necessário # zerar essa variável EYEOPTIONS= # Alguns valores do contador indexam campos # específicos do retorno do yad COUNTER=0 # Troca o delimitador de argumentos para '|' # O yad retorna os valores dos campos separados # por '|' OIFS=$IFS; IFS='|' for FIELD in `cat $INFOFILE` do let COUNTER++ [ -z $FIELD ] && continue case $COUNTER in 1) EYEOPTIONS=$EYEOPTIONS"--artist '$FIELD' " ;; 2) EYEOPTIONS=$EYEOPTIONS"--album '$FIELD' " ;; 3) EYEOPTIONS=$EYEOPTIONS"--title '$FIELD' " ;; 4) EYEOPTIONS=$EYEOPTIONS"--track ${FIELD%.*} " ;; 5) EYEOPTIONS=$EYEOPTIONS"--genre '$FIELD' " ;; 6) EYEOPTIONS=$EYEOPTIONS"--recording-date '$FIELD' " ;; 8) RENAMEFLAG=$FIELD ;; 10) RENAMEMASK=$FIELD ;; 11) if [ "$FIELD" = "TRUE" ] then EYEOPTIONS="--to-v2.3 "$EYEOPTIONS FLAGVERSION=1 fi ;; 12) if [ -z "$FLAGVERSION" -a "$FIELD" = "TRUE" ] then EYEOPTIONS="--to-v2.4 "$EYEOPTIONS fi ;; 13) DELETEOLDTAGS=$FIELD ;; 14) ASKFLAG=$FIELD esac done IFS=$OIFS # Se $APICFILE foi setada então devemos inserir a opção # --add-image [ "$APICFILE" ] && EYEOPTIONS=$EYEOPTIONS"--add-image '$APICFILE':FRONT_COVER" # TRUE se pelo menos um campo do formulário # foi preenchido if [ "$EYEOPTIONS" ] then # Mostra tela de confirmação [ "$ASKFLAG" = "TRUE" ] && yad --text 'Salvar alterações no arquivo?' # "1" se clicou em Cancelar ASKRET=$? # Se clicou em OK na tela acima OU desmarcou a checkbox # relativo a tela de confirmação, então executa o # eyeD3 if [ "$ASKRET" = "0" -o "$ASKFLAG" = "FALSE" ] then # Remove tags antigas [ "$DELETEOLDTAGS" = "TRUE" ] && eyeD3 --remove-all "$MUSICFILE" # Chama o eyeD3 com eval eval eyeD3 $EYEOPTIONS "'$MUSICFILE'" # Renomeia o arquivo de áudio de acordo com a máscara dada [ "$RENAMEFLAG" = "TRUE" ] && eyeD3 --rename "$RENAMEMASK" "$MUSICFILE" fi fi done # Remove o arquivo temporário rm -f $INFOFILE #EOF
O script
Para executar o script é preciso passar o nome do arquivo de áudio por parâmetro na linha de comando:
$ ./deye musica.mp3
Vários arquivos também podem ser passados inclusive usando caracteres coringas:
$ ./deye *.mp3
Após a execução a seguinte tela irá aparecer:
Repare que o título da janela é o mesmo que o nome do arquivo sendo tratado no momento. Veja também que se o arquivo já contiver tags, então elas serão recuperadas e mostradas na tela do programa.
Os campos do lado esquerdo representam as tags que irão para o arquivo de música, como nome da banda, da música e ano de gravação. A imagem do album pode ser selecionada ao se clicar em “Selecionar imagem do album”.
Em relação as checkboxes:
Renomear usando a máscaras abaixo: Se marcada, o script irá renomear o arquivo de áudio usando o formato ditado pela máscara. Essa máscara é passada diretamente para o eyeD3 e seus formatos válidos são [3]:
+-----------+----------------+ |$track:num |Número da faixa | +-----------+----------------+ | $artist | Artista/Banda | +-----------+----------------+ | $album | Nome do album | +-----------+----------------+ | $title | Nome da música | +-----------+----------------+
Versão ID3v2, 2.3 ou 2.4: Essas caixas escolhem qual versão das tags ID3v2 que será usada. Eu coloquei somente as versões 2.3 e 2.4 por serem mais usadas e coloquei a 2.3 marcada por padrão por ela representar maior compatibilidade. A escolha de qual versão escolher depende do usuário e somente uma delas deve ser marcada.
Deletar todas as tags no arquivo: se marcada faz com que todas as tags no arquivo sejam apagadas antes de inserir as novas tags. O padrão é a opção não ser marcada fazendo com que as tags no arquivo sejam sempre mantidas caso não sofram atualização. Por exemplo, se somente o campo do nome do artista for preenchido, as tags relacionadas com o nome da música e do album ainda continuaram no arquivo.
Confirmar antes de salvar: Se marcada, essa opção diz para o deye mostrar uma janela de confirmação antes de etiquetar o arquivo de áudio. Essa janela ajuda naqueles casos em que escrevemos algo errado e só percebemos isso na última hora.
Conclusão
No mais é isso. Fiz o máximo para manter o script simples e facilmente usável. Qualquer dúvida, sugestão, dica de implementação (principalmente nos TODOs) poste nos comentários.
Referências
[1] Yad 0.16 – Eu quero sempre mais de ti, por Raimundo Alves Portela (Acessado em: Fevereiro/2012)
http://www.vivaolinux.com.br/artigo/Yad-016-Eu-quero-sempre-mais-de-ti
[2] YAD – Yet Another Dialog, por Júlio Cezar Neves (Acessado em: Fevereiro/2012)
http://www.dicas-l.com.br/arquivo/yad_yet_another_dialog.php
[3] Manipulando Tags ID3 Com O eyeD3, por Daemonio (Acessado em: Fevereiro/2012)
https://daemoniolabs.wordpress.com/2011/11/24/manipulando-tags-id3-com-o-eyed3/
Pingback: deye 1.1 | Daemonio Labs
Pingback: dtag.sh: Taguear Músicas MP3 No Terminal | Daemonio Labs
Postagem atualizada em 15/12/2013.
ps. tb esta ok para quotes nas tags
Ok, obrigado! Eu ainda uso este script, muito útil. Abraços