#!/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