#!/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 getopts Dry flag; do case "$flag" in D) delete_in_file=yes;; r) recursive=yes;; y) ffmpeg_flag_y=-y;; ?) usage;; esac done shift $(( ${OPTIND} - 1 )) 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 if test "${out_file}" = -; then printf '%s: - is not supported for out-file\n' "$0" >&2 exit 1 fi else if test "${in_file}" = -; then printf '%s: out-file must be specified if in-file is -\n' "$0" >&2 exit 1 fi fi getext () { probed_file="$1" if test ! "${probed_file}" = -; then probed_file="file:${probed_file}" fi ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 -- "${probed_file}" } removeext () { printf '%s\0' "$1" | tr '\0\n' '\n\0' | sed 's/\.[^.]*$//' | tr '\0' '\n' } 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 in_file_prefixed="${1}" if test ! "${in_file_prefixed}" = -; then in_file_prefixed="file:${in_file_prefixed}" fi if ffmpeg -i "${in_file_prefixed}" -vn -acodec copy ${ffmpeg_flag_y} -- "file:${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 "${in_file}"; 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