forked from HPR/hpr-tools
		
	Moved project directories and files to an empty local repo
This commit is contained in:
		
							
								
								
									
										247
									
								
								InternetArchive/replace_derived
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										247
									
								
								InternetArchive/replace_derived
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| #!/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 | ||||
		Reference in New Issue
	
	Block a user