458 lines
15 KiB
Bash
Executable File
458 lines
15 KiB
Bash
Executable File
#!/bin/bash
|
||
#VARIABLES
|
||
VOLUME=/tmp
|
||
RIP_DIR=audio/RIP
|
||
ALAC_DIR=ALAC
|
||
FLAC_DIR=data/media/music
|
||
DEV=/dev/cdrom
|
||
CDDB_URL="freedb.freac.org:/~cddb/cddb.cgi"
|
||
COMPILATION=""
|
||
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 compilation?(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(){
|
||
echo "COMPILATION: $COMPILATION"
|
||
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
|
||
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 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_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"
|
||
}
|
||
|
||
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}
|
||
cdda2wav -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" # 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 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
|
||
fi
|