X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/2c7824bcf5d84f0c3a4f18429364582aa44647cb..2c2dffe6d58521463918acd4425cf9e99d8001e8:/abcde diff --git a/abcde b/abcde index 6cb9600..d585c16 100755 --- a/abcde +++ b/abcde @@ -13,7 +13,7 @@ # # $Id$ -VERSION='2.3.99.8' +VERSION='2.4.2' 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 } @@ -496,7 +496,7 @@ makeids () do_replaygain() { if checkstatus replaygain; then :; else - run_command "" echo "Adding replygain information..." + run_command "" echo "Adding replaygain information..." for TMPOUTPUT in $( echo $OUTPUTTYPE | tr , \ ) do case $TMPOUTPUT in @@ -520,10 +520,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 +541,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 "${OUTPUTFILES[@]}" + run_command replaygain-mp3 nice $ENCNICE $MP3GAIN $MP3GAINOPTS "${OUTPUTFILES[@]}" ;; mpc) run_command replaygain-mpc nice $ENCNICE $MPPGAIN --auto "${OUTPUTFILES[@]}" @@ -778,8 +778,8 @@ 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})" @@ -799,6 +799,11 @@ do_tag () mp3) # id3v2 v0.1.9 claims to have solved the -c bug, so we merge both id3 and id3v2 GENREID=$(do_getgenreid "${CDGENRE}") + # Set TPE2 in case we have a Various Artists rip. + TPE2="" + if [ "$VARIOUSARTISTS" = "y" ]; then + TPE2="Various" + fi case "$ID3SYNTAX" in id3);; @@ -811,6 +816,7 @@ do_tag () -G "$GENREID" -n "${TRACKNUM:-$1}" \ "${TRACKNUM:+-N $TRACKS}" \ "${ENCODING:+--set-encoding=$ENCODING}" \ + "${TPE2:+--set-user-text-frame=TPE2:$TPE2}" \ "$ABCDETEMPDIR/track$1.$OUTPUT" ;; # FIXME # Still not activated... @@ -828,7 +834,8 @@ do_tag () $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" \ -y "$CDYEAR" -g "$GENREID" \ - -T "${TRACKNUM:-$1/$TRACKS}" \ + -T "${TRACKNUM:-$1}/$TRACKS" \ + ${TPE2:+--TPE2 "$TPE2"} \ "$ABCDETEMPDIR/track$1.$OUTPUT" ;; esac @@ -1047,7 +1054,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 @@ -1098,8 +1105,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:" @@ -1118,7 +1125,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 @@ -1189,7 +1196,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 @@ -1227,7 +1234,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 @@ -1357,19 +1364,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 @@ -1410,7 +1417,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... @@ -1597,7 +1604,7 @@ abcde.cue2discid () { ;; PREGAP) PREGAP=$(msf2lba $2) ;; - REM) case "$2" in + REM) case "$2" in FLAC__lead-out) LEADOUT=$(( $4 / 588 )) ;; @@ -1651,48 +1658,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 - echomsf " INDEX 01 " $LBA + 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 i=$(($i+1)) - shift - done + shift + done } # do_discid @@ -1732,8 +1754,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 ;; *) @@ -1757,14 +1779,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 @@ -1945,7 +1966,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." @@ -2004,6 +2025,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" @@ -2087,7 +2127,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 @@ -2177,15 +2217,76 @@ 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 + ${MUSICBRAINZ} --command data --device "$CDROM" --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 @@ -2206,15 +2307,25 @@ do_cddbstat () RESPONSECODE=$(head -n 1 "$ABCDETEMPDIR/cddbstat" | cut -f1 -d' ') case "$RESPONSECODE" in 210) # 210 OK, status information follows (until terminating `.') - rc=0; + rc=0 ;; - 501|*) # 501 Illegal CDDB protocol level: . + 501) # 501 Illegal CDDB protocol level: . CDDBPROTO=`expr $CDDBPROTO - 1` ;; - esac + *) # Try a cddb query, since freedb2.org doesn't support the stat or ver commands + # FreeDB TESTCD disc-id is used for query + $CDDBTOOL query $CDDBURL $CDDBPROTO $CDDBUSER $CDDBHOST 03015501 1 296 344 > "$ABCDETEMPDIR/cddbstat" + RESPONSECODE=$(head -n 1 "$ABCDETEMPDIR/cddbstat" | cut -f1 -d' ') + case "$RESPONSECODE" in + 2??) # Server responded, everything seems OK + rc=0 + ;; + esac + ;; + esac done if test $rc -eq 1; then - CDDBAVAIL="n" + CDDBAVAIL="n" fi fi echo cddb-statcomplete >> "$ABCDETEMPDIR/status" @@ -2234,7 +2345,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..." @@ -2320,7 +2431,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 @@ -2381,7 +2492,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" @@ -2416,7 +2527,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. @@ -2464,7 +2575,7 @@ do_cddbedit () if [ "$USELOCALRESP" = "y" ]; then :; else if [ -n "$CHOICE" ] ; then case $CDDBCHOICES in - 0) + 0) UNKNOWNDISK=y echo "Selected template." ;; @@ -2650,7 +2761,7 @@ do_cddbedit () 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 @@ -2689,7 +2800,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 @@ -2698,17 +2809,17 @@ do_cdread () # FIXME # Add the possibility of grabbing ranges of tracks in onetrack # FIXME # Until then, we grab the whole CD in one track, no matter what # the user said - # We need the first and last track for cdda2wav + # We need the first and last track for cdda2wav/icedax FIRSTTRACK=$2 LASTTRACK=$(expr $3 + 0) 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" ;; - cdda2wav) READTRACKNUMS="$FIRSTTRACK+$LASTTRACK" ;; + cdda2wav | icedax) READTRACKNUMS="$FIRSTTRACK+$LASTTRACK" ;; *) echo "abcde error: $CDROMREADERSYNTAX does not support ONETRACK mode" exit 1 ;; esac @@ -2719,7 +2830,7 @@ do_cdread () if [ "$USEPIPES" = "y" ]; then TEMPARG="PIPERIPPER_$CDROMREADERSYNTAX" FILEARG="$( eval echo "\$$TEMPARG" )" - REDIR="" + REDIR="y" PIPE_MESSAGE="and encoding " else WAVDATA="$ABCDETEMPDIR/track$UTRACKNUM.wav" @@ -2735,7 +2846,7 @@ do_cdread () FILEARG="$WAVDATA" ;; esac - REDIR=">&2" + REDIR="n" fi if [ "$1" = "onetrack" ]; then echo "Grabbing ${PIPE_MESSAGE}tracks $UTRACKNUM - $LASTTRACK as one track ..." >&2 @@ -2754,13 +2865,18 @@ 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) - nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" $REDIR ;; - cdda2wav) + cdparanoia) + if [ "$REDIR" = "y" ]; then + nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" >&2 + else + nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" + fi;; + + cdda2wav | icedax) if [ "$OSFLAVOUR" = "OSX" ] ; then - # Hei, we have to unmount the device before running anything like cdda2wav in OSX + # Hei, we have to unmount the device before running anything like cdda2wav/icedax in OSX disktool -u ${CDROM#/dev/} 0 - # Also, in OSX the cdrom device for cdda2wav changes... + # Also, in OSX the cdrom device for cdda2wav/icedax changes... CDDA2WAVCDROM="IODVDServices" elif [ "$OSFLAVOUR" = "FBSD" ] ; then CDDA2WAVCDROM="$CDROMID" @@ -2771,12 +2887,19 @@ do_cdread () CDDA2WAVCDROM="$CDROMID" fi fi - nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" $REDIR - ;; + if [ "$REDIR" = "y" ]; then + nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" >&2 + 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) nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" $REDIR - ;; + dagrab) + if [ "$REDIR" = "y" ]; then + nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" >&2 + else + nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" + fi ;; cddafs) # Find the track's mounted path REALTRACKNUM=$(expr $UTRACKNUM + 0) @@ -2784,15 +2907,23 @@ do_cdread () FILEPATH=$(find "$FILEPATH" | grep "/$REALTRACKNUM "); # If the file exists, copy it if [ -e "$FILEPATH" ] ; then - nice $READNICE $CDROMREADER "$FILEPATH" "$FILEARG" $REDIR + if [ "$REDIR" = "y" ]; then + nice $READNICE $CDROMREADER "$FILEPATH" "$FILEARG" >&2 + else + nice $READNICE $CDROMREADER "$FILEPATH" "$FILEARG" + fi else false fi ;; - debug) nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -w $UTRACKNUM-[:1] "$FILEARG" $REDIR - ;; + debug) + 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 @@ -2820,7 +2951,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" @@ -2901,7 +3032,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 @@ -2953,7 +3084,7 @@ NOGAP=n BATCHNORM=n NOCDDBQUERY=n -# If using scsi devices, cdda2wav needs a CDROMID, instead of a device node +# If using scsi devices, cdda2wav/icedax needs a CDROMID, instead of a device node # i.e. CDROMID="1,0,0" CDROMID="" # If we are using the IDE bus, we need CDPARANOIACDROMBUS defined as "d" @@ -2989,12 +3120,12 @@ METAFLAC=metaflac AACTAG=faac CDPARANOIA=cdparanoia -CDDA2WAV=cdda2wav +CDDA2WAV=icedax DAGRAB=dagrab CDDAFS=cp CDDISCID=cd-discid CDDBTOOL=cddb-tool -MUSICBRAINZ=musicbrainz-get-tracks +MUSICBRAINZ=abcde-musicbrainz-tool EJECT=eject MD5SUM=md5sum DISTMP3=distmp3 @@ -3017,11 +3148,14 @@ BLADEENCOPTS= L3ENCOPTS= XINGMP3ENCOPTS= MP3ENCOPTS= +MP3GAINOPTS="-a -k" # ogg VORBIZEOPTS= OGGENCOPTS= +VORBISGAINOPTS="--album" # flac FLACOPTS= +FLACGAINOPTS="--add-replay-gain" # speex SPEEXENCOPTS= # mpc @@ -3053,12 +3187,12 @@ 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 # List of prefered cdromreaders - by default, run whichever we have in the path -DEFAULT_CDROMREADERS="cdparanoia cdda2wav" +DEFAULT_CDROMREADERS="cdparanoia icedax cdda2wav" # List of quality levels associated with the encoders: DEFAULT_QUALITY_XLO="oggenc:-q -1,lame:-q 9,speex:--quality 1,m4a:" @@ -3194,7 +3328,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" @@ -3204,13 +3338,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 ;; @@ -3266,14 +3400,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) ;; + 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..." @@ -3294,14 +3428,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 @@ -3358,8 +3492,8 @@ 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 [ "$CDROMREADERSYNTAX" = "cdda2wav" ] && [ "$NEEDCDROMID" = "y" ] ; 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 log error "CDROMID not in the right format for $CDROMREADERSYNTAX" @@ -3427,7 +3561,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 @@ -3457,7 +3591,7 @@ case "$CDROMREADERSYNTAX" in CDROMREADER="$CDPARANOIA" CDROMREADEROPTS="$CDPARANOIAOPTS" ;; - cdda2wav) + cdda2wav | icedax) CDROMREADER="$CDDA2WAV" CDROMREADEROPTS="$CDDA2WAVOPTS" ;; @@ -3524,7 +3658,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 @@ -3680,7 +3814,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 @@ -3794,7 +3928,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 # ;; @@ -3823,14 +3957,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: @@ -3840,7 +3968,7 @@ if [ "$DOCDDB" = "y" ]; then fi if checkstatus cddb-choice > /dev/null; then : - else + else if [ "$CDDBLOCALSTATUS" = "notfound" ] ; then case "$CDDBMETHOD" in cddb) @@ -3881,7 +4009,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 @@ -3905,7 +4033,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 @@ -3938,7 +4066,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. @@ -3978,11 +4106,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 @@ -4002,7 +4130,7 @@ fi ) | ( -## Do we need to pre-process +## Do we need to pre-process #if [ x"$PREPROCESS" = "x" ] ; then # cat #else @@ -4017,7 +4145,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 @@ -4113,11 +4241,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 @@ -4155,7 +4283,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