Classificando uma biblioteca de música por BPM

Classificando uma biblioteca de música por BPM

Estou usando uma ferramenta chamada bpm-tag que recebe um arquivo mp3 ("myfile.mp3") como entrada e gera "myfile.mp3: XX.XXX BPM". Gostaria de executar um script que percorre minha biblioteca de músicas, calcula o BPM de cada música e a move para um diretório de acordo com seu BPM (por exemplo, diretório "Lento" para <80 BPM, etc.). Tenho uma vaga ideia de como fazer isso mas não sei como analisar a saída do bpm-tag para obter o valor do BPM.

Alguma sugestão ?

Responder1

Aqui está o que eu fiz. Pareceu funcionar (mas infelizmente o bpm-tag não foi preciso o suficiente para muitas músicas...).

#!/bin/bash

cd /path/to/my/library

while IFS= read -r -d '' FILE; do
    BPM=$(bpm-tag -f -n "$FILE" 2>&1 | sed "s/.mp3:/%/" | cut -d'%' -f2 | sed "s/ BPM//" | sed "s/^ //" | cut -d'.' -f1) 
#bpm-tag has its output in stderr, so I use 2>&1 to redirect it to stdout, then format it with sed and cut
    if [ "$BPM" -le 130 ]
        then cp "$FILE" /path/to/my/library/Slow/
    elif [ "$BPM" -le 180 ]
        then cp "$FILE" /path/to/my/library/Medium/
    else cp "$FILE" /path/to/my/library/Fast/
    fi
done < <(find . -type f -name '*.mp3' -print0)

Aqui fazendo

while IFS= read -r -d '' FILE; do
    echo "$FILE"
done < <(find . -type f -name '*.mp3' -print0)

imprime todos os arquivos (-type f) terminados em .mp3 (-name '*.mp3') que estão na pasta ou em uma de suas subpastas. Pelo que entendi, as opções -print0 e -r -d '' são para fins de formatação, mas não entendo como funciona.

informação relacionada