mirror of
https://github.com/mpv-player/mpv
synced 2024-12-26 00:42:57 +00:00
7201fd7d08
As threatened by the API changes document. We can actually keep the deprecated --playlist-pos and --cache options, since they are aliases and not used by the corresponding properties. They are inconsistent, but do no harm. Keep them for now for the sake of the command line user. mpv_identify.sh partially stopped working, because it was never updated. The shell magic can't deal with property names that contain "/", so we can't replace "samplerate" with "audio-params/samplerate" - just remove these properties. (How about you use ffprobe?)
149 lines
3.8 KiB
Bash
Executable File
149 lines
3.8 KiB
Bash
Executable File
#!/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
|
|
[ -n "$1" ] && set -- '' "$@"
|
|
;;
|
|
esac
|
|
|
|
if [ "$#" -lt 2 ]; then
|
|
cat >&2 <<EOF
|
|
Usage 1 (for humans only): $0 filename.mkv
|
|
will print all property values.
|
|
Note that this output really shouldn't be parsed, as the
|
|
format is subject to change.
|
|
|
|
Usage 2 (for use by scripts): see top of this file
|
|
|
|
NOTE: for mkv with ordered chapters, this may
|
|
not always identify the specified file, but the
|
|
file providing the first chapter. Specify
|
|
--no-ordered-chapters to prevent this.
|
|
EOF
|
|
return 2
|
|
fi
|
|
|
|
local LF="
|
|
"
|
|
|
|
local nextprefix="$1"
|
|
shift
|
|
|
|
if [ -n "$nextprefix" ]; then
|
|
# in case of error, we always want this unset
|
|
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-codec-name
|
|
|
|
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="$(printf '%s\n' "$key" | tr - _)"
|
|
unset "$nextprefix$key"
|
|
done
|
|
|
|
local fileindex=0
|
|
local prefix=
|
|
local line
|
|
while IFS= read -r line; do
|
|
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="$(printf '%s\n' "$key" | tr - _)"
|
|
unset "$nextprefix$key"
|
|
done
|
|
else
|
|
if [ "$fileindex" -gt 0 ]; then
|
|
printf '\n'
|
|
fi
|
|
fileindex="$((fileindex+1))"
|
|
fi
|
|
;;
|
|
X-MIDENTIFY:\ *)
|
|
local key="${line#X-MIDENTIFY: }"
|
|
local value="${key#* }"
|
|
key="${key%% *}"
|
|
key="$(printf '%s\n' "$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
|
|
printf '%s=%s\n' "$key" "$value"
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
done <<EOF
|
|
$(${MPV:-mpv} --term-playing-msg="$propstr" --vo=null --ao=null \
|
|
--frames=1 --quiet --no-cache --no-config -- "$@")
|
|
EOF
|
|
}
|
|
|
|
__midentify__main "$@"
|