#!/bin/sh # See LICENSE file for copyright and license details. set -e usage () { printf 'usage %s: [-Dry] in-file [out-file]\n' "$0" >&2 exit 1 } recursive=no delete_in_file=no ffmpeg_flag_y= status=0 while test "${1::1}" = '-'; do if test "${1}" = '--'; then shift break elif test "${1}" = '-'; then break fi arg="${1:1}" while test -n "${arg}"; do flag="${arg::1}" arg="${arg:1}" if test "${flag}" = r; then recursive=yes elif test "${flag}" = D; then delete_in_file=yes elif test "${flag}" = y; then ffmpeg_flag_y=-y else usage fi do done if test ! $# = 1 && test ! $# = 2; then usage fi in_file="$1" if test -z "${in_file}"; then usage fi out_file="" if test $# = 2; then out_file="$2" if test -z "${out_file}"; then usage fi fi getext () { ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 -- "$1" } removeext () { printf '%s\n' "$1" | sed 's/\.[^.]*$//' } extract () { printf '\033[1m%s\033[m\n' "Extracting audio track from ${1}" >&2 printf '\033[1m%s\033[m\n' "and storing as ${2}" >&2 if ffmpeg -i "${1}" -vn -acodec copy ${ffmpeg_flag_y} -- "${2}"; then if test ${delete_in_file} = yes; then unlink -- "${1}" fi fi } if test ${recursive} = no || test ! -d "${in_file}"; then if test -z "${out_file}"; then out_file="$(removeext "${in_file}").$(getext "${in_file}")" fi extract "${in_file}" "${out_file}" exit $? fi recursive () { for in_file in "${1}/"*; do out_file="$2/$(basename -- "${in_file}")" if test -d "$f"; then mkdir -p -- "${out_file}" recursive "${in_file}" "${out_file}" else out_file="$(removeext "${out_file}").$(getext "${in_file}")" if ! extract "${in_file}" "${out_file}"; then status=1 fi fi done if test ${delete_in_file} = yes; then rmdir -- "${1}" 2>/dev/null || : fi } if test -z "${out_file}"; then out_file="${in_file}" else mkdir -p -- "${out_file}" fi recursive "${in_file}" "${out_file}" exit $status