#
# Copyright for this work is to expire January 1, 2010, after which it
# shall be public domain.
-#
-# $Id$
-VERSION='2.5.5-UNRELEASED'
+VERSION='2.6.1-UNRELEASED'
usage ()
{
echo " cddb,read,normalize,encode,tag,move,replaygain,playlist,clean"
#echo "-A Experimental actions (retag, transcode)"
echo "-b Enable batch normalization"
-#echo "-B Disable batch replaygain (do file by file)"
echo "-c <file>"
echo " Specify a configuration file (overrides system and user config files)"
echo "-C <discid#>"
echo " Output file type(s) (vorbis,mp3,flac,spx,mpc,wav,m4a,opus). 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 <level>"
-echo " Set quality level (high,medium,low)"
echo "-r <host1[,host2]...>"
echo " Also encode on these remote hosts"
echo "-s <field>"
case "$CDDBMETHOD" in
cddb)
- printf -v DISCID "%08lx" $(( ($CDDBCKSUM % 0xff) << 24 | $TOTALTIME << 8 | $TRACKS))
+ printf -v DISCID "%08lx" $(( ($CDDBCKSUM % 0xff) * 16777216 | $TOTALTIME * 256 | $TRACKS))
;;
musicbrainz)
# FIXME: don't assume the first track is 1
else
OUTPUTFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\")"
fi
- else
+ else
if [ "$VARIOUSARTISTS" = "y" ]; then
OUTPUTFILE="$(eval echo \""$VAOUTPUTFORMAT"\")"
else
if [ "$VARIOUSARTISTS" = "y" ]; then
TPE2="Various"
fi
-
+
case "$ID3SYNTAX" in
id3);;
eyed3)
# FIXME # track numbers in mp3 come with 1/10, so we cannot
# happily substitute them with $TRACKNUM
# FIXME as well! # Older versions of eyeD3 (< 0.7.0) expect
- # --set-encoding and --set-text-frame so perhaps some version
- # sniffing would be useful. Might also be better to simply cut
+ # --set-encoding and --set-text-frame so perhaps some version
+ # sniffing would be useful. Might also be better to simply cut
# ties with the older eyeD3... Andrew.
# eyeD3 --comment syntax is also different in < and >= 0.7.0
run_command tagtrack-$OUTPUT-$1 nice $ENCNICE $TAGGER $TAGGEROPTS \
--comment="$COMMENTOUTPUT" -A "$DALBUM" \
- -a "$TRACKARTIST" -t "$TRACKNAME" -Y "$CDYEAR" \
+ -a "$TRACKARTIST" -t "$TRACKNAME" ${CDYEAR:+-Y "$CDYEAR"} \
-G "$GENREID" -n "${TRACKNUM:-$1}" \
${TRACKNUM:+-N "$TRACKS"} \
${ENCODING:+--encoding="$ENCODING"} \
fi
if [ -n "$CDGENRE" ]; then
echo GENRE="$CDGENRE"
- fi
+ fi
echo TRACKNUMBER=${TRACKNUM:-$1}
if [ -n "$DISCNUMBER" ]; then
echo DISCNUMBER="$DISCNUMBER"
case "$COMMENTOUTPUT" in
*=*) echo "$COMMENTOUTPUT";;
*) echo COMMENT="$COMMENTOUTPUT";;
- esac
+ esac
fi
) | run_command tagtrack-$OUTPUT-$1 nice $ENCNICE \
$VORBISCOMMENT $VORBISCOMMENTOPTS -w \
fi
if [ -n "$CDGENRE" ]; then
echo GENRE="$CDGENRE"
- fi
+ fi
echo TRACKNUMBER="${TRACKNUM:-$1}"
if [ -n "$DISCNUMBER" ]; then
echo DISCNUMBER="$DISCNUMBER"
case "$COMMENTOUTPUT" in
*=*) echo "$COMMENTOUTPUT";;
*) echo COMMENT="$COMMENTOUTPUT";;
- esac
+ esac
fi
) | run_command tagtrack-$OUTPUT-$1 nice $ENCNICE $METAFLAC $METAFLACOPTS ${IMPORTCUESHEET:+--import-cuesheet-from="$ABCDETEMPDIR/$CUEFILE"} --import-tags-from=- "$ABCDETEMPDIR/track$1.$FLACOUTPUTCONTAINER"
;;
esac
;;
esac
- done
+ done
if checkerrors "nogap-encode"; then :; else
if [ ! "$KEEPWAVS" = "y" ] ; then
if [ ! "$KEEPWAVS" = "move" ] ; then
case "$2" in
%local*%)
case "$OPUSENCODERSYNTAX" in
- opusenc)
+ opusenc)
if [ "$(eval echo ${COMMENT})" != "" ]; then
case "$COMMENT" in
*=*) ;;
*) COMMENT="COMMENT=$COMMENT" ;;
- esac
+ esac
fi
# Tag the file at encode time, as it can't be done after encoding.
if [ "$DOTAG" = "y" ]; then
$RUN_COMMAND nice $EFFECTIVE_NICE $OPUSENCODER $OPUSENCODEROPTS --artist "$TRACKARTIST" --album "$DALBUM" --title "$TRACKNAME" --genre "$CDGENRE" --date "$CDYEAR" --comment TRACKNUMBER="$1" ${COMMENT:+--comment "$COMMENT"} "$IN" "$OUT"
else
- $RUN_COMMAND nice $EFFECTIVE_NICE $OPUSENCODER $OPUSENCODEROPTS "$IN" "$OUT"
+ $RUN_COMMAND nice $EFFECTIVE_NICE $OPUSENCODER $OPUSENCODEROPTS "$IN" "$OUT"
fi
;;
esac
case "$COMMENT" in
*=*) ;;
*) COMMENT="COMMENT=$COMMENT" ;;
- esac
+ esac
fi
# Tag the file at encode time, as it can't be done after encoding.
if [ "$DOTAG" = "y" ]; then
$RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS "$IN" "$OUT"
fi
;;
- mpc)
+ mpc)
# MPP/MP+(Musepack) format (.mpc) is done locally, with inline
# tagging. Uses mpcenc for Musepack SV8 encoding, changed from
# Musepack SV7 which used mppenc....
$RUN_COMMAND nice $ENCNICE $AACENC $AACENCOPTS -if "$IN" -of "$OUT"
elif [ ! "$DOTAG" = "y" ]; then
$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"
fi
else
OUTPUTFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\")"
fi
- else
+ else
if [ "$VARIOUSARTISTS" = "y" ]; then
OUTPUTFILE="$(eval echo \""$VAOUTPUTFORMAT"\")"
else
;;
esac
# Create a playlist file for the playlist data to go into.
- # We used to wipe it out if it existed. Now we request permision if interactive.
+ # We used to wipe it out if it existed. Now we request permission if interactive.
for LASTTRACK in $TRACKQUEUE; do :; done
ALBUMFILE="$(mungefilename "$DALBUM")"
ARTISTFILE="$(mungefilename "$DARTIST")"
LEADIN=88200
i=0
N=0
-
+
while read line ; do
set -- $line
case "$1" in
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\""
echo cdparanoia-audio-tracks=$CDPARANOIAAUDIOTRACKS >> "$ABCDETEMPDIR/status"
fi
fi
-
+
# Create the discid file
echo "$TRACKINFO" > "$ABCDETEMPDIR/discid"
if checkstatus cddbmethod > /dev/null 2>&1 ; then :; else
do_localcddb ()
{
if checkstatus cddb-readcomplete && checkstatus cddb-choice >/dev/null; then :; else
-
+
CDDBLOCALSTATUS="notfound"
CDDBDISCID=$(echo $TRACKINFO | cut -d' ' -f1)
USELOCALRESP="y"
else
CDDBLOCALMATCH=none
fi
-
+
# If the user has selected to check a local CDDB repo, we proceed with it
case $CDDBLOCALMATCH in
multiple)
# List out disc title/author and contents
CDDBLOCALREAD="$ABCDETEMPDIR/cddblocalread.$X"
cat "$RESULT" > "${CDDBLOCALREAD}"
- {
+ {
echo -n "#$X: "
do_cddbparse "${CDDBLOCALREAD}"
echo ""
{
CDDBDISCID=$(echo $TRACKINFO | cut -d' ' -f1)
CDDBLOCALFILE="${CDDBLOCALDIR}/${CDDBDISCID}"
-
+
# Perform CDDB query if it hasn't already been done
if checkstatus cddb-querycomplete; then :; else
if [ "$CDDBAVAIL" = "n" ]; then
echo cddb-read-1-complete >> "$ABCDETEMPDIR/status"
echo cddb-choice=1 >> "$ABCDETEMPDIR/status"
;;
- esac
+ esac
echo "cddb-readcomplete" >> "$ABCDETEMPDIR/status"
fi
}
# It's all going to fit in one page, cat it
cat "$ABCDETEMPDIR/cddbchoices" >&2
fi
-
+
CDDBCHOICENUM=""
# Setting the choice to an impossible integer to avoid errors in the numeric comparisons
CDCHOICENUM=-1
exit 1
fi
CDDBDATA="$ABCDETEMPDIR/cddbread.$(checkstatus cddb-choice)"
- echo -n "Edit selected CDDB data? [y/n] (" >&2
+ echo -n "Edit selected CDDB data " >&2
if [ "$INTERACTIVE" = "y" ]; then
if [ "$UNKNOWNDISK" = "y" ]; then
- echo -n "y): " >&2
+ echo -n "[Y/n]? " >&2
read EDITCDDB
[ "$EDITCDDB" != "n" ] && EDITCDDB=y
else
- echo -n "n): " >&2
+ echo -n "[y/N]? " >&2
read EDITCDDB
fi
else
- echo "n): n" >&2
+ echo "[y/N]? " >&2
EDITCDDB=n
fi
if [ "$EDITCDDB" = "y" ]; then
CDDBDATAMD5SUM=$($MD5SUM "$CDDBDATA" | cut -d " " -f 1);
-
+
# Use the debian sensible-editor wrapper to pick the editor that the
# user has requested via their $EDITOR environment variable
if [ -x "/usr/bin/sensible-editor" ]; then
# List of preferred cdromreaders - by default, run whichever we have in the path
DEFAULT_CDROMREADERS="cdparanoia icedax cdda2wav pird"
-# 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:"
-
# Assume 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
fi
# We used to use EXTRAVERBOSE=y to turn on more debug output. Now
-# that's changed to a number to allow for more control. If
-# EXTRAVERBOSE=y, set it to 1 for backwards compatibility.
-if [ "$EXTRAVERBOSE" = "y" ]; then
- EXTRAVERBOSE=1
-fi
-if [ "$EXTRAVERBOSE" = "n" ]; then
- EXTRAVERBOSE=0
-fi
+# that's changed to a number to allow for more control. Deal with
+# EXTRAVERBOSE=y/n, set it to 1/0 for backwards compatibility.
+case "$EXTRAVERBOSE" in
+ *y*|*Y*)
+ EXTRAVERBOSE=1
+ ;;
+ *n*|*N*)
+ EXTRAVERBOSE=0
+ ;;
+esac
# 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:pPq:r:s:S:t:T:UvVxX:w:W:z opt ; do
+while getopts 1a:bc:C:d:Defghj:klLmMnNo:pPr:s:S:t:T:UvVxX:w:W:z opt ; do
case "$opt" in
1) ONETRACK=y ;;
a) ACTIONS="$OPTARG" ;;
A) EXPACTIONS="$OPTARG" ;;
b) BATCHNORM=y ;;
- B) NOBATCHREPLAYGAIN=y ;;
c) if [ -e "$OPTARG" ] ; then . "$OPTARG" ; else log error "config file \"$OPTARG\" cannot be found." ; exit 1 ; fi ;;
C) DISCID="$( echo ${OPTARG#abcde.} | tr -d /)" ;;
d) CDROM="$OPTARG" ;;
o) OUTPUTTYPE="$OPTARG" ;;
p) PADTRACKS=y ;;
P) USEPIPES=y ;;
- q) QUALITYLEVEL="$OPTARG" ;;
r) REMOTEHOSTS="$OPTARG" ;;
R) CDDBLOCALRECURSIVE=y ;;
s) SHOWCDDBFIELDS="$OPTARG" ;;
X) CUE2DISCID="$OPTARG" ;;
w) COMMENT="$OPTARG" ;;
W) if echo $OPTARG | grep "[[:digit:]]" > /dev/null 2>&1 ; then
- STARTTRACKNUMBER="${OPTARG}01"
+ STARTTRACKNUMBER="${OPTARG}$(printf %02d ${STARTTRACKNUMBER:-01})"
STARTTRACKNUMBERTAG="y"
COMMENT="CD${OPTARG}"
DISCNUMBER="${OPTARG}"
esac
# Allow -o OUTPUT(1):OPTIONS(1),...,OUTPUT(N):OPTIONS(N) mode of operation
-if echo "$OUTPUTTYPE" | grep ":" > /dev/null 2>&1 ; then
- for OUTPUT in "$(echo "$OUTPUTTYPE" | tr \ \|| tr , \ | tr \| \ )"; do
+case "$OUTPUTTYPE" in *:*)
+ for OUTPUT in $(echo "$OUTPUTTYPE" | tr \ \|| tr , \ ); do
+ OUTPUT="$(echo "$OUTPUT" | tr \| \ )"
case "$OUTPUT" in
vorbis:*|ogg:*) OGGENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
opus:*) OPUSENCODEROPTSCLI="$( echo $OUTPUT | cut -d: -f2- )" ;;
TEMPOUTPUTTYPE="${TEMPOUTPUTTYPE:+$TEMPOUTPUTTYPE,}$TEMPOUTPUT"
done
OUTPUTTYPE="$TEMPOUTPUTTYPE"
-fi
+ ;;
+esac
# If nothing has been specified, use oggenc for oggs and lame for mp3s and flac
# for flacs and speexenc for speex and mpcenc for mpcs and faac for m4as
case "$FLACENCODERSYNTAX" in
flac)
FLACENCODEROPTS="${FLACENCODEROPTSCLI:-$FLACOPTS}"
- FLACENCODER="$FLAC"
+ FLACENCODER="$FLAC"
if [ "$DOREPLAYGAIN" = "y" ]; then
FLACENCODEROPTS="${FLACENCODEROPTS} --replay-gain"
fi