hpr-tools/InternetArchive/replace_derived

248 lines
6.5 KiB
Bash
Executable File

#!/bin/bash -
#===============================================================================
#
# FILE: replace_derived
#
# USAGE: ./replace_derived show_number
#
# DESCRIPTION: Given a show that has already been uploaded to the IA, upload
# a locally derived set of files to replace those generated by
# the IA themselves. The IA's process of deriving files does not
# propagate the tags, which we really want to do.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: This is to be run on the HPR VPS
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.5
# CREATED: 2018-01-05 19:08:32
# REVISION: 2019-01-27 15:55:58
#
#===============================================================================
set -o nounset # Treat unset variables as an error
VERSION="0.0.5"
SCRIPT=${0##*/}
# DIR=${0%/*}
STDOUT="/dev/fd/2"
#
# Select the appropriate working directory
#
case $(hostname) in
i7-desktop) BASEDIR="$HOME/HPR/InternetArchive";;
hprvps|marvin) BASEDIR="$HOME/IA";;
*) echo "Wrong host!"; exit 1;;
esac
cd "$BASEDIR" || exit 1
#=== FUNCTION ================================================================
# NAME: yes_no
# DESCRIPTION: Read a Yes or No response from STDIN (only these values are
# accepted) and return a suitable numeric value.
# PARAMETERS: 1 - Prompt string for the read
# 2 - Default value (optional)
# RETURNS: 0 for a response of Y or YES, 1 otherwise
#===============================================================================
yes_no () {
local prompt="${1:?Usage: ${FUNCNAME[0]} prompt [default]}"
local default="${2^^}"
local ans res
if [[ $prompt =~ %s ]]; then
if [[ -n $default ]]; then
default=${default:0:1}
# shellcheck disable=SC2059
# {
case "$default" in
Y) printf -v prompt "$prompt" "[Y/n]" ;;
N) printf -v prompt "$prompt" "[y/N]" ;;
*) echo "Error: ${FUNCNAME[0]} @ line ${BASH_LINENO[0]}: Default must be 'Y' or 'N'"
exit 1
;;
esac
# }
else
echo "Error: ${FUNCNAME[0]} @ line ${BASH_LINENO[0]}: Default required"
exit 1
fi
fi
#
# Loop until a valid input is received
#
while true; do
#
# Read and handle CTRL-D (EOF)
#
read -r -e -p "$prompt" ans
res="$?"
if [[ $res -ne 0 ]]; then
echo "Read aborted"
return 1
fi
[ -z "$ans" ] && ans="$default"
#
# Look for valid replies and return appropriate values. Print an error
# message otherwise and loop around for another go
#
if [[ ${ans^^} =~ ^Y(E|ES)?$ ]]; then
return 0
elif [[ ${ans^^} =~ ^NO?$ ]]; then
return 1
else
echo "Invalid reply; please use 'Y' or 'N'"
fi
done
}
#=== FUNCTION ================================================================
# NAME: _usage
# DESCRIPTION: Report usage
# PARAMETERS: None
# RETURNS: Nothing
#===============================================================================
_usage () {
local exitcode=${1:-0}
cat >$STDOUT <<-endusage
${SCRIPT} - version: ${VERSION}
Usage: ./${SCRIPT} show_number
For a show already on the archive it determines if the files are those derived
by the IA software and if not collects the WAV file (if necessary) and
generates all the derivatives (if necessary), then it uploads these
replacements. This is necessary because the IA's derivation process does not
copy the audio tags across to the derived files whereas we do.
endusage
exit "$exitcode"
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Make temporary files and set traps to delete them
#
# TMP1=$(mktemp) || { echo "$SCRIPT: creation of temporary file failed!"; exit 1; }
# trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT
UPLOADS="/var/IA/uploads"
#
# Don't run on the wrong system
#
HOST=${HOSTNAME:-${hostname}}
if [[ $HOST != 'hprvps' ]]; then
echo "This should be run on the HPR VPS"
exit 1
fi
#
# We need a show number argument
#
if [[ $# -ne 1 ]]; then
_usage 1
fi
show_number=$1
#
# Tools we need: the Awk script 'parse_ia_audio.awk', and the script
# 'transcode'
#
PARSE_IA_AUDIO="$BASEDIR/parse_ia_audio.awk"
[ -e "$PARSE_IA_AUDIO" ] || { echo "$SCRIPT: Unable to find $PARSE_IA_AUDIO"; exit 1; }
TRANSCODE="$BASEDIR/transcode"
[ -e "$TRANSCODE" ] || { echo "$SCRIPT: Unable to find $TRANSCODE"; exit 1; }
#
# Build the file path and the identifier we're looking for
#
WAV="$UPLOADS/hpr${show_number}.wav"
IDENTIFIER="hpr${show_number}"
#
# Look for the WAV file in the upload area
#
if [[ -e $WAV ]]; then
echo "The WAV file already exists"
else
#
# Not found. Check it's on the archive
#
if ia metadata --exists "$IDENTIFIER" > /dev/null 2>&1; then
#
# It's there. Report the status of original and derived
#
echo "Need to download ${WAV##*/}"
ia list -va "$IDENTIFIER" | $PARSE_IA_AUDIO
#
# Download the WAV
#
if yes_no "OK to download? %s " N; then
echo "Downloading"
ia download "$IDENTIFIER" "${WAV##*/}" --stdout > "$WAV"
RES=$?
[ $RES -gt 0 ] && { echo "Download failed"; exit 1; }
else
echo "Download cancelled"
exit 1
fi
else
echo "This episode is not in the archive"
exit 1
fi
fi
#
# Did we already transcode this one?
#
tally=0
for fmt in flac mp3 ogg opus spx; do
if [[ -e "$UPLOADS/hpr${show_number}.${fmt}" ]]; then
((tally++))
fi
done
#
# We have a WAV file so transcode it unless we found transcoded files
#
if [[ $tally -gt 0 ]]; then
echo "There are already $tally derived files for this show"
echo "Not transcoding"
else
if yes_no "OK to transcode? %s " N; then
$TRANSCODE "$WAV"
else
echo "Transcode cancelled"
exit 1
fi
fi
if yes_no "OK to upload? %s " N; then
ia upload "$IDENTIFIER" "${WAV%wav}"{flac,mp3,ogg,opus,spx}
else
echo "Upload cancelled"
exit 1
fi
if yes_no "OK to delete WAV and derived files? %s " N; then
rm -f "${WAV%wav}"*
else
echo "Deletion cancelled"
exit 1
fi
exit
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21