# Copyright (c) 1998-2001 Robert Woodcock <rcw@debian.org>
# Copyright (c) 2003-2006 Jesus Climent <jesus.climent@hispalinux.es>
# Copyright (c) 2009-2012 Colin Tuckley <colint@debian.org>
-# Copyright (c) 2012 Steve McIntyre <93sam@@debian.org>
+# Copyright (c) 2012- Steve McIntyre <93sam@@debian.org>
+# Copyright (c) 2015- Andrew Strong <andrew.david.strong@gmail.com>
# This code is hereby licensed for public consumption under either the
# GNU GPL v2 or greater, or Larry Wall's Artistic license - your choice.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Copyright for this work is to expire January 1, 2010, after which it
-# shall be public domain.
-VERSION='2.7-UNRELEASED'
+VERSION='2.7.1-UNRELEASED'
usage ()
{
echo "-n No lookup. Don't query CDDB, just create and use template"
echo "-N Noninteractive. Never prompt for anything"
echo "-o <type1[,type2]...>"
-echo " Output file type(s) (vorbis,mp3,flac,spx,mpc,wav,m4a,opus,wv,ape). Defaults to vorbis"
+echo " Output file type(s) (vorbis,mp3,flac,spx,mpc,wav,m4a,opus,wv,ape,mp2,tta). 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 "-r <host1[,host2]...>"
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
+ if [ -e /etc/debian_* ] ; then
case $X in
oggenc) MISSING_PACKAGE=vorbis-tools ;;
lame|flac) MISSING_PACKAGE=$X ;;
esac
- log info "Hint: apt-get install $MISSING_PACKAGE" >&2
+ log info "Hint: sudo apt-get install $MISSING_PACKAGE" >&2
fi
exit 1
elif [ ! -x "$(which $X)" ]; then
-p artist="$TRACKARTIST" -p album="$DALBUM" -p title="$TRACKNAME" -p track=${TRACKNUM:-$1} \
-p year="$CDYEAR" -p genre="$CDGENRE" ${COMMENTOUTPUT:+-p comment="$COMMENTOUTPUT"}
;;
+ mp2)
+ # Using Mutagen's mid3v2 for tagging with id3v2.4.0. Interesting enough vlc, MPlayer and XMMS ignore
+ # these tags but they are read by Audacious, Xine, Aqualung, mediainfo, ffplay, ffprobe. FFmpeg does
+ # not currently tag mp2 audio so twolame and FFmpeg will both use mid3v2...
+ run_command tagtrack-$OUTPUT-$1 nice $ENCNICE "$MID3V2" --verbose -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" \
+ -y "$CDYEAR" -g "$CDGENRE" -T "${TRACKNUM:-$1}/$TRACKS" ${TPE2:+--TPE2 "$TPE2"} ${COMMENTOUTPUT:+--comment="$COMMENTOUTPUT"} \
+ "$ABCDETEMPDIR/track$1.mp2"
+ ;;
aac)
run_command tagtrack-$OUTPUT-$1 true
;;
faac)
run_command tagtrack-$OUTPUT-$1 true
;;
+ qaac)
+ run_command tagtrack-$OUTPUT-$1 true
+ ;;
+ fhgaacenc)
+ # Tag post encode with AtomicParsley. Note that previous problems with seg fault when using
+ # 'overWrite' cannot be reproduced with newer versions: https://bitbucket.org/wez/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" --comment="$COMMENT" $ATOMICPARSLEYOPTS --overWrite
+ ;;
+ ffmpeg)
+ run_command tagtrack-$OUTPUT-$1 true
+ ;;
esac
;;
+ tta)
+ # We use mid3v2 tagging for True Audio:
+ run_command tagtrack-$OUTPUT-$1 nice $ENCNICE "$MID3V2" --verbose -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" \
+ -y "$CDYEAR" -g "$CDGENRE" -T "${TRACKNUM:-$1}/$TRACKS" ${TPE2:+--TPE2 "$TPE2"} ${COMMENTOUTPUT:+--comment="$COMMENTOUTPUT"} \
+ "$ABCDETEMPDIR/track$1.tta"
+ ;;
wav)
run_command tagtrack-$OUTPUT-$1 true
;;
case "$OUTPUT" in
mp3)
case "$MP3ENCODERSYNTAX" in
- lame|toolame)
+ lame)
(
cd "$ABCDETEMPDIR"
TRACKFILES=
wv)
TEMPARG="PIPE_$WVENCODERSYNTAX"
;;
+ tta)
+ TEMPARG="PIPE_$TTAENCODERSYNTAX"
+ ;;
aac)
TEMPARG="PIPE_$AACENCODERSYNTAX"
;;
case "$2" in
%local*%)
case "$MP3ENCODERSYNTAX" in
- lame|toolame|gogo) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER $MP3ENCODEROPTS "$IN" "$OUT" ;;
+ lame|gogo) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER $MP3ENCODEROPTS "$IN" "$OUT" ;;
bladeenc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER $MP3ENCODEROPTS -quit "$IN" "$OUT" ;;
l3enc|xingmp3enc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER "$IN" "$OUT" $MP3ENCODEROPTS ;;
mp3enc) $RUN_COMMAND nice $EFFECTIVE_NICE $MP3ENCODER -if "$IN" -of "$OUT" $MP3ENCODEROPTS ;;
$RUN_COMMAND nice $EFFECTIVE_NICE $MPCENCODER $MPCENCODEROPTS "$IN" "$OUT"
fi
;;
+ tta)
+ $RUN_COMMAND nice $EFFECTIVE_NICE $TTAENCODER -e $TTAENCODEROPTS "$IN" -o "$OUT"
+ ;;
wv)
- if [ "$DOTAG" = "y" ]; then
- $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER $WVENCODEROPTS -w Artist="$TRACKARTIST" -w Album="$DALBUM" \
- -w Title="$TRACKNAME" -w Track="$1" -w Genre="$CDGENRE" -w Year="$CDYEAR" ${COMMENT:+-w Comment="$COMMENT"} "$IN" -o "$OUT"
- else
- $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER $WVENCODEROPTS "$IN" -o "$OUT"
- fi
+ case "$WVENCODERSYNTAX" in
+ wavpack)
+ if [ "$DOTAG" = "y" ]; then
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER $WVENCODEROPTS -w Artist="$TRACKARTIST" -w Album="$DALBUM" \
+ -w Title="$TRACKNAME" -w Track="$1" -w Genre="$CDGENRE" -w Year="$CDYEAR" ${COMMENT:+-w Comment="$COMMENT"} "$IN" -o "$OUT"
+ else
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER $WVENCODEROPTS "$IN" -o "$OUT"
+ fi
+ ;;
+ ffmpeg)
+ if [ "$DOTAG" = "y" ]; then
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER -i "$IN" $WVENCODEROPTS -metadata artist="$TRACKARTIST" \
+ -metadata album="$DALBUM" -metadata title="$TRACKNAME" -metadata track=${TRACKNUM:-$1} -metadata date="$CDYEAR" \
+ -metadata genre="$CDGENRE" -metadata comment="$COMMENT" "$OUT"
+ else
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WVENCODER -i "$IN" $WVENCODEROPTS "$OUT"
+ fi
+ ;;
+ esac
;;
ape)
$RUN_COMMAND nice $EFFECTIVE_NICE $APENCODER "$IN" "$OUT" $APENCODEROPTS
;;
+ mp2)
+ case "$MP2ENCODERSYNTAX" in
+ twolame)
+ $RUN_COMMAND nice $EFFECTIVE_NICE $MP2ENCODER $MP2ENCODEROPTS "$IN" "$OUT"
+ ;;
+ ffmpeg)
+ $RUN_COMMAND nice $EFFECTIVE_NICE $MP2ENCODER -i "$IN" $MP2ENCODEROPTS "$OUT"
+ ;;
+ esac
+ ;;
aac)
# aac container is only used to catch faac encoded files where faac
# is compiled without mp4 support (with libmp4v2).
$RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER $AACENCODEROPTS "$IN" -o "$OUT"
fi
;;
+ qaac)
+ if [ "$DOTAG" = "y" ]; then
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WINE $AACENCODER $AACENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" \
+ --title "$TRACKNAME" --track ${TRACKNUM:-$1} --date "$CDYEAR" --genre "$CDGENRE" --comment "$COMMENT" -o "$OUT" "$IN"
+ else
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WINE $AACENCODER $AACENCODEROPTS -o "$OUT" "$IN"
+ fi
+ ;;
+ fhgaacenc)
+ $RUN_COMMAND nice $EFFECTIVE_NICE $WINE $AACENCODER $AACENCODEROPTS "$IN" "$OUT"
+ ;;
+ ffmpeg)
+ if [ "$DOTAG" = "y" ]; then
+ $RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER -i "$IN" $AACENCODEROPTS -metadata artist="$TRACKARTIST" \
+ -metadata album="$DALBUM" -metadata title="$TRACKNAME" -metadata track=${TRACKNUM:-$1} -metadata date="$CDYEAR" \
+ -metadata genre="$CDGENRE" -metadata comment="$COMMENT" "$OUT"
+ else
+ $RUN_COMMAND nice $EFFECTIVE_NICE $AACENCODER -i "$IN" $AACENCODEROPTS "$OUT"
+ fi
+ ;;
esac
;;
wav)
CDTEXT_READER=icedax
elif new_checkexec cdda2wav; then
CDTEXT_READER=cdda2wav
- else
+ else
# Didn't find either, bail
return 0
fi
SPEEXENCODERSYNTAX=default
MPCENCODERSYNTAX=default
WVENCODERSYNTAX=default
+TTAENCODERSYNTAX=default
APENCODERSYNTAX=default
+MP2ENCODERSYNTAX=default
AACENCODERSYNTAX=default
NORMALIZERSYNTAX=default
CUEREADERSYNTAX=default
# program paths - defaults to checking your $PATH
# mp3
LAME=lame
-TOOLAME=toolame
GOGO=gogo
BLADEENC=bladeenc
L3ENC=l3enc
# mpc (Musepack)
MPCENC=mpcenc
# wv (wavpack)
+# WVENC is retained in abcde 2.7.1 for backwards compatibility
+# with abcde 2.7:
WVENC=wavpack
+WAVPACK=wavpack
+# True Audio
+TTAENC=ttaenc
# ape
APENC=mac
APETAG=apetag
+# mp2
+TWOLAME=twolame
# m4a
FAAC=faac
NEROAACENC=neroAacEnc
FDKAAC=fdkaac
+# Note that the qaac PATH will almost always require adjustment
+# as it is a Windows application being run through Wine. More
+# detailed notes in the sample abcde.conf file in the abcde tarball.
+QAAC=qaac
+FHGAACENC=fhgaacenc
+# The path to 'avconv' rather than 'ffmpeg'can be used here:
+FFMPEG=ffmpeg
ID3=id3
ID3V2=id3v2
+MID3V2=mid3v2
EYED3=eyeD3
VORBISCOMMENT=vorbiscomment
METAFLAC=metaflac
NEROAACTAG=neroAacTag
+ATOMICPARSLEY=AtomicParsley
+WINE=wine
CDPARANOIA=cdparanoia
CD_PARANOIA=cd-paranoia
CDDA2WAV=icedax
# Options for programs called from abcde
# mp3
LAMEOPTS=
-TOOLAMEOPTS=
GOGOOPTS=
BLADEENCOPTS=
L3ENCOPTS=
# mpc
MPCENCOPTS=
# wv
-WVENCOPTS=
+WAVPACKENCOPTS=
+# True Audio has no useful options but it is here anyway :)
+TTAENCOPTS=
# ape
# Monkey's Audio Console (mac) chokes without a mode setting
# so we set one here.
APENCOPTS='-c4000'
+# mp2
+TWOLAMENCOPTS=
# m4a
FAACENCOPTS=
NEROACENCOPTS=
# fdkaac chokes without either a bitrate or bitrate-mode specified so
# we set bitrate here.
FDKAACENCOPTS='--bitrate 192k'
+QAACENCOPTS=
+FHGAACENCOPTS=
+FFMPEGENCOPTS=
ID3OPTS=
EYED3OPTS=""
+ATOMICPARSLEYOPTS=
CDPARANOIAOPTS=
PIRDOPTS=
CDDA2WAVOPTS=
# This option is basically for Debian package dependencies:
# List of preferred 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:opus
+DEFAULT_OUTPUT_BINARIES=vorbis:oggenc,flac:flac,mp3:lame,mp3:bladeenc,spx:speex,m4a:faac:opus
# List of preferred cdromreaders - by default, run whichever we have in the path
DEFAULT_CDROMREADERS="cdparanoia icedax cdda2wav libcdio pird"
spx:*) SPEEXENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
mpc:*) MPCENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
wv:*) WVENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
+ tta:*) TTAENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
ape:*) APENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
+ mp2:*) MP2ENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
m4a:*|aac:*) AACENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
esac
done
[ "$WVENCODERSYNTAX" = "default" ] && WVENCODERSYNTAX=wavpack
[ "$DOTAG" = "y" ]
[ "$DOREPLAYGAIN" = "y" ] && NEEDWVGAIN=y
+ [ "$WVENCODERSYNTAX" = "ffmpeg" ] && DOREPLAYGAIN=n
;;
ape)
[ "$APENCODERSYNTAX" = "default" ] && APENCODERSYNTAX=mac
[ "$DOTAG" = "y" ] && NEEDAPETAG=y
;;
+ mp2)
+ [ "$MP2ENCODERSYNTAX" = "default" ] && MP2ENCODERSYNTAX=twolame
+ [ "$DOTAG" = "y" ] && NEEDMID3V2=y
+ [ "$MP2ENCODERSYNTAX" = "ffmpeg" ] && [ "$DOTAG" = "y" ] && NEEDMID3V2=y
+ ;;
+ tta)
+ [ "$TTAENCODERSYNTAX" = "default" ] && TTAENCODERSYNTAX=ttaenc
+ [ "$DOTAG" = "y" ] && NEEDMID3V2=y
+ ;;
aac)
[ "$AACENCODERSYNTAX" = "default" ] && AACENCODERSYNTAX=faac
[ "$DOTAG" = "n" ]
[ "$AACENCODERSYNTAX" = "default" ] && AACENCODERSYNTAX=faac
[ "$DOTAG" = "y" ] && CHECKFAACBUILD=y
[ "$AACENCODERSYNTAX" = "neroAacEnc" ] && NEEDNEROAACTAG=y
+ [ "$AACENCODERSYNTAX" = "qaac" ] && NEEDWINE=y
+ [ "$AACENCODERSYNTAX" = "fhgaacenc" ] && NEEDWINE=y && NEEDATOMICPARSLEY=y
+ [ "$AACENCODERSYNTAX" = "ffmpeg" ] && [ "$DOTAG" = "y" ]
;;
wav)
if [ "$KEEPWAVS" = "y" ]; then
MP3ENCODEROPTS="${MP3ENCODEROPTSCLI:-$LAMEOPTS}"
MP3ENCODER="$LAME"
;;
- toolame)
- MP3ENCODEROPTS="${MP3ENCODEROPTSCLI:-$TOOLAMEOPTS}"
- MP3ENCODER="$TOOLAME"
- ;;
gogo)
MP3ENCODEROPTS="${MP3ENCODEROPTSCLI:-$GOGOOPTS}"
MP3ENCODER="$GOGO"
esac
case "$WVENCODERSYNTAX" in
wavpack)
- WVENCODEROPTS="${WVENCODEROPTSCLI:-$WVENCOPTS}"
- WVENCODER="$WVENC"
+ # Syntax changed slightly between abcde 2.7 and abcde 2.7.1,
+ # and in the interests of backward compatibility:
+ if [ -z "$WAVPACKENCOPTS" ] && [ -n "$WVENCOPTS" ]; then
+ WVENCODEROPTS="${WVENCODEROPTSCLI:-$WVENCOPTS}"
+ WVENCODER="$WAVPACK"
+ else
+ WVENCODEROPTS="${WVENCODEROPTSCLI:-$WAVPACKENCOPTS}"
+ WVENCODER="$WAVPACK"
+ fi
+ ;;
+ ffmpeg)
+ WVENCODEROPTS="${WVENCODEROPTSCLI:-$FFMPEGENCOPTS}"
+ WVENCODER="$FFMPEG"
+ ;;
+esac
+case "$TTAENCODERSYNTAX" in
+ ttaenc)
+ TTAENCODEROPTS="${TTAENCODEROPTSCLI:-$TTAENCOPTS}"
+ TTAENCODER="$TTAENC"
;;
esac
case "$APENCODERSYNTAX" in
APENCODER="$APENC"
;;
esac
+case "$MP2ENCODERSYNTAX" in
+ twolame)
+ MP2ENCODEROPTS="${MP2ENCODEROPTSCLI:-$TWOLAMENCOPTS}"
+ MP2ENCODER="$TWOLAME"
+ ;;
+ ffmpeg)
+ MP2ENCODEROPTS="${MP2ENCODEROPTSCLI:-$FFMPEGENCOPTS}"
+ MP2ENCODER="$FFMPEG"
+ ;;
+esac
case "$AACENCODERSYNTAX" in
- # Some elaborate 'if' work to keep backward compatability for those
+ # Some elaborate 'if' work to keep backward compatibility for those
# who don't realise that AACENCOPTS does not work with abcde from
# version 2.7 onwards.
faac)
AACENCODER="$FDKAAC"
fi
;;
+ qaac)
+ if [ -z "$QAACENCOPTS" ] && [ -n "$AACENCOPTS" ]; then
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
+ AACENCODER="$QAAC"
+ else
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$QAACENCOPTS}"
+ AACENCODER="$QAAC"
+ fi
+ ;;
+ fhgaacenc)
+ if [ -z "$FHGAACENCOPTS" ] && [ -n "$AACENCOPTS" ]; then
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
+ AACENCODER="$FHGAACENC"
+ else
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$FHGAACENCOPTS}"
+ AACENCODER="$FHGAACENC"
+ fi
+ ;;
+ ffmpeg)
+ if [ -z "$FFMPEGENCOPTS" ] && [ -n "$AACENCOPTS" ]; then
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$AACENCOPTS}"
+ AACENCODER="$FFMPEG"
+ else
+ AACENCODEROPTS="${AACENCODEROPTSCLI:-$FFMPEGENCOPTS}"
+ AACENCODER="$FFMPEG"
+ fi
+ ;;
esac
# and which tagger
PIPE_mpcenc="-"
PIPE_wavpack="-"
PIPE_faac="-"
+PIPE_qaac="-"
+PIPE_fhgaacenc="-"
+PIPE_ffmpeg="-"
+PIPE_ttaenc="-"
# Both neroAacEnc and fdkaac seem to manage without the addition of
# the 'ignorelength' option in PIPE_$AACENCODERSYNTAX when piping
# in this manner. Andrew.
PIPEENCODERSVARCHECK="PIPE_$MPCENCODERSYNTAX" ;;
wv)
PIPEENCODERSVARCHECK="PIPE_$WVENCODERSYNTAX" ;;
+ tta)
+ PIPEENCODERSVARCHECK="PIPE_$TTAENCODERSYNTAX" ;;
m4a)
PIPEENCODERSVARCHECK="PIPE_$AACENCODERSYNTAX" ;;
aac)
# Make sure a buncha things exist
for X in $CDROMREADER $CDDISCID ${NEEDTAGGER+$TAGGER} $MP3ENCODER \
$OGGENCODER $OPUSENCODER $FLACENCODER $SPEEXENCODER $MPCENCODER \
- $AACENCODER $WVENCODER $CDDBTOOL $APENCODER \
+ $AACENCODER $WVENCODER $CDDBTOOL $APENCODER $MP2ENCODER $TTAENCODER \
${NEEDHTTPGET+$HTTPGET} ${NEEDDISTMP3+$DISTMP3} \
${NEEDCOMMENTER+$VORBISCOMMENT} ${NEEDMETAFLAC+$METAFLAC} \
${NEEDNORMALIZER+$NORMALIZER} ${NEEDEJECT+$EJECT} \
${NEEDMPCGAIN+$MPCGAIN} ${NEEDCUEREADER+$CUEREADER} \
${NEEDWVGAIN+WVGAIN} ${NEEDAPETAG+$APETAG} \
${NEEDCUE2DISCID+$CUE2DISCID} ${NEEDNEROAACTAG+$NEROAACTAG} \
- ${NEEDGLYRC+$GLYRC}
+ ${NEEDGLYRC+$GLYRC} ${NEEDWINE+$WINE} ${NEEDATOMICPARSLEY+$ATOMICPARSLEY} \
+ ${NEEDMID3V2+$MID3V2}
do
checkexec "$X"
done
$eject $EJECTOPTS $cd
elif [ X"$(uname)" = X"Darwin" ] ; then
diskutil eject ${CDROM#/dev/} 0
- elif [ -x $(which $EJECT) ]; then
+ elif [ -x $(which $EJECT) ]; then
$EJECT $EJECTOPTS "$CDROM"
fi
#fi