mirror of https://github.com/mpv-player/mpv
170 lines
4.3 KiB
Bash
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 "$@"
|