diff options
Diffstat (limited to 'ffextract-audio')
-rwxr-xr-x | ffextract-audio | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/ffextract-audio b/ffextract-audio new file mode 100755 index 0000000..b95dd8f --- /dev/null +++ b/ffextract-audio @@ -0,0 +1,108 @@ +#!/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 |