X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/d68ebfffb7417f90492b113c50f517893aac878d..9bd5228d4a520626d624074e8883a02cc9aacde2:/abcde diff --git a/abcde b/abcde index c7f5642..0ca4542 100755 --- a/abcde +++ b/abcde @@ -13,7 +13,7 @@ # # $Id$ -VERSION='2.3.99-$Revision$' +VERSION='2.3.99.8' usage () { @@ -46,27 +46,29 @@ 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 "-M Create a CUE file" +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" echo "-p Pad track numbers with 0's (if less than 10 tracks)" echo "-P Use UNIX pipes to read+encode without wav files" +echo "-q " +echo " Set quality level (high,medium,low)" echo "-r " echo " Also encode on these remote hosts" echo "-R Use local CDDB in recursive mode" echo "-s " -echo " Show dielfs from the CDDB info (year,genre)" +echo " Show fields from the CDDB info (year,genre)" echo "-S <#> Set the CD speed" echo "-t <#> Start the track numbering at a given number" echo "-T <#> Same as -t but modifies tag numbering" -echo "-u Use UNICODE (UTF8) tags and comments" echo "-U Do NOT use UNICODE (UTF8) tags and comments" echo "-v Show version number and exit" 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 <#> Contatenate 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." @@ -353,9 +355,18 @@ checkexec () if [ ! "$@" = "" ]; then # Cut off any command-line option we added in X=$(echo $@ | cut -d' ' -f2) + # Test for built-in abcde.function + [ "$X" != "${X#abcde.}" ] && type $X >/dev/null 2>&1 && return if [ "$(which $X)" = "" ]; then log error "$X is not in your path." >&2 log info "Define the full path to the executable if it exists on your system." >&2 + if [ -e /etc/debian_release ] ; then + case $X in + oggenc) MISSING_PACKAGE=vorbis-tools ;; + lame|flac) MISSING_PACKAGE=$X ;; + esac + log info "Hint: apt-get install $MISSING_PACKAGE" >&2 + fi exit 1 elif [ ! -x "$(which $X)" ]; then log error "$X is not executable." >&2 @@ -409,6 +420,9 @@ getcddbinfo() TRACKNAME) 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/;' + ;; esac } @@ -506,6 +520,8 @@ do_replaygain() TRACKFILE="$(mungefilename "$TRACKNAME")" ARTISTFILE="$(mungefilename "$TRACKARTIST")" ALBUMFILE="$(mungefilename "$DALBUM")" + GENRE="$(mungegenre "$GENRE")" + YEAR=${CDYEAR:-$CDYEAR} gettracknum if [ "$ONETRACK" = "y" ]; then if [ "$VARIOUSARTISTS" = "y" ]; then @@ -525,16 +541,17 @@ do_replaygain() done case "$OUTPUT" in flac) - run_command replaygain-flac $METAFLAC --add-replay-gain "${OUTPUTFILES[@]}" + run_command replaygain-flac nice $ENCNICE $METAFLAC --add-replay-gain "${OUTPUTFILES[@]}" + #run_command replaygain-flac true ;; vorbis|ogg) - run_command replaygain-vorbis $VORBISGAIN --album "${OUTPUTFILES[@]}" + run_command replaygain-vorbis nice $ENCNICE $VORBISGAIN --album "${OUTPUTFILES[@]}" ;; mp3) - run_command replaygain-mp3 $MP3GAIN -a "${OUTPUTFILES[@]}" + run_command replaygain-mp3 nice $ENCNICE $MP3GAIN -a "${OUTPUTFILES[@]}" ;; mpc) - run_command replaygain-mpc $MPPGAIN --auto "${OUTPUTFILES[@]}" + run_command replaygain-mpc nice $ENCNICE $MPPGAIN --auto "${OUTPUTFILES[@]}" ;; *);; esac @@ -761,11 +778,14 @@ return 0 # do_tag [tracknumber] # id3 tags a filename # variables used: -# TRACKS, TRACKNAME, TRACKARTIST, TAGGER, TAGGEROPTS, VORBISCOMMENT, METAFLAC, +# TRACKS, TRACKNAME, TRACKARTIST, TAGGER, TAGGEROPTS, VORBISCOMMENT, METAFLAC, ATOMICPARSLEY # COMMENT, DALBUM, DARTIST, CDYEAR, CDGENRE (and temporarily) ID3TAGV do_tag () { COMMENTOUTPUT="$(eval echo ${COMMENT})" + if [ -z "$COMMENTOUTPUT" ]; then + COMMENTOUTPUT="$(getcddbinfo TRACK-INFO)" + fi CDDBDISCID=$(echo $TRACKINFO | cut -d' ' -f1) 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 @@ -785,26 +805,30 @@ do_tag () 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 \ + run_command tagtrack-$OUTPUT-$1 nice $ENCNICE $TAGGER $TAGGEROPTS \ --comment=::"$COMMENTOUTPUT" -A "$DALBUM" \ -a "$TRACKARTIST" -t "$TRACKNAME" -Y "$CDYEAR" \ - -G "$GENREID" -n "${TRACKNUM:-$1}" "${TRACKNUM:+-N $TRACKS}" \ + -G "$GENREID" -n "${TRACKNUM:-$1}" \ + "${TRACKNUM:+-N $TRACKS}" \ "${ENCODING:+--set-encoding=$ENCODING}" \ "$ABCDETEMPDIR/track$1.$OUTPUT" ;; # FIXME # Still not activated... id3ed) - run_command tagtrack-$OUTPUT-$1 $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ - -a "$DALBUM" -n "$TRACKARTIST" -s "$TRACKNAME" -y "$CDYEAR" \ - -g "$GENREID" -k "${TRACKNUM:-$1}" \ + run_command tagtrack-$OUTPUT-$1 nice $ENCNICE \ + $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ + -a "$DALBUM" -n "$TRACKARTIST" -s "$TRACKNAME" \ + -y "$CDYEAR" -g "$GENREID" -k "${TRACKNUM:-$1}" \ "$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}" \ + run_command tagtrack-$OUTPUT-$1 nice $ENCNICE \ + $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ + -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" \ + -y "$CDYEAR" -g "$GENREID" \ + -T "${TRACKNUM:-$1/$TRACKS}" \ "$ABCDETEMPDIR/track$1.$OUTPUT" ;; esac @@ -817,7 +841,9 @@ do_tag () mv "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" fi ( - # These are from http://www.xiph.org/ogg/vorbis/doc/v-comment.html + # These are from + # http://www.xiph.org/ogg/vorbis/doc/v-comment.html + echo ARTIST="$TRACKARTIST" echo ALBUM="$DALBUM" echo TITLE="$TRACKNAME" @@ -828,6 +854,9 @@ do_tag () echo GENRE="$CDGENRE" fi echo TRACKNUMBER=${TRACKNUM:-$1} + if [ -n "$DISCNUMBER" ]; then + echo DISCNUMBER="$DISCNUMBER" + fi echo CDDB=$CDDBDISCID if [ "$(eval echo ${COMMENT})" != "" ]; then case "$COMMENTOUTPUT" in @@ -835,9 +864,11 @@ do_tag () *) echo COMMENT="$COMMENTOUTPUT";; esac fi - ) | run_command tagtrack-$OUTPUT-$1 $VORBISCOMMENT $VORBISCOMMENTOPTS -w \ + ) | run_command tagtrack-$OUTPUT-$1 nice $ENCNICE \ + $VORBISCOMMENT $VORBISCOMMENTOPTS -w \ "$ABCDETEMPDIR/track$1.uncommented.$OGGOUTPUTCONTAINER" "$ABCDETEMPDIR/track$1.$OGGOUTPUTCONTAINER" - # Doublecheck that the commented file was created successfully before wiping the original + # 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 @@ -858,6 +889,9 @@ do_tag () echo GENRE="$CDGENRE" fi echo TRACKNUMBER="${TRACKNUM:-$1}" + if [ -n "$DISCNUMBER" ]; then + echo DISCNUMBER="$DISCNUMBER" + fi echo CDDB="$CDDBDISCID" if [ "$(eval echo ${COMMENT})" != "" ]; then case "$COMMENTOUTPUT" in @@ -865,7 +899,7 @@ do_tag () *) echo COMMENT="$COMMENTOUTPUT";; esac fi - ) | run_command tagtrack-$OUTPUT-$1 $METAFLAC $METAFLACOPTS ${IMPORTCUESHEET:+--import-cuesheet-from="$ABCDETEMPDIR/$CUEFILE"} --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER" + ) | run_command tagtrack-$OUTPUT-$1 nice $ENCNICE $METAFLAC $METAFLACOPTS ${IMPORTCUESHEET:+--import-cuesheet-from="$ABCDETEMPDIR/$CUEFILE"} --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER" ;; spx) run_command tagtrack-$OUTPUT-$1 true @@ -874,7 +908,20 @@ do_tag () run_command tagtrack-$OUTPUT-$1 true ;; m4a) - run_command tagtrack-$OUTPUT-$1 true + # Use a temp-file of our choice. --overWrite seems to + # case core dumps with AtomicParsley 0.9.0 + ATOMICTEMPFILE="$ABCDETEMPDIR/track$1.m4a-atomic" + + VARIOUSBOOL="false" + if [ "$VARIOUSARTISTS" = "y" ]; then + VARIOUSBOOL="true" + fi + + #It has to be command file opts for AtomicParsley + run_command tagtrack-$OUTPUT-$1 nice $ENCNICE $ATOMICPARSLEY $ABCDETEMPDIR/track$1.m4a --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --tracknum ${TRACKNUM:-$1} --year "$CDYEAR" --genre "$CDGENRE" --compilation $VARIOUSBOOL --comment "$COMMENTOUTPUT" --output $ATOMICTEMPFILE + if [ -f $ATOMICTEMPFILE ]; then + mv "$ATOMICTEMPFILE" "$ABCDETEMPDIR/track$1.m4a" + fi ;; wav) run_command tagtrack-$OUTPUT-$1 true @@ -892,14 +939,15 @@ do_tag () # OUTPUTTYPE, {FOO}ENCODERSYNTAX, ENCNICE, ENCODER, ENCODEROPTS do_nogap_encode () { - # The commands here don't go through run_command because they're never supposed to be silenced + # The commands here don't go through run_command because they're never + # supposed to be silenced echo "Encoding gapless MP3 tracks: $TRACKQUEUE" for OUTPUT in $(echo $OUTPUTTYPE | tr , \ ) do case "$OUTPUT" in mp3) case "$MP3ENCODERSYNTAX" in - lame) + lame|toolame) ( cd "$ABCDETEMPDIR" TRACKFILES= @@ -931,8 +979,8 @@ do_nogap_encode () fi fi fi - # Other encoders fall through to normal encoding as the tracks - # have not been entered in the status file. + # Other encoders fall through to normal encoding as the tracks have not + # been entered in the status file. } # do_encode [tracknumber] [hostname] @@ -1006,20 +1054,26 @@ do_encode () RUN_COMMAND="" # We need a way to store the creation of the files when using PIPES RUN_COMMAND_PIPES="run_command encodetrack-$OUTPUT-$1 true" + # When pipping it does not make sense to have a higher nice for + # reading than for encoding, since it will be hold by the + # encoding process. Setting an effective nice, to calm down a + # bit the reading process. + EFFECTIVE_NICE=$READNICE else run_command '' echo "Encoding track $1 of $TRACKS: $TRACKNAME..." RUN_COMMAND="run_command encodetrack-$OUTPUT-$1" + EFFECTIVE_NICE=$ENCNICE fi case "$OUTPUT" in mp3) case "$2" in %local*%) case "$MP3ENCODERSYNTAX" in - lame|gogo) $RUN_COMMAND nice $ENCNICE $MP3ENCODER $MP3ENCODEROPTS "$IN" "$OUT" ;; - bladeenc) $RUN_COMMAND nice $ENCNICE $MP3ENCODER $MP3ENCODEROPTS -quit "$IN" ;; - l3enc|xingmp3enc) $RUN_COMMAND nice $ENCNICE $MP3ENCODER "$IN" "$OUT" $MP3ENCODEROPTS ;; + lame|toolame|gogo) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER $MP3ENCODEROPTS "$IN" "$OUT" ;; + bladeenc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER $MP3ENCODEROPTS -quit "$IN" ;; + l3enc|xingmp3enc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER "$IN" "$OUT" $MP3ENCODEROPTS ;; # FIXME # Relates to the previous FIXME since it might need the "-if" removed. - mp3enc) $RUN_COMMAND nice $ENCNICE $MP3ENCODER -if "$IN" -of "$OUT" $MP3ENCODEROPTS ;; + mp3enc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER -if "$IN" -of "$OUT" $MP3ENCODEROPTS ;; esac ;; *) @@ -1031,8 +1085,8 @@ do_encode () case "$2" in %local*%) case "$OGGENCODERSYNTAX" in - vorbize) $RUN_COMMAND nice $ENCNICE $OGGENCODER $OGGENCODEROPTS -w "$OUT" "$IN" ;; - oggenc) $RUN_COMMAND nice $ENCNICE $OGGENCODER $OGGENCODEROPTS -o "$OUT" "$IN" ;; + vorbize) $RUN_COMMAND nice $EFFECTIVE_NICE $OGGENCODER $OGGENCODEROPTS -w "$OUT" "$IN" ;; + oggenc) $RUN_COMMAND nice $EFFECTIVE_NICE $OGGENCODER $OGGENCODEROPTS -o "$OUT" "$IN" ;; esac ;; *) @@ -1044,7 +1098,7 @@ do_encode () case "$2" in %local*%) case "$FLACENCODERSYNTAX" in - flac) $RUN_COMMAND nice $ENCNICE $FLACENCODER -f $FLACENCODEROPTS -o "$OUT" "$IN" ;; + flac) $RUN_COMMAND nice $EFFECTIVE_NICE $FLACENCODER -f $FLACENCODEROPTS -o "$OUT" "$IN" ;; esac ;; *) @@ -1064,9 +1118,9 @@ 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 $ENCNICE $SPEEXENCODER $SPEEXENCODEROPTS --author "$TRACKARTIST" --title "$TRACKNAME" "$COMMENT" "$IN" "$OUT" + $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS --author "$TRACKARTIST" --title "$TRACKNAME" "$COMMENT" "$IN" "$OUT" else - $RUN_COMMAND nice $ENCNICE $SPEEXENCODER $SPEEXENCODEROPTS "$IN" "$OUT" + $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS "$IN" "$OUT" fi ;; mpc) @@ -1076,12 +1130,12 @@ do_encode () # errors, so I have not tried it myself. ## FIXME ## Needs some cleanup to determine if an empty tag sent ## FIXME ## to the encoder ends up empty. - $RUN_COMMAND nice $ENCNICE $MPPENCODER $MPPENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --year "$CDYEAR" --comment "$COMMENT" "$IN" "$OUT" + $RUN_COMMAND nice $EFFECTIVE_NICE $MPPENCODER $MPPENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --year "$CDYEAR" --comment "$COMMENT" "$IN" "$OUT" ;; m4a) # 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 $ENCNICE $AACENCODER $AACENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --year "$CDYEAR" --comment "$COMMENT" -o "$OUT" "$IN" + $RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER $AACENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --track "$1" --genre "$CDGENRE" --year "$CDYEAR" --comment "$COMMENT" -o "$OUT" "$IN" else $RUN_COMMAND nice $ENCNICE $AACENCODER $AACENCODEROPTS -o "$OUT" "$IN" @@ -1432,6 +1486,7 @@ do_playlist () read ERASEPLAYLIST case $ERASEPLAYLIST in e|E|a|A|k|K) DONE=y ;; + "") ERASEPLAYLIST=e ; DONE=y ;; *) ;; esac done @@ -1490,6 +1545,156 @@ do_playlist () done } +# abcde.cue2discid +# This function reads a cuefile on stdin and writes an extended +# cddb query on stdout. Any PREGAP for track 1 is properly +# handled, although cue files embedded in FLAC files do not +# appear to properly store the PREGAP setting. :( +abcde.cue2discid () { + + cddb_sum () { + val=$1 + ret=0 + while [ $val -gt 0 ] ; do + ret=$(( $ret + ( $val % 10) )) + val=$(( $val / 10 )) + done + echo $ret + } + + msf2lba () { + OIFS="$IFS" + IFS=":" + set -- $1 + IFS="$OIFS" + local first second third + first=$(expr ${1} + 0 ) + second=$(expr ${2} + 0 ) + third=$(expr ${3} + 0 ) + + echo $(( ((($first * 60) + $second) * 75) + $third )) + } + + OFFSET=150 + PREGAP=0 + LEADOUT=0 + LEADIN=88200 + i=0 + N=0 + + while read line ; do + set -- $line + case "$1" in + TRACK) i=$(( i + 1 )) + ;; + INDEX) if [ "$2" -eq 1 ] ; then + LBA=$(msf2lba $3) + START=$(( $LBA + $PREGAP + $OFFSET )) + eval TRACK$i=$START + X=$(cddb_sum $(( $START / 75 )) ) + N=$(( $N + $X )) + fi + ;; + PREGAP) PREGAP=$(msf2lba $2) + ;; + REM) case "$2" in + FLAC__lead-out) + LEADOUT=$(( $4 / 588 )) + ;; + FLAC__lead-in) + LEADIN=$(( $3 / 588 )) + ;; + esac + ;; + esac + + done + + TRACKS=$i + LEADOUT=$(( $LEADOUT + $LEADIN )) + + LENGTH=$(( $LEADOUT/75 - $TRACK1/75 )) + DISCID=$(( ( $N % 255 ) * 2**24 | $LENGTH * 2**8 | $TRACKS )) + printf "%08x %i" $DISCID $TRACKS + + j=1 + while [ $j -le $TRACKS ] ; do + eval echo -n "\" \$TRACK$j\"" + j=$((j+1)) + done + echo " $(( $LEADOUT / 75 ))" +} + +# abcde.mkcue +# abcde.mkcue [--wholedisk] +# This creates a cuefile directly from the extended discid information +# The --wholedisk option controls whether we're ripping data from the +# start of track one or from the start of the disk (usually, but not +# always the same thing!) +# +# Track one leadin/pregap (if any) handeling: +# --wholedisk specified: +# TRACK 01 AUDIO +# INDEX 00 00:00:00 +# INDEX 01 +# Remaining track index values unchanged from disc TOC +# +# --wholedisk not specified +# TRACK 01 AUDIO +# PREGAP +# INDEX 01 00:00:00 +# Remaining track index values offset by +# +# Variables used: +# TRACKINFO +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 + fi + echomsf " INDEX 01 " $LBA + i=$(($i+1)) + shift + done +} + # do_discid # This essentially the start of things do_discid () @@ -1509,7 +1714,11 @@ do_discid () flac) if $METAFLAC $METAFLACOPTS --export-cuesheet-to=- "$CDROM" > /dev/null 2>&1 ; then case "$CUE2DISCID" in + # FIXME # right now we have 2 cue2discid internal + # implementations: builtin and abcde.cue2discid. Test + # both of them and decide which one we want to use. builtin) + #vecho "Using builtin cue2discid implementation..." CUESHEET="$(metaflac $METAFLACOPTS --export-cuesheet-to=- "$CDROM")" #TRACKS=$(echo $CUESHEET | egrep "TRACK \+[[:digit:]]\+ \+AUDIO" |wc -l) @@ -1528,6 +1737,7 @@ do_discid () makeids ;; *) + #vecho "Using external python cue2discid implementation..." TRACKINFO=$($METAFLAC $METAFLACOPTS --export-cuesheet-to=- "$CDROM" | $CUE2DISCID) ;; esac @@ -1537,7 +1747,7 @@ do_discid () fi ;; # cdparanoia|debug) -# CDPARANOIAOUTPUT="$( $CDROMREADER -$CDPARANOIACDROMBUS $CDROM -Q --verbose 2>&1 )" +# CDPARANOIAOUTPUT="$( $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -Q --verbose 2>&1 )" # RET=$? # if [ ! "$RET" = "0" ];then # log warning "something went wrong while querying the CD... Maybe a DATA CD?" @@ -1552,9 +1762,9 @@ do_discid () # ;; *) case "$CDDBMETHOD" in - cddb) TRACKINFO=$($CDDISCID $CDROM) ;; + cddb) TRACKINFO=$($CDDISCID "$CDROM") ;; # FIXME # musicbrainz needs a cleanup - musicbrainz) TRACKINFO=$($MUSICBRAINZ -c $CDROM ) ;; + musicbrainz) TRACKINFO=$($MUSICBRAINZ -c "$CDROM" ) ;; esac ;; esac @@ -1598,7 +1808,7 @@ do_discid () cdparanoia|debug) if [ "$WEHAVEACD" = "y" ]; then vecho "Querying the CD for audio tracks..." - CDPARANOIAOUTPUT="$( $CDROMREADER -$CDPARANOIACDROMBUS $CDROM -Q --verbose 2>&1 )" + CDPARANOIAOUTPUT="$( $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -Q --verbose 2>&1 )" RET=$? if [ ! "$RET" = "0" ];then log warning "something went wrong while querying the CD... Maybe a DATA CD?" @@ -1729,13 +1939,15 @@ do_discid () # Store the abcde version in the status file. echo "abcde-version=$VERSION" >> "$ABCDETEMPDIR/status" fi - if [ X"$MAKECUEFILE" = "Xy" -a X"$WEHAVEACD" = "Xy" ]; then + if [ X"$DOCUE" = "Xy" -a X"$WEHAVEACD" = "Xy" ]; then if checkstatus cuefile > /dev/null 2>&1 ; then :; else CUEFILE=cue-$(echo "$TRACKINFO" | cut -f1 -d' ').txt vecho "Creating cue file..." case $CDROMREADERSYNTAX in flac) - if $METAFLAC --export-cuesheet-to=- $CDROM > "$ABCDETEMPDIR/$CUEFILE"; then :; else + 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." fi ;; @@ -1779,15 +1991,24 @@ do_cleancue() n=1 echo "PERFORMER \"$DARTIST\"" >> "$CUEFILE_OUT" echo "TITLE \"$DALBUM\"" >> "$CUEFILE_OUT" + # Set IFS to to prevent read from swallowing spaces and tabs + OIFS="$IFS" + IFS=' +' cat "$CUEFILE_IN" | while read line do if echo "$line" | grep "INDEX 01" > /dev/null 2>&1 ; then +# FIXME # Possible patch: remove the line above, uncomment the 2 lines below. +# echo "$line" >> "$CUEFILE_OUT" +# if echo "$line" | grep "^[[:space:]]*TRACK" > /dev/null 2>&1 ; then eval track="\$TRACK$n" n=$(expr $n + 1) - echo "TITLE \"$track\"" >> "$CUEFILE_OUT" + echo " TITLE \"$track\"" >> "$CUEFILE_OUT" fi +# FIXME # If the lines above are uncommented, remove the line below. echo "$line" >> "$CUEFILE_OUT" done + IFS="$OIFS" mv "$CUEFILE_OUT" "$CUEFILE_IN" echo "cleancuefile" >> "$ABCDETEMPDIR/status" fi @@ -1963,6 +2184,7 @@ do_musicbrainzstat () do_musicbrainz () { +# Use MBE_TOCGetCDIndexId on a perl query : } @@ -2482,7 +2704,10 @@ do_cdread () UTRACKNUM=$FIRSTTRACK case "$CDROMREADERSYNTAX" in flac) READTRACKNUMS="$FIRSTTRACK.1-$(($LASTTRACK + 1)).0" ;; - cdparanoia) READTRACKNUMS="$FIRSTTRACK-$LASTTRACK" ;; + 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" ;; *) echo "abcde error: $CDROMREADERSYNTAX does not support ONETRACK mode" exit 1 ;; @@ -2530,7 +2755,7 @@ do_cdread () 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 ;; + nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" ${READTRACKNUMS:-$UTRACKNUM} "$FILEARG" $REDIR ;; cdda2wav) if [ "$OSFLAVOUR" = "OSX" ] ; then # Hei, we have to unmount the device before running anything like cdda2wav in OSX @@ -2550,7 +2775,7 @@ do_cdread () ;; ## 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) nice $READNICE $CDROMREADER -d "$CDROM" -v $UTRACKNUM "$FILEARG" $REDIR ;; cddafs) # Find the track's mounted path @@ -2563,7 +2788,7 @@ do_cdread () else false fi ;; - debug) nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS $CDROM -w $UTRACKNUM-[:1] "$FILEARG" $REDIR + debug) nice $READNICE $CDROMREADER -$CDPARANOIACDROMBUS "$CDROM" -w $UTRACKNUM-[:1] "$FILEARG" $REDIR ;; esac RETURN=$? @@ -2660,6 +2885,13 @@ post_read () : } +# post_encode +# Empty post_encode function, to be defined in the configuration file. +post_encode () +{ +: +} + ############################################################################### # End of functions # @@ -2719,6 +2951,7 @@ KEEPWAVS=n PADTRACKS=n NOGAP=n BATCHNORM=n +NOCDDBQUERY=n # If using scsi devices, cdda2wav needs a CDROMID, instead of a device node # i.e. CDROMID="1,0,0" @@ -2751,6 +2984,10 @@ AACENC=faac ID3=id3 ID3V2=id3v2 EYED3=eyeD3 +VORBISCOMMENT=vorbiscomment +METAFLAC=metaflac +AACTAG=faac + CDPARANOIA=cdparanoia CDDA2WAV=cdda2wav DAGRAB=dagrab @@ -2761,8 +2998,6 @@ MUSICBRAINZ=musicbrainz-get-tracks EJECT=eject MD5SUM=md5sum DISTMP3=distmp3 -VORBISCOMMENT=vorbiscomment -METAFLAC=metaflac NORMALIZE=normalize-audio CDSPEED=eject VORBISGAIN=vorbisgain @@ -2771,7 +3006,7 @@ MPPGAIN=replaygain MKCUE=mkcue MKTOC=cdrdao DIFF=diff -CUE2DISCID=cue2discid +CUE2DISCID=builtin # Options for programs called from abcde # mp3 @@ -2820,11 +3055,17 @@ ACTIONS=cddb,read,encode,tag,move,clean # 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:lame,mp3:bladeenc,spx:speex,m4a:faac +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" +# List of quality levels associated with the encoders: +DEFAULT_QUALITY_XLO="oggenc:-q -1,lame:-q 9,speex:--quality 1,m4a:" +DEFAULT_QUALITY_LO="oggenc:-q 1,lame:-q 7,speex:--quality 5,m4a:" +DEFAULT_QUALITY_HI="oggenc:-q 7,lame:--preset standard,speex:--quality 9,m4a:" +DEFAULT_QUALITY_XHI="oggenc:-q 10,lame:--preset extreme,speex:--quality 10,m4a:" + # Asume fetch if under FreeBSD. curl is used for Mac OS X. wget is used for # Linux/OpenBSD. ftp is user for NetBSD. # Let's use these checkings to determine the OS flavour, which will be used @@ -2862,6 +3103,12 @@ CDDBAVAIL=y USEID3=y USEID3V2=y +# There we go.. +# But before we get into business, let us chop off any GREP environmental +# variables. +GREP_OPTIONS="" +GREP_COLOR="" + if [ -z "$OUTPUTDIR" ]; then OUTPUTDIR=$(pwd) fi @@ -2884,7 +3131,7 @@ fi if [ "$HTTPGETOPTS" = "" ] ; then case $HTTPGET in - wget) HTTPGETOPTS="-q -O -";; + wget) HTTPGETOPTS="-q -nv -e timestamping=off -O -";; curl) HTTPGETOPTS="-f -s";; fetch)HTTPGETOPTS="-q -o -";; ftp) HTTPGETOPTS="-a -V -o - ";; @@ -2910,8 +3157,8 @@ if [ "$CDROM" = "" ] ; then fi # Parse command line options -#while getopts 1a:bc:C:d:Dehj:klLmMnNo:pPr:Rs:S:t:T:vVxw:W: opt ; do -while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:uvVxw:W:z opt ; do +#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 case "$opt" in 1) ONETRACK=y ;; a) ACTIONS="$OPTARG" ;; @@ -2935,17 +3182,17 @@ while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:uvVxw:W:z opt ; do n) CDDBAVAIL=n ;; N) INTERACTIVE=n ;; m) DOSPLAYLIST=y ;; - M) MAKECUEFILE=y ;; + M) DOCUE=y ;; o) OUTPUTTYPE="$OPTARG" ;; p) PADTRACKS=y ;; P) USEPIPES=y ;; + q) QUALITYLEVEL="$OPTARG" ;; r) REMOTEHOSTS="$OPTARG" ;; R) CDDBLOCALRECURSIVE=y ;; s) SHOWCDDBFIELDS="$OPTARG" ;; S) CDSPEEDVALUE="$OPTARG" ;; t) STARTTRACKNUMBER="$OPTARG" ;; T) STARTTRACKNUMBER="$OPTARG" ; STARTTRACKNUMBERTAG="y" ;; - u) CDDBPROTO=6 ;; U) CDDBPROTO=5 ;; v) echo "This is abcde v$VERSION." @@ -2955,16 +3202,19 @@ while getopts 1a:bBc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:uvVxw:W:z opt ; do ;; V) EXTRAVERBOSE="y" ;; x) EJECTCD="y" ;; + X) CUE2DISCID="$OPTARG" ;; w) COMMENT="$OPTARG" ;; W) if echo $OPTARG | grep "[[:digit:]]" > /dev/null 2>&1 ; then - STARTTRACKNUMBER="${OPTARG}01" ; STARTTRACKNUMBERTAG="y" ; COMMENT="CD${OPTARG}" + STARTTRACKNUMBER="${OPTARG}01" + STARTTRACKNUMBERTAG="y" + COMMENT="CD${OPTARG}" + DISCNUMBER="${OPTARG}" else log error "argument of -W must be integer" exit 1 fi ;; z) DEBUG=y ; CDROMREADERSYNTAX=debug ; EJECTCD="n" ;; - Z) CUE2DISCID=builtin;; ?) usage; exit ;; esac done @@ -2975,6 +3225,11 @@ shift $(($OPTIND - 1)) # ripping, we have a mixture of sanity checks, verifications, default settigs # and other crazy stuff that interdepends, but hey, someone has to do it. +# If NOCDDBQUERY is set, don't query the CDDB server. +if [ "$NOCDDBQUERY" = "y" ]; then + CDDBAVAIL="n" +fi + # If the user specified a flac file, then switch to special flac mode if echo "$CDROM" | grep -i '.flac$' > /dev/null 2>&1 ; then if [ ! -f "$CDROM" ]; then @@ -3064,11 +3319,14 @@ DOMOVE=n DOREPLAYGAIN=n DOPLAYLIST=n DOCLEAN=n +## FIXME ## Lets keep compatibility with -M +[ "$DOCUE" != "y" ] && DOCUE=n for ACTION in $(echo $ACTIONS | tr , \ ) do case $ACTION in default) DOCDDB=y; DOREAD=y; DOENCODE=y; DOTAG=y; DOMOVE=y; DOCLEAN=y;; + cue) DOCUE=y ; MAKECUEFILE=y ;; cddb) DOCDDB=y;; read) DOREAD=y;; normalize) DONORMALIZE=y; DOREAD=y;; @@ -3172,7 +3430,7 @@ if [ "$BATCHNORM" = "y" ] && [ "$DONORMALIZE" = "n" ]; then BATCHNORM=n fi -# Check the encoding format from the ones available in the system, if nothing has been configured in the system. +# Check the encoding format from the ones available in the system, if nothing has been configured. if [ X"$OUTPUTTYPE" = "X" ]; then for DEFAULT_OUTPUT in $( echo "$DEFAULT_OUTPUT_BINARIES" | tr , \ ); do DEFAULT_OUTPUT_FORMAT="$(echo $DEFAULT_OUTPUT | cut -d ":" -f 1)" @@ -3263,7 +3521,7 @@ do [ "$FLACENCODERSYNTAX" = "default" ] && FLACENCODERSYNTAX=flac [ "$DOTAG" = "y" ] && NEEDMETAFLAC=y [ "$DOREPLAYGAIN" = "y" ] && NEEDMETAFLAC=y - [ "$ONETRACK" = "y" ] && [ "$MAKECUEFILE" = "y" ] && NEEDMETAFLAC=y + [ "$ONETRACK" = "y" ] && [ "$DOCUE" = "y" ] && NEEDMETAFLAC=y ;; spx) [ "$SPEEXENCODERSYNTAX" = "default" ] && SPEEXENCODERSYNTAX=speexenc @@ -3275,6 +3533,7 @@ do ;; m4a) [ "$AACENCODERSYNTAX" = "default" ] && AACENCODERSYNTAX=faac + [ "$DOTAG" = "y" ] && CHECKATOMICPARSLEY=y ;; wav) if [ "$KEEPWAVS" = "y" ]; then @@ -3333,6 +3592,9 @@ case "$FLACENCODERSYNTAX" in flac) FLACENCODEROPTS="${FLACENCODEROPTSCLI:-$FLACOPTS}" FLACENCODER="$FLAC" + if [ "$DOREPLAYGAIN" = "y" ]; then + FLACENCODEROPTS="${FLACENCODEROPTS} --replay-gain" + fi # FLAC streams can be encapsulated on a Ogg transport layer if echo "$FLACENCODEROPTS" | egrep -- "(^| )--ogg($| )" > /dev/null 2>&1 ;then log error "FLAC on an Ogg container is not yet supported" @@ -3372,9 +3634,9 @@ else TAGGEROPTS="$ID3V2OPTS" fi -# Specific for NOGAP is the use of lame. Another encoder fails... +# NOGAP is specific to lame. Other encoders fail ... if [ "$NOGAP" = "y" ] && [ ! "$MP3ENCODER" = "lame" ]; then - log warning "the NOGAP option is specific of lame. Deactivating..." + log warning "the NOGAP option is specific to lame. Deactivating..." NOGAP=n fi @@ -3431,7 +3693,7 @@ if [ ! "$CDDBAVAIL" = "n" ] && [ "$DOCDDB" = "y" ]; then : fi fi -if [ "$MAKECUEFILE" = "y" ]; then +if [ "$DOCUE" = "y" ]; then NEEDCUEREADER=y fi @@ -3497,6 +3759,7 @@ fi for X in $CDROMREADER $CDDISCID ${NEEDTAGGER+$TAGGER} $MP3ENCODER \ $OGGENCODER $FLACENCODER $SPEEXENCODER $MPPENCODER \ $AACENCODER \ + ${NEEDATOMICPARSLEY+$ATOMICPARSLEY} \ ${NEEDHTTPGET+$HTTPGET} ${NEEDDISTMP3+$DISTMP3} \ ${NEEDCOMMENTER+$VORBISCOMMENT} ${NEEDMETAFLAC+$METAFLAC} \ ${NEEDNORMALIZER+$NORMALIZER} ${NEEDEJECT+$EJECT} \ @@ -3508,6 +3771,15 @@ do checkexec "$X" done +if [ "$CHECKATOMICPARSLEY" = "y" ]; then + if ! new_checkexec "$ATOMICPARSLEY"; then + echo "WARNING: $ATOMICPARSLEY Not Found Not Post-Tagging!" + DOTAG='n' + else + echo "Using $ATOMICPARSLEY To Tag AAC Tracks." + fi +fi + # And last but not least, check if we can diff between files. We do not abort, # since diffing is not critical... if [ -x $(which $DIFF) ]; then :; else @@ -3531,7 +3803,7 @@ HTTPGET="$HTTPGET $HTTPGETOPTS" # Here it used to say: # One thousand lines in, we can start doing stuff with things -# Well, right now we are at line 3306 ;) +# Well, right now we are at line 3737 ;) # Export needed things so they can be read in this subshell export CDDBTOOL ABCDETEMPDIR TRACKQUEUE LOWDISK EJECTCD EJECT EJECTOPTS @@ -3720,7 +3992,7 @@ if [ "$EJECTCD" = "y" ] && [ -x $(which $EJECT) ]; then elif [ X"$(uname)" = X"Darwin" ] ; then disktool -e ${CDROM#/dev/} 0 else - $EJECT $EJECTOPTS $CDROM + $EJECT $EJECTOPTS "$CDROM" fi #fi fi @@ -3925,6 +4197,9 @@ if [ "$DOREPLAYGAIN" = "y" ]; then do_replaygain fi +# Execute the user-defined post_encode function before cleaning up +post_encode + # Check to see if run_command logged any errors if [ -f "$ABCDETEMPDIR/errors" ]; then log error "The following commands failed to run:"