samhorn ha scritto:Paolo mi daresti una mano a fare uno script per transcodare questi files?
per prima cosa, installa
pacpl. Se usi Debian o Ubuntu (o derivate), basta che dai il comando:
Codice: Seleziona tutto
apt-get install --install-recommends --install-suggests pacpl
Installa anche "mediainfo" (se vuoi, eventualmente anche "mediainfo-gui") nonché sndfile-programs, libav-tools e/o ffmpeg, ecc:
Codice: Seleziona tutto
apt install mediainfo flac shntool libav-tools ffmpeg sndfile-programs
(ovviamente questi comandi li devi dare come utente root, perciò usa "sudo" o "su").
Una volta completata l'installazione di pacpl, delle sue dipendenze (che includono i vari transcoder) e degli altri pacchetti, dai una occhiata al manuale:
Ad es., potresti dare banalmente il comando:
Codice: Seleziona tutto
pacpl --to flac --only m4a -r -p --delete -v /archivio_m4a --outdir /archivio_flac
e, alla fine (se tutto va bene), nella directory di destinazione (--outdir) ti dovresti ritrovare con tutti i files m4a convertiti in flac, all'interno di un albero di directory uguale a quello di partenza.
Ma! Occhio però che pacpl converte tutto a prescindere, ad es.
non verifica se il file che sta convertendo sia lossless o lossy... il che non sarebbe affatto una bella cosa se per sbaglio tra gli m4a lossless (ALAC) ne hai anche qualcuno lossy. Quindi nel caso ti conviene verificare prima con "mediainfo" che tutti i files che vuoi convertire siano effettivamente lossless.
Una possibilità per evitare questo problema è, ancora una volta, ricorrere ad uno script.
Parecchio tempo addietro scrissi una serie di script per un problema simile (convertire un intero archivio musicale dove nel tempo si era accumulato un guazzabuglio con po' di tutto verso file flac divisi per singola traccia). Però non avevo nessun m4a/alac, quindi il supporto per quelli non lo avevo incluso ed è da aggiungere.
Lo script che converte un intero albero è questo:
ConvertAudioTree.sh
Codice: Seleziona tutto
#!/bin/bash
my_name=`basename "$0"`
target="$1"
[ "$target" == "." ] && target="$PWD"
log_file="ConvertAudioTree.log"
if ! [ -d "$target" ]; then
echo "usage: $my_name dir_name"
exit 1
fi
echo -e "\nWill convert all lossless audio files under \"${target}\" "
echo -e "to single-track FLAC format files.\n"
#read -p "Press Enter to continue, Ctrl+C to quit..."
#echo -e "\nOK, processing target tree.\n"
echo "$my_name" >> ${log_file}
echo "Date: `date`" >> ${log_file}
echo -e "Processing ${target}\n" >> ${log_file}
find "$target" -depth -type d -not -name "done" -execdir any2flac.sh "{}" \; 2>&1 | tee -a ${log_file}
echo -e "\n`date`\ndone.\n\n" >> ${log_file}
come puoi vedere, questo non fa altro che chiamare un altro script (any2flac.sh) per ciascuna subdir che incontra.
any2flac.sh
Codice: Seleziona tutto
#!/bin/bash
my_name=`basename "$0"`
log_file="any2flac.log"
if ! [ -d "$1" ]; then
echo "usage: $my_name dir_name"
exit 1
fi
pushd "$1" || { echo -e "\nERROR: can't enter directory:\n \"$1\"\n" ; exit 1; }
#fix-suffixes.sh
# first try to split full CD images using cue sheet.
#for file in *.cue; do
# [ -s "$file" ] && CueSplit.sh .
#done
# then convert split-track files to flac.
for suffix in ape tta wv wav aif m4a; do
if ls *.$suffix > /dev/null 2>&1 ; then
${suffix}2flac.sh .
fi
done
popd
questo per prima cosa chiama un altro script (fix-suffixes.sh) che controlla ed eventualmente corregge i suffissi nei nomi dei files (si assicura che siano scritti tutti in minuscolo), ed un altro ancora (CueSplit.sh) che converte eventuali album contenuti in un unico file audio + "cue sheet" suddividendoli in tracce singole; dato che a te presumibilmente non serve nulla di tutto ciò, qui sopra ho commentato quei due step.
Infine, l'ultimo passo è un semplice loop che verifica la presenza di files con uno dei suffissi elencati e, se ve ne sono, avvia uno script dedicato ("${suffix}2flac.sh") per processarli. Di questi ovviamente ce ne deve essere uno per ciascun formato supportato (ape2flac.sh, wav2flac.sh, ecc).
Se hai tutto in m4a, a te ne serve uno solo, per quel formato. In generale si tratta di script abbastanza semplici ma, nel caso del m4a (così come per "ogg"), dato che si tratta di un "container" che può contenere sia codec lossless che "lossy", e bisogna evitare di convertire per errore questi ultimi in flac, le cose si complicano leggermente. Di seguito un abbozzo, scritto al volo...
N.B.: non ho file m4a/ALAC sottomano per testarlo, per cui non è collaudato. Potrebbero esserci errori grossolani. Non lanciarlo mai come root e, prima di usarlo sull'archivio, verifica che tutto funzioni correttamente e senza far danni!!!
Per farlo fai dei test con un utente diverso dal tuo, che non abbia permessi di scrittura su nessun file che non vuoi perdere, utilizzando
una copia temporanea di parte dell'archivio (qualche dir, con qualche files m4a in ciascuna; questi ovviamente devono essere scrivibili dall'utente che usi per i test).
m4a2flac.sh
Codice: Seleziona tutto
#!/bin/bash
my_name=`basename "$0"`
if ! [ -d "$1" ]; then
echo "usage: $my_name dir_name"
exit 1
fi
echo "Now processing $1..."
pushd "$1" || exit 1
if ls *.[Mm]4[Aa] > /dev/null 2>&1 ; then
rename.pl -v 's/\.[Ma]4[Aa]/.m4a/' *.[Mm]4[Aa]
fi
if ls *.m4a > /dev/null 2>&1 ; then
pwd
for file in *.m4a ; do
target="$(basename "$file" .m4a).flac"
if [ -f "$target" ]; then
echo -e "\nERROR: file \"$target\" already exists\!\n" | tee -a $my_name.log
elif [ -f "$file" ] && [ -s "$file" ]; then
codec=$(mediainfo --Inform='Audio;%Format%' "$file")
if "$codec" != "ALAC"; then
echo -e "\nERROR: file \"$file\" is not lossless\!\n" | tee -a $my_name.log
else
echo -e "\nNow processing: $file" >> $my_name.log
savetags.sh "$file"
# There are various alternative commands to do the job, choose one:
#avconv -i "$file" -f flac "$target" >> $my_name.log 2>&1 && rm -vf "$file" >> $my_name.log
#ffmpeg -i "$file" -f flac "$target" >> $my_name.log 2>&1 && rm -vf "$file" >> $my_name.log
#sndfile-convert "$file" "$target" >> $my_name.log 2>&1 && rm -vf "$file" >> $my_name.log
pacpl --to flac --delete -v "$file" >> $my_name.log 2>&1
fi
fi
done
fi
popd
P.S.: non sono sicuro se il comando:
dato su un file m4a lossless ritorna (esattamente) la stringa "ALAC" o qualcos'altro... quindi è possibile che il test (if "$codec" != "ALAC"; then ...) sia da correggere di conseguenza.