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