#!/bin/bash # Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/ #============================================================ # Check input usage="usage: $(basename $0 ) [ -i ] [ -o ] , -i to add intro and -o outro, fname is a file with audio for HPR" # Argument = -t test -r server -p password -v echoerr() { echo "$@" 1>&2; } usage() { cat << EOF usage: $0 [options] {media file to encode} {episode number} OPTIONS: -h Show this message -p add a promo -i add the intro -s Automatically generate the summary -o add the outro -b add the intro and outro ( and summary default) -2 encode to 2 channels -n no audio normalization -x eXclude sponsor mention EOF } TEMP_DIR="/var/tmp/" CHANNELS="1" FIXAUDIO="1" ADDSUMMARY="n" ADDINTRO="n" ADDPROMO="n" ADDOUTRO="n" ADDSPONSOR="y" ARTIST="EMPTY" TITLE="EMPTY" YEAR="EMPTY" SLOT="EMPTY" basedir="/var/IA" intro="${basedir}/intro.flac" promo="${basedir}/promo.flac" outro="${basedir}/outro.flac" anhonesthost="${basedir}/sponsor-anhonesthost.com-hpr15.flac" internetarchive="${basedir}/sponsor-archive.org.flac" while getopts "hipsob2nx" OPTION do case $OPTION in h) usage exit 1 ;; s) ADDSUMMARY="y" ;; i) ADDINTRO="y" ;; p) ADDPROMO="y" ;; o) ADDOUTRO="y" ;; b) ADDINTRO="y" ADDOUTRO="y" ;; 2) CHANNELS="2" ;; n) FIXAUDIO="0" ;; x) ADDSPONSOR="n" ;; ?) usage exit ;; esac done shift $(($OPTIND - 1)) if [ "$#" -ne 2 ]; then echoerr "Please enter the source file and episode number" exit fi mediafile=${1} ep_num=${2} ep_num=$(echo $ep_num | sed 's/hpr//g') re='^[0-9]+$' if ! [[ $ep_num =~ $re ]] ; then echoerr "error: episode \"${ep_num}\" is not a number" exit 1 fi if [ ! -f "${anhonesthost}" ]; then echoerr "sorry, file \"${anhonesthost}\" does not exist" exit 1 fi if [ ! -f "${internetarchive}" ]; then echoerr "sorry, file \"${internetarchive}\" does not exist" exit 1 fi if [ ! -f "${intro}" ]; then echoerr "sorry, file \"intro.flac\" does not exist" exit 1 fi if [ "$ADDPROMO" = 'y' ]; then if [ ! -f "${promo}" ]; then echoerr "sorry, file \"promo.flac\" does not exist" exit 1 fi fi if [ ! -f "${outro}" ]; then echoerr "sorry, file \"outro.flac\" does not exist" exit 1 fi if [ ! -f "${mediafile}" ]; then echoerr "sorry, media file \"${mediafile}\" does not exist" exit fi if [ ! -r "${mediafile}" ]; then echoerr "sorry, media file \"${mediafile}\" is not readable" exit fi if [ $(ffprobe "${mediafile}" 2>&1 | grep "Audio:" | wc -l ) -eq 0 ]; then echoerr "sorry, media file \"${mediafile}\" has no audio track" exit fi # extract file name and extension media_dir=$(dirname ${mediafile}) fname=${mediafile%.*} ext=${mediafile/*./} if [ "$ADDSUMMARY" = 'n' ]; then if [ ! -e "${media_dir}/summary.wav" ] then echoerr "ERROR: Can not find the summary file \"${media_dir}/summary.wav\"" wget -O- --timeout=10 --tries=1 --quiet http://hackerpublicradio.org/say.php?id=${ep_num} | grep HPR_summary exit 1 fi fi if [[ -e hpr${ep_num}.wav ]] || [[ -e hpr${ep_num}.mp3 ]] || [[ -e hpr${ep_num}.ogg ]] || [[ -e hpr${ep_num}.spx ]] || [[ -e hpr${ep_num}_summary.wav ]] || [[ -e ${fname}_mez_norm.wav ]] || [[ -e ${fname}_mez.wav ]] || [[ -e ${fname}_sox_norm.wav ]] || [[ -e ${fname}_sox.wav ]] || [[ -e ${fname}_tmp_hh.pcm ]] || [[ -e ${fname}_tmp_ia.pcm ]] || [[ -e ${fname}_tmp.log ]] then echoerr "Files for this episode already exist." ls -1 hpr${ep_num}* ${fname}_* 2>/dev/null exit 1 fi echo "--------------------------------------------------------------------------------" echo "Geting metadata for hpr${ep_num}" while read -r line do field=$(echo $line | awk -F ':' '{print $1}') case $field in "HPR_summary") HPR_summary=$(echo $line | grep "HPR_summary: " | cut -c 14- ) continue ;; "HPR_album") HPR_album=$(echo $line | grep "HPR_album: " | cut -c 12- ) continue ;; "HPR_artist") HPR_artist=$(echo $line | grep "HPR_artist: " | cut -c 13- ) continue ;; "HPR_comment") HPR_comment=$(echo $line | grep "HPR_comment: " | cut -c 14- ) continue ;; "HPR_genre") HPR_genre=$(echo $line | grep "HPR_genre: " | cut -c 12- ) continue ;; "HPR_title") HPR_title=$(echo $line | grep "HPR_title: " | cut -c 12- ) continue ;; "HPR_track") HPR_track=$(echo $line | grep "HPR_track: " | cut -c 12- ) continue ;; "HPR_year") HPR_year=$(echo $line | grep "HPR_year: " | cut -c 11- ) continue ;; "HPR_duration") HPR_duration=$(echo $line | grep "HPR_duration: " | cut -c 15- ) continue ;; "HPR_explicit") HPR_explicit=$(echo $line | grep "HPR_explicit: " | cut -c 15- ) continue ;; "HPR_license") HPR_license=$(echo $line | grep "HPR_license: " | cut -c 14- ) continue ;; esac done < <( wget --timeout=10 --tries=1 --quiet http://hackerpublicradio.org/say.php?id=${ep_num} -O - ) if [[ -z "$ADDINTRO" || -z "$ADDPROMO" || -z "$ADDSUMMARY" || -z "$ADDOUTRO" || -z "$HPR_album" || -z "$HPR_artist" || -z "$HPR_comment" || -z "$HPR_genre" || -z "$HPR_title" || -z "$HPR_track" || -z "$HPR_year" || -z "$HPR_summary" || -z "$HPR_duration" || -z "$HPR_explicit" || -z "$HPR_license" ]] then echoerr "Could not find information on ${ep_num}. Has the show been posted ?" exit; fi echo "--------------------------------------------------------------------------------" echo "Add intro : $ADDINTRO" echo "Add promo : $ADDPROMO" echo "Add Summary : $ADDSUMMARY" echo "Add outro : $ADDOUTRO" echo "album : $HPR_album" echo "artist : $HPR_artist" echo "comment : $HPR_comment" echo "genre : $HPR_genre" echo "title : $HPR_title" echo "track : $HPR_track" echo "year : $HPR_year" echo "summary : $HPR_summary" echo "duration : $HPR_duration" echo "explicit : $HPR_explicit" echo "license : $HPR_license" if [[ $HPR_duration == "0" ]] then echoerr "The duration is set to 0. Please update the show with the correct time." exit; fi #============================================================ # Preproc`s the source file echo "--------------------------------------------------------------------------------" echo "Prepare mezzanine file" ffmpeg -i ${mediafile} -ar 44100 -ac $CHANNELS ${fname}_sox.wav > ${fname}_tmp.log 2>&1 if [ "$FIXAUDIO" = "1" ];then echo "normalizing audio" sox --temp "${TEMP_DIR}" --norm ${fname}_sox.wav ${fname}_sox_norm.wav mv -v ${fname}_sox_norm.wav ${fname}_sox.wav >> ${fname}_tmp.log 2>&1 # normalize -a 0.5 ${fname}_sox.wav >> ${fname}_tmp.log 2>&1 fi echo "--------------------------------------------------------------------------------" echo "Add HPR Branding" if [ "$ADDSUMMARY" = 'y' ]; then echo "Creating the summary" #echo "$HPR_summary" - | espeak -w hpr${ep_num}_summary.wav echo "$HPR_summary" - | text2wave - -o hpr${ep_num}_summary.wav #festival --tts #echo "${HPR_summary}" | gtts-cli - --output hpr${ep_num}_summary.mp3 #ffmpeg -i hpr${ep_num}_summary.mp3 hpr${ep_num}_summary.wav #rm -v hpr${ep_num}_summary.mp3 else echo "Copying the supplied summary" if [ ! -e "${media_dir}/summary.wav" ] then echoerr "ERROR: Can not find the summary file \"${media_dir}/summary.wav\"" exit 1 fi cp -v "${media_dir}/summary.wav" hpr${ep_num}_summary.wav fi ffmpeg -i hpr${ep_num}_summary.wav -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i hpr${ep_num}_summary.wav -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.pcm 2>> ${fname}_tmp.log rm hpr${ep_num}_summary.wav if [ "$ADDSPONSOR" = 'y' ]; then echo "Adding the sponsor" ffmpeg -i "$anhonesthost" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i "$internetarchive" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.pcm 2>> ${fname}_tmp.log else echo "NOT Adding the sponsor" fi if [ "$ADDPROMO" = 'y' ]; then echo "Adding the promo" ffmpeg -i "$promo" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i "$promo" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.pcm 2>> ${fname}_tmp.log fi if [ "$ADDINTRO" = 'y' ]; then echo "Adding the intro" ffmpeg -i "$intro" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i "$intro" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.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_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i ${fname}_sox.wav -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.pcm 2>> ${fname}_tmp.log if [ "$ADDOUTRO" = 'y' ]; then echo "Adding the outro" ffmpeg -i "$outro" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_hh.pcm 2>> ${fname}_tmp.log ffmpeg -i "$outro" -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp_ia.pcm 2>> ${fname}_tmp.log fi echo "Convert the pcm file to a know wav format" ffmpeg -f s16le -ar 44100 -ac $CHANNELS -acodec pcm_s16le -i ${fname}_tmp_hh.pcm ${fname}_mez.wav 2>> ${fname}_tmp.log ffmpeg -f s16le -ar 44100 -ac $CHANNELS -acodec pcm_s16le -i ${fname}_tmp_ia.pcm hpr${ep_num}.wav 2>> ${fname}_tmp.log echo "Normalizing the wav files" sox --temp "${TEMP_DIR}" --norm ${fname}_mez.wav ${fname}_mez_norm.wav mv -v ${fname}_mez_norm.wav ${fname}_mez.wav >> ${fname}_tmp.log 2>&1 # normalize -a 0.5 ${fname}_mez.wav >> ${fname}_tmp.log 2>&1 sox --temp "${TEMP_DIR}" --norm hpr${ep_num}.wav hpr${ep_num}_norm.wav mv -v hpr${ep_num}_norm.wav /var/IA/uploads/hpr${ep_num}.wav >> ${fname}_tmp.log 2>&1 # normalize -a 0.5 hpr${ep_num}.wav >> ${fname}_tmp.log 2>&1 echo "--------------------------------------------------------------------------------" echo "File information" ffprobe ${fname}_mez.wav 2>&1 | grep Audio: mediainfo ${fname}_mez.wav echo "--------------------------------------------------------------------------------" echo "Convert to opus for IA" opusenc hpr${ep_num}.wav /var/IA/uploads/hpr${ep_num}.opus echo "--------------------------------------------------------------------------------" echo "Convert to flac for IA" sox --temp "${TEMP_DIR}" -S hpr${ep_num}.wav /var/IA/uploads/hpr${ep_num}.flac echo "--------------------------------------------------------------------------------" echo "Convert to mp3 for HPR" sox --temp "${TEMP_DIR}" -S ${fname}_mez.wav hpr${ep_num}.mp3 echo "Convert to mp3 for IA" sox --temp "${TEMP_DIR}" -S hpr${ep_num}.wav /var/IA/uploads/hpr${ep_num}.mp3 echo "--------------------------------------------------------------------------------" echo "Convert to ogg for HPR" sox --temp "${TEMP_DIR}" -S ${fname}_mez.wav hpr${ep_num}.ogg echo "Convert to ogg for IA" sox --temp "${TEMP_DIR}" -S hpr${ep_num}.wav /var/IA/uploads/hpr${ep_num}.ogg echo "--------------------------------------------------------------------------------" echo "Convert to spx for HPR" sox --temp "${TEMP_DIR}" -S ${fname}_mez.wav -c 1 -r 16000 -t wav - | speexenc - hpr${ep_num}.spx echo "Convert to spx for IA" sox --temp "${TEMP_DIR}" -S hpr${ep_num}.wav -c 1 -r 16000 -t wav - | speexenc - /var/IA/uploads/hpr${ep_num}.spx if [[ ! -s /var/IA/uploads/hpr${ep_num}.wav ]] || [[ ! -s /var/IA/uploads/hpr${ep_num}.mp3 ]] || [[ ! -s /var/IA/uploads/hpr${ep_num}.ogg ]] || [[ ! -s /var/IA/uploads/hpr${ep_num}.spx ]] || [[ ! -s hpr${ep_num}.mp3 ]] || [[ ! -s hpr${ep_num}.ogg ]] || [[ ! -s hpr${ep_num}.spx ]] then echoerr "ERROR: Something went wrong encoding the files" exit 1 fi fix_tags -album="$HPR_album" -artist="$HPR_artist" -comment="${HPR_comment} The license is ${HPR_license}" -genre="$HPR_genre" -title="$HPR_title" -track="$HPR_track" -year="$HPR_year" hpr${ep_num}* 2>> ${fname}_tmp.log 1>&2 fix_tags -album="$HPR_album" -artist="$HPR_artist" -comment="$HPR_comment" -genre="$HPR_genre" -title="$HPR_title" -track="$HPR_track" -year="$HPR_year" /var/IA/uploads/hpr${ep_num}* 2>> ${fname}_tmp.log 1>&2 fix_tags hpr${ep_num}* fix_tags /var/IA/uploads/hpr${ep_num}* #echo "Changing the file dates to the time of upload" touch -r ${mediafile} hpr${ep_num}* touch -r ${mediafile} /var/IA/uploads/hpr${ep_num}* rsync -ave ssh --partial --progress --ignore-existing hpr${ep_num}.mp3 hpr${ep_num}.ogg hpr${ep_num}.spx hpr:www/eps/ firefox http://hackerpublicradio.org/local/hpr${ep_num}.mp3 firefox http://hackerpublicradio.org/local/hpr${ep_num}.ogg firefox file:///var/IA/uploads/hpr${ep_num}.mp3 firefox file:///var/IA/uploads/hpr${ep_num}.ogg mpv "http://hackerpublicradio.org/local/hpr${ep_num}.spx" "http://hackerpublicradio.org/local/hpr${ep_num}.ogg" "http://hackerpublicradio.org/local/hpr${ep_num}.mp3" "file:///var/IA/uploads/hpr${ep_num}.spx" "file:///var/IA/uploads/hpr${ep_num}.opus" "file:///var/IA/uploads/hpr${ep_num}.ogg" "file:///var/IA/uploads/hpr${ep_num}.mp3" "file:///var/IA/uploads/hpr${ep_num}.flac" echo "Source: $( mediainfo --Output=XML --Full "${mediafile}" | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' )" mediainfo --Output=XML --Full hpr${ep_num}* /var/IA/uploads/hpr${ep_num}* | xmlstarlet sel -T -t -m '/_:MediaInfo/_:media/_:track[@type="Audio"]' -v '_:Duration' -n | awk -F '.' '{print $1}' | sort | uniq -c read -p "Remove files for \"${fname}\" (y|N) ? " -n 1 -r echo # (optional) move to a new line if [[ $REPLY =~ ^[Yy]$ ]] then mediafilename=$(basename "${mediafile}") mediaextension="${mediafilename##*.}" ssh hpr -t "mkdir /home/hpr/www/eps/hpr${ep_num}" >/dev/null 2>&1 rsync -ave ssh --partial --progress --ignore-existing "${mediafile}" hpr:www/eps/hpr${ep_num}/hpr${ep_num}_source.${mediaextension} ssh hpr -t "ls -al /home/hpr/www/eps/hpr${ep_num}*" cp -v "${mediafile}" "/var/IA/uploads/hpr${ep_num}_source.${mediaextension}" #echo "Remove temp files" rm -v ${fname}_sox.wav ${fname}_tmp*.pcm ${fname}_tmp.log ${fname}_mez.wav mv -v ${fname}* hpr${ep_num}* *_${ep_num}_* /var/IA/done/ wget --timeout=0 -q "http://hackerpublicradio.org/hpr_ogg_rss.php?gomax=1" -O - | xmlstarlet val --err - wget --timeout=0 -q "http://hackerpublicradio.org/hpr_mp3_rss.php?gomax=1" -O - | xmlstarlet val --err - wget --timeout=0 -q "http://hackerpublicradio.org/hpr_spx_rss.php?gomax=1" -O - | xmlstarlet val --err - wget --timeout=0 -q "http://hackerpublicradio.org/rss-future.php" -O - | xmlstarlet val --err - #rsync -ave ssh --partial --progress /var/IA/uploads/ hpr:/home/hpr/upload/processed/ rsync -ave ssh --partial --progress /var/IA/uploads/ borg:/data/IA/uploads/ echo "$( ssh borg -t "ls -al /data/IA/uploads/hpr${ep_num}*" ; ls -al /var/IA/uploads/hpr${ep_num}* )" | grep "hpr${ep_num}" | awk '{print $5, $NF}' | sort find /var/IA/done/ -empty -delete else echo "skipping...." echo "cp -v \"${mediafile}\" \"/var/IA/uploads/hpr${ep_num}_source.${mediaextension}\"" echo "rm -v ${fname}_sox.wav ${fname}_tmp*.pcm ${fname}_tmp.log ${fname}_mez.wav" echo "mv -v ${fname}* hpr${ep_num}* *_${ep_num}_* /var/IA/done/" echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_ogg_rss.php?gomax=1\" -O - | xmlstarlet val --err -" echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_mp3_rss.php?gomax=1\" -O - | xmlstarlet val --err -" echo "wget --timeout=0 -q \"http://hackerpublicradio.org/hpr_spx_rss.php?gomax=1\" -O - | xmlstarlet val --err -" echo "rsync -ave ssh --partial --progress /var/IA/uploads/ borg:/data/IA/uploads/" fi