#!/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) (Default 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) (Default y): " subrespuesta if [[ "$subrespuesta" == "n" ]]; then read -p "Introduce un nuevo valor para el título $((i + 1)): " nuevo_valor TITLES[$i]="$nuevo_valor" else TITLES[$i]="${TEMP_TITLES[$i]}" fi done fi echo "Lista final de títulos:" for titulo in "${TITLES[@]}"; do echo "$titulo" 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" } 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" 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 " 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