rendered paste body#!/bin/sh# convert 'non-compliant' cuesheet, created with EAC (with gaps added to prev track)# to 'single-file' joined cuesum() { F=$(($FI+$FL)); FF=$(($F%75)) # frames S=$(($SI+$SL)); SS=$(($S%60+$F/75)); [ $SS -ge 60 ] && S=$SS # seconds M=$(($MI+$ML)); MM=$(($M+$S/60)) # minutes SS="${SS/60/00}"; FF="${FF/75/00}"}leadzero() { [ ${#MM} -lt 2 ] && MM=0$MM; [ ${#SS} -lt 2 ] && SS=0$SS; [ ${#FF} -lt 2 ] && FF=0$FF}if [ -z "$1" ]; then echo "Usage: $0 <cuesheet.cue>"else sed '/\<REM\> /d; /./!d' "$1" | dos2unix > TMP.CUE # clean comments and blank lines IDX=$(shntool len "`grep FILE TMP.CUE | head -n1 | cut -d'"' -f2`" | tail -n2 | head -n1 | sed 's/^[ ]*//; s/ .*//; s/\./:/') [ ${#IDX} -lt 9 ] && IDX=0$IDX # process first two tracks grep -B100 "TRACK 02" TMP.CUE | sed '/FILE/d' | sed '$D' > NEW.CUE # start new cue (sed cuts last line) sed -n '/TRACK 02/,/TRACK 03/p' TMP.CUE | sed "s/\(.*INDEX 01 \).*/\1$IDX/; /FILE /d" | sed '$D' >> NEW.CUE # collect some data: 'INDEX 00' of track XX -> I[XX], length of track XX -> L[XX] NT=`grep TRACK TMP.CUE | tail -n1 | sed 's:[^0-9]::g'` # number of tracks C=1 while [ $C -le $NT ]; do CN=$(($C+1)) # extract range of cuesheet for current track sed -n "/TRACK `[ ${#C} -lt 2 ] && echo 0$C || echo $C`/,/TRACK `[ ${#CN} -lt 2 ] && echo 0$CN || echo $CN`/p" \ TMP.CUE > RANGE if grep -q "INDEX 00" RANGE; then I[$C]=$(echo `grep "INDEX 00" RANGE | sed 's/.* 00 //; s/:0/:/g; s/^0//'`) # index 00 fi # get length of referenced file FILE=`grep FILE TMP.CUE | head -n$C | tail -n1 | cut -d'"' -f2` L[$C]=$(shntool len "$FILE" | tail -n2 | head -n1 | sed 's/^[ ]*//; s/ .*//; s/\./:/; s/:0/:/g') C=$CN done # process tracks from No.3 C=3 while [ $C -le $NT ]; do CP=$(($C-1)); CN=$(($C+1)) ML=`echo ${IDX/#0} | cut -d: -f1`; SL=`echo ${IDX/#0} | cut -d: -f2`; FL=`echo ${IDX/#0} | cut -d: -f3` # if 'INDEX 00' presented, calculate its absolute position if [ -n "${I[$C]}" ]; then MI=`echo ${I[$C]} | cut -d: -f1`; SI=`echo ${I[$C]} | cut -d: -f2`; FI=`echo ${I[$C]} | cut -d: -f3` sum leadzero IDX0="$MM:$SS:$FF" fi # calculate abs pos of 'INDEX 01' MI=`echo ${L[$CP]} | cut -d: -f1`; SI=`echo ${L[$CP]} | cut -d: -f2`; FI=`echo ${L[$CP]} | cut -d: -f3` sum IDX="$MM:$SS:$FF" leadzero IDX1="$MM:$SS:$FF" # replace indeces and append modified range to new cue sed -n "/TRACK `[ ${#C} -lt 2 ] && echo 0$C || echo $C`/,/TRACK `[ ${#CN} -lt 2 ] && echo 0$CN || echo $CN`/p" \ TMP.CUE | sed '$D' | sed "s/\(.*INDEX 00 \).*/\1$IDX0/; s/\(.*INDEX 01 \).*/\1$IDX1/; /FILE/d" >> \ NEW.CUE IDX0="" C=$CN done # process last track ML=`echo ${IDX/#0} | cut -d: -f1`; SL=`echo ${IDX/#0} | cut -d: -f2`; FL=`echo ${IDX/#0} | cut -d: -f3` MI=`echo ${L[$NT]} | cut -d: -f1`; SI=`echo ${L[$NT]} | cut -d: -f2`; FI=`echo ${L[$NT]} | cut -d: -f3` leadzero tail -n1 TMP.CUE | sed "s/\(.*INDEX 01 \).*/\1$MM:$SS:$FF/" >> NEW.CUE # finish new cue echo FILE "joined.wav" WAVE > joined.cue cat NEW.CUE >> joined.cue rm -f {TMP,NEW}.CUE RANGE # clean junk echo "All done, check joined.cue"fi