forked from HPR/hpr-tools
		
	
		
			
	
	
		
			214 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			214 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/bash -
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#         FILE: transcode
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#        USAGE: ./transcode path_to_file
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#  DESCRIPTION: Given an audio file generated for archive.org transcode it to
							 | 
						||
| 
								 | 
							
								#               other audio formats: wav, opus, flac, mp3, ogg, spx. Having
							 | 
						||
| 
								 | 
							
								#               done so propagate the tags from the first file to the others.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#      OPTIONS: ---
							 | 
						||
| 
								 | 
							
								# REQUIREMENTS: ---
							 | 
						||
| 
								 | 
							
								#         BUGS: ---
							 | 
						||
| 
								 | 
							
								#        NOTES: ---
							 | 
						||
| 
								 | 
							
								#       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
							 | 
						||
| 
								 | 
							
								#      VERSION: 0.0.2
							 | 
						||
| 
								 | 
							
								#      CREATED: 2018-01-05 12:52:49
							 | 
						||
| 
								 | 
							
								#     REVISION: 2021-04-23 20:27:35
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set -o nounset                              # Treat unset variables as an error
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SCRIPT=${0##*/}
							 | 
						||
| 
								 | 
							
								# DIR=${0%/*}
							 | 
						||
| 
								 | 
							
								VERSION="0.0.2"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDOUT="/dev/fd/2"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#===  FUNCTION  ================================================================
							 | 
						||
| 
								 | 
							
								#         NAME: _usage
							 | 
						||
| 
								 | 
							
								#  DESCRIPTION: Reports usage; always exits the script after doing so
							 | 
						||
| 
								 | 
							
								#   PARAMETERS: 1 - the integer to pass to the 'exit' command
							 | 
						||
| 
								 | 
							
								#      RETURNS: Nothing
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								_usage () {
							 | 
						||
| 
								 | 
							
								    local -i result=${1:-0}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cat >$STDOUT <<-endusage
							 | 
						||
| 
								 | 
							
								${SCRIPT} - version: ${VERSION}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Usage: ./${SCRIPT} [-h] [-v] path_to_file
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Performs a "transcode" action on the given file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This means a variety of audio types are generated from the 'wav' format. The
							 | 
						||
| 
								 | 
							
								formats required are 'wav' 'opus' 'flac' 'mp3' 'ogg' 'spx'. If the file
							 | 
						||
| 
								 | 
							
								presented is not 'wav' format then this format is generated from the file
							 | 
						||
| 
								 | 
							
								using ffmpeg.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Options:
							 | 
						||
| 
								 | 
							
								  -h                    Print this help
							 | 
						||
| 
								 | 
							
								  -v                    Run in verbose mode where more information is reported
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Arguments:
							 | 
						||
| 
								 | 
							
								    path_to_file        The primary file to be processed. The replica files
							 | 
						||
| 
								 | 
							
								                        generated from it are written to the same path. The
							 | 
						||
| 
								 | 
							
								                        file is expected to be an HPR audio file with a name
							 | 
						||
| 
								 | 
							
								                        such as 'hpr1234.mp3'.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								endusage
							 | 
						||
| 
								 | 
							
								    exit "$result"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Options
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								while getopts :hv opt
							 | 
						||
| 
								 | 
							
								do
							 | 
						||
| 
								 | 
							
								    case "${opt}" in
							 | 
						||
| 
								 | 
							
								        h) _usage 1;;
							 | 
						||
| 
								 | 
							
								        v) VERBOSE=1;;
							 | 
						||
| 
								 | 
							
								        *) _usage 1;;
							 | 
						||
