A small shell script to grab audio from a CD and encode/compress it.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

344 lines
13 KiB

USAGE="usage: $0 [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h]\n"
USAGE="${USAGE} -d :\tA single character delimiting trackname from\n"
USAGE="${USAGE}\tartistname with sampler cds\n\n"
USAGE="${USAGE} -o :\tspecifies if theres the track or the artist first\n"
USAGE="${USAGE}\tMust be:\n"
USAGE="${USAGE}\t t for titel first or\n"
USAGE="${USAGE}\t a for artist first\n"
USAGE="${USAGE}\tIf there is none specified t is assumed\n"
USAGE="${USAGE} -t :\tyou can specify either m for encoding to mp3\n"
USAGE="${USAGE}\tusing lame, or f for making lossless encoding using flac,\n"
USAGE="${USAGE}\tor o for making ogg/vorbis, or w for uncompressed wav.\n"
USAGE="${USAGE}\tOmitting this results in encoding to flac.\n"
USAGE="${USAGE}\tmp3s will be placed under a subfolder mp3 and flacs\n"
USAGE="${USAGE}\tunder a subfolder flac\n"
USAGE="${USAGE} -p :\tspecifies the path to save the encoded data.\n"
USAGE="${USAGE}\tDefaults to the users home directory.\n"
USAGE="${USAGE} -e :\tspecifies the mp3 encoder to use.\n"
USAGE="${USAGE}\tvalid encoders are actually: lame,bladeenc\n"
USAGE="${USAGE}\tDefaults to lame.\n"
USAGE="${USAGE} -c :\tspecifies the CDDB-Entry to use.\n"
USAGE="${USAGE}\tsometimes there is more than 1 entry for a cd in cddb.\n"
USAGE="${USAGE}\tThen you can specify wich one to use by this option.\n"
USAGE="${USAGE}\tYou can checkout all entries using cddb.pl.\n"
USAGE="${USAGE} -h :\tShows this help."
HAS_DELIMITER=0
TA_ORDER="t"
ENCODING_DIR=$HOME
ENCODING_TYPE="f"
ENCODER="lame"
CDDB_ENTRY=1
while getopts d:o:t:p:he:c: option
do
case $option in
d) if [ ${#OPTARG} -gt 1 ]
then
echo -e "$USAGE"
exit 1
fi
HAS_DELIMITER=1
TA_DELIMITER=$OPTARG
;;
o) if [ \( "${OPTARG}" != "t" -a "${OPTARG}" != "a" \) -o \
${HAS_DELIMITER} -eq 0 ]
then
echo -e "$USAGE"
exit 1
fi
TA_ORDER=$OPTARG
;;
t) if [ ${OPTARG} != "m" -a ${OPTARG} != "f" -a ${OPTARG} != "o" -a \
${OPTARG} != "w" ]
then
echo -e "$USAGE"
exit 1
fi
ENCODING_TYPE=$OPTARG
;;
p) if [ ! \( -d ${OPTARG} \) ]
then
echo -e "$USAGE"
exit 1
fi
ENCODING_DIR=$OPTARG
;;
e) if [ -z ${OPTARG} ]
then
echo -e "$USAGE"
exit 1
fi
ENCODER=$OPTARG
;;
c) if [ ${OPTARG} -lt 1 ]
then
echo -e "$USAGE"
exit 1
fi
CDDB_ENTRY=$OPTARG
;;
[h\?]) echo -e "$USAGE"
exit 1
;;
esac
done
test "$ENCODING_TYPE" = "m" && ENCODING_DIR="$ENCODING_DIR/mp3"
test "$ENCODING_TYPE" = "f" && ENCODING_DIR="$ENCODING_DIR/flac"
test "$ENCODING_TYPE" = "o" && ENCODING_DIR="$ENCODING_DIR/ogg"
test "$ENCODING_TYPE" = "w" && ENCODING_DIR="$ENCODING_DIR/wav"
indices[0]="album"
indices[1]="artist"
indices[2]="genre"
indices[3]="year"
indices[4]="comment"
i=1
max_track=30
while [ $i -le $max_track ]; do
indices[`expr \( $i \- 1 \) \* 2 \+ 5`]="`echo $i | \
sed 's/^\([0-9]\)$/0\1/g;\
s/\(.*\)/track-\1/g'`"
indices[`expr \( $i \- 1 \) \* 2 \+ 6`]="`echo $i | \
sed 's/^\([0-9]\)$/0\1/g;\
s/\(.*\)/tartist-\1/g'`"
i=`expr $i \+ 1`
done
comment=""
function idxof() {
str=$1
idx=0
for i in "${indices[@]}"; do
test "$i" == "$str" && echo $idx && return 0
idx=`expr $idx \+ 1`
done
echo -1
return 0
}
title_pat="/^[^:]*: *(.*[^ ]).*/"
artist_pat="//"
if [ $HAS_DELIMITER -ne 0 ]
then
if [ $TA_ORDER == "t" ]
then
title_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/"
artist_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/"
else
artist_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/"
title_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/"
fi
fi
echo "Preparing...."
echo -n "getting cddb info..."
eval "`cddb.pl -e $CDDB_ENTRY | sed 's/ \([0-9]\):/ 0\1:/g;s/track /track-/g' |\
awk -v has_delimiter=$HAS_DELIMITER \
'/artist/||/title/||/genre/||/year/ { \
cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\
gensub(/^[^:]*: *(.*[^ ]).*/, \"\\\\1\", \"g\")\
} \
/trackno/ {\
trackno=int(gensub(/^trackno: *([0-9]*).*/, \"\\\\1\", \"1\"))\
}\
/track-/ {\
cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\
gensub('\"$title_pat\"', \"\\\\1\", \"1\");\
if(has_delimiter==0) \
cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\
cddb[\"artist\"]; \
else \
cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\
gensub('\"$artist_pat\"', \"\\\\1\", \"1\");\
} \
END {\
cddb_str=\"cddb=(\\\"\" cddb[\"title\"] \"\\\" \\\"\" \
cddb[\"artist\"] \"\\\" \\\"\" \
cddb[\"genre\"] \"\\\" \\\"\" \
cddb[\"year\"] \"\\\" \\\"'$comment'\\\"\"; \
for(i=1; i<=trackno; i++) {\
cddb_str=cddb_str \" \\\"\" \
cddb[\"track-\" sprintf(\"%02s\", i)] \"\\\"\";\
cddb_str=cddb_str \" \\\"\" \
cddb[\"tarti-\" sprintf(\"%02s\", i)] \"\\\"\"\
}\
print cddb_str \")\"\
}'`"
echo "done"
echo -n "getting CD info..."
cddainfo=`cdda2wav -H -D/dev/cdrom -J -v summary,toc,sectors 2>&1`
echo "done"
track_num=`echo "$cddainfo" | \
sed '/tracks/{s/^.*tracks:\([0-9]*\).*$/\1/g;p};d'`
cd_time=`echo "$cddainfo" | \
sed '/tracks/{s/^.*time \([0-9:\.]*\).*$/\1/g;p};d'`
cddbid=`echo "$cddainfo" | \
sed '/CDDB/{s/^.*discid: *\(0x[a-z0-9]*[^ ]\).*/\1/g;p};d'`
cdindex=`echo "$cddainfo" | \
sed '/CDINDEX/{s/^.*discid: *\([a-zA-Z0-9_\.]*-\).*/\1/g;p};d'`
cdtext=`echo "$cddainfo" | sed '/CD-Text/{s/^[^:]*: *\(.*[^ ]\).*/\1/g
s/&/\&amp\;/g;s/\"/\&quot\;/g
s/</\&lt\;/g;s/>/\&gt\;/g
s/\o47/\&apos\;/g
p};d'`
cdextra=`echo "$cddainfo" | sed '/CD-Extra/{s/^[^:]*: *\(.*[^ ]\).*/\1/g
s/&/\&amp\;/g;s/\"/\&quot\;/g
s/</\&lt\;/g;s/>/\&gt\;/g
s/\o47/\&apos\;/g
p};d'`
ENCODING_DIR="${ENCODING_DIR}/${cddb[`idxof "artist"`]}/"
ENCODING_DIR="${ENCODING_DIR}${cddb[`idxof "album"`]}/"
mkdirhier "$ENCODING_DIR"
echo "Output directory is: $ENCODING_DIR"
xmlfile="${ENCODING_DIR}cdinfo.xml"
# some special chars within xml must be converted to special syntax
# & => &amp;
# " => &quot;
# ' => &apos;
# < => &lt;
# > => &gt;
xmlartist=`echo ${cddb[\`idxof "artist"\`]} | \
sed 's/&/\&amp\;/g
s/</\&lt\;/g
s/>/\&gt\;/g
s/\"/\&quot\;/g
s/\o47/\&apos\;/g'`
xmlalbum=`echo ${cddb[\`idxof "album"\`]} | \
sed 's/&/\&amp\;/g
s/</\&lt\;/g
s/>/\&gt\;/g
s/\"/\&quot\;/g
s/\o47/\&apos\;/g'`
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>" > "${xmlfile}"
echo "<!DOCTYPE cdInfo SYSTEM \"cdInfo.dtd\">" >> "${xmlfile}"
echo "<cdinfo>" >> "${xmlfile}"
echo " <cdindex>$cdindex</cdindex>" >> "${xmlfile}"
echo " <cddb>$cddbid</cddb>" >> "${xmlfile}"
echo " <cd-text>$cdtext</cd-text>" >> "${xmlfile}"
echo " <cd-extra>$cdextra</cd-extra>" >> "${xmlfile}"
echo " <cd-artist>${xmlartist}</cd-artist>" >> "${xmlfile}"
echo " <cd-title>${xmlalbum}</cd-title>" >> "${xmlfile}"
echo " <cd-year>${cddb[`idxof "year"`]}</cd-year>" >> "${xmlfile}"
echo " <cd-genre>${cddb[`idxof "genre"`]}</cd-genre>" >> "${xmlfile}"
echo " <cd-time>$cd_time</cd-time>" >> "${xmlfile}"
echo " <cd-tracks>$track_num</cd-tracks>" >> "${xmlfile}"
echo " <cd-comment></cd-comment>" >> "${xmlfile}"
i=1; while [ $i -le $track_num ]
do
j=`expr $i \+ 1`
tracknr=`awk 'BEGIN{printf("%02d\n",'$i')}'`
track=${cddb[`idxof "track-$tracknr"`]}
tartist=${cddb[`idxof "tartist-$tracknr"`]}
xmltrack=`echo ${track} | sed 's/&/\&amp\;/g
s/</\&lt\;/g
s/>/\&gt\;/g
s/\"/\&quot\;/g
s/\o47/\&apos\;/g'`
xmltartist=`echo ${tartist} | sed 's/&/\&amp\;/g
s/</\&lt\;/g
s/>/\&gt\;/g
s/\"/\&quot\;/g
s/\o47/\&apos\;/g'`
tracklen=`echo "$cddainfo" | \
sed '/ '"$i"'\.([0-9 ]*:/{s/.*'"$i"'\.( *\([0-9:\.]*\)).*/\1/g;p};d'`
trackstart=`echo "$cddainfo" | \
sed '/ '"$i"'\.([0-9 ]*)/{s/.*'"$i"'\.( *\([0-9]*\)).*/\1/g;p};d'`
test $i -eq $track_num && \
trackend=`echo "$cddainfo" | \
sed '/ lead-out([0-9 ]*)/{s/.*lead-out( *\([0-9]*\)).*/\1/g;p};d'` || \
trackend=`echo "$cddainfo" | \
sed '/ '"$j"'\.([0-9 ]*)/{s/.*'"$j"'\.( *\([0-9]*\)).*/\1/g;p};d'`
echo " <track>" >> "${xmlfile}"
echo " <track-number>$i</track-number>" >> "${xmlfile}"
echo " <track-time>$tracklen</track-time>" >> "${xmlfile}"
echo " <track-start-sector>$trackstart</track-start-sector>" >> "${xmlfile}"
echo " <track-length>`expr $trackend \- $trackstart`</track-length>" >> "${xmlfile}"
echo " <track-artist>$xmltartist</track-artist>" >> "${xmlfile}"
echo " <track-title>$xmltrack</track-title>" >> "${xmlfile}"
echo " <track-comment></track-comment>" >> "${xmlfile}"
echo " </track>" >> "${xmlfile}"
# outfile="${ENCODING_DIR}The Wall/Disk2/"
outfile="${ENCODING_DIR}${tracknr}-${track}"
test "$ENCODING_TYPE" = "f" && \
outstr="track-$tracknr => ${tracknr}-${track}.flac"
test "$ENCODING_TYPE" = "m" && \
outstr="track-$tracknr => ${tracknr}-${track}.mp3"
test "$ENCODING_TYPE" = "o" && \
outstr="track-$tracknr => ${tracknr}-${track}.ogg"
test "$ENCODING_TYPE" = "w" && \
outstr="track-$tracknr => ${tracknr}-${track}.wav"
if [ "$ENCODING_TYPE" = "f" ]
then
bash -c "exec 2>&1;\
cdda2wav -H -D/dev/cdrom -H -t$i - | \
flac -c \
-T artist=\"${tartist}\" -T album=\"${cddb[`idxof "album"`]}\" \
-T genre=\"${cddb[`idxof "genre"`]}\" -T title=\"${track}\" \
-T tnum=\"`expr ${tracknr} \+ 0`\" -T date=\"${cddb[`idxof "year"`]}\" \
-T comment=\"${cddb[`idxof "comment"`]}\" \
-o \"${outfile}.flac\" - 2>/dev/null" | rton | \
awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}'
fi
if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "lame" ]
then
bash -c "exec 2>&1;\
cdda2wav -H -D/dev/cdrom -t$i - | \
lame -h \
--ta \"${tartist}\" --tl \"${cddb[`idxof "album"`]}\" \
--tg \"${cddb[`idxof "genre"`]}\" --tt \"${track}\" \
--tn \"`expr ${tracknr} \+ 0`\" --ty \"${cddb[`idxof "year"`]}\" \
--tc \"${cddb[`idxof "comment"`]}\" \
- \"${outfile}.mp3\" 2>/dev/null" | rton | \
awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}'
fi
if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "bladeenc" ]
then
bash -c "exec 2>&1;\
cdda2wav -H -D/dev/cdrom -t$i - | \
bladeenc -progress=0 STDIN \"${outfile}.mp3\" 2>/dev/null" | rton | \
awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}'
fi
if [ "$ENCODING_TYPE" = "o" ]
then
bash -c "exec 2>&1;\
cdda2wav -H -D/dev/cdrom -t$i - | \
oggenc -a \"${tartist}\" -l \"${cddb[`idxof "album"`]}\" \
-G \"${cddb[`idxof "genre"`]}\" -t \"${track}\" \
-N \"`expr ${tracknr} \+ 0`\" -d \"${cddb[`idxof "year"`]}\" \
-c \"${cddb[`idxof "comment"`]}\" \
-o \"${outfile}.ogg\" - 2>/dev/null" | rton | \
awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}'
fi
if [ "$ENCODING_TYPE" = "w" ]
then
bash -c "exec 2>&1;\
cdda2wav -H -D/dev/cdrom -t$i - > \"${outfile}.wav\"" | rton | \
awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}'
fi
i=`expr $i + 1`
done
echo "</cdinfo>" >> "${xmlfile}"