mpv/TOOLS/mpv_identify.sh

170 lines
4.3 KiB
Bash

#!/bin/sh
# file identification script
#
# manual usage:
# mpv_identify.sh foo.mkv
#
# sh/dash/ksh/bash usage:
# . mpv_identify.sh FOO_ foo.mkv
# will fill properties into variables like FOO_length
#
# zsh usage:
# mpv_identify() { emulate -L sh; . mpv_identify.sh "$@"; }
# mpv_identify FOO_ foo.mkv
# will fill properties into variables like FOO_length
#
# When multiple files were specified, their info will be put into FOO_* for the
# first file, FOO_1_* for the second file, FOO_2_* for the third file, etc.
__midentify__main() {
case "$0" in
mpv_identify.sh|*/mpv_identify.sh)
# we are NOT being sourced
case "$1" in
'')
;;
*)
set -- '' "$@"
;;
esac
;;
esac
if [ $# -lt 2 ]; then
echo >&2 "Usage 1 (for humans only): $0 filename.mkv"
echo >&2 "will print all property values."
echo >&2 "Note that this output really shouldn't be parsed, as the"
echo >&2 "format is subject to change."
echo >&2
echo >&2 "Usage 2 (for use by scripts): see top of this file"
echo >&2
echo >&2 "NOTE: for mkv with ordered chapters, this may"
echo >&2 "not always identify the specified file, but the"
echo >&2 "file providing the first chapter. Specify"
echo >&2 "--no-ordered-chapters to prevent this."
return 1
fi
if [ -z "$MPV" ]; then
local MPV="mpv"
fi
local LF="
"
local nextprefix=$1
shift
if [ -n "$nextprefix" ]; then
# in case of error, we always want this unset
eval unset $nextprefix'path'
fi
local allprops="
filename
path
stream-start
stream-end
stream-length
demuxer
length
chapters
editions
titles
audio
audio-bitrate
audio-codec
audio-format
channels
samplerate
video
angle
video-bitrate
video-codec
video-format
video-aspect
fps
width
height
dwidth
dheight
sub
"
# TODO add metadata support once mpv can do it
local propstr="X-MIDENTIFY-START:$LF"
local key
for key in $allprops; do
propstr=$propstr"X-MIDENTIFY: $key \${=$key}$LF"
key=`echo "$key" | tr - _`
eval unset $nextprefix$key
done
local output=`$MPV --term-playing-msg="$propstr" --vo=null --ao=null --frames=1 --quiet --no-cache --no-config "$@"`
local fileindex=0
local prefix=
while :; do
local line output
case "$output" in
'')
break
;;
*$LF*)
line=${output%%$LF*}
output=${output#*$LF}
;;
*)
line=$output
output=
;;
esac
case "$line" in
X-MIDENTIFY-START:)
if [ -n "$nextprefix" ]; then
prefix=$nextprefix
if [ $fileindex -gt 0 ]; then
nextprefix=${prefix%$fileindex\_}
fi
fileindex=$(($fileindex+1))
nextprefix=$nextprefix$fileindex\_
for key in $allprops; do
key=`echo "$key" | tr - _`
eval unset $nextprefix$key
done
else
if [ $fileindex -gt 0 ]; then
echo
fi
fileindex=$(($fileindex+1))
fi
;;
X-MIDENTIFY:\ *)
key=${line#X-MIDENTIFY:\ }
local value=${key#* }
key=${key%% *}
key=`echo "$key" | tr - _`
if [ -n "$nextprefix" ]; then
if [ -z "$prefix" ]; then
echo >&2 "Got X-MIDENTIFY: without X-MIDENTIFY-START:"
elif [ -n "$value" ]; then
eval $prefix$key=\$value
fi
else
if [ -n "$value" ]; then
echo "$key=$value"
fi
fi
;;
esac
done
}
__midentify__main "$@"