forked from HPR/hpr-tools
		
	
		
			
	
	
		
			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
							 |