forked from HPR/hpr-tools
		
	
		
			
				
	
	
		
			248 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 |