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
 |