423 lines
15 KiB
Bash
423 lines
15 KiB
Bash
#!/bin/bash
|
|
# Copyright Ken Fallon - Released into the public domain. http://creativecommons.org/publicdomain/
|
|
#============================================================
|
|
# Check input
|
|
usage="usage: $(basename $0 ) [ -i ] [ -o ] <fname>, -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
|
|
|
|
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 -
|
|
|
|
#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/
|
|
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
|