Files
audioForge/depFiles/ripCD.sh
2024-12-09 22:17:07 +01:00

481 lines
15 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#VARIABLES
VOLUME=/tmp
RIP_DIR=audio/RIP
ALAC_DIR=ALAC
FLAC_DIR=data/media/music
DISCIMAGE_DIR=audio/DISCIMAGE
DEV=/dev/cdrom
CDDB_URL="freedb.freac.org:/~cddb/cddb.cgi"
#CDDB_URL="gnudb.gnudb.org/~cddb/cddb.cgi"
COMPILATION=""
ISMIXEDCD=''
declare -a TITLES
#FUNCTIONS
checkRipDir(){
if [ -d "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}" ]; then
read -r -p "Directory already exists, do you want to rip audio cd?: [Y/n] (default: Y)" RIP
if [[ -z "${RIP}" ]]; then
RIP='y'
fi
case ${RIP} in
[yY][eE][sS]|[yY])
downloadArt
ripDisc
writeTOC
setFinalData
writeCsv
tagRipFiles
;;
[nN][oO]|[nN])
downloadArt
setFinalData
writeCsv
tagRipFiles
#exit 1
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
else
mkdir -p "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
downloadArt
ripDisc
writeTOC
setFinalData
tagRipFiles
fi
}
checkEncDir(){
if [ -d "${VOLUME}/${FLAC_DIR}/${PERFORMER}/${ALBUM_DIR}" ]; then
read -r -p "Directory already exists, do you want to encode audio cd?: [Y/n](default: Y) " ENCODE
if [[ -z "${ENCODE}" ]]; then
ENCODE='y'
fi
case ${ENCODE} in
[yY][eE][sS]|[yY])
encode
;;
[nN][oO]|[nN])
#exit 1
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
else
mkdir -p "${VOLUME}/${FLAC_DIR}/${PERFORMER}/${ALBUM_DIR}"
encode
fi
}
writeCsv(){
CSVFILE="albums.csv"
cd "${VOLUME}/${RIP_DIR}"
if [ ! -e "${CSVFILE}" ]; then
touch "${CSVFILE}"
fi
grep -qF -- ${DISCID} "${CSVFILE}" || echo ""${DISCID}","${PERFORMER}","${ALBUM_TITLE}","${YEAR}","${DISCNUMBER}"" >> "${CSVFILE}"
}
writeTOC(){
cdrdao read-toc --fast-toc --device "${DEV}" --driver generic-mmc:0x20000 --paranoia-mode 0 --with-cddb --cddb-servers $CDDB_URL "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}/${ALBUM_TITLE}.toc"
sed -i -e 's/\\240/ /g' -e 's/\\300/À/g' -e 's/\\340/à/g' \
-e 's/\\241/¡/g' -e 's/\\301/Á/g' -e 's/\\341/á/g' \
-e 's/\\242/¢/g' -e 's/\\302/Â/g' -e 's/\\342/â/g' \
-e 's/\\243/£/g' -e 's/\\303/Ã/g' -e 's/\\343/ã/g' \
-e 's/\\244/¤/g' -e 's/\\304/Ä/g' -e 's/\\344/ä/g' \
-e 's/\\245/¥/g' -e 's/\\305/Å/g' -e 's/\\345/å/g' \
-e 's/\\246/¦/g' -e 's/\\306/Æ/g' -e 's/\\346/æ/g' \
-e 's/\\247/§/g' -e 's/\\307/Ç/g' -e 's/\\347/ç/g' \
-e 's/\\250/¨/g' -e 's/\\310/È/g' -e 's/\\350/è/g' \
-e 's/\\251/©/g' -e 's/\\311/É/g' -e 's/\\351/é/g' \
-e 's/\\252/ª/g' -e 's/\\312/Ê/g' -e 's/\\352/ê/g' \
-e 's/\\253/«/g' -e 's/\\313/Ë/g' -e 's/\\353/ë/g' \
-e 's/\\254/¬/g' -e 's/\\314/Ì/g' -e 's/\\354/ì/g' \
-e 's/\\255/ /g' -e 's/\\315/Í/g' -e 's/\\355/í/g' \
-e 's/\\256/®/g' -e 's/\\316/Î/g' -e 's/\\356/î/g' \
-e 's/\\257/¯/g' -e 's/\\317/Ï/g' -e 's/\\357/ï/g' \
-e 's/\\260/°/g' -e 's/\\320/Ð/g' -e 's/\\360/ð/g' \
-e 's/\\261/±/g' -e 's/\\321/Ñ/g' -e 's/\\361/ñ/g' \
-e 's/\\262/²/g' -e 's/\\322/Ò/g' -e 's/\\362/ò/g' \
-e 's/\\263/³/g' -e 's/\\323/Ó/g' -e 's/\\363/ó/g' \
-e 's/\\264/´/g' -e 's/\\324/Ô/g' -e 's/\\364/ô/g' \
-e 's/\\265/µ/g' -e 's/\\325/Õ/g' -e 's/\\365/õ/g' \
-e 's/\\266/¶/g' -e 's/\\326/Ö/g' -e 's/\\366/ö/g' \
-e 's/\\267/·/g' -e 's/\\327/×/g' -e 's/\\367/÷/g' \
-e 's/\\270/¸/g' -e 's/\\330/Ø/g' -e 's/\\370/ø/g' \
-e 's/\\271/¹/g' -e 's/\\331/Ù/g' -e 's/\\371/ù/g' \
-e 's/\\272/º/g' -e 's/\\332/Ú/g' -e 's/\\372/ú/g' \
-e 's/\\273/»/g' -e 's/\\333/Û/g' -e 's/\\373/û/g' \
-e 's/\\274/¼/g' -e 's/\\334/Ü/g' -e 's/\\374/ü/g' \
-e 's/\\275/½/g' -e 's/\\335/Ý/g' -e 's/\\375/ý/g' \
-e 's/\\276/¾/g' -e 's/\\336/Þ/g' -e 's/\\376/þ/g' \
-e 's/\\277/¿/g' -e 's/\\337/ß/g' -e 's/\\377/ÿ/g' "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}/${ALBUM_TITLE}.toc"
sed -i -e '/TITLE/s/\\"//g' "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}/${ALBUM_TITLE}.toc"
}
isCompilation(){
read -r -p "Is a multi CD album?(default: n): " COMPILATION
if [[ -z "${COMPILATION}" ]]; then
COMPILATION='n'
fi
case ${COMPILATION} in
[yY][eE][sS]|[yY])
COMPILATION="y"
read -r -p "Disc number?: " DISCNUMBER
if [[ -z "${DISCNUMBER}" ]]; then
DISCNUMBER='1'
fi
read -r -p "Total disks?: " TOTALDISKS
if [[ -z "${TOTALDISKS}" ]]; then
TOTALDISKS='1'
fi
;;
[nN][oO]|[nN])
DISCNUMBER='1'
TOTALDISKS='1'
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
}
setInitialData(){
if [ "$CDDA" -eq 1 ]; then
DISCID=$(cd-discid "${DEV}" | sed 's/ /+/g')
ALBUMNAME="$(curl -s "http://$CDDB_URL?cmd=cddb+query+$(cd-discid "${DEV}" | sed 's/ /+/g')&hello=user+hostname+cdparanoia+3&proto=3" |
sed -e 's/AC\/DC/\ACDC/g' |
sed 's/\// - /g' |
awk '{$1=""; $2=""; $3=""; sub(" ", " "); print}' |
awk '{gsub(/^[ \t]+|[ \t]+$/,""); print}' |
iconv -f=ISO-8859-1 -t=UTF-8)"
# Extraer el performer y el album name de ALBUMNAME
PERFORMER=$(echo "$ALBUMNAME" | awk -F' - ' '{print $1}')
ALBUM_TITLE=$(echo "$ALBUMNAME" | awk -F' - ' '{print $2}')
ALBUMNAME="${ALBUMNAME%$'\n'}"
SPEED=$(more /proc/sys/dev/cdrom/info | grep -E 'drive speed:' | awk '{print $3}')
echo "Artist detected as: "${PERFORMER}""
read -r -p "Is correct: ? [Y/n] (default: Y) " input
if [[ -z "${input}" ]]; then
input='y'
fi
case $input in
[yY][eE][sS]|[yY])
#echo "Yes"
;;
[nN][oO]|[nN])
#echo -e "No"
read -r -p "Enter a new name: " PERFORMER
if [[ -z "${PERFORMER}" ]]; then
echo "Invalid input..."
echo "Quit"
exit 1
fi
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
echo "Album detected as: "${ALBUM_TITLE}""
read -r -p "Is correct: ? [Y/n] (default: Y) " input
if [[ -z "${input}" ]]; then
input='y'
fi
case $input in
[yY][eE][sS]|[yY])
#echo "Yes"
;;
[nN][oO]|[nN])
#echo -e "No"
read -r -p "Enter a new name: " ALBUM_TITLE
if [[ -z "${ALBUM_TITLE}" ]]; then
echo "Invalid input..."
echo "Quit"
exit 1
fi
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
ALBUM_DIR=${ALBUM_TITLE}
if [ "$COMPILATION" = "y" ]; then
ALBUM_DIR="${ALBUM_DIR} (CD ${DISCNUMBER})"
echo $ALBUM_DIR
fi
fi
}
setFinalData(){
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
CDDBDATA="audio.cddb"
TOTALTRACKS=$(grep TTITLE ${CDDBDATA} |wc -l)
GENRE=$(grep DGENRE ${CDDBDATA} | awk -F '=' '{print $2}')
YEAR=$(grep DYEAR ${CDDBDATA} | awk -F '=' '{print $2}')
#GENRE
echo "Genre: "${GENRE}""
read -r -p "Is correct: ? [Y/n] (default: Y) " input
if [[ -z "${input}" ]]; then
input='y'
fi
case $input in
[yY][eE][sS]|[yY])
#echo "Yes"
;;
[nN][oO]|[nN])
#echo -e "No"
read -r -p "Enter a new name: " GENRE
if [[ -z "${GENRE}" ]]; then
echo "Invalid input..."
echo "Quit"
exit 1
fi
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
#YEAR
echo "Year: "${YEAR}""
read -r -p "Is correct: ? [Y/n] (default: Y) " input
if [[ -z "${input}" ]]; then
input='y'
fi
case $input in
[yY][eE][sS]|[yY])
#echo "Yes"
;;
[nN][oO]|[nN])
#echo -e "No"
read -r -p "Enter a new name: " YEAR
if [[ -z "${YEAR}" ]]; then
echo "Invalid input..."
echo "Quit"
exit 1
fi
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
read -r -p "Is a Various Artist disk? (default: n):" input
if [[ -z "${input}" ]]; then
input='n'
fi
case $input in
[yY][eE][sS]|[yY])
PERFORMER_ALBUM="Various Artists"
;;
[nN][oO]|[nN])
PERFORMER_ALBUM=$PERFORMER
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
#Set track names
declare -a TEMP_TITLES
if [[ ! -f "${CDDBDATA}" ]]; then
echo "File does not existe: ${CDDBDATA}"
touch ${CDDBDATA}
#exit 1
fi
count=0
while IFS= read -r linea; do
if [[ "$linea" =~ ^TTITLE([0-9]+)=(.*)$ ]]; then
number="${BASH_REMATCH[1]}"
title="${BASH_REMATCH[2]}"
TEMP_TITLES[$count]="$title"
count=$((count + 1))
fi
done < "${CDDBDATA}"
TOTALTRACKS=$(ls -l *.wav|wc -l)
if [[ ${#TEMP_TITLES[@]} -eq 0 ]]; then
echo "${CDDBDATA} is empty"
WAVFILES=(*.wav)
if [[ -z ${TOTALTRACKS} ]]; then
echo "There are no.wav files in folder ${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
exit 1
fi
for ((i = 0; i < ${#WAVFILES[@]}; i++)); do
WAVFILE="${WAVFILES[i]}"
read -p "Set a tittle for '$WAVFILE': " title
TEMP_TITLES[i]="$title"
done
else
TITLES=("${TEMP_TITLES[@]}")
fi
echo "Following titles found:"
for ((i = 0; i < ${#TEMP_TITLES[@]}; i++)); do
echo "$((i + 1)): ${TEMP_TITLES[$i]}"
done
read -p "¿Is this correct? (y/N) (Default n): " answer
if [[ "$answer" == "y" ]]; then
TITLES=("${TEMP_TITLES[@]}")
else
for ((i = 0; i < ${#TEMP_TITLES[@]}; i++)); do
read -p "¿"${TEMP_TITLES[$i]}" is a valid track name? (y/n) (Default y): " subanswer
if [[ "$subanswer" == "n" ]]; then
read -p "Set a new title name $((i + 1)): " new_title
TITLES[$i]="$new_title"
else
TITLES[$i]="${TEMP_TITLES[$i]}"
fi
done
fi
echo "Final title's list:"
for title in "${TITLES[@]}"; do
echo "$title"
done
}
tagRipFiles(){
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
WAVFILES=(*.wav)
TOTALTRACKS=$(ls -l *.wav|wc -l)
count=1
for ((i = 0; i < ${#WAVFILES[@]}; i++)); do
WAVFILE="${WAVFILES[i]}"
NEWTITLE="${TITLES[i]}"
ffmpeg -y -i "$WAVFILE" \
-metadata album_artist="${PERFORMER_ALBUM}" \
-metadata artist="${PERFORMER}" \
-metadata genre="${GENRE}" \
-metadata TRACKTOTAL="$TOTALTRACKS" \
-metadata date="${YEAR}" \
-metadata album="${ALBUM_TITLE}" \
-metadata disc="${DISCNUMBER}" \
-metadata track="${count}/${TOTALTRACKS}" \
-metadata title="${NEWTITLE}" \
-c copy tmp.wav
mv tmp.wav ${WAVFILE}
count=$((count + 1))
done
}
downloadArt(){
SACAD_PERFORMER=\"${PERFORMER}\"
SACAD_ALBUM_TITLE=\"${ALBUM_TITLE}\"
sacad "${SACAD_PERFORMER}" "${SACAD_ALBUM_TITLE}" 500 "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}/AlbumArt.jpg"
}
backup (){
DISCIMAGE_PATH="${VOLUME}/${DISCIMAGE_DIR}/${PERFORMER}/${ALBUM_DIR}"
mkdir -p "${DISCIMAGE_PATH}"
ISMIXEDCD=$(cd-info --no-device-info --no-cddb --no-header --no-joliet --no-rock-ridge --no-xa --no-analyze --no-disc-mode|grep data)
if [[ ! -z ${ISMIXEDCD} ]]; then
for session in 1 2 ; do
#--read-raw \
cdrdao read-cd \
--driver generic-mmc:0x20000 \
--paranoia-mode 0 \
--device /dev/cdrom \
--session $session \
--datafile "${DISCIMAGE_PATH}/data-$session.bin" "${DISCIMAGE_PATH}/data-$session.toc"
toc2cue "${DISCIMAGE_PATH}/data-$session.toc" "${DISCIMAGE_PATH}/data-$session.cue"
done
#
else
session=1
cdrdao read-cd \
--driver generic-mmc:0x20000 \
--paranoia-mode 0 \
--device /dev/cdrom \
--session $session \
--datafile "${DISCIMAGE_PATH}/data-$session.bin" "${DISCIMAGE_PATH}/data-$session.toc"
toc2cue "${DISCIMAGE_PATH}/data-$session.toc" "${DISCIMAGE_PATH}/data-$session.cue"
fi
}
ripDisc(){
if [ ! -d "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}" ] && [ ${RIP} = 's' ]; then
mkdir -p "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
fi
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
#cdda2wav -vall cddb=0 -cddbp-server=gnudb.gnudb.org speed="$SPEED" -paranoia -B -D ${DEV}
icedax -max -vall cddb=0 -cddbp-server=gnudb.gnudb.org speed="$SPEED" -B -D ${DEV}
}
encode() {
RIPDIR="${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_DIR}"
ENCDIR="${VOLUME}/${FLAC_DIR}/${PERFORMER}/${ALBUM_DIR}"
cd "$RIPDIR"
WAVFILES=(*.wav)
TOTALTRACKS=$(ls -l *.wav | wc -l)
count=1
for ((i = 0; i < ${#WAVFILES[@]}; i++)); do
CODEC="flac"
WAVFILE="${WAVFILES[i]}"
NEWFILENAME="${WAVFILE%.wav}.flac"
NEWTITLE="${TITLES[i]}"
ffmpeg -y -i "$WAVFILE" -i "${RIPDIR}/AlbumArt.jpg" \
-map 0:a -map 1 \
-c:a flac -c:v copy \
-metadata:s:v title="Album cover" \
-metadata:s:v comment="Cover (front)" \
-disposition:v attached_pic \
-metadata album_artist="${PERFORMER_ALBUM}" \
-metadata artist="${PERFORMER}" \
-metadata genre="${GENRE}" \
-metadata TRACKTOTAL="$TOTALTRACKS" \
-metadata date="${YEAR}" \
-metadata album="${ALBUM_TITLE}" \
-metadata disc="${DISCNUMBER}" \
-metadata DISCTOTAL="${TOTALDISKS}" \
-metadata track="${count}/${TOTALTRACKS}" \
-metadata title="${NEWTITLE}" \
"${ENCDIR}/${NEWFILENAME}"
count=$((count + 1))
done
}
#MAIN PROGRAM
if [ $# -lt 1 ]
then
echo "Usage: sh $0 <action> <codec>"
exit 1
fi
ACTION=$1
CDDA=$(cdparanoia -Q 2>&1 | grep -c 'audio only')
isCompilation
if [ ${ACTION} = 'r' ] || [ ${ACTION} = 'e' ]; then
mkdir -p "${VOLUME}/${RIP_DIR}"
setInitialData
checkRipDir
if [ ${ACTION} = 'e' ];then
checkEncDir
fi
elif [ ${ACTION} = 'b' ];then
setInitialData
backup
fi