X-Git-Url: https://git.hcoop.net/clinton/abcde.git/blobdiff_plain/eb1474fe45e9507164ac46b48414dfc1608f7b27..76448acfe004a89d28ebaf481ac0f20ef75d6ae3:/abcde diff --git a/abcde b/abcde index e186802..af7282d 100755 --- a/abcde +++ b/abcde @@ -30,6 +30,7 @@ echo " Specify discid to resume from (only needed if you no longer have th echo "-d " echo " Specify CDROM device to grab" echo "-D Debugging mode (equivalent to sh -x abcde)" +echo "-e Erase encoded track information from status file" echo "-h This help information" #echo "-i Tag files while encoding, when possible (local only) -NWY-" echo "-j <#> Number of encoder processes to run at once (localhost)" @@ -61,6 +62,7 @@ echo "-W <#> Contatenate CDs: -T #01 -w \"CD #\"" echo "" echo "Tracks is a space-delimited list of tracks to grab." echo "Ranges specified with hyphens are allowed." +#echo "Double hyphens are used to concatenate tracks" } # Funtions to replace the need of seq, which is too distribution dependant. @@ -85,6 +87,31 @@ f_seq_line () echo } +# Functions to replace the need of awk {print $1} and {print $NF} +get_first() +{ +if [ X"$1" = "X" ]; then + for first in `cat`; do + break + done +else + first=$1 +fi +echo $first +} + +get_last() +{ +if [ X"$1" = "X" ]; then + for stdin in `cat`; do + last=$stdin + done +else + for last in $@ ; do :; done +fi +echo $last +} + # checkstatus [blurb] # Returns "0" if the blurb was found, returns 1 if it wasn't # Puts the blurb content, if available, on stdout. @@ -451,18 +478,16 @@ do_tag () if [ -n "$STARTTRACKNUMBER" -a -n "$STARTTRACKNUMBERTAG" ] ; then # Get the trackpadding from the current track CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - 1 )) + TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) fi for OUTPUT in $(echo $OUTPUTTYPE | tr , \ ) do case "$OUTPUT" in mp3) # id3v2 v0.1.9 claims to have solved the -c bug, so we merge both id3 and id3v2 - GENREID=$(do_getgenreid "${CDGENRE}") - - # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM GENREID=$(do_getgenreid "${CDGENRE}") + # FIXME # track numbers in mp3 come with 1/10, so we cannot happily substitute them with $TRACKNUM run_command tagtrack-$1 $TAGGER $TAGGEROPTS -c "$COMMENTOUTPUT" \ -A "$DALBUM" -a "$TRACKARTIST" -t "$TRACKNAME" -y "$CDYEAR" \ -g "$GENREID" -T "${TRACKNUM:-$1/$TRACKS}" \ @@ -480,12 +505,12 @@ do_tag () echo ARTIST="$TRACKARTIST" echo ALBUM="$DALBUM" echo TITLE="$TRACKNAME" - if [ -n "$CDYEAR" ]; then + if [ -n "$CDYEAR" ]; then echo DATE="$CDYEAR" - fi - if [ -n "$CDGENRE" ]; then + fi + if [ -n "$CDGENRE" ]; then echo GENRE="$CDGENRE" - fi + fi echo TRACKNUMBER=${TRACKNUM:-$1} echo CDDB=$CDDBDISCID if [ "$(eval echo ${COMMENT})" != "" ]; then @@ -494,7 +519,7 @@ do_tag () *) echo COMMENT="$COMMENTOUTPUT";; esac fi - ) | run_command tagtrack-$1 $VORBISCOMMENT -w \ + ) | run_command tagtrack-$1 $VORBISCOMMENT $VORBISCOMMENTOPTS -w \ "$ABCDETEMPDIR/track$1.uncommented.$OUTPUT" "$ABCDETEMPDIR/track$1.$OUTPUT" # Doublecheck that the commented file was created successfully before wiping the original if [ -f "$ABCDETEMPDIR/track$1.$OUTPUT" ]; then @@ -507,16 +532,16 @@ do_tag () ;; flac) ## FIXME ## [ "$FLACONOGG" = "y" ] && OUTPUT=ogg - ( + ( echo ARTIST="$TRACKARTIST" echo ALBUM="$DALBUM" echo TITLE="$TRACKNAME" - if [ -n "$CDYEAR" ]; then + if [ -n "$CDYEAR" ]; then echo DATE="$CDYEAR" - fi - if [ -n "$CDGENRE" ]; then + fi + if [ -n "$CDGENRE" ]; then echo GENRE="$CDGENRE" - fi + fi echo TRACKNUMBER=${TRACKNUM:-$1} echo CDDB=$CDDBDISCID if [ "$(eval echo ${COMMENT})" != "" ]; then @@ -525,7 +550,7 @@ do_tag () *) echo COMMENT="$COMMENTOUTPUT";; esac fi - ) | run_command tagtrack-$1 $METAFLAC --no-utf8-convert --import-tags-from=- "$ABCDETEMPDIR/track$1.$OUTPUT" + ) | run_command tagtrack-$1 $METAFLAC $METAFLACOPTS --import-tags-from=- "$ABCDETEMPDIR/track$1.$OUTPUT" ;; spx) run_command tagtrack-$1 true @@ -798,9 +823,18 @@ do_encode () # done #} +# do_single_gain +# variables used: +# FIXME # +do_single_gain () +{ +: +} + # do_batch_gain # variables used: # MP3GAIN, MP3GAINOPTS, VORBISGAIN, VORBISGAINOPTS +# FIXME # do_batch_gain () { # The commands here don't go through run_command because they're never supposed to be silenced @@ -900,7 +934,7 @@ do_move () if [ -n "$STARTTRACKNUMBER" ] ; then # Get the trackpadding from the current track CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - 1 )) + TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) else TRACKNUM=${UTRACKNUM} fi @@ -934,6 +968,7 @@ do_playlist () ALBUMFILE=$(mungefilename "$DALBUM") ARTISTFILE=$(mungefilename "$DARTIST") GENRE=$(mungegenre "$GENRE") + YEAR=${CDYEAR:-$CDYEAR} if [ "$VARIOUSARTISTS" = "y" ] ; then PLAYLISTFILE=$(eval echo $VAPLAYLISTFORMAT) else @@ -976,7 +1011,7 @@ do_playlist () if [ -n "$STARTTRACKNUMBER" ] ; then # Get the trackpadding from the current track CURRENTTRACKPADDING=$(echo -n $UTRACKNUM | wc -c) - TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - 1 )) + TRACKNUM=$( printf %0.${CURRENTTRACKPADDING}d $(expr ${UTRACKNUM} + ${STARTTRACKNUMBER} - $FIRSTTRACK )) else TRACKNUM=${UTRACKNUM} fi @@ -1022,7 +1057,13 @@ do_discid () #elif [ -z "$DISCID" ]; then if [ -z "$DISCID" ]; then vecho -n "Getting CD track info... " + if [ "$OSFLAVOUR" = "OSX" ]; then + disktool -u ${CDROM#/dev/} + fi TRACKINFO=$($CDDISCID $CDROM) + if [ "$OSFLAVOUR" = "OSX" ]; then + disktool -m ${CDROM#/dev/} + fi # Make sure there's a CD in there by checking cd-discid's return code if [ "$?" = "1" ]; then echo "abcde error: CD could not be read. Perhaps there's no CD in the drive?" >&2 @@ -1057,7 +1098,7 @@ do_discid () if [ ! "$RET" = "0" ];then echo "Warning: Something went wrong while querying the CD... Maybe a DATA CD?" fi - TRACKS="$( echo "$CDPARANOIAOUTPUT" | egrep '^[[:space:]]+[[:digit:]]' | tail -n 1 | awk '{print $1}' | tr -d "." | tr '\n' ' ' )" + TRACKS="$( echo "$CDPARANOIAOUTPUT" | egrep '^[[:space:]]+[[:digit:]]' | tail -n 1 | get_first | tr -d "." | tr '\n' ' ' )" CDPARANOIAAUDIOTRACKS="$TRACKS" else if [ -f "$ABCDETEMPDIR/status" ] && checkstatus cdparanoia-audio-tracks ; then @@ -1072,7 +1113,7 @@ do_discid () else TRACKS=$(echo $TRACKINFO | cut -f2 -d' ') fi - if echo "$TRACKS" | grep [[:digit:]] > /dev/null 2>&1 ;then :;else + if echo "$TRACKS" | grep "[[:digit:]]" > /dev/null 2>&1 ;then :;else echo "The disc does not contain any tracks. Giving up..." exit 0 fi @@ -1107,8 +1148,6 @@ do_discid () echo Grabbing tracks: "$TRACKQUEUE" fi -# for LASTTRACK in $TRACKQUEUE; do :; done - QUEUEDTRACKS=$(echo $TRACKQUEUE | wc -w | tr -d ' ') # We have the discid, create a temp directory after it to store all the temp @@ -1181,9 +1220,10 @@ do_discid () cat /dev/null > "$ABCDETEMPDIR/status" fi if [ X"$CUEFILE" = "Xy" -a X"$WEHAVEACD" = "Xy" ]; then - if checkstatus cuefile ; then :; else - $MKCUE $MKCUEOPTS > $ABCDETEMPDIR/cue-$(echo $TRACKINFO | cut -f1 -d' ').txt - echo cuefile >> "$ABCDETEMPDIR/status" + if checkstatus cuefile >/dev/null ; then :; else + CUEFILE=cue-$(echo $TRACKINFO | cut -f3 -d' ').txt + $MKCUE $MKCUEOPTS > $ABCDETEMPDIR/$CUEFILE + echo cuefile=$CUEFILE >> "$ABCDETEMPDIR/status" fi fi # If we got the CDPARANOIA status and it is not recorded, save it now @@ -1199,6 +1239,19 @@ do_discid () echo "$TRACKINFO" > "$ABCDETEMPDIR/discid" } +# do_cleancue +# Create a proper CUE file based on the CUE file we created before. +do_cleancue() +{ + if checkstatus cuefile; then :; else + $CUEFILE_INPUT="$ABCDETEMPDIR/cue-$(echo $TRACKINFO | cut -f1 -d' ').txt" + ### FIXME ### checkstatus cddb + if [ "$DOCDDB" = "y" ]; then + MARKER + fi + fi +} + # do_cddbparse # Parses a CDDB file and outputs the title and the track names. # Variables: CDDBFILE @@ -1245,7 +1298,7 @@ do_localcddb () echo "y" >&2 fi if [ "$USELOCALRESP" = "y" ]; then - #echo "Using local copy of CDDB data" + #echo "Using local copy of CDDB data" cp "${CDDBLOCALFILE}" "$ABCDETEMPDIR/cddbread.1" echo 999 > "$ABCDETEMPDIR/cddbquery" # Assuming 999 isn't used by CDDB echo cddb-readcomplete >> "$ABCDETEMPDIR/status" @@ -1256,7 +1309,6 @@ do_localcddb () #echo "Not using local copy of CDDB data" CDDBLOCALSUCCESS="n" fi - CDDBLOCALSUCCESS="y" else CDDBLOCALSUCCESS="n" fi @@ -1752,9 +1804,10 @@ do_cdread () # We need the first and last track for cdda2wav FIRSTTRACK=$2 LASTTRACK=$3 + UTRACKNUM=$FIRSTTRACK case "$CDROMREADERSYNTAX" in - cdparanoia) UTRACKNUM="1-" ;; - cdda2wav) UTRACKNUM="1+$LASTRACK" ;; + cdparanoia) READTRACKNUMS="$FIRSTTRACK-$LASTTRACK" ;; + cdda2wav) READTRACKNUMS="$FIRSTTRACK+$LASTRACK" ;; *) echo "abcde error: $CDROMREADERSYNTAX does not support ONETRACK mode" exit 1 ;; esac @@ -1780,14 +1833,19 @@ do_cdread () esac REDIR=">&2" fi - if [ -r "$CDDBDATA" ]; then - TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2 -d= | tr -d \[:cntrl:\]) - echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM: $TRACKNAME..." >&2 + if [ "$1" = "onetrack" ]; then + echo "Grabbing ${PIPE_MESSAGE}tracks $UTRACKNUM - $LASTTRACK ..." >&2 else - echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM..." >&2 + if [ -r "$CDDBDATA" ]; then + TRACKNAME=$(grep ^TTITLE$CDDBTRACKNUM= "$CDDBDATA" | head -n 1 | cut -f2 -d= | tr -d \[:cntrl:\]) + echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM: $TRACKNAME..." >&2 + else + echo "Grabbing ${PIPE_MESSAGE}track $UTRACKNUM..." >&2 + fi fi case "$CDROMREADERSYNTAX" in - cdparanoia) nice $READNICE $CDROMREADER -d $CDROM $UTRACKNUM $FILEARG $REDIR ;; + cdparanoia) + nice $READNICE $CDROMREADER -d $CDROM ${READTRACKNUMS:-$UTRACKNUM} $FILEARG $REDIR ;; cdda2wav) if [ "$OSFLAVOUR" = "OSX" ] ; then # Hei, we have to unmount the device before running anything like cdda2wav in OSX @@ -1803,7 +1861,7 @@ do_cdread () CDDA2WAVCDROM="$CDROMID" fi fi - nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t $UTRACKNUM $FILEARG $REDIR + nice $READNICE $CDROMREADER -D $CDDA2WAVCDROM -t ${READTRACKNUMS:-$UTRACKNUM} $FILEARG $REDIR ;; ## FIXME ## We have an exception for dagrab, since it uses -f ## FIXME ## Shall we just use -f $FILEARG ?? @@ -1889,6 +1947,9 @@ pre_read () : } +# do_movecue +# Standalone function to move the CUE file to the final location + ############################################################################### # End of functions # @@ -2007,6 +2068,8 @@ NORMALIZEOPTS= CDSPEEDOPTS="-x" CDSPEEDVALUE= MKCUEOPTS= +VORBISCOMMENTOPTS="-R" +METAFLACOPTS="--no-utf8-convert" # Default to one process if -j isn't specified MAXPROCS=1 @@ -2025,6 +2088,7 @@ elif [ X$(uname) = "XDarwin" ] ; then OSFLAVOUR=OSX # We should have disktool in OSX, but let's be sure... NEEDDISKTOOL=y + CDROMREADERSYNTAX=cddafs elif [ X$(uname) = "XOpenBSD" ] ; then HTTPGET=wget MD5SUM=md5 @@ -2086,7 +2150,7 @@ fi # Parse command line options #while getopts 1a:bc:C:d:Dhj:klLnNo:pr:S:t:T:vVx opt ; do -while getopts 1a:A:bc:C:d:Dhj:klLmMnNo:pPr:Rs:S:t:T:vVxw:W: opt ; do +while getopts 1a:A:bc:C:d:Dehj:klLmMnNo:pPr:Rs:S:t:T:vVxw:W: opt ; do case "$opt" in 1) ONETRACK=y ;; a) ACTIONS="$OPTARG" ;; @@ -2096,7 +2160,9 @@ while getopts 1a:A:bc:C:d:Dhj:klLmMnNo:pPr:Rs:S:t:T:vVxw:W: opt ; do C) DISCID="${OPTARG#abcde.}" ;; d) CDROM="$OPTARG" ;; D) set -x ;; + e) ERASEENCODEDSTATUS=y ;; h) usage; exit ;; + e) ERASEENCODEDSTATUS=y ;; # f) FORCECDDBUSELOCAL=y ;; i) INLINETAG=y ;; j) MAXPROCS="$OPTARG" ;; @@ -2128,7 +2194,13 @@ while getopts 1a:A:bc:C:d:Dhj:klLmMnNo:pPr:Rs:S:t:T:vVxw:W: opt ; do V) EXTRAVERBOSE="y" ;; x) EJECTCD="y" ;; w) COMMENT="$OPTARG" ;; - W) STARTTRACKNUMBER="${OPTARG}01" ; STARTTRACKNUMBERTAG="y" ; COMMENT="CD${OPTARG}" ;; + W) if echo $OPTARG | grep -q "[[:digit:]]" ; then + STARTTRACKNUMBER="${OPTARG}01" ; STARTTRACKNUMBERTAG="y" ; COMMENT="CD${OPTARG}" + else + echo "abcde error: argument of -W must be integer" + exit 1 + fi + ;; ?) usage; exit ;; esac done @@ -2139,7 +2211,7 @@ shift $(($OPTIND - 1)) if [ "$ONETRACK" = "y" ]; then # FIXME # remove check as soon as we find out about the other readers case "$CDROMREADERSYNTAX" in - dagrab|cddafs|debug) echo "abcde error: ONETRACK reading is not suported with "$CDROMREADERSYNTAX" yet" + dagrab|cddafs|debug) echo "abcde error: ONETRACK reading is not suported with $CDROMREADERSYNTAX yet" exit 1 ;; esac if [ "$BATCH" = "y" ]; then @@ -2404,11 +2476,21 @@ if [ "$DISTMP3NICE" ]; then fi # Don't check for stuff if it's not needed -if [ "$REMOTEHOSTS" ]; then NEEDDISTMP3=y; fi -[ "$DONORMALIZE" = "y" ] && NEEDNORMALIZER=y -[ "$EJECTCD" = "y" ] && NEEDEJECT=y -[ ! "$CDDBAVAIL" = "n" ] && [ "$DOCDDB" = "y" ] && NEEDHTTPGET=y -[ "$CUEFILE" = "y" ] && NEEDMKCUE=y +if [ "$REMOTEHOSTS" ]; then + NEEDDISTMP3=y +fi +if [ "$DONORMALIZE" = "y" ]; then + NEEDNORMALIZER=y +fi +if [ "$EJECTCD" = "y" ]; then + NEEDEJECT=y +fi +if [ ! "$CDDBAVAIL" = "n" ] && [ "$DOCDDB" = "y" ]; then + NEEDHTTPGET=y +fi +if [ "$CUEFILE" = "y" ]; then + NEEDMKCUE=y +fi if [ X"$CDSPEEDVALUE" != "X" ]; then case "$CDROMREADERSYNTAX" in @@ -2424,6 +2506,7 @@ PIPE_cdparanoia="-" # Encoders with USEPIPE support # FIXME # Include here all the encoders we can figure out support pipes PIPE_lame="-" +PIPE_bladeenc="-" PIPE_oggenc="-" # Figure out if we can use pipes with the ripper/encoder combination @@ -2527,6 +2610,16 @@ if [ X"$CDSPEEDVALUE" != "X" ]; then esac fi +# Define the first and last track, since we might need them later in several places +FIRSTTRACK=$( get_first $TRACKQUEUE ) +LASTTRACK=$( get_last $TRACKQUEUE ) + +if [ -f "$ABCDETEMPDIR/status" ] && [ X"$ERASEENCODEDSTATUS" = "Xy" ]; then + mv "$ABCDETEMPDIR/status" "$ABCDETEMPDIR/status.old" + grep -v ^encodetracklocation- < "$ABCDETEMPDIR/status.old" \ + | grep -v ^encode-output > "$ABCDETEMPDIR/status" +fi + # Create playlist if needed (backgroundable) and start reading in tracks ( @@ -2545,11 +2638,9 @@ if [ "$LOWDISK" = "y" ] || [ "$ONETRACK" = "y" ]; then fi if [ "$ONETRACK" = "y" ]; then - FIRSTTRACK=$( echo $TRACKQUEUE | awk '{print $1}' ) TRACKS="$FIRSTTRACK" - for UTRACKNUM in $TRACKQUEUE; do :;done if checkstatus readtrack-$FIRSTTRACK; then :; else - do_cdread onetrack $FIRSTTRACK $UTRACKNUM + do_cdread onetrack $FIRSTTRACK $LASTTRACK fi else for UTRACKNUM in $TRACKQUEUE @@ -2671,8 +2762,7 @@ fi # If we are using ONETRACK, we can proceed with the normal encoding using just the $FIRSTTRACK as TRACKQUEUE if [ "$ONETRACK" = "y" ] ; then - FIRSTTRACK=$( echo $TRACKQUEUE | awk '{print $1}') - TRACKQUEUE=$FIRSTTRACK + TRACKQUEUE="$FIRSTTRACK" TRACKS="$FIRSTTRACK" fi @@ -2779,6 +2869,12 @@ do fi ) & done + +# Lets move the cue file +if checkstatus cuefile >/dev/null ; then + do_movecue +fi + # Go through it again and make sure there's no distmp3 stragglers, otherwise # we'll delete the files they're working on ## FIXME ## Check also for files which are encoded using PIPEs.