forked from HPR/hpr-tools
		
	Moved in workflow
This commit is contained in:
		
							
								
								
									
										268
									
								
								workflow/hprid
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										268
									
								
								workflow/hprid
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,268 @@ | ||||
| #!/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 | ||||
		Reference in New Issue
	
	Block a user