#!/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 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 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-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="$(printf '%s\n' "$key" | tr - _)" unset "$nextprefix$key" done local output="$(${MPV:-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="$(printf '%s\n' "$key" | tr - _)" unset "$nextprefix$key" done else if [ "$fileindex" -gt 0 ]; then echo 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 echo "$key=$value" fi fi ;; esac done } __midentify__main "$@"