X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/cbdb0706d73c6b94a5e5ff3a6ac37349163a7a49..1a064efbc8a90d7cd31185b1f7a2c816ec817c8c:/abcde diff --git a/abcde b/abcde index 8a3b59f..55951fc 100755 --- a/abcde +++ b/abcde @@ -11,7 +11,7 @@ # Copyright for this work is to expire January 1, 2010, after which it # shall be public domain. -VERSION="2.3.99" +VERSION="2.3.99-$Id$" usage () { @@ -209,7 +209,7 @@ run_command () fi fi case "$1" in - normalize) + normalize|normalize-audio) if [ "$RETURN" = "2" ]; then # File was already normalized. RETURN=0 @@ -288,9 +288,61 @@ relpath () # TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2 -d= | tr -d \[:cntrl:\]) # TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" -do_getcddbinfo () +do_getcddbinfo() { - : + case $1 in + TRACKNAME1) + TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" + ;; + TRACKNAME) + TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" + ;; + esac +} + +# do_gettracknum +# Get the track number we are going to use for different actions +do_gettracknum() +{ + if [ -n "$STARTTRACKNUMBER" ] ; then + # Get the trackpadding from the current track + CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) + TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) + else + TRACKNUM=${UTRACKNUM} + fi +} + +do_replaygain() +{ + run_command "" echo "Adding reply-gain information..." + for OUTPUT in $( echo $OUTPUTTYPE | tr , \ ) + do + OUTPUTFILES="" + for UTRACKNUM in $TRACKQUEUE + do + CDDBTRACKNUM=$(expr $UTRACKNUM - 1) + do_getcddbinfo TRACKNAME + splitvarious + TRACKFILE=$(mungefilename "$TRACKNAME") + ARTISTFILE=$(mungefilename "$TRACKARTIST") + ALBUMFILE=$(mungefilename "$DALBUM") + do_gettrucknum + if [ "$VARIOUSARTISTS" = "y" ]; then + OUTPUTFILE=$(eval echo $VAOUTPUTFORMAT) + else + OUTPUTFILE=$(eval echo $OUTPUTFORMAT) + fi + OUTPUTFILES="$OUTPUTDIR/$OUTPUTFILE.$OUTPUT $OUTPUTFILES" + done + case "$OUTPUT" in + flac);; + ogg);; + *);; + esac + echo vorbisgain-$OUTPUT >> "$ABCDETEMPDIR/status" + done + echo vorbisgain >> "$ABCDETEMPDIR/status" } # This code splits the a Various Artist track name from one of the following @@ -517,103 +569,112 @@ do_tag () run_command '' echo "Tagging track $1 of $TRACKS: $TRACKNAME..." # If we want to start the tracks with a given number, we need to modify the # TRACKNUM value before evaluation - if [ -n "$STARTTRACKNUMBER" -a -n "$STARTTRACKNUMBERTAG" ] ; then - # Get the trackpadding from the current track - CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) +# if [ -n "$STARTTRACKNUMBER" -a -n "$STARTTRACKNUMBERTAG" ] ; then +# # Get the trackpadding from the current track +# CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) +# TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) +# fi + if [ -n "$STARTTRACKNUMBERTAG" ] ; then + do_gettracknum fi for OUTPUT in $(echo $OUTPUTTYPE | tr , \ ) do - case "$OUTPUT" in - mp3) - # id3v2 v0.1.9 claims to have solved the -c bug, so we merge both id3 and id3v2 - GENREID=$(do_getgenreid "${CDGENRE}") - - case "$ID3SYNTAX" in - id3);; - eyed3) - # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM - run_command tagtrack-$1 $TAGGER $TAGGEROPTS --commen=::"$COMMENTOUTPUT" \ - -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" -Y "$CDYEAR" \ - -G "$GENREID" -n "${TRACKNUM:-$1}" "${TRACKNUM:+-N $TRACKS}" \ - "${ENCODING:+--set-encoding=$ENCODING}" - "$ABCDETEMPDIR/track$1.$OUTPUT" - ;; - *) - # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM - run_command tagtrack-$1 $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ - -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" -y "$CDYEAR" \ - -g "$GENREID" -T "${TRACKNUM:-$1/$TRACKS}" \ - "$ABCDETEMPDIR/track$1.$OUTPUT" - ;; - esac - ;; - vorbis|ogg) - case "$OGGENCODERSYNTAX" in - vorbize|oggenc) - # vorbiscomment can't do in-place modification, mv the file first - if [ -f "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" -a ! -f "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" ]; then - mv "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" - fi - ( - # These are from http://www.xiph.org/ogg/vorbis/doc/v-comment.html - echo ARTIST="$TRACKARTIST" - echo ALBUM="$DALBUM" - echo TITLE="$TRACKNAME" - if [ -n "$CDYEAR" ]; then - echo DATE="$CDYEAR" - fi - if [ -n "$CDGENRE" ]; then - echo GENRE="$CDGENRE" - fi - echo TRACKNUMBER=${TRACKNUM:-$1} - echo CDDB=$CDDBDISCID - if [ "$(eval echo ${COMMENT})" != "" ]; then - case "$COMMENTOUTPUT" in - *=*) echo "$COMMENTOUTPUT";; - *) echo COMMENT="$COMMENTOUTPUT";; - esac - fi - ) | run_command tagtrack-$1 $VORBISCOMMENT $VORBISCOMMENTOPTS -w \ - "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" - # Doublecheck that the commented file was created successfully before wiping the original - if [ -f "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" ]; then - rm -f "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" - else - mv "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" - fi - ;; + case "$OUTPUT" in + mp3) + # id3v2 v0.1.9 claims to have solved the -c bug, so we merge both id3 and id3v2 + GENREID=$(do_getgenreid "${CDGENRE}") + + case "$ID3SYNTAX" in + id3);; + eyed3) + # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM + run_command tagtrack-$OUTPUT-$1 $TAGGER $TAGGEROPTS --commen=::"$COMMENTOUTPUT" \ + -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" -Y "$CDYEAR" \ + -G "$GENREID" -n "${TRACKNUM:-$1}" "${TRACKNUM:+-N $TRACKS}" \ + "${ENCODING:+--set-encoding=$ENCODING}" + "$ABCDETEMPDIR/track$1.$OUTPUT" + ;; + *) + # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM + run_command tagtrack-$OUTPUT-$1 $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ + -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" -y "$CDYEAR" \ + -g "$GENREID" -T "${TRACKNUM:-$1/$TRACKS}" \ + "$ABCDETEMPDIR/track$1.$OUTPUT" + ;; + esac + ;; + vorbis|ogg) + case "$OGGENCODERSYNTAX" in + vorbize|oggenc) + # vorbiscomment can't do in-place modification, mv the file first + if [ -f "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" -a ! -f "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" ]; then + mv "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" + fi + ( + # These are from http://www.xiph.org/ogg/vorbis/doc/v-comment.html + echo ARTIST="$TRACKARTIST" + echo ALBUM="$DALBUM" + echo TITLE="$TRACKNAME" + if [ -n "$CDYEAR" ]; then + echo DATE="$CDYEAR" + fi + if [ -n "$CDGENRE" ]; then + echo GENRE="$CDGENRE" + fi + echo TRACKNUMBER=${TRACKNUM:-$1} + echo CDDB=$CDDBDISCID + if [ "$(eval echo ${COMMENT})" != "" ]; then + case "$COMMENTOUTPUT" in + *=*) echo "$COMMENTOUTPUT";; + *) echo COMMENT="$COMMENTOUTPUT";; + esac + fi + ) | run_command tagtrack-$OUTPUT-$1 $VORBISCOMMENT $VORBISCOMMENTOPTS -w \ + "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" + # Doublecheck that the commented file was created successfully before wiping the original + if [ -f "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" ]; then + rm -f "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" + else + mv "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" + fi + ;; + esac + ;; + flac) + ( + echo ARTIST="$TRACKARTIST" + echo ALBUM="$DALBUM" + echo TITLE="$TRACKNAME" + if [ -n "$CDYEAR" ]; then + echo DATE="$CDYEAR" + fi + if [ -n "$CDGENRE" ]; then + echo GENRE="$CDGENRE" + fi + echo TRACKNUMBER="${TRACKNUM:-$1}" + echo CDDB="$CDDBDISCID" + if [ "$(eval echo ${COMMENT})" != "" ]; then + case "$COMMENTOUTPUT" in + *=*) echo "$COMMENTOUTPUT";; + *) echo COMMENT="$COMMENTOUTPUT";; + esac + fi + ) | run_command tagtrack-$OUTPUT-$1 $METAFLAC $METAFLACOPTS --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER" + ;; + spx) + run_command tagtrack-$OUTPUT-$1 true + ;; + mpc) + run_command tagtrack-$OUTPUT-$1 true + ;; esac - ;; - flac) - ( - echo ARTIST="$TRACKARTIST" - echo ALBUM="$DALBUM" - echo TITLE="$TRACKNAME" - if [ -n "$CDYEAR" ]; then - echo DATE="$CDYEAR" - fi - if [ -n "$CDGENRE" ]; then - echo GENRE="$CDGENRE" - fi - echo TRACKNUMBER=${TRACKNUM:-$1} - echo CDDB=$CDDBDISCID - if [ "$(eval echo ${COMMENT})" != "" ]; then - case "$COMMENTOUTPUT" in - *=*) echo "$COMMENTOUTPUT";; - *) echo COMMENT="$COMMENTOUTPUT";; - esac - fi - ) | run_command tagtrack-$1 $METAFLAC $METAFLACOPTS --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER" - ;; - spx) - run_command tagtrack-$1 true - ;; - mpc) - run_command tagtrack-$1 true - ;; - esac done + if checkerrors "tagtrack-(.{3,4})-$1"; then + run_command tagtrack-$1 false + else + run_command tagtrack-$1 true + fi + } # do_batch_encode @@ -635,7 +696,7 @@ do_batch_encode () do TRACKFILES="$TRACKFILES track$UTRACKNUM.wav" done - nice $ENCNICE $MP3ENCODER $MP3ENCODEROPTS --nogap $TRACKFILES + nice $ENCNICE $MP3ENCODER $MP3ENCODEROPTS `[ "$MP3ENCODER" = "lame" ] && echo "--nogap"` $TRACKFILES RETURN=$? if [ "$RETURN" != "0" ]; then echo "batch-encode: $ENCODER returned code $RETURN" >> errors @@ -800,10 +861,8 @@ do_encode () fi fi else - if [ "$(checkstatus encode-output)" = "loud" ]; then - echo "HEH! The file we were about to encode disappeared:" - echo ">> $IN" - fi + run_command "" echo "HEH! The file we were about to encode disappeared:" + run_command "" echo ">> $IN" run_command encodetrack-$1 false fi } @@ -981,14 +1040,6 @@ do_move () { for OUTPUT in $(echo $OUTPUTTYPE | tr , \ ) do - case $OUTPUT in - vorbis|ogg) - OUTPUT=$OGGOUTPUTCONTAINER - ;; - flac) - OUTPUT=$FLACOUTPUTCONTAINER - ;; - esac # Create ALBUMFILE, ARTISTFILE, TRACKFILE # Munge filenames as follows: # ' ' -> '_' @@ -1003,13 +1054,14 @@ do_move () YEAR=$(echo $CDYEAR) # If we want to start the tracks with a given number, we need to modify the # TRACKNUM value before evaluation - if [ -n "$STARTTRACKNUMBER" ] ; then - # Get the trackpadding from the current track - CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) - else - TRACKNUM=${UTRACKNUM} - fi + # if [ -n "$STARTTRACKNUMBER" ] ; then + # # Get the trackpadding from the current track + # CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) + # TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) + # else + # TRACKNUM=${UTRACKNUM} + # fi + do_gettracknum # Supported variables for OUTPUTFORMAT are GENRE, ALBUMFILE, ARTISTFILE, # TRACKFILE, and TRACKNUM. if [ "$VARIOUSARTISTS" = "y" ]; then @@ -1017,34 +1069,43 @@ do_move () else OUTPUTFILE=$(eval echo $OUTPUTFORMAT) fi - # Check that the directory for OUTPUTFILE exists, if it doesn't, create it - OUTPUTFILEDIR=$(dirname "$OUTPUTDIR/$OUTPUTFILE") - # mkdir -p shouldn't return an error if the directory already exists - mkdir -p "$OUTPUTFILEDIR" - # Silence the Moving output since it overlaps with encoding processes... - #run_command '' vecho "Moving track$1.$OUTPUT to $OUTPUTDIR/$OUTPUTFILE.$OUTPUT" - run_command movetrack-$1 mv "$ABCDETEMPDIR/track$1.$OUTPUT" "$OUTPUTDIR/$OUTPUTFILE.$OUTPUT" - # Lets move the cue file - if CUEFILE=$(checkstatus cuefile) >/dev/null ; then - if [ -r "$ABCDETEMPDIR/$CUEFILE" ]; then - if checkstatus movecue-$OUTPUT; then :; else - # Silence the Copying output since it overlaps with encoding processes... - #run_command '' vecho "Copying cue file to its destination directory..." - if checkstatus onetrack >/dev/null ; then - case $OUTPUT in - # NOTE: Creating a cue file with the 3-char-extension files is to comply with - # http://brianvictor.tripod.com/mp3cue.htm#details - [a-z0-9][a-z0-9][a-z0-9]) - run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTDIR/$OUTPUTFILE.cue" - ;; - *) - run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTDIR/$OUTPUTFILE.$OUTPUT.cue" - ;; - esac - else - run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTFILEDIR/$CUEFILE" + if checkerrors "tagtrack-$OUTPUT-$1"; then :; else + # Once we know the specific output was successful, we can change the OUTPUT to the value containing the container + case $OUTPUT in + vorbis|ogg) + OUTPUT=$OGGOUTPUTCONTAINER + ;; + flac) + OUTPUT=$FLACOUTPUTCONTAINER + ;; + esac + # Check that the directory for OUTPUTFILE exists, if it doesn't, create it + OUTPUTFILEDIR=$(dirname "$OUTPUTDIR/$OUTPUTFILE") + # mkdir -p shouldn't return an error if the directory already exists + mkdir -p "$OUTPUTFILEDIR" + run_command movetrack-$1 mv "$ABCDETEMPDIR/track$1.$OUTPUT" "$OUTPUTDIR/$OUTPUTFILE.$OUTPUT" + # Lets move the cue file + if CUEFILE=$(checkstatus cuefile) >/dev/null ; then + if [ -r "$ABCDETEMPDIR/$CUEFILE" ]; then + if checkstatus movecue-$OUTPUT; then :; else + # Silence the Copying output since it overlaps with encoding processes... + #run_command '' vecho "Copying cue file to its destination directory..." + if checkstatus onetrack >/dev/null ; then + case $OUTPUT in + # NOTE: Creating a cue file with the 3-char-extension files is to comply with + # http://brianvictor.tripod.com/mp3cue.htm#details + [a-z0-9][a-z0-9][a-z0-9]) + run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTDIR/$OUTPUTFILE.cue" + ;; + *) + run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTDIR/$OUTPUTFILE.$OUTPUT.cue" + ;; + esac + else + run_command movecue-$OUTPUT cp "$ABCDETEMPDIR/$CUEFILE" "$OUTPUTFILEDIR/$CUEFILE" + fi + echo movecue-$OUTPUT >> "$ABCDETEMPDIR/status" fi - echo movecue-$OUTPUT >> "$ABCDETEMPDIR/status" fi fi fi @@ -1100,19 +1161,22 @@ do_playlist () do # Shares some code with do_move since the filenames have to match CDDBTRACKNUM=$(expr $UTRACKNUM - 1) - TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2 -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//') + #TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2 -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//') + do_getcddbinfo TRACKNAME splitvarious TRACKFILE=$(mungefilename "$TRACKNAME") ARTISTFILE=$(mungefilename "$TRACKARTIST") + ALBUMFILE=$(mungefilename "$DALBUM") # If we want to start the tracks with a given number, we need to modify the # TRACKNUM value before evaluation - if [ -n "$STARTTRACKNUMBER" ] ; then - # Get the trackpadding from the current track - CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) - else - TRACKNUM=${UTRACKNUM} - fi + # if [ -n "$STARTTRACKNUMBER" ] ; then + # # Get the trackpadding from the current track + # CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) + # TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) + # else + # TRACKNUM=${UTRACKNUM} + # fi + do_gettrucknum if [ "$VARIOUSARTISTS" = "y" ]; then OUTPUTFILE=$(eval echo $VAOUTPUTFORMAT) else @@ -1989,7 +2053,8 @@ do_cdread () echo "Grabbing ${PIPE_MESSAGE}tracks $UTRACKNUM - $LASTTRACK as one track ..." >&2 else if [ -r "$CDDBDATA" ]; then - TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2 -d= | tr -d \[:cntrl:\]) + #TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2 -d= | tr -d \[:cntrl:\]) + do_getcddbinfo TRACKNAME echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM: $TRACKNAME..." >&2 else echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM..." >&2 @@ -3074,7 +3139,8 @@ do # TRACKNUM=$(printf %0.${TRACKNUMPADDING}d $(expr ${UTRACKNUM} + 0)) TRACKNUM=$UTRACKNUM CDDBTRACKNUM=$(expr $UTRACKNUM - 1) - TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" + #TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" + do_getcddbinfo TRACKNAME splitvarious fi fi @@ -3145,6 +3211,9 @@ if [ "$DOENCODE" = "y" -a "$USEPIPES" != "y" ]; then fi # If the above didn't catch the stragglers, this will wait +if checkstatus replaygain; then :; else + do_replaygain +fi # Check to see if run_command logged any errors if [ -f "$ABCDETEMPDIR/errors" ]; then echo "The following commands failed to run:"