#!/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] " RIP case ${RIP} in [yY][eE][sS]|[yY]) downloadArt ripDisc writeTOC setFinalData writeCsv tagRipFiles ;; [nN][oO]|[nN]) 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] " ENCODE 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=${VOLUME}/${RIP_DIR}/albums.csv 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?: " COMPILATION 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] " input 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] " input 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(){ CDDBDATA="${VOLUME}/${RIP_DIR}/${PERFORMER}/${ALBUM_TITLE}/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] " input 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] " input 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?:" input 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]}" NEWFILENAME="${count}-${NEWTITLE// /_}.wav" # Reemplaza espacios por guiones bajos en el título 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 ${NEWFILENAME} rm ${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} } 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 " 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