forked from HPR/hpr-tools
		
	
		
			
	
	
		
			269 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			269 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | #!/bin/bash | ||
|  | # hprid | ||
|  | 
 | ||
|  | ################################################################################ | ||
|  | # | ||
|  | # script to prepare audio files for HPR shows | ||
|  | # | ||
|  | # input: mp3 or ogg file | ||
|  | # result: mp3, ogg in 44100 Hz, spx files 16000Hz with intro and outro | ||
|  | # provides 3 interactive checks for audio quality, intro and outro | ||
|  | # | ||
|  | ################################################################################ | ||
|  | # This file is part of the HPR Tool set | ||
|  | #  | ||
|  | # HPR Tool set is free software: you can redistribute it and/or modify | ||
|  | # it under the terms of the GNU Affero General Public License as published by | ||
|  | # the Free Software Foundation, either version 3 of the License, or | ||
|  | # (at your option) any later version. | ||
|  | #  | ||
|  | # HPR Tool set is distributed in the hope that it will be useful, | ||
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
|  | # GNU Affero General Public License for more details. | ||
|  | #  | ||
|  | # You should have received a copy of the GNU Affero General Public License | ||
|  | # along with HPR Tool set.  If not, see <http://www.gnu.org/licenses/>. | ||
|  | # http://www.gnu.org/licenses/agpl-3.0.html | ||
|  | # ######################################################################### | ||
|  | 
 | ||
|  | ################################################################################ | ||
|  | # | ||
|  | # PREREQUISITS | ||
|  | # - current folder has to be writable | ||
|  | # - there should NOT be a temp.ogg or temp.mp3 file | ||
|  | # - intro.mp3 and outro.mp3 have to be present | ||
|  | # - IMPORTANT: sox compiled with mp3 support | ||
|  | #                see http://a0u.xanga.com/700438974/howto-soc-installation | ||
|  | # | ||
|  | # | ||
|  | # IMPORTANT | ||
|  | # Backup the files before feeding them to this script, no guarantees here | ||
|  | # Handling of .wav not yet tested, but it should work  | ||
|  | # | ||
|  | # code.cruncher, May 2011 | ||
|  | #  | ||
|  | ################################################################################ | ||
|  | 
 | ||
|  | ################################################################################ | ||
|  | # | ||
|  | # TODO | ||
|  | #  | ||
|  | # test handling of wav files | ||
|  | # add play final files or open them in specific player(s) | ||
|  | # add handling of ID3 tags | ||
|  | # create html interface for standardized info gathering  | ||
|  | # | ||
|  | ################################################################################ | ||
|  | 
 | ||
|  | 
 | ||
|  | #============================================================ | ||
|  | # Check input | ||
|  | usage="usage: $(basename $0 ) [ -i ] [ -o ] <fname>, -i to add intro and -o outro, fname is a file with audio for HPR" | ||
|  | 
 | ||
|  | CHANNELS="1" | ||
|  | ADDINTRO="n" | ||
|  | ADDOUTRO="n" | ||
|  | 
 | ||
|  | 
 | ||
|  | while getopts "io" opt; do | ||
|  |     case $opt in | ||
|  |         i ) | ||
|  |             ADDINTRO="y" | ||
|  |             ;; | ||
|  |         o ) | ||
|  |             ADDOUTRO="y" | ||
|  |             ;; | ||
|  |     esac | ||
|  | done | ||
|  | shift $(($OPTIND - 1)) | ||
|  | 
 | ||
