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 |