deye : Usando o yad + eyeD3

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:

Tela do deye

Tela do deye

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/

3 pensamentos sobre “deye : Usando o yad + eyeD3

  1. Pingback: deye 1.1 | Daemonio Labs

  2. Pingback: dtag.sh: Taguear Músicas MP3 No Terminal | Daemonio Labs

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s