#!/bin/sh # # Copyright (C) 2013 Mark Hills # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License version 2 for more details. # # You should have received a copy of the GNU General Public License # version 2 along with this program; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # # Analyse an audio file and add BPM metadata # set -e usage() { cat < Usage: bpm-tag [options] Tag an audio file with tempo (in beats-per-minute, BPM) -f Ignore existing BPM value -n Display BPM only, don't tag -m Minimum detected BPM -x Maximum detected BPM -h Display this help message and exit See the bpm-tag(1) man page for more information and examples. END } # Parse command line arguments FORCE=false WRITE=true ARGS="" while getopts "fhnm:x:" OPT; do case "$OPT" in f) FORCE=true ;; n) WRITE=false ;; m) ARGS="$ARGS -m $OPTARG" ;; x) ARGS="$ARGS -x $OPTARG" ;; h) usage exit 0 ;; ?) exit 1 esac done shift $((OPTIND - 1)) if [ -z "$1" ]; then usage >&2 exit 1 fi set -u FILE="$1" shift # Don't overwrite an existing BPM tag case "$FILE" in *.flac) BPM=`metaflac --show-tag=BPM "$FILE" | sed -e 's/BPM=//'` ;; *.mp3) BPM=`id3v2 -R "$FILE" | sed -n 's/^TBPM.*: \([0-9\.]\+\)/\1/p'` ;; *.ogg) BPM=`vorbiscomment "$FILE" | sed -n 's/^BPM=//p'` ;; *.m4a) BPM=`mp4info "$FILE" | sed -n 's/^\s*BPM://p'` ;; *) echo "$FILE: file extension not known" >&2 exit 1 ;; esac if [ -n "$BPM" ] && ! $FORCE; then echo "$FILE: already tagged, $BPM BPM" >&2 exit 1 fi # Analyse the BPM BPM=`sox -V1 "$FILE" -r 44100 -e float -c 1 -t raw - | bpm $ARGS` if [ -z "$BPM" ]; then exit 1 fi echo "$FILE: $BPM BPM" >&2 if ! $WRITE; then exit 0 fi # Write a BPM tag case "$FILE" in *.flac) metaflac --remove-tag=BPM --set-tag="BPM=$BPM" "$FILE" ;; *.mp3) id3v2 --TBPM "$BPM" "$FILE" ;; *.ogg) vorbiscomment -at "BPM=$BPM" "$FILE" ;; *.m4a) mp4tags -tempo "$BPM" "$FILE" ;; *) echo "$FILE: don't know how to tag this type of file" >&2 exit 1 esac