aboutsummaryrefslogtreecommitdiffstats
path: root/ffextract-audio
diff options
context:
space:
mode:
Diffstat (limited to 'ffextract-audio')
-rwxr-xr-xffextract-audio108
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