forked from HPR/hpr-tools
		
	
		
			
				
	
	
		
			214 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |