Files
audioForge/depFiles/ripCD.sh

451 lines
14 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=RIP
ALAC_DIR=ALAC
FLAC_DIR=FLAC
DEV=/dev/cdrom
CDDB_URL="freedb.freac.org:/~cddb/cddb.cgi"
declare -a TITLES
#FUNCTIONS
checkRipDir(){
if [ -d "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}" ]; 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])
setFinalData
writeCsv
tagRipFiles
#exit 1
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
else
mkdir -p "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
downloadArt
ripDisc
writeTOC
setFinalData
tagRipFiles
fi
}
checkEncDir(){
if [ -d "${VOLUME}/${FLAC_DIR}/${PERFORMER}/${ALBUM_TITLE}" ]; 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_TITLE}"
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_TITLE}/${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_TITLE}/${ALBUM_TITLE}.toc"
sed -i -e '/TITLE/s/\\"//g' "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}/${ALBUM_TITLE}.toc"
}
isCompilation(){
read -r -p "Is a compilation?(default: n): " COMPILATION
if [[ -z "${COMPILATION}" ]]; then
COMPILATION='n'
fi
case ${COMPILATION} in
[yY][eE][sS]|[yY])
read -r -p "Disc number?: " DISCNUMBER
if [[ -z "${DISCNUMBER}" ]]; then
DISCNUMBER='1'
fi
read -r -p "Disc number?: " TOTALDISCKS
if [[ -z "${TOTALDISCKS}" ]]; then
TOTALDISCKS='1'
fi
;;
[nN][oO]|[nN])
DISCNUMBER='1'
TOTALDISCKS='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'}"
# Imprimir los resultados
echo "ALBUMNAME: $ALBUMNAME"
echo "Performer: $PERFORMER"
echo "Album Name: $ALBUM_TITLE"
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
if [ ${DISCNUMBER} -gt 1 ]; then
ALBUM_TITLE="${ALBUM_TITLE} (CD ${DISCNUMBER})"
fi
fi
}
setFinalData(){
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
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 Artist"
;;
[nN][oO]|[nN])
PERFORMER_ALBUM=$PERFORMER
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
# Verificar si el archivo existe
if [[ ! -f "${CDDBDATA}" ]]; then
echo "El archivo no existe: ${CDDBDATA}"
exit 1
fi
# Leer títulos del archivo
declare -a TEMP_TITLES
contador=0
while IFS= read -r linea; do
if [[ "$linea" =~ ^TTITLE([0-9]+)=(.*)$ ]]; then
numero="${BASH_REMATCH[1]}"
titulo="${BASH_REMATCH[2]}"
TEMP_TITLES[$contador]="$titulo"
contador=$((contador + 1))
fi
done < "${CDDBDATA}"
if [[ ${#TEMP_TITLES[@]} -eq 0 ]]; then
echo "No se encontraron títulos en el archivo."
WAVFILES=(*.wav)
# Verificar si hay archivos .wav
if [[ ${#WAVFILES[@]} -eq 0 ]]; then
echo "No se encontraron archivos .wav en el directorio actual."
exit 1
fi
for WAVFILE in "${WAVFILES[@]}"; do
read -p "Asigna un título para el archivo '$WAVFILE': " titulo
TITLES+=("$titulo")
done
else
TITLES=("${TEMP_TITLES[@]}")
fi
# Mostrar títulos y preguntar si son correctos
echo "Se encontraron los siguientes títulos:"
for ((i = 0; i < ${#TEMP_TITLES[@]}; i++)); do
echo "$((i + 1)): ${TEMP_TITLES[$i]}"
done
read -p "¿Es correcta la información mostrada? (s/n): " respuesta
if [[ "$respuesta" == "s" ]]; then
TITLES=("${TEMP_TITLES[@]}")
else
for ((i = 0; i < ${#TEMP_TITLES[@]}; i++)); do
read -p "¿Es correcto el título '${TEMP_TITLES[$i]}'? (s/n): " subrespuesta
if [[ "$subrespuesta" == "s" ]]; then
TITLES[$i]="${TEMP_TITLES[$i]}"
else
read -p "Introduce un nuevo valor para el título $((i + 1)): " nuevo_valor
TITLES[$i]="$nuevo_valor"
fi
done
fi
# Mostrar la lista final de títulos
echo "Lista final de títulos:"
for titulo in "${TITLES[@]}"; do
echo "$titulo"
done
# Guardar la lista en una variable o archivo si es necesario
# Aquí simplemente se muestra cómo imprimirla en la terminal
echo "Los títulos finales son: ${TITLES[*]}"
}
tagRipFiles(){
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
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}" \
-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_TITLE}/AlbumArt.jpg"
}
ripDisc(){
if [ ! -d "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}" ] && [ ${RIP} = 's' ]; then
mkdir -p "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
fi
cd "${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
#cdda2wav -vall cddb=0 -cddbp-server=gnudb.gnudb.org speed="$SPEED" -paranoia -B -D ${DEV}
cdda2wav -vall cddb=0 -cddbp-server=gnudb.gnudb.org speed="$SPEED" -B -D ${DEV}
}
encode() {
RIPDIR="${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}"
ENCDIR="${VOLUME}/${FLAC_DIR}/${PERFORMER}/${ALBUM_TITLE}"
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" # Reemplaza la extensión .wav por .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 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
fi