Ripping automatico di un CD su un lettore MP3

Da MontelLUG.
Versione del 21 apr 2005 alle 21:54 di Cdron (Discussione | contributi) (Script per il ripping automatico di un CD)

Script per il ripping automatico di un CD

Si tratta di uno script per automatizzare il ripping di un CD su una chiave USB. Visto che lo uso per avere il lettore USB carico al mattino per andare al lavoro, è prevista anche una opzione per spegnere il PC in automatico una volta finito il lavoro. In pratica lo script esegue le seguneti operazioni:

  • Raccoglie le informazioni sul CD (numero di tracce) e, se richiesto, scarica i dati dal CDDB
  • Rippa una ad una le tracce in una cartella temporanea (/tmp/newCD di default)
  • Converte le tracce in MP3
  • Monta, se non lo è già, il lettore MP3
  • Elimina le eventuali tracce MP3 già presenti nel lettore
  • Copia le tracce compresse nel lettore
  • Smonta il lettore e, se richiesto spegne il PC

La sintassi è visibile con il comando ./cd2mp3usb -h

Dipendenze: per eseguire lo script, sono necessari i seguenti pacchetti:

  • cdparanoia, per il ripping dei CD in WAV
  • lame, per la compressione MP3
  • cddb.pl, per interrogare il CDDB (è un pacchetto che si trova nella maggior parte delle distribuzioni)
  • discid, piccolo programma in C che ricava l'ID del CD audio, reperibile su sourceforge
# !/bin/bash

# Script per rippare un CD e scaricarlo su chiave USB
# Autore: CD-RON

function showhelp(){
echo "Script per il ripping dei CD su chiave USB"
echo
echo Sintassi:
echo
echo -e "\tcd2mp3usb [phlc] Artista Album"
echo
echo "Opzioni:";
echo -e "  c \t Cerca i titoli nel CDDB"
echo -e "  l \t Non cerca nel CDDB, usa i parametri da riga di comando"
echo -e "  p \t Spegne il computer dopo aver terminato"
echo -e "  h \t Mostra questo help"
echo
echo "Artista e album possono contenere spazi, se inclusi tra apici"
exit 0
}

# Funzione che esegue le funzioni di ripping
function rippa(){
echo $NOME
cdparanoia -- $x $NOME.wav
lame -h -b 128 $NOME.wav $NOME.mp3;
rm -f $NOME.wav
}

#Troppi pochi argomenti
if [[ $# -lt 1 ]]; then
showhelp
fi

if [[ -n $(echo $1 | grep 'h') ]]; then
showhelp
fi

# togli lo spazio dai delimitatori
IFS=${IFS// /}

# Inizializza la cartella temporanea di ripping
TEMP=/tmp/newCD
CDLOG=$TEMP/CD-ripping.log
if !(test -d $TEMP); then
mkdir $TEMP;
fi
rm -f $TEMP/*

# Calcola il numero di tracce
cdparanoia -Q 2> $CDLOG
NTR=$( grep -B 1 'TOTAL' $CDLOG | head -n 1 | cut -c 1-3)
echo $NTR

# Controlla l'opzione di ricerca nel CDDB
if [[ -n $(echo $1 | grep 'c') ]]; then
	# Verifica che sia posssibile connettersi al server
	if !(ping -c 1 freedb.freedb.org >> $CDLOG); then
		echo "Impossibile connettersi al database" >> $CDLOG
		echo "Inserisco i dati di default nei nomi" >> $CDLOG
		if [[ $# -eq 3 ]]; then
			ARTISTA=$2
			ALBUM=$3
			TRACCIA=""
			CDDBOK=1
		else
			ARTISTA="Unknown"
			ALBUM="NoAlbum"
			TRACCIA=""
			CDDBOK=1
		fi;
	else
	# Trova i dati cel CD nel CDDB
	cddb.pl -s
	# Recupera i dati dal file CDDB
	ID=$(discid | cut -c 1-8)
	FILEIN=$(find /tmp/xmcd -iname $ID)
	cp $FILEIN $TEMP/CDDB-output.txt
	grep 'DTITLE=' $TEMP/CDDB-output.txt | cut -c 8- | cut -d / -f1
	grep 'DTITLE=' $TEMP/CDDB-output.txt | cut -c 8- | cut -d / -f2 | cut -c 2-
	CDDBOK=0
	fi;
else
	# Non e' stata data l'opzione di cercare in CDDB
	if [[ $# -eq 3 ]]; then
		ARTISTA=$2
		ALBUM=$3
		TRACCIA=""
		CDDBOK=1
	else
		ARTISTA="Unknown"
		ALBUM="NoAlbum"
		TRACCIA=""
		CDDBOK=1
	fi;
fi;


# Rippa le tracce e le comprime in MP3
x=1
while [[ $x -le $NTR ]];
do
# Crea il nome file
if [[ $CDDBOK -eq 0 ]]; then
TRACCIA=-$(grep TTITLE$(($x-1)) | cut -d = -f2);
fi
if test $x -le 9; then
NOME=$TEMP/$ARTISTA-$ALBUM-0$x$TRACCIA
else
NOME=$TEMP/$ARTISTA-$ALBUM-$x$TRACCIA
fi;
rippa
x=$(($x+1))
done

#Monta il lettore MP3
USB=/mnt/usb
if [[ -z $(mount -l | grep $USB) ]]; then
mount $USB
echo Lettore MP3 Montato
fi;
# Cancella gli MP3 eventualmente presenti
echo File precedentenente nel lettore >> $CDLOG
find $USB -iname '.mp3' >> $CDLOG
rm -f $USB/*.mp3
rm -f $USB/*.MP3
# Controlla che lo spazio sia sufficiente
SPAZIO=$(df $USB | grep $USB | cut -c 41-51)
DIM=$(du -sk $TEMP | cut -f 1)
if [[ $DIM -ge $SPAZIO ]]; then
echo File MP3 troppo grandi! >> $CDLOG
exit 1
else
# Copia i file MP3 nel lettore
cp $TEMP/*.mp3 $USB/
fi;
umount $USB
# Spegne il Computer se richiesto
if [[ -n $(echo $1 | grep 'p') ]]; then
poweroff
fi