#!/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 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\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 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