X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/98bea0a0f2d7e9d9c24037ed9998920b12711bee..9d790401f2100147cbe64c3aa7111c218f862d80:/abcde diff --git a/abcde b/abcde index 34e0546..7a6caed 100755 --- a/abcde +++ b/abcde @@ -13,7 +13,7 @@ # # $Id$ -VERSION='2.5.1-UNRELEASED' +VERSION='2.5.3-UNRELEASED' usage () { @@ -43,11 +43,11 @@ echo "-j <#> Number of encoder processes to run at once (localhost)" 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 " 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)" @@ -56,7 +56,6 @@ echo "-q " echo " Set quality level (high,medium,low)" echo "-r " echo " Also encode on these remote hosts" -echo "-R Use local CDDB in recursive mode" echo "-s " echo " Show fields from the CDDB info (year,genre)" echo "-S <#> Set the CD speed" @@ -118,7 +117,7 @@ f_seq_line () done echo else - log error "syntax error while processing track numbers" + log error "syntax error while processing track numbers ($i)" exit 1 fi } @@ -938,7 +937,7 @@ do_tag () 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 @@ -1027,7 +1026,7 @@ do_encode () TEMPARG="PIPE_$MPPENCODER" ;; m4a) - TEMPARG="PIPE_$MPPENCODER" + TEMPARG="PIPE_$AACENCODERSYNTAX" ;; esac IN="$( eval echo "\$$TEMPARG" )" @@ -1137,7 +1136,7 @@ do_encode () 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 @@ -1556,7 +1555,7 @@ do_playlist () ## 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 @@ -2229,6 +2228,58 @@ do_localcddb () 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 [ "$CDROMID" = "" ]; then + CDDA2WAVCDROM="$CDROM" + else + CDDA2WAVCDROM="$CDROMID" + 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 @@ -2243,27 +2294,11 @@ do_musicbrainz () 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" @@ -2280,23 +2315,42 @@ do_musicbrainz () 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 @@ -3468,7 +3522,8 @@ else # 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##*-} @@ -4022,6 +4077,13 @@ if [ "$DOCDDB" = "y" ]; then ;; 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