+new_checkexec ()
+{
+ if [ ! "$@" = "" ]; then
+ # Cut off any command-line option we added in
+ X=$(echo $@ | cut -d' ' -f2)
+ if [ "$(which $X)" = "" ]; then
+ return 1
+ elif [ ! -x $(which $X) ]; then
+ return 2
+ fi
+ fi
+ return 0
+}
+
+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
+ exit 1
+ fi
+ fi
+}
+
+# diffentries <filename> <max_value> <entry1>,<entry2>
+# max_value: the range of entries goes from 1 to <max_value>
+diffentries ()
+{
+ FILENAME=$1
+ shift
+ local CDDBDIFFCHOICES=$1
+ shift
+ local CDDBDIFFCHOICE="$@"
+ if [ ! X"$DIFF" = "X" ]; then
+ PARSECHOICE1=$(echo $CDDBDIFFCHOICE | cut -d"," -f1 | xargs printf %d 2>/dev/null)
+ 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
+ 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.
+ for PARSECHOICE in $(echo $CDDBDIFFCHOICE | tr , \ ); do
+ do_cddbparse "$ABCDETEMPDIR/$FILENAME.$PARSECHOICE" > "$ABCDETEMPDIR/$FILENAME.parsechoice.$PARSECHOICE"
+ done
+ echo "Showing diff between choices $PARSECHOICE1 and $PARSECHOICE2..." > "$ABCDETEMPDIR/$FILENAME.diff"
+ $DIFF $DIFFOPTS "$ABCDETEMPDIR/$FILENAME.parsechoice.$PARSECHOICE1" "$ABCDETEMPDIR/$FILENAME.parsechoice.$PARSECHOICE2" >> "$ABCDETEMPDIR/$FILENAME.diff"
+ if [ $(cat "$ABCDETEMPDIR/$FILENAME.diff" | wc -l) -ge 24 ]; then
+ page "$ABCDETEMPDIR/$FILENAME.diff"
+ else
+ cat "$ABCDETEMPDIR/$FILENAME.diff" >&2
+ fi
+ fi
+ else
+ echo "The diff program was not found in your path. Please choose a number between 0 and $CDDBDIFFCHOICES." >&2
+ fi
+}
+
+# getcddbinfo
+# Finds an specific field from cddbinfo
+getcddbinfo()
+{
+ case $1 in
+ TRACKNAME1)
+ TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')"
+ ;;
+ TRACKNAME)
+ TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')"
+ ;;
+ TRACK-INFO)
+ grep ^EXTT$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\\n/\n/g'
+ ;;
+ esac
+}
+
+# gettracknum
+# Get the track number we are going to use for different actions
+gettracknum()
+{
+ if [ -n "$STARTTRACKNUMBER" ] ; then
+ # Get the trackpadding from the current track
+ CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c)
+ TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK ))
+ else
+ TRACKNUM=${UTRACKNUM}
+ fi
+}
+
+# makeids
+#
+# Calculate cddb disc ids without requiring specialized helper programs.
+# largely copied from cd-discid and musicbrainz examples. some of the steps
+# don't make sense, but they're necessary to match the ids generated by other
+# programs.
+#
+## FIXME ## Right now, we get 2 frames more than with cue2discid ??
+# data@petit:~$ sh /tmp/cue2discid /home/data/tmp/flac/01.Roisin_Murphy--Ruby_Blue.flac
+# processing offsetimes 00:00:00 04:47:10 08:20:37 11:46:46 17:45:36 21:41:57 27:32:21 32:03:73 35:39:28 38:27:33 43:50:38 44:42:34
+# 980b4b0c 12 150 21685 37687 53146 80061 97782 124071 144448 160603 173208 197438 201334 2895
+# data@petit:~$ metaflac --export-cuesheet-to=- /home/data/tmp/flac/01.Roisin_Murphy--Ruby_Blue.flac| python /home/data/sources/abcde/trunk/examples/cue2discid
+# 980b4b0c 12 150 21685 37687 53146 80061 97782 124071 144448 160603 173208 197438 201334 2893
+#
+# Variables: OFFSETS, TRACKS, LEADOUT, [LEADIN]
+makeids ()
+{
+ if [ X"$LEADOUT" = "X" ]; then
+ log warning "Error trying to calculate disc ids without lead-out information."
+ exit 1
+ fi
+
+ # default to a two second lead-in
+ IDMAGICNUM=150
+ LEADIN=${LEADIN:=150}
+
+ # number of cdframes per second
+ CDFRAMES=75
+
+ # reset cddb checksum for cddb disc-id calululation
+ CDDBCKSUM=0
+
+ COOKEDOFFSETS=""
+ for OFFSET in $(echo $OFFSETS)
+ do
+ COOKEDOFFSETS="${COOKEDOFFSETS} $(($OFFSET + $LEADIN))"
+
+ OFFSETTIME=$(( ($OFFSET + $LEADIN) / $CDFRAMES ))
+ while [ $OFFSETTIME -gt 0 ]; do
+ CDDBCKSUM=$(($CDDBCKSUM + $OFFSETTIME % 10))
+ OFFSETTIME=$(($OFFSETTIME / 10))
+ done
+
+ done
+
+ COOKEDOFFSETS="${COOKEDOFFSETS:1}" # eat the leading space
+
+ PREGAP=$(($(echo $OFFSETS | cut -f1 -d' ')))
+ TOTALTIME=$(( (($LEADOUT + $LEADIN + $PREGAP) / $CDFRAMES) - (($LEADIN + $PREGAP) / $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()
+{
+ if checkstatus replaygain; then :; else
+ run_command "" echo "Adding replaygain information..."
+ for TMPOUTPUT in $( echo $OUTPUTTYPE | tr , \ )
+ do
+ case $TMPOUTPUT in
+ vorbis|ogg)
+ OUTPUT=$OGGOUTPUTCONTAINER
+ ;;
+ flac)
+ OUTPUT=$FLACOUTPUTCONTAINER
+ ;;
+ *)
+ OUTPUT=$TMPOUTPUT
+ ;;
+ esac
+ OUTPUTFILES=""
+ REPLAYINDEX=0
+ for UTRACKNUM in $TRACKQUEUE
+ do
+ CDDBTRACKNUM=$(expr $UTRACKNUM - 1)
+ getcddbinfo TRACKNAME
+ splitvarious
+ TRACKFILE="$(mungefilename "$TRACKNAME")"
+ ARTISTFILE="$(mungefilename "$TRACKARTIST")"
+ ALBUMFILE="$(mungefilename "$DALBUM")"
+ GENRE="$(mungegenre "$GENRE")"
+ YEAR=${CDYEAR:-$CDYEAR}
+ gettracknum
+ if [ "$ONETRACK" = "y" ]; then
+ if [ "$VARIOUSARTISTS" = "y" ]; then
+ OUTPUTFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\")"
+ else
+ OUTPUTFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\")"
+ fi
+ else
+ if [ "$VARIOUSARTISTS" = "y" ]; then
+ OUTPUTFILE="$(eval echo \""$VAOUTPUTFORMAT"\")"
+ else
+ OUTPUTFILE="$(eval echo \""$OUTPUTFORMAT"\")"
+ fi
+ fi
+ OUTPUTFILES[$REPLAYINDEX]="$OUTPUTDIR/$OUTPUTFILE.$OUTPUT"
+ (( REPLAYINDEX = $REPLAYINDEX + 1 ))
+ done
+ case "$OUTPUT" in
+ flac)
+ run_command replaygain-flac nice $ENCNICE $METAFLAC $FLACGAINOPTS "${OUTPUTFILES[@]}"
+ #run_command replaygain-flac true
+ ;;
+ vorbis|ogg)
+ run_command replaygain-vorbis nice $ENCNICE $VORBISGAIN $VORBISGAINOPTS "${OUTPUTFILES[@]}"
+ ;;
+ mp3)
+ run_command replaygain-mp3 nice $ENCNICE $MP3GAIN $MP3GAINOPTS "${OUTPUTFILES[@]}"
+ ;;
+ mpc)
+ run_command replaygain-mpc nice $ENCNICE $MPPGAIN --auto "${OUTPUTFILES[@]}"
+ ;;
+ *);;
+ esac
+ done
+ if checkerrors "replaygain-.{3,6}"; then :; else
+ run_command replaygain true
+ fi
+ fi
+}
+