|  | # if not ${mediafile} return usage | ||
|  | if [ $# -lt 1 ]; then | ||
|  |   echo $usage | ||
|  |   exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | mediafile=${1} | ||
|  | 
 | ||
|  | # test if file exists  | ||
|  | if [ ! -f "intro.flac" ]; then | ||
|  |   echo "sorry, file \"intro.flac\" does not exist" | ||
|  |   echo "To download it run the command:" | ||
|  |   echo "   wget http://hackerpublicradio.org/media/theme-music/intro.flac" | ||
|  |   exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | if [ ! -f "outro.flac" ]; then | ||
|  |   echo "sorry, file \"outro.flac\" does not exist" | ||
|  |   echo "To download it run the command:" | ||
|  |   echo "   wget http://hackerpublicradio.org/media/theme-music/outro.flac" | ||
|  |   exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | for mediafile in "$@" | ||
|  | do | ||
|  |     echo $var    | ||
|  | 
 | ||
|  |     if [ ! -f "${mediafile}" ]; then | ||
|  |         echo "sorry, file \"${mediafile}\" does not exist" | ||
|  |         continue | ||
|  |     fi | ||
|  | 
 | ||
|  |     # test if file exists  | ||
|  |     if [ ! -r "${mediafile}" ]; then | ||
|  |         echo "sorry, file \"${mediafile}\" is not readable" | ||
|  |         continue | ||
|  |     fi | ||
|  | 
 | ||
|  |     if [ $(ffprobe "${mediafile}" 2>&1 | grep "Audio:" | wc -l ) -eq 0 ]; then | ||
|  |         echo "sorry, file \"${mediafile}\" has no audio track" | ||
|  |         continue | ||
|  |     fi | ||
|  | 
 | ||
|  |     # extract file name and extension | ||
|  |     fname=${mediafile%.*} | ||
|  |     ext=${mediafile/*./} | ||
|  | 
 | ||
|  |     #Make a backup | ||
|  |     # mediafilebackup=${mediafile}_$(md5sum ${mediafile} | cut -c -32 )_orig.${ext} | ||
|  |     # cp -v ${mediafile} ${mediafilebackup} | ||
|  |     #  | ||
|  |     # if [[ ! -e ${mediafilebackup} ]]; then | ||
|  |     #   echo "Backup not made: ${mediafilebackup}" | ||
|  |     #   exit | ||
|  |     # fi | ||
|  | 
 | ||
|  |     # check audio quality | ||
|  |     dur=7			# playtime of sample in seconds | ||
|  |     go=1			# variable to repeat playing of sample | ||
|  |     from=180                # start sample at 3 minutes in | ||
|  | 
 | ||
|  |     #============================================================ | ||
|  |     # Question Time | ||
|  | 
 | ||
|  |     # # # while [ $go -ne 0 ] | ||
|  |     # # # do | ||
|  |     # # #   echo | ||
|  |     # # #   echo "--------------------------------------------------------------------------------" | ||
|  |     # # #   echo "1/4 AUDIO TEST: check audio quality: ... playing $dur seconds ..."  | ||
|  |     # # #   play "${mediafile}" trim $from $dur | ||
|  |     # # #   ((from+=180))           # next sample will be 3 minutes later | ||
|  |     # # #   read -s -n1 -p "sound quality ok?[y,n] ... or play another sample[a] ... [y,n,a]" | ||
|  |     # # #   echo | ||
|  |     # # #   case "$REPLY" in | ||
|  |     # # #     n) echo "aborting ... get better quality sound file ... good bye!"; exit 0;; | ||
|  |     # # #     y) go=0;; | ||
|  |     # # #   esac | ||
|  |     # # # done | ||
|  |     # # #  | ||
|  |     # # # # Check for intro | ||
|  |     # # # echo | ||
|  |     # # # echo "--------------------------------------------------------------------------------" | ||
|  |     # # # echo "2/4 ADDINTRO TEST: Is the intro playing? " | ||
|  |     # # # play "${mediafile}" trim 1 5	# play 5 seconds at beginning of file | ||
|  |     # # # read -s -n1 -p "Is there a intro? [y, n]" -i "n"; echo | ||
|  |     # # # if [ "$REPLY" = 'y' ]; then | ||
|  |     # # #   echo "Will add the intro" | ||
|  |     # # #   ADDINTRO="y" | ||
|  |     # # # fi | ||
|  |     # # #  | ||
|  |     # # # # Check for outro | ||
|  |     # # # echo  | ||
|  |     # # # echo "--------------------------------------------------------------------------------" | ||
|  |     # # # echo "3/4 ADDOUTRO TEST: Is the outro playing? " | ||
|  |     # # # len=$(eval "soxi -D \"${mediafile}\"") | ||
|  |     # # # len=$(echo "scale=0; $len - 50" | bc) | ||
|  |     # # # play "${mediafile}" trim $len 5 | ||
|  |     # # # read -s -n1 -p "Is there a outro ? [y, n]" -i "n"; echo | ||
|  |     # # # if [ "$REPLY" = 'y' ]; then | ||
|  |     # # #   echo "Will add the outro" | ||
|  |     # # #   ADDOUTRO="y" | ||
|  |     # # # fi | ||
|  |     # # #  | ||
|  |     # # #  | ||
|  |     # # # echo | ||
|  |     # # # echo "--------------------------------------------------------------------------------" | ||
|  |     # # # echo "4/4 STEREO TEST: Should this be mono or stereo [m,s] ? " | ||
|  |     # # # CHANNELS="1" | ||
|  |     # # # read -s -n1 -p "intro ok? [m, s]" -i "m" ; echo | ||
|  |     # # # if [ "$REPLY" = 's' ]; then | ||
|  |     # # #   echo "Will convert to stereo" | ||
|  |     # # #   CHANNELS="2" | ||
|  |     # # # fi | ||
|  | 
 | ||
|  |     #============================================================ | ||
|  |     # Preprocess the source file | ||
|  | 
 | ||
|  |     echo "Convert from ${mediafile} to known wav format ${fname}_tmp.wav" | ||
|  |     ffmpeg -i ${mediafile} -ar 44100 -ac $CHANNELS ${fname}_tmp.wav > ${fname}_tmp.log 2>&1 | ||
|  | 
 | ||
|  |     # echo "Normalising the audio" | ||
|  |     # normalize -a 0.5 ${fname}_tmp.wav >> ${fname}_tmp.log 2>&1 | ||
|  | 
 | ||
|  |     # TODO Compressor ! | ||
|  | 
 | ||
|  |     # TODO add a little speed up | ||
|  | 
 | ||
|  |     # TODO little overlap in fade in of intro | ||
|  | 
 | ||
|  |     # echo "Truncating the silence" | ||
|  |     # sox ${fname}_tmp.wav ${fname}_sox.wav silence -l 1 0.1 1.6% -1 0.6 1.6% >> ${fname}_tmp.log 2>&1 | ||
|  |     cp -v  ${fname}_tmp.wav ${fname}_sox.wav | ||
|  | 
 | ||
|  |     echo "Add the intro if it is missing and add it to the temp pcm file" | ||
|  |     if [ "$ADDINTRO" = 'y' ]; then | ||
|  |     ffmpeg -i intro.flac -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - > ${fname}_tmp.pcm 2>> ${fname}_tmp.log  | ||
|  |     fi | ||
|  | 
 | ||
|  |     echo "convert the uploaded episode and add it to the temp pcm file" | ||
|  |     ffmpeg -i ${fname}_sox.wav -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp.pcm 2>> ${fname}_tmp.log  | ||
|  | 
 | ||
|  |     echo "Add the outro if it is missing and add it to the temp pcm file" | ||
|  |     if [ "$ADDOUTRO" = 'y' ]; then | ||
|  |     ffmpeg -i outro.flac -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp.pcm 2>> ${fname}_tmp.log  | ||
|  |     fi | ||
|  | 
 | ||
|  |     echo "Convert the pcm file to a know wav format" | ||
|  |     ffmpeg -f s16le -ar 44100 -ac 1 -acodec pcm_s16le -i ${fname}_tmp.pcm ${fname}_mez.wav 2>> ${fname}_tmp.log  | ||
|  | 
 | ||
|  |     # echo "Get an image of the converted audio" | ||
|  |     # sox ${fname}_mez.wav -n  spectrogram -x 800 -y 100 -o ${fname}_mez.png | ||
|  | 
 | ||
|  |     echo "--------------------------------------------------------------------------------" | ||
|  |     echo "File information" | ||
|  |     ffprobe ${fname}_mez.wav 2>&1 | grep Audio: | ||
|  |     mediainfo ${fname}_mez.wav | ||
|  | 
 | ||
|  |     echo "--------------------------------------------------------------------------------" | ||
|  |     # display ${fname}_mez.png & | ||
|  |     # read -s -n1 -p "Spectrogram check: Everything look ok [y,n] ? " -i "y" ; echo | ||
|  |     # if [ "$REPLY" = 'n' ]; then | ||
|  |     #   echo "Something went w  rong. Aborting." | ||
|  |     #   exit | ||
|  |     # fi | ||
|  | 
 | ||
|  |     # echo "--------------------------------------------------------------------------------" | ||
|  |     # vlc ${fname}_mez.wav >> ${fname}_tmp.log 2>&1 & | ||
|  |     # read -s -n1 -p "VLC check: Everything look ok [y,n] ? " -i "y" ; echo | ||
|  |     # if [ "$REPLY" = 'n' ]; then | ||
|  |     #   echo "Something went wrong. Aborting." | ||
|  |     #   exit | ||
|  |     # fi | ||
|  | 
 | ||
|  |     echo "Remove temp files" | ||
|  |     rm -v ${fname}_tmp.wav ${fname}_sox.wav ${fname}_tmp.pcm ${fname}_tmp.log | ||
|  | 
 | ||
|  |     echo "Convert to mp3" # TODO and add tags" | ||
|  |     sox -S ${fname}_mez.wav ${fname}_mez.mp3  | ||
|  | 
 | ||
|  |     echo "Convert to ogg" # TODO and add tags" | ||
|  |     sox -S ${fname}_mez.wav ${fname}_mez.ogg | ||
|  | 
 | ||
|  |     echo "Convert to spx" # TODO and add tags" | ||
|  |     sox -S ${fname}_mez.wav -c 1 -r 16000 -t wav  - | speexenc - ${fname}_mez.spx | ||
|  | 
 | ||
|  |     echo "Changing the file dates to the time of upload" | ||
|  |     touch -r ${mediafile} ${fname}* | ||
|  | done |