| 
								 | 
							
								    esac
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								shift $((OPTIND - 1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								VERBOSE=${VERBOSE:-0}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Check for the presence of the required tools
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								for f in ffmpeg ffprobe opusenc sox speexenc transfer_tags; do
							 | 
						||
| 
								 | 
							
								    TOOL=$(command -v $f)
							 | 
						||
| 
								 | 
							
								    if [[ -z $TOOL ]]; then
							 | 
						||
| 
								 | 
							
								        echo "$SCRIPT: Unable to find required audio tool '$f'; aborted"
							 | 
						||
| 
								 | 
							
								        exit 1
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# We need an audio file argument
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								if [[ $# -ne 1 ]]; then
							 | 
						||
| 
								 | 
							
								    _usage 1
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PRIMARY=$1
							 | 
						||
| 
								 | 
							
								WORKDIR=${PRIMARY%/*}
							 | 
						||
| 
								 | 
							
								FILE=${PRIMARY##*/}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# echo "PRIMARY=$PRIMARY"
							 | 
						||
| 
								 | 
							
								# echo "WORKDIR=$WORKDIR"
							 | 
						||
| 
								 | 
							
								# echo "FILE=$FILE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								declare -a audiotypes
							 | 
						||
| 
								 | 
							
								mapfile -t audiotypes < <(printf '%s\n' wav opus flac mp3 ogg spx)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# We expect an HPR-format filename and one of a list of audio formats.
							 | 
						||
| 
								 | 
							
								# TODO: review the use of spx!
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								RE="${audiotypes[*]/%/|}"
							 | 
						||
| 
								 | 
							
								RE="${RE// /}"
							 | 
						||
| 
								 | 
							
								RE="${RE:0: -1}"
							 | 
						||
| 
								 | 
							
								RE="^hpr([0-9]{1,4})\.($RE)$"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if [[ $FILE =~ $RE ]]; then
							 | 
						||
| 
								 | 
							
								    ep_num=${BASH_REMATCH[1]}
							 | 
						||
| 
								 | 
							
								    ext=${BASH_REMATCH[2]}
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    echo "$SCRIPT: Expecting an HPR audio file, got $FILE"
							 | 
						||
| 
								 | 
							
								    exit 1
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Check the primary file exists
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								[ -e "$PRIMARY" ] || { echo "$SCRIPT: Unable to find the file: $PRIMARY"; exit 1; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Is the primary file a wav file? If not, convert it
							 | 
						||
| 
								 | 
							
								# TODO: Can this be one with spx?
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								CHANNELS=1
							 | 
						||
| 
								 | 
							
								WAV="$WORKDIR/hpr${ep_num}.wav"
							 | 
						||
| 
								 | 
							
								if [[ ! -e $WAV ]]; then
							 | 
						||
| 
								 | 
							
								    if [[ ! "$ext" == 'wav' ]]; then
							 | 
						||
| 
								 | 
							
								        [[ $VERBOSE -eq 1 ]] && echo "Making a wav file from $ext"
							 | 
						||
| 
								 | 
							
								        ffmpeg -i "${PRIMARY}" -ar 44100 -ac $CHANNELS "$WAV" > /dev/null 2>&1
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEMP_DIR='/tmp'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Make variables containing the audio variants
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								[[ $VERBOSE -eq 1 ]] && echo "Generating replica files..."
							 | 
						||
| 
								 | 
							
								for fmt in "${audiotypes[@]}"; do
							 | 
						||
| 
								 | 
							
								    target="$WORKDIR/hpr${ep_num}.${fmt}"
							 | 
						||
| 
								 | 
							
								    case $fmt in
							 | 
						||
| 
								 | 
							
								        wav)
							 | 
						||
| 
								 | 
							
								            [[ $VERBOSE -eq 1 ]] && echo "** Nothing to do for $fmt"
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        opus)
							 | 
						||
| 
								 | 
							
								            if [[ ! -e "$target" ]]; then
							 | 
						||
| 
								 | 
							
								                if [[ $VERBOSE -eq 1 ]]; then
							 | 
						||
| 
								 | 
							
								                    echo "Make format $fmt"
							 | 
						||
| 
								 | 
							
								                    opusenc "$WAV" "$target"
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    opusenc "$WAV" "$target" > /dev/null 2>&1
							 | 
						||
| 
								 | 
							
								                fi
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                [[ $VERBOSE -eq 1 ]] && echo "** $target already exists"
							 | 
						||
| 
								 | 
							
								            fi
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        flac|mp3|ogg)
							 | 
						||
| 
								 | 
							
								            if [[ ! -e "$target" ]]; then
							 | 
						||
| 
								 | 
							
								                if [[ $VERBOSE -eq 1 ]]; then
							 | 
						||
| 
								 | 
							
								                    echo "Make format $fmt"
							 | 
						||
| 
								 | 
							
								                    sox --temp "${TEMP_DIR}" -S "$WAV" "$target"
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    sox --temp "${TEMP_DIR}" -S "$WAV" "$target" > /dev/null 2>&1
							 | 
						||
| 
								 | 
							
								                fi
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                [[ $VERBOSE -eq 1 ]] && echo "** $target already exists"
							 | 
						||
| 
								 | 
							
								            fi
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								        spx)
							 | 
						||
| 
								 | 
							
								            if [[ ! -e "$target" ]]; then
							 | 
						||
| 
								 | 
							
								                if [[ $VERBOSE -eq 1 ]]; then
							 | 
						||
| 
								 | 
							
								                    echo "Make format $fmt"
							 | 
						||
| 
								 | 
							
								                    sox --temp "${TEMP_DIR}" -S "$WAV" -c 1 -r 16000 -t wav  - |\
							 | 
						||
| 
								 | 
							
								                        speexenc - "$target"
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                    sox --temp "${TEMP_DIR}" -S "$WAV" -c 1 -r 16000 -t wav  - |\
							 | 
						||
| 
								 | 
							
								                        speexenc - "$target" > /dev/null 2>&1
							 | 
						||
| 
								 | 
							
								                fi
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                [[ $VERBOSE -eq 1 ]] && echo "** $target already exists"
							 | 
						||
| 
								 | 
							
								            fi
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								            ;;
							 | 
						||
| 
								 | 
							
								    esac
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[[ $VERBOSE -eq 1 ]] && echo "transfer_tags $PRIMARY"
							 | 
						||
| 
								 | 
							
								if [[ $VERBOSE -eq 1 ]]; then
							 | 
						||
| 
								 | 
							
								    transfer_tags -verbose "$PRIMARY"
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    transfer_tags -noverbose "$PRIMARY"
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21
							 |