forked from HPR/hpr-tools
		
	
		
			
				
	
	
		
			269 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |