#
# $Id$
-VERSION='2.5.1-UNRELEASED'
+VERSION='2.5.3-UNRELEASED'
usage ()
{
echo "-k Keep the wav tracks for later use"
echo "-l Use low disk space algorithm"
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 " WARNING: Deprecated. Use \"cue\" action"
#echo "-M Create a CUE file"
+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). Defaults to vorbis"
echo "-p Pad track numbers with 0's (if less than 10 tracks)"
echo " Set quality level (high,medium,low)"
echo "-r <host1[,host2]...>"
echo " Also encode on these remote hosts"
-echo "-R Use local CDDB in recursive mode"
echo "-s <field>"
echo " Show fields from the CDDB info (year,genre)"
echo "-S <#> Set the CD speed"
done
echo
else
- log error "syntax error while processing track numbers"
+ log error "syntax error while processing track numbers ($i)"
exit 1
fi
}
# Runs a command, silently if necessary, and updates the status file
run_command ()
{
+ vvecho "$@"
BLURB="$1"
shift
# See if this is supposed to be silent
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
+ 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
TEMPARG="PIPE_$MPPENCODER"
;;
m4a)
- TEMPARG="PIPE_$MPPENCODER"
+ TEMPARG="PIPE_$AACENCODERSYNTAX"
;;
esac
IN="$( eval echo "\$$TEMPARG" )"
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 --author "$TRACKARTIST" --title "$TRACKNAME" ${COMMENT:+--comment "$COMMENT"} "$IN" "$OUT"
+ $RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS --author "$TRACKARTIST" --title "$TRACKNAME" ${COMMENT:+--comment "$COMMENT"} "$IN" "$OUT"
else
$RUN_COMMAND nice $EFFECTIVE_NICE $SPEEXENCODER $SPEEXENCODEROPTS "$IN" "$OUT"
fi
## this will convert the playlist to have CRLF line-endings, if specified
## (some hardware players insist on CRLF endings)
if [ "$DOSPLAYLIST" = "y" ]; then
- awk '{substr("\r",""); printf "%s\r\n", $0}' "$OUTPUTDIR/$PLAYLISTFILE" > "$ABCDETEMPDIR/PLAYLISTFILE.tmp"
+ awk '{sub("\r$",""); printf "%s\r\n", $0}' "$OUTPUTDIR/$PLAYLISTFILE" > "$ABCDETEMPDIR/PLAYLISTFILE.tmp"
# mv -f "$ABCDETEMPDIR/PLAYLISTFILE.tmp" "$OUTPUTDIR/$PLAYLISTFILE"
cat "$ABCDETEMPDIR/PLAYLISTFILE.tmp" | sed 's/\//\\/' > "$OUTPUTDIR/$PLAYLISTFILE"
fi
fi
}
+# do_cdtext
+# Try to read CD-Text from the drive using icedax / cdda2wav
+do_cdtext ()
+{
+ if new_checkexec icedax; then
+ CDTEXT_READER=icedax
+ elif new_checkexec cdda2wav; then
+ CDTEXT_READER=cdda2wav
+ else
+ # Didn't find either, bail
+ return 0
+ fi
+
+ if [ "$OSFLAVOUR" = "OSX" ] ; then
+ # Hei, we have to unmount the device before running anything like cdda2wav/icedax in OSX
+ diskutil unmount ${CDROM#/dev/}
+ # Also, in OSX the cdrom device for cdda2wav/icedax changes...
+ CDDA2WAVCDROM="IODVDServices"
+ elif [ "$OSFLAVOUR" = "FBSD" ] ; then
+ CDDA2WAVCDROM="$CDROMID"
+ else
+ if [ "$CDROMID" = "" ]; then
+ CDDA2WAVCDROM="$CDROM"
+ else
+ CDDA2WAVCDROM="$CDROMID"
+ fi
+ 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"
+ ERRORCODE=$?
+ if [ $ERRORCODE -ne 0 ]; then
+ # No CD-Text found, bail
+ return 0
+ fi
+
+ rm -f "$ABCDETEMPDIR/cddbchoices"
+ CDDBCHOICES=1
+ # Make an empty template
+ $CDDBTOOL template $(cat "$ABCDETEMPDIR/discid") > "$ABCDETEMPDIR/cddbread.1"
+ echo -n "Retrieved 1 CD-Text match..." >> "$ABCDETEMPDIR/cddbchoices"
+ 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- )
+ 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")"
+ echo "$TRACK: $TITLE" >> "$ABCDETEMPDIR/cddbchoices"
+ sed -i "s~^TTITLE${TRACKM1}=.*~TTITLE${TRACKM1}=${TITLE}~" "$ABCDETEMPDIR/cddbread.1"
+ done
+ sed -i "s~^DTITLE=.*~DTITLE=${ATITLE}~" "$ABCDETEMPDIR/cddbread.1"
+ echo >> "$ABCDETEMPDIR/cddbchoices"
+ echo "cdtext-readcomplete" >> "$ABCDETEMPDIR/status"
+}
+
# do_musicbrainz
# Work with the musicbrainz WS API, then transform the results here so
# they look (very) like the results from CDDB. Maybe not the best way
rm -f "$ABCDETEMPDIR/cddbchoices"
CDDBCHOICES=1 # Overridden by multiple matches
MBDISCID=$(echo $TRACKINFO | cut -d' ' -f1)
- ${MUSICBRAINZ} --command data --discid "$MBDISCID" --workdir $ABCDETEMPDIR
+ ${MUSICBRAINZ} --command data --discid "$MBDISCID" --workdir "$ABCDETEMPDIR"
# The helper script will write disc matches out to
# cddbread.*. Count how many we have
- NUM_RESPONSES=$(echo ${ABCDETEMPDIR}/cddbread.* | wc -w)
- if [ "$NUM_RESPONSES" -eq 1 ] ; then
- # One exact match
- echo -n "Retrieved 1 Musicbrainz match..." >> "$ABCDETEMPDIR/cddbchoices"
- 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- )
- 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"
- done
- echo >> "$ABCDETEMPDIR/cddbchoices"
- elif [ "$NUM_RESPONSES" -eq 0 ] ; then
+ 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"
echo cddb-choice=0 >> "$ABCDETEMPDIR/status"
echo 503 > "$ABCDETEMPDIR/cddbquery"
else
- echo "210 Found exact matches, list follows (until terminating .)" > "$ABCDETEMPDIR/cddbquery"
- echo "Multiple Musicbrainz matches:" >> "$ABCDETEMPDIR/cddbchoices"
- for file in $ABCDETEMPDIR/cddbread.*
- do
- X=$(echo $file | sed 's/^.*cddbread\.//g')
- echo cddb-read-$X-complete >> "$ABCDETEMPDIR/status"
- ATITLE=$(grep -e '^DTITLE=' ${ABCDETEMPDIR}/cddbread.$X | cut -c8- )
- echo "none ${ATITLE}" >> "$ABCDETEMPDIR/cddbquery"
+ # We have some matches
+ NUM_RESPONSES=$(echo "${ABCDETEMPDIR}"/cddbread.* | wc -w)
+ if [ "$NUM_RESPONSES" -eq 1 ] ; then
+ # One exact match
+ echo -n "Retrieved 1 Musicbrainz match..." >> "$ABCDETEMPDIR/cddbchoices"
+ 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- )
+ echo "200 none ${ATITLE}" >> "$ABCDETEMPDIR/cddbquery"
# List out disc title/author and contents
- echo "#$X: ---- ${ATITLE} ----" >> "$ABCDETEMPDIR/cddbchoices"
+ echo ---- ${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 ^TTITLE$(expr $TRACK - 1)= "$ABCDETEMPDIR/cddbread.1" | cut -f2- -d= | tr -d \\r\\n)" >> "$ABCDETEMPDIR/cddbchoices"
done
echo >> "$ABCDETEMPDIR/cddbchoices"
- done
- echo "." >> "$ABCDETEMPDIR/cddbquery"
+ else
+ echo "210 Found exact matches, list follows (until terminating .)" > "$ABCDETEMPDIR/cddbquery"
+ echo "Multiple Musicbrainz matches:" >> "$ABCDETEMPDIR/cddbchoices"
+ for file in "$ABCDETEMPDIR"/cddbread.*
+ do
+ X=$(echo $file | sed 's/^.*cddbread\.//g')
+ echo cddb-read-$X-complete >> "$ABCDETEMPDIR/status"
+ ATITLE=$(grep -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"
+ done
+ echo >> "$ABCDETEMPDIR/cddbchoices"
+ done
+ echo "." >> "$ABCDETEMPDIR/cddbquery"
+ fi
fi
echo "musicbrainz-readcomplete" >> "$ABCDETEMPDIR/status"
fi
cdda2wav | icedax)
if [ "$OSFLAVOUR" = "OSX" ] ; then
# Hei, we have to unmount the device before running anything like cdda2wav/icedax in OSX
- diskutil unmount ${CDROM#/dev/} 0
+ diskutil unmount ${CDROM#/dev/}
# Also, in OSX the cdrom device for cdda2wav/icedax changes...
CDDA2WAVCDROM="IODVDServices"
elif [ "$OSFLAVOUR" = "FBSD" ] ; then
# Range parsing code courtesy of Vincent Ho
# Cleaned up to use shell built-ins by Charles Steinkuehler
if [ "${1#*[^0-9-]}" != "$1" ]; then
- log error "syntax error while processing track numbers"
+ log error "syntax error while processing track numbers ($1)"
+ exit 1
else
RSTART=${1%%-*}
REND=${1##*-}
;;
esac
fi
+ CHOICE=$(checkstatus cddb-choice)
+ if [ $CHOICE = 0 ] ; then
+ # We don't have any information at all; try to fall back
+ # to CD-Text for basic information
+ vecho "No CDDB information found, trying cdtext from the CD"
+ do_cdtext
+ fi
fi
do_cddbedit