# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-VERSION='2.7.2-UNRELEASED'
+VERSION='2.8.1'
usage ()
{
{
case $1 in
TRACKNAME1)
- TRACKNAME="$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\ \+$//')"
+ TRACKNAME="$(grep -a ^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/\ \+$//')"
+ TRACKNAME="$(grep -a ^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'
+ grep -a ^EXTT$CDDBTRACKNUM= "$CDDBDATA" | cut -f2- -d= | tr -d \[:cntrl:\] | sed 's/\\n/\n/g'
;;
esac
}
CDDBTRACKNUM=$(expr $UTRACKNUM - 1)
getcddbinfo TRACKNAME
splitvarious
- TRACKFILE="$(mungefilename "$TRACKNAME")"
- ARTISTFILE="$(mungefilename "$TRACKARTIST")"
- ALBUMFILE="$(mungefilename "$DALBUM")"
+ TRACKFILE="$(mungetrackname "$TRACKNAME")"
+ ARTISTFILE="$(mungeartistname "$TRACKARTIST")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
GENRE="$(mungegenre "$GENRE")"
YEAR=${CDYEAR:-$CDYEAR}
gettracknum
fi
(
# These are from
- # http://www.xiph.org/vorbis/doc/v-comment.html
+ # https://www.xiph.org/vorbis/doc/v-comment.html
echo ARTIST="$TRACKARTIST"
echo ALBUM="$DALBUM"
fi
echo TRACKNUMBER=${TRACKNUM:-$1}
# TRACKTOTAL is not in the proposed, minimal list of standard field names from
- # xiph.org: http://www.xiph.org/vorbis/doc/v-comment.html but is in common usage
+ # xiph.org: https://www.xiph.org/vorbis/doc/v-comment.html but is in common usage
# and read by mediainfo, ffprobe, vlc, Aqualung, ogg123, Foobar. And now abcde :)
# The tag is quietly ignored by Audacious, MPlayer, mpv, XMMS....
echo TRACKTOTAL="${TRACKS}"
fi
echo TRACKNUMBER="${TRACKNUM:-$1}"
# TRACKTOTAL is not in the proposed, minimal list of standard field names from
- # xiph.org: http://www.xiph.org/vorbis/doc/v-comment.html but is in common usage
+ # xiph.org: https://www.xiph.org/vorbis/doc/v-comment.html but is in common usage
# and read by mediainfo, ffprobe, vlc, Aqualung, ogg123, Foobar. And now abcde :)
# The tag is quietly ignored by Audacious, MPlayer, mpv, XMMS....
echo TRACKTOTAL="${TRACKS}"
nice $ENCNICE $MP3ENCODER $MP3ENCODEROPTS --nogap $TRACKFILES
RETURN=$?
if [ "$RETURN" != "0" ]; then
- echo "nogap-encode: $ENCODER returned code $RETURN" >> errors
+ echo "nogap-encode: $ENCODER returned code $RETURN" >> "$ABCDETEMPDIR/errors"
else
for UTRACKNUM in $TRACKQUEUE
do
$NORMALIZER -b $NORMALIZEROPTS $TRACKFILES
RETURN=$?
if [ "$RETURN" != "0" ]; then
- echo "batch-normalize: $NORMALIZER returned code $RETURN" >> errors
+ echo "batch-normalize: $NORMALIZER returned code $RETURN" >> "$ABCDETEMPDIR/errors"
else
for UTRACKNUM in $TRACKQUEUE
do
- echo normalizetrack-$UTRACKNUM >> status
+ echo "normalizetrack-$UTRACKNUM" >> "$ABCDETEMPDIR/status"
done
fi
)
$NORMALIZER -b $NORMALIZEROPTS $TRACKFILES
RETURN=$?
if [ "$RETURN" != "0" ]; then
- echo "batch-normalize: $NORMALIZER returned code $RETURN" >> errors
+ echo "batch-normalize: $NORMALIZER returned code $RETURN" >> "$ABCDETEMPDIR/errors"
else
for UTRACKNUM in $TRACKQUEUE
do
- echo normalizetrack-$UTRACKNUM >> status
+ echo "normalizetrack-$UTRACKNUM" >> "$ABCDETEMPDIR/status"
done
fi
)
OUTPUT="$TMPOUTPUT"
# Create ALBUMFILE, ARTISTFILE, TRACKFILE
- ALBUMFILE="$(mungefilename "$DALBUM")"
- ARTISTFILE="$(mungefilename "$TRACKARTIST")"
- TRACKFILE="$(mungefilename "$TRACKNAME")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
+ ARTISTFILE="$(mungeartistname "$TRACKARTIST")"
+ TRACKFILE="$(mungetrackname "$TRACKNAME")"
GENRE="$(mungegenre "$GENRE")"
YEAR=${CDYEAR:-$CDYEAR}
# If we want to start the tracks with a given number, we need to modify
# Create a playlist file for the playlist data to go into.
# 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")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
+ ARTISTFILE="$(mungeartistname "$DARTIST")"
GENRE="$(mungegenre "$GENRE")"
YEAR=${CDYEAR:-$CDYEAR}
if [ "$VARIOUSARTISTS" = "y" ] ; then
CDDBTRACKNUM=$(expr $UTRACKNUM - 1)
getcddbinfo TRACKNAME
splitvarious
- TRACKFILE="$(mungefilename "$TRACKNAME")"
- ARTISTFILE="$(mungefilename "$TRACKARTIST")"
- ALBUMFILE="$(mungefilename "$DALBUM")"
+ TRACKFILE="$(mungetrackname "$TRACKNAME")"
+ ARTISTFILE="$(mungeartistname "$TRACKARTIST")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
# If we want to start the tracks with a given number, we need to modify the
# TRACKNUM value before evaluation
gettracknum
fi
vecho "One track is $ONETRACK"
- TRACKFILE="$(mungefilename "$TRACKNAME")"
- ARTISTFILE="$(mungefilename "$TRACKARTIST")"
- ALBUMFILE="$(mungefilename "$DALBUM")"
+ TRACKFILE="$(mungetrackname "$TRACKNAME")"
+ ARTISTFILE="$(mungeartistname "$TRACKARTIST")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
if [ "$ONETRACK" = "y" ]; then
if [ "$VARIOUSARTISTS" = "y" ]; then
CUEWAVFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT"
exit 1
fi
;;
-# cdparanoia|debug)
-# 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?"
-# fi
-#
-# TRACKS="$(echo "$CDPARANOIAOUTPUT" | grep -E '^[[:space:]]+[[:digit:]]' | tail -n 1 | get_first | tr -d "." | tr '\n' ' ')"
-# CDPARANOIAAUDIOTRACKS="$TRACKS"
-#
-# LEADOUT="$(echo "$CDPARANOIAOUTPUT" | grep -Eo '^TOTAL[[:space:]]+([[:digit:]]+)' | get_last)"
-# OFFSETS="$(echo "$CDPARANOIAOUTPUT" | sed -n -e's/^ .* \([0-9]\+\) \[.*/\1/p')"
-# makeids
-# ;;
+ cdparanoia|debug)
+ 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?"
+ fi
+
+ TRACKS="$(echo "$CDPARANOIAOUTPUT" | grep -E '^[[:space:]]+[[:digit:]]' | tail -n 1 | get_first | tr -d "." | tr '\n' ' ')"
+ CDPARANOIAAUDIOTRACKS="$TRACKS"
+
+ LEADOUT="$(echo "$CDPARANOIAOUTPUT" | grep -Eo '^TOTAL[[:space:]]+([[:digit:]]+)' | get_last)"
+ OFFSETS="$(echo "$CDPARANOIAOUTPUT" | sed -n -e's/^ .* \([0-9]\+\) \[.*/\1/p')"
+ makeids
+ ;;
*)
case "$CDDBMETHOD" in
cddb) TRACKINFO=$($CDDISCID "$CDROM") ;;
elif [ "$ONETRACK" = "y" ] &&
echo "$line" | grep '^FILE "dummy.wav" WAVE' > /dev/null 2>&1 ; then
- TRACKFILE="$(mungefilename "$TRACKNAME")"
- ARTISTFILE="$(mungefilename "$TRACKARTIST")"
- ALBUMFILE="$(mungefilename "$DALBUM")"
+ TRACKFILE="$(mungetrackname "$TRACKNAME")"
+ ARTISTFILE="$(mungeartistname "$TRACKARTIST")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
if [ "$VARIOUSARTISTS" = "y" ]; then
OUTPUTFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT"
if [ "$ONETRACK" = "y" ]; then
vecho "ONETRACK mode selected: displaying only the title of the CD..."
fi
- echo "---- $(grep DTITLE "${CDDBPARSEFILE}" | cut '-d=' -f2- | tr -d \\r\\n ) ----"
+ echo "---- $(grep -a DTITLE "${CDDBPARSEFILE}" | cut '-d=' -f2- | tr -d \\r\\n ) ----"
if [ X"$SHOWCDDBYEAR" = "Xy" ]; then
- PARSEDYEAR=$(grep DYEAR "${CDDBPARSEFILE}" | cut '-d=' -f2-)
+ PARSEDYEAR=$(grep -a DYEAR "${CDDBPARSEFILE}" | cut '-d=' -f2-)
if [ ! X"$PARSEDYEAR" = "X" ]; then
echo "Year: $PARSEDYEAR"
fi
fi
if [ X"$SHOWCDDBGENRE" = "Xy" ]; then
- PARSEDGENRE=$(grep DGENRE "${CDDBPARSEFILE}" | cut '-d=' -f2-)
+ PARSEDGENRE=$(grep -a DGENRE "${CDDBPARSEFILE}" | cut '-d=' -f2-)
if [ ! X"$PARSEDGENRE" = "X" ]; then
echo "Genre: $PARSEDGENRE"
fi
if [ ! "$ONETRACK" = "y" ]; then
for TRACK in $(f_seq_row 1 $TRACKS)
do
- echo $TRACK: "$(grep ^TTITLE$(expr $TRACK - 1)= "${CDDBPARSEFILE}" | cut -f2- -d= | tr -d \\r\\n)"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "${CDDBPARSEFILE}" | cut -f2- -d= | tr -d \\r\\n)"
done
fi
}
# Do we have CD-Text on the disc (and can the drive read it?)
${CDTEXT_READER} -J -N -D ${CDDA2WAVCDROM} > "$ABCDETEMPDIR/cd-text" 2>&1
- grep -q '^CD-Text: detected' "$ABCDETEMPDIR/cd-text"
+ grep -a -q '^CD-Text: detected' "$ABCDETEMPDIR/cd-text"
ERRORCODE=$?
if [ $ERRORCODE -ne 0 ]; then
# No CD-Text found, bail
echo "done." >> "$ABCDETEMPDIR/cddbchoices"
echo cddb-read-1-complete >> "$ABCDETEMPDIR/status"
echo cddb-choice=1 >> "$ABCDETEMPDIR/status"
- ATITLE=$(grep -e '^Album title:' "${ABCDETEMPDIR}/cd-text" | cut -c14- )
+ ATITLE=$(grep -ae '^Album title:' "${ABCDETEMPDIR}/cd-text" | cut -c14- )
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
TRACKM1=$(($TRACK - 1))
- TITLE="$(grep -E ^Track\ +$TRACK: "$ABCDETEMPDIR/cd-text" | tr -d \\r\\n | sed 's~^Track ..: .~~g;'"s~'$~~g")"
+ TITLE="$(grep -aE ^Track\ +$TRACK: "$ABCDETEMPDIR/cd-text" | tr -d \\r\\n | sed 's~^Track ..: .~~g;'"s~'$~~g")"
echo "$TRACK: $TITLE" >> "$ABCDETEMPDIR/cddbchoices"
- sed "s~^TTITLE${TRACKM1}=.*~TTITLE${TRACKM1}=${TITLE}~" "$ABCDETEMPDIR/cddbread.1" > "$ABCDETEMPDIR/cddbread.new"
- mv -f "$ABCDETEMPDIR/cddbread.new" "$ABCDETEMPDIR/cddbread.1"
+ sed "s~^TTITLE${TRACKM1}=.*~TTITLE${TRACKM1}=${TITLE}~" "$ABCDETEMPDIR/cddbread.1" > "$ABCDETEMPDIR/cddbread.new" && \
+ mv -f "$ABCDETEMPDIR/cddbread.new" "$ABCDETEMPDIR/cddbread.1"
done
- sed "s~^DTITLE=.*~DTITLE=${ATITLE}~" "$ABCDETEMPDIR/cddbread.1" > "$ABCDETEMPDIR/cddbread.new"
- mv -f "$ABCDETEMPDIR/cddbread.new" "$ABCDETEMPDIR/cddbread.1"
+ sed "s~^DTITLE=.*~DTITLE=${ATITLE}~" "$ABCDETEMPDIR/cddbread.1" > "$ABCDETEMPDIR/cddbread.new" && \
+ mv -f "$ABCDETEMPDIR/cddbread.new" "$ABCDETEMPDIR/cddbread.1"
+ rm -f "$ABCDETEMPDIR/cddbread.new" # In case a sed error occurred
echo >> "$ABCDETEMPDIR/cddbchoices"
echo "cdtext-readcomplete" >> "$ABCDETEMPDIR/status"
}
# The helper script will write disc matches out to
# cddbread.*. Count how many we have
if [ ! -f "${ABCDETEMPDIR}/cddbread.1" ] ; 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"
+ if [ $CDDBLASTMETHOD = "y" ]
+ then
+ # We're the end of the line.
+ #
+ # No matches. Use the normal cddb template for the user to
+ # fill in
+ vecho "Unable to find a match with ${CDDBMETHCHOICE}, generating CDDB template."
+ 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 -a ^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
+ # Neat, we'll let the next guy take care of this CDDB
+ # file junk.
+ vecho "Unable to find a match with ${CDDBMETHCHOICE}, moving on to the next option."
+ fi
else
# We have some matches
NUM_RESPONSES=$(echo "${ABCDETEMPDIR}"/cddbread.* | wc -w)
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- )
+ ATITLE=$(grep -a -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"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.1" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
else
do
X=$(echo $file | sed 's/^.*cddbread\.//g')
echo cddb-read-$X-complete >> "$ABCDETEMPDIR/status"
- ATITLE=$(grep -e '^DTITLE=' "${ABCDETEMPDIR}"/cddbread.$X | cut -c8- )
+ ATITLE=$(grep -a -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"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.$X" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
done
echo ---- "$(cut '-d ' -f4- "$ABCDETEMPDIR/cddbquery")" ---- >> "$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"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.1" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
;;
# TODO: Explain these error codes a little more accurately:
# http://ftp.freedb.org/pub/freedb/misc/freedb_CDDB_protcoldoc.zip
# No match response:
- case "$RESPONSECODE" in
- 202) echo "No CDDB match." >> "$ABCDETEMPDIR/cddbchoices" ;;
- 403|409) echo "CDDB entry is corrupt, or the handshake failed." >> "$ABCDETEMPDIR/cddbchoices" ;;
- 500|503) echo "CDDB unavailable." >> "$ABCDETEMPDIR/cddbchoices" ;;
- esac
- $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"
+ if [ $CDDBLASTMETHOD = "y" ]
+ then
+ # We're the caboose, so we need to generate the CDDB
+ # template.
+ vecho "Unable to find a match with ${CDDBMETHCHOICE}, generating CDDB template."
+ case "$RESPONSECODE" in
+ 202) echo "No CDDB match." >> "$ABCDETEMPDIR/cddbchoices" ;;
+ 403|409) echo "CDDB entry is corrupt, or the handshake failed." >> "$ABCDETEMPDIR/cddbchoices" ;;
+ 500|503) echo "CDDB unavailable." >> "$ABCDETEMPDIR/cddbchoices" ;;
+ esac
+ $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 -a ^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"
+ else
+ # Template's the next chump's job.
+ vecho "Unable to find a match with ${CDDBMETHCHOICE}, moving on to the next option."
+ fi
;;
210|211)
# Multiple exact, (possibly multiple) inexact matches
echo \#$X: ---- "$DISCINFO" ---- >> "$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"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.$X" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
done )
# Using local copy.
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"
+ echo $TRACK: "$(grep -a ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.1" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
echo cddb-read-1-complete >> "$ABCDETEMPDIR/status"
CHOICE=$(checkstatus cddb-choice)
if [ -n "$CHOICE" ] ; then
case $CDDBCHOICES in
- -1) if head -1 "$ABCDETEMPDIR/cddbquery" | grep "^$" > /dev/null 2>&1 ; then
+ -1) if head -1 "$ABCDETEMPDIR/cddbquery" | grep -a "^$" > /dev/null 2>&1 ; then
log error "CDDB query failed!"
exit 1
else
UNKNOWNDISK=y
$CDDBTOOL template $(cat "$ABCDETEMPDIR/discid") > "$ABCDETEMPDIR/cddbread.0"
else
- echo "Selected: #$CDCHOICENUM ($(grep ^DTITLE= "$ABCDETEMPDIR/cddbread.$CDCHOICENUM" | cut -f2- -d= | tr -d \\r\\n))" >&2
+ echo "Selected: #$CDCHOICENUM ($(grep -a ^DTITLE= "$ABCDETEMPDIR/cddbread.$CDCHOICENUM" | cut -f2- -d= | tr -d \\r\\n))" >&2
do_cddbparse "$ABCDETEMPDIR/cddbread.$CDCHOICENUM"
fi
echo "cddb-choice=$CDCHOICENUM" >> "$ABCDETEMPDIR/status"
CDCHOICENUM=1
echo "cddb-choice=$CDCHOICENUM" >> "$ABCDETEMPDIR/status"
fi
- echo "Selected: #$CDCHOICENUM ($(grep ^DTITLE= "$ABCDETEMPDIR/cddbread.$CDCHOICENUM" | cut -f2- -d= | tr -d \\r\\n))" >&2
+ echo "Selected: #$CDCHOICENUM ($(grep -a ^DTITLE= "$ABCDETEMPDIR/cddbread.$CDCHOICENUM" | cut -f2- -d= | tr -d \\r\\n))" >&2
fi
fi
# Some heuristics first. Look at Disc Title, and if it starts with
# "Various", then we'll assume Various Artists
- if [ "$(grep ^DTITLE= "$CDDBDATA" | cut -f2- -d= | grep -Eci '^(various|soundtrack|varios|sonora|ost)')" != "0" ]; then
+ if [ "$(grep -a ^DTITLE= "$CDDBDATA" | cut -f2- -d= | grep -aEci '^(various|soundtrack|varios|sonora|ost)')" != "0" ]; then
echo "Looks like a Multi-Artist CD" >&2
VARIOUSARTISTS=y
else
# Set a default
DEFAULTSTYLE=1
# Need NUMTRACKS before cddb-tool will return it:
- NUMTRACKS=$(grep -E '^TTITLE[0-9]+=' "$CDDBDATA" | wc -l)
- if [ "$(grep -c "^TTITLE.*\/" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
+ NUMTRACKS=$(grep -a -E '^TTITLE[0-9]+=' "$CDDBDATA" | wc -l)
+ if [ "$(grep -ac "^TTITLE.*\/" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
# More than 1/2 tracks contain a "/", so guess forward
DEFAULTSTYLE=1
- elif [ "$(grep -c "^TTITLE.*\-" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
+ elif [ "$(grep -ac "^TTITLE.*\-" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
# More than 1/2 contain a "-", so guess forward-dash
DEFAULTSTYLE=2
- elif [ "$(grep -c "^TTITLE.*(.*)" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
+ elif [ "$(grep -ac "^TTITLE.*(.*)" "$CDDBDATA")" -gt "$(expr $NUMTRACKS / 2 )" ]; then
# More than 1/2 contain something in parens, so guess trailing-paren
DEFAULTSTYLE=6
fi
do_getalbumart()
{
# set variables
- ALBUMFILE="$(mungefilename "$DALBUM")"
- ARTISTFILE="$(mungefilename "$DARTIST")"
+ ALBUMFILE="$(mungealbumname "$DALBUM")"
+ ARTISTFILE="$(mungeartistname "$DARTIST")"
GENRE="$(mungegenre "$GENRE")"
YEAR=${CDYEAR:-$CDYEAR}
# have we got a musicbrainz mbid or amazon asin?
LASTTRACK=$(expr $3 + 0)
UTRACKNUM=$FIRSTTRACK
case "$CDROMREADERSYNTAX" in
- flac) READTRACKNUMS="$FIRSTTRACK.1-$(($LASTTRACK + 1)).0" ;;
+ flac) READTRACKNUMS="-" ;;
cdparanoia|libcdio)
#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" ;;
+ # Add a variable to check if tracks are provided in command line and if not, rip the whole CD
+ # We must make sure to rip from sector 0, both lines below work
+ # READTRACKNUMS="-- -$LASTTRACK" ;;
+ READTRACKNUMS="[.0]-" ;;
cdda2wav | icedax) READTRACKNUMS="$FIRSTTRACK+$LASTTRACK" ;;
pird) READTRACKNUMS="$FIRSTTRACK..$LASTTRACK" ;;
*) echo "abcde error: $CDROMREADERSYNTAX does not support ONETRACK mode"
echo "$@" | sed -e 's/^\.*//' -e 's/ /_/g' | tr -d ":><|*/\"'?[:cntrl:]"
}
+# Custom filename munging specific to track names:
+mungetrackname ()
+{
+ mungefilename $@
+}
+
+# Custom filename munging specific to artist names:
+mungeartistname ()
+{
+ mungefilename $@
+}
+
+# Custom filename munging specific to album names:
+mungealbumname ()
+{
+ mungefilename $@
+}
+
# Custom genre munging:
mungegenre ()
{
# Builtin defaults
# CDDB
-# Defaults to FreeDB, but musicbrainz can be used too, via the abcde-musicbrainz-tool script
-CDDBMETHOD=cddb
+# Currently two supported options ("musicbrainz" and "cddb" for freedb.org)
+CDDBMETHOD=musicbrainz
CDDBURL="http://freedb.freedb.org/~cddb/cddb.cgi"
CDDBSUBMIT=freedb-submit@freedb.org
CDDBPROTO=6
CDDBLOCALRECURSIVE="y"
CDDBLOCALDIR="$HOME/.cddb"
CDDBUSELOCAL="n"
+# pre-declare a variable we'll use if the user provides a
+# comma-separated list of CDDBMETHODs
+declare -a CDDBMETHODS
+CDDBLASTMETHOD="n"
# List of fields we parse and show during the CDDB parsing...
SHOWCDDBFIELDS="year,genre"
# 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:lame,mp3:bladeenc,spx:speex,m4a:faac:opus
+DEFAULT_OUTPUT_BINARIES=vorbis:oggenc,flac:flac,mp3:lame,mp3:bladeenc,spx:speex,m4a:fdkaac:opus
# List of preferred cdromreaders - by default, run whichever we have in the path
DEFAULT_CDROMREADERS="cdparanoia icedax cdda2wav libcdio pird"
if [ "$HTTPGETOPTS" = "" ] ; then
case $HTTPGET in
wget) HTTPGETOPTS="-q -nv -e timestamping=off -O -";;
- curl) HTTPGETOPTS="-f -s";;
+ curl) HTTPGETOPTS="-f -s -L";;
fetch)HTTPGETOPTS="-q -o -";;
ftp) HTTPGETOPTS="-a -V -o - ";;
*) log warning "HTTPGET in non-standard and HTTPGETOPTS are not defined." ;;
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 and
+# for flacs and speexenc for speex and mpcenc for mpcs and fdkaac for m4as and
# wavpack for wvs...
# Getting ready for multiple output changes
# compiled without libmp4v2... Andrew.
;;
m4a)
- [ "$AACENCODERSYNTAX" = "default" ] && AACENCODERSYNTAX=faac
- [ "$DOTAG" = "y" ] && CHECKFAACBUILD=y
+ [ "$AACENCODERSYNTAX" = "default" ] && AACENCODERSYNTAX=fdkaac
+ [ "$AACENCODERSYNTAX" = "faac" ] && [ "$DOTAG" = "y" ] && CHECKFAACBUILD=y
[ "$AACENCODERSYNTAX" = "neroAacEnc" ] && NEEDNEROAACTAG=y
[ "$AACENCODERSYNTAX" = "qaac" ] && NEEDWINE=y
[ "$AACENCODERSYNTAX" = "fhgaacenc" ] && NEEDWINE=y && NEEDATOMICPARSLEY=y
musicbrainz) ;;
esac
+# 2016-08-30: adding comma-separated list (in this case, to be used in
+# sequence until successful) support ala OUTPUTYPE. -GR
+idx=0
+for CDDBCHOICE in $(echo "$CDDBMETHOD" | tr -d ' ' | tr , ' ')
+do
+ # The OUTPUTTYPE code uses bash-specific syntax (var=${var:+var}),
+ # but then doesn't just use an array to store the output, which seems
+ # weird. So I'm going to use an array for this...? -GR
+ CDDBMETHODS[$idx]=$CDDBCHOICE
+ vvecho "CDDB method $idx: $CDDBCHOICE"
+ idx=$((idx + 1))
+done
+
+# Just so CDDBMETHOD is a legible value for functions, in case I
+# miss something, set it to the first choice: -GR
+CDDBMETHOD=${CDDBMETHODS[0]}
+
# Check if both OGGEOUTPUTCONTAINER and FLACOUTPUTCONTAINER are the same, and differentiante them
if [ X"$OGGOUTPUTCONTAINER" = "Xogg" ] && [ X"$FLACOUTPUTCONTAINER" = "Xogg" ]; then
log error "FLAC on an Ogg container is not yet supported"
if faac --help 2>&1 | grep -q -F 'MP4 support unavailable.'; then
echo "WARNING: Your copy of Faac does not have mp4 support"
echo "WARNING: Encoding untagged files to aac..."
- OUTPUTTYPE=aac
+ # Replace m4a with aac for single and multi-output encodes:
+ OUTPUTTYPE=$(echo "$OUTPUTTYPE" | sed 's/m4a/aac/')
else
echo "Using Faac to Tag AAC Tracks..."
fi
# Here it used to say:
# One thousand lines in, we can start doing stuff with things
# Well, right now we are at line 3737 ;)
+# Hey, for grins, as of 2016-08-30 this is now line 4814! -GR
# Export needed things so they can be read in this subshell
export CDDBTOOL ABCDETEMPDIR TRACKQUEUE LOWDISK EJECTCD EJECT EJECTOPTS
:
else
if [ "$CDDBLOCALSTATUS" = "notfound" ] ; then
- case "$CDDBMETHOD" in
+ for CDDBMETHCHOICE in ${CDDBMETHODS[@]}
+ do
+ vecho "Trying CDDB method ${CDDBMETHCHOICE}."
+ if [ $CDDBLASTMETHOD = "n" ]
+ then
+ if [ ${#CDDBMETHODS[@]} -le 1 ]
+ # (number of items)
+ then
+ CDDBLASTMETHOD="y"
+ else
+ CDDBMETHODS=("${CDDBMETHODS[@]:1}")
+ # (performs shift on an array in bash)
+ fi
+ else
+ vvecho "(Last chance before manual entry...)"
+ fi
+ case "$CDDBMETHCHOICE" in
cddb)
do_cddbstat
do_cddbquery
musicbrainz)
do_musicbrainz
;;
- esac
+ esac
+ if [ -f "$ABCDETEMPDIR/cddbchoices" ]
+ then
+ # If this pass found something, we're done.
+ break
+ fi
+ done
fi
CHOICE=$(checkstatus cddb-choice)
if [ "$CHOICE" = 0 ] ; then