Este é o script que estou usando agora:
#!/bin/bash
echo "checking $1"
find "$1" -name "*.mp3" | while read filename; do
echo "checking $(basename "$filename")"
ffmpeg_dur=$(ffmpeg -i "$filename" 2>&1 | awk -F: '($1 ~ /Duration/) {printf "60*%d+%d\n", $3, $4}' | bc)
# mp3_check_dur=$(mp3_check -a "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /SONG_LENGTH/) {printf "60*%d+%d\n", $2, $3}' | bc )
mp3info_dur=$(mp3info -x "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /Length/) {printf "60*%d+%d\n", $2, $3}' | bc )
if [[ -z $ffmpeg_dur ]] ; then # some files are so broken that ffmpeg doesn't print a length
echo "ERROR (ffmpeg): $filename"
else
len_diff=$(( $ffmpeg_dur - $mp3_check_dur ))
if [[ $len_diff -gt 0 ]] ; then
echo -e "ERROR (length): $filename\t${len_diff}"
fi
fi
done
A duração relatada por ffmpeg
é sempre maior que a de mp3_check
e mp3info
. Às vezes há uma diferença de 1 segundo entre os últimos também. mp3info
está disponível como pacote para algumas distribuições linux (Ubuntu, Arch, ...?), mp3_check
tem que ser construído a partir da fonte.