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
|