diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index 8dac282..49992a2 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -1,5 +1,6 @@ # Makefile.am - process with automake to produce Makefile.in bin_PROGRAMS = cuebreakpoints cueconvert cueprint +bin_SCRIPTS = cuetag.sh LDADD = ../lib/libcuefile.a AM_CPPFLAGS = -I$(srcdir)/../lib diff --git a/src/tools/cuetag.sh b/src/tools/cuetag.sh new file mode 100755 index 0000000..123ba4d --- /dev/null +++ b/src/tools/cuetag.sh @@ -0,0 +1,180 @@ +#! /bin/sh + +# cuetag.sh - tag files based on cue/toc file information +# uses cueprint output +# usage: cuetag.sh [file]... + +CUEPRINT=cueprint +cue_file="" + +# print usage instructions +usage() +{ + echo "usage: cuetag.sh [file]..." + echo + echo "cuetag.sh adds tags to autofiles based on cue or toc information" + echo + echo "Supported formats (format extension, format name, tagging utility):" + echo "ogg, Ogg Vorbis, vorbiscomment" + echo "flac, FLAC, metaflac" + echo "mp3, MP3, mp3info" + echo + echo "cuetag.sh uses cueprint, which must be in your path" +} + +# Vorbis Comments +# for FLAC and Ogg Vorbis files +vorbis() +{ + # FLAC tagging + # --remove-vc-all overwrites existing comments + METAFLAC="metaflac --remove-vc-all --import-vc-from=-" + + # Ogg Vorbis tagging + # -w overwrites existing comments + # -a appends to existing comments + VORBISCOMMENT="vorbiscomment -w -c -" + + case "$2" in + *.[Ff][Ll][Aa][Cc]) + VORBISTAG=$METAFLAC + ;; + *.[Oo][Gg][Gg]) + VORBISTAG=$VORBISCOMMENT + ;; + esac + + # space seperated list of recomended stardard field names + # see http://www.xiph.org/ogg/vorbis/doc/v-comment.html + # TRACKTOTAL is not in the Xiph recomendation, but is in common use + + fields='TITLE VERSION ALBUM TRACKNUMBER TRACKTOTAL ARTIST PERFORMER COPYRIGHT LICENSE ORGANIZATION DESCRIPTION GENRE DATE LOCATION CONTACT ISRC' + + # fields' corresponding cueprint conversion characters + # seperate alternates with a space + + TITLE='%t' + VERSION='' + ALBUM='%T' + TRACKNUMBER='%n' + TRACKTOTAL='%N' + ARTIST='%c %p' + PERFORMER='%p' + COPYRIGHT='' + LICENSE='' + ORGANIZATION='' + DESCRIPTION='%m' + GENRE='%g' + DATE='' + LOCATION='' + CONTACT='' + ISRC='%i %u' + + (for field in $fields; do + value="" + for conv in `eval echo \\$$field`; do + value=`$CUEPRINT -n $1 -t "$conv\n" $cue_file` + + if [ -n "$value" ]; then + echo "$field=$value" + break + fi + done + done) | $VORBISTAG "$2" +} + +id3() +{ + MP3INFO=mp3info + + # space seperated list of ID3 v1.1 tags + # see http://id3lib.sourceforge.net/id3/idev1.html + + fields="TITLE ALBUM ARTIST YEAR COMMENT GENRE TRACKNUMBER" + + # fields' corresponding cueprint conversion characters + # seperate alternates with a space + + TITLE='%t' + ALBUM='%T' + ARTIST='%p' + YEAR='' + COMMENT='%c' + GENRE='%g' + TRACKNUMBER='%n' + + for field in $fields; do + value="" + for conv in `eval echo \\$$field`; do + value=`$CUEPRINT -n $1 -t "$conv\n" $cue_file` + + if [ -n "$value" ]; then + break + fi + done + + if [ -n "$value" ]; then + case $field in + TITLE) + $MP3INFO -t "$value" "$2" + ;; + ALBUM) + $MP3INFO -l "$value" "$2" + ;; + ARTIST) + $MP3INFO -a "$value" "$2" + ;; + YEAR) + $MP3INFO -y "$value" "$2" + ;; + COMMENT) + $MP3INFO -c "$value" "$2" + ;; + GENRE) + $MP3INFO -g "$value" "$2" + ;; + TRACKNUMBER) + $MP3INFO -n "$value" "$2" + ;; + esac + fi + done +} + +main() +{ + if [ $# -lt 1 ]; then + usage + exit + fi + + cue_file=$1 + shift + + ntrack=`cueprint -d '%N' $cue_file` + trackno=1 + + if [ $# -ne $ntrack ]; then + echo "warning: number of files does not match number of tracks" + fi + + for file in $@; do + case $file in + *.[Ff][Ll][Aa][Cc]) + vorbis $trackno "$file" + ;; + *.[Oo][Gg][Gg]) + vorbis $trackno "$file" + ;; + *.[Mm][Pp]3) + id3 $trackno "$file" + ;; + *) + echo "$file: uknown file type" + ;; + esac + trackno=$(($trackno + 1)) + done +} + +main "$@"