248 lines
6.5 KiB
Plaintext
248 lines
6.5 KiB
Plaintext
|
#!/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
|