X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/b470d3eb6f7a99b737185bf1572d81d7fae4f1b4..d847529d086db49427251f34824b0fd4f20e8ee8:/abcde diff --git a/abcde b/abcde index 6fd1506..41c767a 100755 --- a/abcde +++ b/abcde @@ -13,7 +13,7 @@ # # $Id$ -VERSION='2.4.1' +VERSION='2.5.1-UNRELEASED' usage () { @@ -46,7 +46,7 @@ echo "-L Use local CDDB storage directory" echo "-n No lookup. Don't query CDDB, just create and use template" echo "-N Noninteractive. Never prompt for anything" echo "-m Modify playlist to include CRLF endings, to comply with some players" -echo " WARNING: Deprecated. Use \"cue\" action" +#echo " WARNING: Deprecated. Use \"cue\" action" #echo "-M Create a CUE file" echo "-o " echo " Output file type(s) (vorbis,mp3,flac,spx,mpc,wav,m4a). Defaults to vorbis" @@ -68,7 +68,7 @@ echo "-V Be a bit more verbose about what is happening behind the scenes" echo "-x Eject CD after all tracks are read" echo "-w " echo " Add a comment to the CD tracks" -echo "-W <#> Concatenate CDs: -T #01 -w \"CD #\"" +echo "-W <#> Concatenate CDs: -T #01 -w \"CD #\"" echo "-z Use debug CDROMREADERSYNTAX option (needs cdparanoia)" echo "" echo "Tracks is a space-delimited list of tracks to grab." @@ -83,7 +83,7 @@ addstatus () } # log [level] [message] -# +# # log outputs the right message in a common format log () { @@ -389,7 +389,7 @@ diffentries () PARSECHOICE2=$(echo $CDDBDIFFCHOICE | cut -d"," -f2 | xargs printf %d 2>/dev/null) if [ $PARSECHOICE1 -lt 1 ] || [ $PARSECHOICE1 -gt $CDDBDIFFCHOICES ] || \ [ $PARSECHOICE2 -lt 1 ] || [ $PARSECHOICE2 -gt $CDDBDIFFCHOICES ] || \ - [ $PARSECHOICE1 -eq $PARSECHOICE2 ]; then + [ $PARSECHOICE1 -eq $PARSECHOICE2 ]; then echo "Invalid diff range. Please select two comma-separated numbers between 1 and $CDDBDIFFCHOICES" >&2 else # We parse the 2 choices to diff, store them in temporary files and diff them. @@ -421,7 +421,7 @@ getcddbinfo() TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')" ;; TRACK-INFO) - grep ^EXTT$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | perl -p -e 's/\\n/\n/;' + grep ^EXTT$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\\n/\n/g' ;; esac } @@ -489,8 +489,18 @@ makeids () PREGAP=$(($(echo $OFFSETS | cut -f1 -d' '))) TOTALTIME=$(( (($LEADOUT + $LEADIN + $PREGAP) / $CDFRAMES) - (($LEADIN + $PREGAP) / $CDFRAMES))) - printf -v HEXSUM "%08lx" $(( ($CDDBCKSUM % 0xff) << 24 | $TOTALTIME << 8 | $TRACKS)) - TRACKINFO="${HEXSUM} $((TRACKS)) ${COOKEDOFFSETS} $((($LEADOUT + $LEADIN + $IDMAGICNUM) / $CDFRAMES))" + case "$CDDBMETHOD" in + cddb) + printf -v DISCID "%08lx" $(( ($CDDBCKSUM % 0xff) << 24 | $TOTALTIME << 8 | $TRACKS)) + ;; + musicbrainz) + # FIXME: don't assume the first track is 1 + echo "dasd: 1 $TRACKS $LEADIN $LEADOUT $OFFSETS " + DISCID=$($MUSICBRAINZ --command calcid --discinfo 1 $TRACKS $LEADIN $LEADOUT $OFFSETS) + ;; + esac + + TRACKINFO="${DISCID} $((TRACKS)) ${COOKEDOFFSETS} $((($LEADOUT + $LEADIN + $IDMAGICNUM) / $CDFRAMES))" } do_replaygain() @@ -520,10 +530,10 @@ do_replaygain() TRACKFILE="$(mungefilename "$TRACKNAME")" ARTISTFILE="$(mungefilename "$TRACKARTIST")" ALBUMFILE="$(mungefilename "$DALBUM")" - GENRE="$(mungegenre "$GENRE")" - YEAR=${CDYEAR:-$CDYEAR} + GENRE="$(mungegenre "$GENRE")" + YEAR=${CDYEAR:-$CDYEAR} gettracknum - if [ "$ONETRACK" = "y" ]; then + if [ "$ONETRACK" = "y" ]; then if [ "$VARIOUSARTISTS" = "y" ]; then OUTPUTFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\")" else @@ -541,14 +551,14 @@ do_replaygain() done case "$OUTPUT" in flac) - run_command replaygain-flac nice $ENCNICE $METAFLAC --add-replay-gain "${OUTPUTFILES[@]}" + run_command replaygain-flac nice $ENCNICE $METAFLAC $FLACGAINOPTS "${OUTPUTFILES[@]}" #run_command replaygain-flac true ;; vorbis|ogg) - run_command replaygain-vorbis nice $ENCNICE $VORBISGAIN --album "${OUTPUTFILES[@]}" + run_command replaygain-vorbis nice $ENCNICE $VORBISGAIN $VORBISGAINOPTS "${OUTPUTFILES[@]}" ;; mp3) - run_command replaygain-mp3 nice $ENCNICE $MP3GAIN -a -k "${OUTPUTFILES[@]}" + run_command replaygain-mp3 nice $ENCNICE $MP3GAIN $MP3GAINOPTS "${OUTPUTFILES[@]}" ;; mpc) run_command replaygain-mpc nice $ENCNICE $MPPGAIN --auto "${OUTPUTFILES[@]}" @@ -778,15 +788,17 @@ return 0 # do_tag [tracknumber] # id3 tags a filename # variables used: -# TRACKS, TRACKNAME, TRACKARTIST, TAGGER, TAGGEROPTS, VORBISCOMMENT, METAFLAC, ATOMICPARSLEY -# COMMENT, DALBUM, DARTIST, CDYEAR, CDGENRE (and temporarily) ID3TAGV +# TRACKS, TRACKNAME, TRACKARTIST, TAGGER, TAGGEROPTS, VORBISCOMMENT, METAFLAC, ATOMICPARSLEY +# COMMENT, DALBUM, DARTIST, CDYEAR, CDGENRE do_tag () { COMMENTOUTPUT="$(eval echo ${COMMENT})" if [ -z "$COMMENTOUTPUT" ]; then COMMENTOUTPUT="$(getcddbinfo TRACK-INFO)" fi - CDDBDISCID=$(echo $TRACKINFO | cut -d' ' -f1) + if [ "$CDDBMETHOD" = "cddb" ]; then + CDDBDISCID=$(echo $TRACKINFO | cut -d' ' -f1) + fi 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 @@ -835,7 +847,7 @@ do_tag () -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" \ -y "$CDYEAR" -g "$GENREID" \ -T "${TRACKNUM:-$1}/$TRACKS" \ - "${TPE2:+--TPE2 \"$TPE2\"}" \ + ${TPE2:+--TPE2 "$TPE2"} \ "$ABCDETEMPDIR/track$1.$OUTPUT" ;; esac @@ -1054,7 +1066,7 @@ do_encode () ;; esac OUT="$ABCDETEMPDIR/track$1.$OUTPUT" - if [ "$NOGAP" = "y" ] && checkstatus encodetrack-$OUTPUT-$1 ; then + if [ "$NOGAP" = "y" ] && checkstatus encodetrack-$OUTPUT-$1 ; then continue fi if [ X"$USEPIPES" = "Xy" ]; then @@ -1105,8 +1117,8 @@ do_encode () case "$2" in %local*%) case "$FLACENCODERSYNTAX" in - flac) $RUN_COMMAND nice $EFFECTIVE_NICE $FLACENCODER -f $FLACENCODEROPTS -o "$OUT" "$IN" ;; - esac + flac) $RUN_COMMAND nice $EFFECTIVE_NICE $FLACENCODER -f $FLACENCODEROPTS -o "$OUT" "$IN" ;; + esac ;; *) vecho -n "DISTMP3:" @@ -1125,7 +1137,7 @@ do_encode () fi # Quick hack to avoid tagging Ogg/Speex, since there is no other way to tag than inline tagging if [ ! "$DOTAG" = "y" ]; then - $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS --author "$TRACKARTIST" --title "$TRACKNAME" "$COMMENT" "$IN" "$OUT" + $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS --author "$TRACKARTIST" --title "$TRACKNAME" --comment "$COMMENT" "$IN" "$OUT" else $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS "$IN" "$OUT" fi @@ -1196,7 +1208,7 @@ do_encode () # esac # done # # Only remove .wav if the encoding succeeded -# if checkerrors "preprocess-(.{3,4})-$1"; then +# if checkerrors "preprocess-(.{3,4})-$1"; then # run_command preprocess-$1 false # else # run_command preprocess-$1 true @@ -1234,7 +1246,7 @@ do_encode () # run_command postprocess-$OUTPUT-$1 nice $POSTNICE $SPX_POST $IF $OF ;; # esac # # Only remove .wav if the encoding succeeded -# if checkerrors "postprocess-(.{3,4})-$1"; then +# if checkerrors "postprocess-(.{3,4})-$1"; then # run_command postprocess-$1 false # else # run_command postprocess-$1 true @@ -1364,19 +1376,19 @@ do_move () gettracknum # Supported variables for OUTPUTFORMAT are GENRE, YEAR, ALBUMFILE, # ARTISTFILE, TRACKFILE, and TRACKNUM. - if [ "$ONETRACK" = "y" ]; then + if [ "$ONETRACK" = "y" ]; then if [ "$VARIOUSARTISTS" = "y" ]; then OUTPUTFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\")" else OUTPUTFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\")" - fi + fi else if [ "$VARIOUSARTISTS" = "y" ]; then OUTPUTFILE="$(eval echo \""$VAOUTPUTFORMAT"\")" else OUTPUTFILE="$(eval echo \""$OUTPUTFORMAT"\")" fi - fi + fi 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 @@ -1417,7 +1429,7 @@ do_move () ;; esac # Lets move the cue file - if CUEFILE=$(checkstatus cuefile) >/dev/null ; then + 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... @@ -1604,7 +1616,7 @@ abcde.cue2discid () { ;; PREGAP) PREGAP=$(msf2lba $2) ;; - REM) case "$2" in + REM) case "$2" in FLAC__lead-out) LEADOUT=$(( $4 / 588 )) ;; @@ -1658,48 +1670,63 @@ abcde.mkcue () { echomsf () { printf "$1%02i:%02i:%02i\n" $(($2/4500)) $((($2/75)%60)) $(($2%75)) - } + } local MODE DISCID TRACKS - local i OFFSET LBA - - - if [ "$1" = --wholedisc ] ; then - MODE=INDEX - else - MODE=PREGAP - fi - - set -- $TRACKINFO - - DISCID=$1 - TRACKS=$2 - shift 2 - - echo REM DISCID $DISCID - echo FILE \"dummy.wav\" WAVE - - if [ $1 -ne 150 ] && [ $MODE = "PREGAP" ] ; then - OFFSET=$1 - else - OFFSET=150 - fi - - i=1 - while [ $i -le "$TRACKS" ] ; do - LBA=$(( $1 - $OFFSET )) - printf " TRACK %02i AUDIO\n" $i - if [ $i -eq 1 -a $1 -ne 150 ] ; then - if [ $MODE = PREGAP ] ; then - echomsf " PREGAP " $(($OFFSET-150)) - else - echo " INDEX 00 00:00:00" - fi + local i OFFSET LBA + local CUEWAVFILE + + if [ "$1" = --wholedisc ] ; then + MODE=INDEX + else + MODE=PREGAP + fi + + vecho "One track is $ONETRACK" + TRACKFILE="$(mungefilename "$TRACKNAME")" + ARTISTFILE="$(mungefilename "$TRACKARTIST")" + ALBUMFILE="$(mungefilename "$DALBUM")" + if [ "$ONETRACK" = "y" ]; then + if [ "$VARIOUSARTISTS" = "y" ]; then + CUEWAVFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT" + else + CUEWAVFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT" + fi + vecho "Cue wav file is $CUEWAVFILE" + else + CUEWAVFILE="dummy.wav" + fi + + set -- $TRACKINFO + + DISCID=$1 + TRACKS=$2 + shift 2 + + echo REM DISCID $DISCID + echo FILE \""$CUEWAVEFILE"\" WAVE + + if [ $1 -ne 150 ] && [ $MODE = "PREGAP" ] ; then + OFFSET=$1 + else + OFFSET=150 + fi + + i=1 + while [ $i -le "$TRACKS" ] ; do + LBA=$(( $1 - $OFFSET )) + printf " TRACK %02i AUDIO\n" $i + if [ $i -eq 1 -a $1 -ne 150 ] ; then + if [ $MODE = PREGAP ] ; then + echomsf " PREGAP " $(($OFFSET-150)) + else + echo " INDEX 00 00:00:00" + fi fi - echomsf " INDEX 01 " $LBA + echomsf " INDEX 01 " $LBA i=$(($i+1)) - shift - done + shift + done } # do_discid @@ -1739,8 +1766,8 @@ do_discid () #OFFSETS[${#OFFSETS[*]}]=$(( 10#${OFFSETTIME:0:2} * 4500 + 10#${OFFSETTIME:3:2} * 75 + 10#${OFFSETTIME:6:2} )) done - LEADOUT=$(( $(echo "$CUESHEET" | grep lead-out | get_last) / 44100 * 75 )) - LEADIN=$(( $(echo "$CUESHEET" | grep lead-in | get_last) / 44100 * 75 )) + LEADOUT=$(( $(echo "$CUESHEET" | grep lead-out | get_last) * 75 / 44100 )) + LEADIN=$(( $(echo "$CUESHEET" | grep lead-in | get_last) * 75 / 44100 )) makeids ;; *) @@ -1764,14 +1791,13 @@ do_discid () # CDPARANOIAAUDIOTRACKS="$TRACKS" # # LEADOUT="$(echo "$CDPARANOIAOUTPUT" | egrep -o '^TOTAL[[:space:]]+([[:digit:]]+)' | get_last)" -# OFFSETS="$(echo "$CDPARANOIAOUTPUT" | sed -n -e's/^ .* \([0-9]\+\) \[.*/\1/p')" +# OFFSETS="$(echo "$CDPARANOIAOUTPUT" | sed -n -e's/^ .* \([0-9]\+\) \[.*/\1/p')" # makeids # ;; *) case "$CDDBMETHOD" in cddb) TRACKINFO=$($CDDISCID "$CDROM") ;; - # FIXME # musicbrainz needs a cleanup - musicbrainz) TRACKINFO=$($MUSICBRAINZ -c "$CDROM" ) ;; + musicbrainz) TRACKINFO=$($MUSICBRAINZ --command id --device "$CDROM") ;; esac ;; esac @@ -1952,7 +1978,7 @@ do_discid () vecho "Creating cue file..." case $CDROMREADERSYNTAX in flac) - if $METAFLAC --export-cuesheet-to=- "$CDROM" > "$ABCDETEMPDIR/$CUEFILE"; then + if $METAFLAC --export-cuesheet-to=- "$CDROM" > "$ABCDETEMPDIR/$CUEFILE"; then echo cuefile=$CUEFILE >> "$ABCDETEMPDIR/status" else log warning "the input flac file does not contain a cuesheet." @@ -2011,6 +2037,25 @@ do_cleancue() eval track="\$TRACK$n" n=$(expr $n + 1) echo " TITLE \"$track\"" >> "$CUEFILE_OUT" + # When making a single-track rip, put the + # actual file name into the file declaration + # in the cue file so that it is usable by + # music players and the like + elif [ "$ONETRACK" = "y" ] && + echo "$line" | grep '^FILE "dummy.wav" WAVE' > /dev/null 2>&1 ; then + + TRACKFILE="$(mungefilename "$TRACKNAME")" + ARTISTFILE="$(mungefilename "$TRACKARTIST")" + ALBUMFILE="$(mungefilename "$DALBUM")" + + if [ "$VARIOUSARTISTS" = "y" ]; then + OUTPUTFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT" + else + OUTPUTFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT" + fi + + echo "FILE \"$OUTPUTFILE\" WAVE" >> "$CUEFILE_OUT" + continue fi # FIXME # If the lines above are uncommented, remove the line below. echo "$line" >> "$CUEFILE_OUT" @@ -2094,7 +2139,7 @@ do_localcddb () cat "$RESULT" > "${CDDBLOCALREAD}" { echo -n "#$X: " - do_cddbparse "${CDDBLOCALREAD}" + do_cddbparse "${CDDBLOCALREAD}" echo "" ##FIXME## QUICK HACK !!!! if [ ! "$INTERACTIVE" = "y" ]; then break ; fi @@ -2184,15 +2229,77 @@ do_localcddb () fi } -do_musicbrainzstat () -{ - : -} +# do_musicbrainz +# Work with the musicbrainz WS API, then transform the results here so +# they look (very) like the results from CDDB. Maybe not the best way +# to go, but it Works For Me (TM) do_musicbrainz () { -# Use MBE_TOCGetCDIndexId on a perl query - : + if checkstatus musicbrainz-readcomplete; then :; else + vecho "Obtaining Musicbrainz results..." + # If MB is to be used, interpret the query results and read all + # the available entries. + rm -f "$ABCDETEMPDIR/cddbchoices" + CDDBCHOICES=1 # Overridden by multiple matches + MBDISCID=$(echo $TRACKINFO | cut -d' ' -f1) + ${MUSICBRAINZ} --command data --discid "$MBDISCID" --workdir $ABCDETEMPDIR + + # The helper script will write disc matches out to + # cddbread.*. Count how many we have + NUM_RESPONSES=$(echo ${ABCDETEMPDIR}/cddbread.* | wc -w) + if [ "$NUM_RESPONSES" -eq 1 ] ; then + # One exact match + echo -n "Retrieved 1 Musicbrainz match..." >> "$ABCDETEMPDIR/cddbchoices" + echo "done." >> "$ABCDETEMPDIR/cddbchoices" + echo cddb-read-1-complete >> "$ABCDETEMPDIR/status" + echo cddb-choice=1 >> "$ABCDETEMPDIR/status" + ATITLE=$(grep -e '^DTITLE=' ${ABCDETEMPDIR}/cddbread.1 | cut -c8- ) + echo "200 none ${ATITLE}" >> "$ABCDETEMPDIR/cddbquery" + # List out disc title/author and contents + echo ---- ${ATITLE} ---- >> "$ABCDETEMPDIR/cddbchoices" + for TRACK in $(f_seq_row 1 $TRACKS) + do + echo $TRACK: "$(grep ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.1" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices" + done + echo >> "$ABCDETEMPDIR/cddbchoices" + elif [ "$NUM_RESPONSES" -eq 0 ] ; then + # No matches. Use the normal cddb template for the user to + # fill in + echo "No Musicbrainz match." >> "$ABCDETEMPDIR/cddbchoices" + $CDDBTOOL template $(cat "$ABCDETEMPDIR/discid") > "$ABCDETEMPDIR/cddbread.0" + # List out disc title/author and contents of template + echo ---- Unknown Artist / Unknown Album ---- >> "$ABCDETEMPDIR/cddbchoices" + UNKNOWNDISK=y + for TRACK in $(f_seq_row 1 $TRACKS) + do + echo $TRACK: "$(grep ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.0" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices" + done + echo >> "$ABCDETEMPDIR/cddbchoices" + echo cddb-read-0-complete >> "$ABCDETEMPDIR/status" + echo cddb-choice=0 >> "$ABCDETEMPDIR/status" + echo 503 > "$ABCDETEMPDIR/cddbquery" + else + echo "210 Found exact matches, list follows (until terminating .)" > "$ABCDETEMPDIR/cddbquery" + echo "Multiple Musicbrainz matches:" >> "$ABCDETEMPDIR/cddbchoices" + for file in $ABCDETEMPDIR/cddbread.* + do + X=$(echo $file | sed 's/^.*cddbread\.//g') + echo cddb-read-$X-complete >> "$ABCDETEMPDIR/status" + ATITLE=$(grep -e '^DTITLE=' ${ABCDETEMPDIR}/cddbread.$X | cut -c8- ) + echo "none ${ATITLE}" >> "$ABCDETEMPDIR/cddbquery" + # List out disc title/author and contents + echo "#$X: ---- ${ATITLE} ----" >> "$ABCDETEMPDIR/cddbchoices" + for TRACK in $(f_seq_row 1 $TRACKS) + do + echo $TRACK: "$(grep ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.$X" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices" + done + echo >> "$ABCDETEMPDIR/cddbchoices" + done + echo "." >> "$ABCDETEMPDIR/cddbquery" + fi + echo "musicbrainz-readcomplete" >> "$ABCDETEMPDIR/status" + fi } # do_cddbstat @@ -2215,7 +2322,7 @@ do_cddbstat () 210) # 210 OK, status information follows (until terminating `.') rc=0 ;; - 501) # 501 Illegal CDDB protocol level: . + 501) # 501 Illegal CDDB protocol level: . CDDBPROTO=`expr $CDDBPROTO - 1` ;; *) # Try a cddb query, since freedb2.org doesn't support the stat or ver commands @@ -2228,10 +2335,10 @@ do_cddbstat () ;; esac ;; - esac + esac done if test $rc -eq 1; then - CDDBAVAIL="n" + CDDBAVAIL="n" fi fi echo cddb-statcomplete >> "$ABCDETEMPDIR/status" @@ -2251,7 +2358,7 @@ do_cddbquery () ERRORCODE=no_query echo 503 > "$ABCDETEMPDIR/cddbquery" # The default CDDBLOCALSTATUS is "notfound" - # This part will be triggered if the user CDDB repo does not + # This part will be triggered if the user CDDB repo does not # contain the entry, or if we are not trying to use the repo. else vecho "Querying the CDDB server..." @@ -2337,7 +2444,7 @@ do_cddbread () if [ "$(wc -l < "$ABCDETEMPDIR/cddbquery" | tr -d ' ')" -eq 3 ]; then echo "One ${IN}exact match:" >> "$ABCDETEMPDIR/cddbchoices" tail -n +2 "$ABCDETEMPDIR/cddbquery" | head -n 1 >> "$ABCDETEMPDIR/cddbchoices" - echo cddb-choice=1 >> "$ABCDETEMPDIR/status" + echo cddb-choice=1 >> "$ABCDETEMPDIR/status" else echo "Multiple ${IN}exact matches:" >> "$ABCDETEMPDIR/cddbchoices" fi @@ -2398,7 +2505,7 @@ do_cddbedit () if [ -n "$CHOICE" ] ; then case $CDDBCHOICES in -1) if head -1 "$ABCDETEMPDIR/cddbquery" | grep "^$" > /dev/null 2>&1 ; then - log error "CDDB query failed!" + log error "CDDB query failed!" exit 1 else cat "$ABCDETEMPDIR/cddbchoices" @@ -2433,7 +2540,7 @@ do_cddbedit () PARSECHOICE2=$(echo $CDDBCHOICE | cut -d"," -f2 | xargs printf %d 2>/dev/null) if [ $PARSECHOICE1 -lt 1 ] || [ $PARSECHOICE1 -gt $CDDBCHOICES ] || \ [ $PARSECHOICE2 -lt 1 ] || [ $PARSECHOICE2 -gt $CDDBCHOICES ] || \ - [ $PARSECHOICE1 -eq $PARSECHOICE2 ]; then + [ $PARSECHOICE1 -eq $PARSECHOICE2 ]; then echo "Invalid diff range. Please select two comma-separated numbers between 1 and $CDDBCHOICES" >&2 else # We parse the 2 choices to diff, store them in temporary files and diff them. @@ -2481,7 +2588,7 @@ do_cddbedit () if [ "$USELOCALRESP" = "y" ]; then :; else if [ -n "$CHOICE" ] ; then case $CDDBCHOICES in - 0) + 0) UNKNOWNDISK=y echo "Selected template." ;; @@ -2663,11 +2770,11 @@ do_cddbedit () echo "variousartists=$VARIOUSARTISTS" >> "$ABCDETEMPDIR/status" echo "variousartiststyle=$VARIOUSARTISTSTYLE" >> "$ABCDETEMPDIR/status" - if [ "$EDITCDDB" = "y" ] && [ "$UNINTENTIONALLY_ANGER_THE_FREEDB_PEOPLE" = "y" ]; then + if [ "$EDITCDDB" = "y" ] && [ "$CDDBMETHOD" = "cddb" ] && [ "$UNINTENTIONALLY_ANGER_THE_FREEDB_PEOPLE" = "y" ]; then if [ "$CDDBDATAMD5SUM" != "" ] && [ "$CDDBDATAMD5SUM" != "$($MD5SUM "$CDDBDATA" | cut -d " " -f 1)" ]; then # This works but does not have the necessary error checking # yet. If you are familiar with the CDDB spec - # (see http://www.freedb.org/src/latest/DBFORMAT) + # (see http://www.freedb.org/src/latest/DBFORMAT) # and can create an error-free entry on your own, then put # UNINTENTIONALLY_ANGER_THE_FREEDB_PEOPLE=y in your # abcde.conf to enable it. Put CDDBSUBMIT=email@address in @@ -2706,7 +2813,7 @@ do_cddbedit () # do_cdread [tracknumber] # do_cdread onetrack [firsttrack] [lasttrack] -# +# do_cdread () { # The commands here don't go through run_command because they're never supposed to be silenced @@ -2721,7 +2828,7 @@ do_cdread () UTRACKNUM=$FIRSTTRACK case "$CDROMREADERSYNTAX" in flac) READTRACKNUMS="$FIRSTTRACK.1-$(($LASTTRACK + 1)).0" ;; - cdparanoia) + cdparanoia) #XX FIXME XX # Add a variable to check if tracks are provided in command line and if not, use "0-" to rip the tracks READTRACKNUMS="$FIRSTTRACK-$LASTTRACK" ;; @@ -2771,11 +2878,11 @@ do_cdread () # Avoid problems wit math expressions by unpadding the given UTRACKNUM STRIPTRACKNUM=$(expr $UTRACKNUM + 0) nice $READNICE $FLAC -d -f --cue=${READTRACKNUMS:-$STRIPTRACKNUM.1-$(($STRIPTRACKNUM + 1)).0} "$FILEARG" "$CDROM" ;; - cdparanoia) - if [ "$REDIR" = "y" ]; then - nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" >&2 + cdparanoia) + if [ "$REDIR" = "y" ]; then + nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" >&2 else - nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" + nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" fi;; cdda2wav | icedax) @@ -2793,15 +2900,15 @@ do_cdread () CDDA2WAVCDROM="$CDROMID" fi fi - if [ "$REDIR" = "y" ]; then + if [ "$REDIR" = "y" ]; then nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" >&2 - else + else nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" fi ;; ## FIXME ## We have an exception for dagrab, since it uses -f ## FIXME ## Shall we just use -f $FILEARG ?? - dagrab) - if [ "$REDIR" = "y" ]; then + dagrab) + if [ "$REDIR" = "y" ]; then nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" >&2 else nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" @@ -2813,7 +2920,7 @@ do_cdread () FILEPATH=$(find "$FILEPATH" | grep "/$REALTRACKNUM "); # If the file exists, copy it if [ -e "$FILEPATH" ] ; then - if [ "$REDIR" = "y" ]; then + if [ "$REDIR" = "y" ]; then nice $READNICE $CDROMREADER "$FILEPATH" "$FILEARG" >&2 else nice $READNICE $CDROMREADER "$FILEPATH" "$FILEARG" @@ -2822,14 +2929,14 @@ do_cdread () false fi ;; debug) - if [ "$REDIR" = "y" ]; then + if [ "$REDIR" = "y" ]; then nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -w $UTRACKNUM-[:1] "$FILEARG" >&2 else nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -w $UTRACKNUM-[:1] "$FILEARG" fi ;; esac RETURN=$? - # If we get some error or we get some missing wav + # If we get some error or we get some missing wav # (as long as we dont use pipes) if [ "$RETURN" != "0" -o \( ! -s "$WAVDATA" -a X"$USEPIPES" != "Xy" \) ]; then # Thank goodness errors is only machine-parseable up to the @@ -2857,7 +2964,7 @@ do_cdread () # do_cdspeed # No values accepted, only uses env variables -do_cdspeed () +do_cdspeed () { if "$CDSPEED" "$CDSPEEDOPTS" "$CDSPEEDVALUE" >/dev/null ; then vecho "Setting CD speed to ${CDSPEEDVALUE}x" @@ -2938,7 +3045,7 @@ post_encode () # Builtin defaults # CDDB -# Defaults to FreeDB, but a python musicbrainz can be used +# Defaults to FreeDB, but musicbrainz can be used too, via the abcde-musicbrainz-tool script CDDBMETHOD=cddb CDDBURL="http://freedb.freedb.org/~cddb/cddb.cgi" CDDBSUBMIT=freedb-submit@freedb.org @@ -3031,7 +3138,7 @@ DAGRAB=dagrab CDDAFS=cp CDDISCID=cd-discid CDDBTOOL=cddb-tool -MUSICBRAINZ=musicbrainz-get-tracks +MUSICBRAINZ=abcde-musicbrainz-tool EJECT=eject MD5SUM=md5sum DISTMP3=distmp3 @@ -3054,11 +3161,14 @@ BLADEENCOPTS= L3ENCOPTS= XINGMP3ENCOPTS= MP3ENCOPTS= +MP3GAINOPTS="-a -k" # ogg VORBIZEOPTS= OGGENCOPTS= +VORBISGAINOPTS="--album" # flac FLACOPTS= +FLACGAINOPTS="--add-replay-gain" # speex SPEEXENCOPTS= # mpc @@ -3090,7 +3200,7 @@ MAXPROCS=1 # List of actions to perform - by default, run to completion ACTIONS=cddb,read,encode,tag,move,clean -# This option is basicaly for Debian package dependencies: +# This option is basicaly for Debian package dependencies: # List of prefered outputs - by default, run with whatever we have in the path DEFAULT_OUTPUT_BINARIES=vorbis:oggenc,flac:flac,mp3:toolame,mp3:lame,mp3:bladeenc,spx:speex,m4a:faac @@ -3195,7 +3305,7 @@ fi # Parse command line options #while getopts 1a:bc:C:d:Dehj:klLmMnNo:pPq:r:Rs:S:t:T:vVxw:W: opt ; do -while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:UvVxX:w:W:z opt ; do +while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPq:r:s:S:t:T:UvVxX:w:W:z opt ; do case "$opt" in 1) ONETRACK=y ;; a) ACTIONS="$OPTARG" ;; @@ -3231,7 +3341,7 @@ while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:UvVxX:w:W:z opt ; do t) STARTTRACKNUMBER="$OPTARG" ;; T) STARTTRACKNUMBER="$OPTARG" ; STARTTRACKNUMBERTAG="y" ;; U) CDDBPROTO=5 ;; - v) + v) echo "This is abcde v$VERSION." echo "Usage: abcde [options] [tracks]" echo "abcde -h for extra help" @@ -3241,13 +3351,13 @@ while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:UvVxX:w:W:z opt ; do x) EJECTCD="y" ;; X) CUE2DISCID="$OPTARG" ;; w) COMMENT="$OPTARG" ;; - W) if echo $OPTARG | grep "[[:digit:]]" > /dev/null 2>&1 ; then - STARTTRACKNUMBER="${OPTARG}01" + W) if echo $OPTARG | grep "[[:digit:]]" > /dev/null 2>&1 ; then + STARTTRACKNUMBER="${OPTARG}01" STARTTRACKNUMBERTAG="y" COMMENT="CD${OPTARG}" DISCNUMBER="${OPTARG}" else - log error "argument of -W must be integer" + log error "argument of -W must be integer" exit 1 fi ;; @@ -3303,14 +3413,14 @@ if [ "$CDROMREADERSYNTAX" = "" ]; then fi # Decide if we can continue. -if [ "$ONETRACK" = "y" ]; then +if [ "$ONETRACK" = "y" ]; then # FIXME # remove check as soon as we find out about the other readers case "$CDROMREADERSYNTAX" in flac) ;; cdparanoia) ;; cdda2wav | icedax) ;; *) log error "$CDROMREADERSYNTAX does not support ONETRACK mode" - exit 1 ;; + exit 1 ;; esac if [ "$BATCHNORM" = "y" ]; then log warning "BATCHNORM mode is not compatible with ONETRACK mode. Disabling..." @@ -3331,14 +3441,14 @@ else # Cleaned up to use shell built-ins by Charles Steinkuehler if [ "${1#*[^0-9-]}" != "$1" ]; then log error "syntax error while processing track numbers" - else + else RSTART=${1%%-*} REND=${1##*-} while [ ${RSTART:=1} -le ${REND:=0} ] ; do TRACKQUEUE="$TRACKQUEUE $RSTART" RSTART=$(( $RSTART + 1 )) done - fi + fi shift done fi @@ -3395,7 +3505,7 @@ for SHOWCDDBFIELD in $(echo $SHOWCDDBFIELDS | tr , \ ); do done # At this point a CDROM has to be defined, so we check it exists. -if [ X"$CDROM" != "X" ] ; then +if [ X"$CDROM" != "X" ] ; then if ( [ "$CDROMREADERSYNTAX" = "cdda2wav" ] || [ "$CDROMREADERSYNTAX" = "icedax" ] ) && [ "$NEEDCDROMID" = "y" ] ; then if [ "$OSFLAVOUR" = "FBSD" ]; then if echo "$CDROMID" | grep "^[0-9],[0-9],[0-9]$" >/dev/null 2>&1 ; then :; else @@ -3464,7 +3574,7 @@ if [ X"$LOWDISK" = "Xy" ]; then fi # BATCHNORM pre-tests, before we get into serious problems -# Not compatible with +# Not compatible with if [ "$BATCHNORM" = "y" ] && [ "$DONORMALIZE" = "n" ]; then vecho warning "Disabling BATCHNORM since we are not normalizing!" BATCHNORM=n @@ -3561,7 +3671,7 @@ do [ "$FLACENCODERSYNTAX" = "default" ] && FLACENCODERSYNTAX=flac [ "$DOTAG" = "y" ] && NEEDMETAFLAC=y [ "$DOREPLAYGAIN" = "y" ] && NEEDMETAFLAC=y - [ "$ONETRACK" = "y" ] && [ "$DOCUE" = "y" ] && NEEDMETAFLAC=y + [ "$ONETRACK" = "y" ] && [ "$DOCUE" = "y" ] && NEEDMETAFLAC=y ;; spx) [ "$SPEEXENCODERSYNTAX" = "default" ] && SPEEXENCODERSYNTAX=speexenc @@ -3717,7 +3827,7 @@ if [ "$DISTMP3NICE" ]; then fi # Don't check for stuff if it's not needed -if [ "$REMOTEHOSTS" ]; then +if [ "$REMOTEHOSTS" ]; then NEEDDISTMP3=y fi if [ "$DONORMALIZE" = "y" ]; then @@ -3831,7 +3941,7 @@ fi #case $CDROMREADERSYNTAX in # flac) # TRACKINFO=$($METAFLAC --show-tag=CDDB $CDROM | cut -d"=" -f2 | egrep "[a-f0-9]{8}") -# if [ "$TRACKINFO" = "" ]; then +# if [ "$TRACKINFO" = "" ]; then # checkexec ${NEEDCUE2DISCID+$CUE2DISCID} # fi # ;; @@ -3860,14 +3970,8 @@ if [ "$DOREAD" = "y" ]; then vecho "done." fi -case "$CDDBMETHOD" in - cddb) - do_discid # Get ABCDETEMPDIR created and status file initialized - ;; - musicbrainz) - do_musicbrainz id - ;; -esac +# Get ABCDETEMPDIR created and status file initialized +do_discid if [ "$DOCDDB" = "y" ]; then # start with a sane default: @@ -3877,7 +3981,7 @@ if [ "$DOCDDB" = "y" ]; then fi if checkstatus cddb-choice > /dev/null; then : - else + else if [ "$CDDBLOCALSTATUS" = "notfound" ] ; then case "$CDDBMETHOD" in cddb) @@ -3918,7 +4022,7 @@ fi if checkstatus onetrack ; then ONETRACK=y ; fi -if [ "$ONETRACK" = "y" ]; then +if [ "$ONETRACK" = "y" ]; then # Reuse the CUEFILE in case we created it (now or in a previous run) if CUEFILE=$(checkstatus cuefile); then IMPORTCUESHEET=y @@ -3942,7 +4046,7 @@ if [ "$LOWDISK" = "y" ] || [ "$ONETRACK" = "y" ]; then echo "encode-output=loud" >> "$ABCDETEMPDIR/status" fi -if [ "$ONETRACK" = "y" ]; then +if [ "$ONETRACK" = "y" ]; then TRACKS="$FIRSTTRACK" if [ "$USEPIPES" = "y" ]; then if checkstatus readencodetrack-$FIRSTTRACK; then :; else @@ -3975,7 +4079,7 @@ else fi fi if [ "$NOGAP" = "y" ] || [ "$BATCHNORM" = "y" ]; then - : + : else # If we are not reading, set the encode output to loud already, so # that we can see the output of the first track. @@ -4015,11 +4119,11 @@ post_read # We are now finished with the cdrom - it can be safely ejected. Note that # abcde will not have completed yet. if [ "$EJECTCD" = "y" ] && [ -x $(which $EJECT) ]; then - # We check if the disk we are processing is actually the disk inside the + # We check if the disk we are processing is actually the disk inside the # CD tray. If not, we do not eject the CD, since it might be so that the # user ejected it manually. #CURRENTTRACKINFO=$($CDDISCID $CDROM) - #if if [ "$?" != "1" ] && [ "$CURRENTTRACKINFO" = "$TRACKINFO" ] ; then + #if if [ "$?" != "1" ] && [ "$CURRENTTRACKINFO" = "$TRACKINFO" ] ; then # More FreeBSD bits. if [ X"$(uname)" = X"FreeBSD" ] ; then # FreeBSD eject uses the EJECT environment variable to name the CDROM @@ -4039,7 +4143,7 @@ fi ) | ( -## Do we need to pre-process +## Do we need to pre-process #if [ x"$PREPROCESS" = "x" ] ; then # cat #else @@ -4054,7 +4158,7 @@ fi # # all locations are working, wait and try again later # if [ ! $PREPROCEED ]; then sleep 3; fi # done -# ( do_preprocess $PRETRACKNUM +# ( do_preprocess $PRETRACKNUM # echo "NEXTTRACK" # ) & # done @@ -4150,11 +4254,11 @@ do fi # Don't proceed with the rest of the loop if we can't encode if [ "$ABORT" ]; then continue; fi - ## FIXME ## Add here + ## FIXME ## Add here ## run_command tagtrack-$OUTPUT-$1 $METAFLAC $METAFLACOPTS ${IMPORTCUESHEET:+--import-cuesheet-from="$ABCDETEMPDIR/$CUEFILE"} --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER" # Set TRACKNUM, TRACKNAME if [ -e "$CDDBDATA" ]; then - if [ "$ONETRACK" = "y" ]; then + if [ "$ONETRACK" = "y" ]; then TRACKNAME="$DALBUM" TRACKNUM="$FIRSTTRACK" splitvarious @@ -4192,7 +4296,7 @@ do fi # Lets tag the cue file if checkstatus cleancuefile >/dev/null; then :; else - if checkstatus cuefile >/dev/null ; then + if checkstatus cuefile >/dev/null ; then do_cleancue fi fi