summaryrefslogtreecommitdiffstats
path: root/TOOLS/mpv_identify.sh
blob: b1c17f75c202b35aa51885ab890efe5fa13f7716 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/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.

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."
    exit 1
fi

if [ -z "$MPV" ]; then
    MPV="mpv"
fi

__midentify__LF="
"

__midentify__nextprefix=$1
shift

if [ -n "$__midentify__nextprefix" ]; then
    # in case of error, we always want this unset
    eval unset $__midentify__nextprefix'path'
fi

__midentify__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
    aspect
    fps
    width
    height
    dwidth
    dheight

    sub
"
# TODO add metadata support once mpv can do it

__midentify__propstr="X-MIDENTIFY-START:$__midentify__LF"
for __midentify__key in $__midentify__allprops; do
    __midentify__propstr=$__midentify__propstr"X-MIDENTIFY: $__midentify__key \${=$__midentify__key}$__midentify__LF"
    __midentify__key=`echo "$__midentify__key" | tr - _`
    eval unset $__midentify__nextprefix$__midentify__key
done

__midentify__output=`$MPV --playing-msg="$__midentify__propstr" --vo=null --ao=null --frames=1 --quiet --no-cache --no-config "$@"`
__midentify__fileindex=0
__midentify__prefix=
while :; do
    case "$__midentify__output" in
        '')
            break
            ;;
        *$__midentify__LF*)
            __midentify__line=${__midentify__output%%$__midentify__LF*}
            __midentify__output=${__midentify__output#*$__midentify__LF}
            ;;
        *)
            __midentify__line=$__midentify__output
            __midentify__output=
            ;;
    esac
    case "$__midentify__line" in
        X-MIDENTIFY-START:)
            if [ -n "$__midentify__nextprefix" ]; then
                __midentify__prefix=$__midentify__nextprefix
                if [ $__midentify__fileindex -gt 0 ]; then
                    __midentify__nextprefix=${__midentify__prefix%$__midentify__fileindex\_}
                fi
                __midentify__fileindex=$(($__midentify__fileindex+1))
                __midentify__nextprefix=$__midentify__nextprefix$__midentify__fileindex\_
                for __midentify__key in $__midentify__allprops; do
                    __midentify__key=`echo "$__midentify__key" | tr - _`
                    eval unset $__midentify__nextprefix$__midentify__key
                done
            else
                if [ $__midentify__fileindex -gt 0 ]; then
                    echo
                fi
                __midentify__fileindex=$(($__midentify__fileindex+1))
            fi
            ;;
        X-MIDENTIFY:\ *)
            __midentify__key=${__midentify__line#X-MIDENTIFY:\ }
            __midentify__value=${__midentify__key#* }
            __midentify__key=${__midentify__key%% *}
            __midentify__key=`echo "$__midentify__key" | tr - _`
            if [ -n "$__midentify__nextprefix" ]; then
                if [ -z "$__midentify__prefix" ]; then
                    echo >&2 "Got X-MIDENTIFY: without X-MIDENTIFY-START:"
                elif [ -n "$__midentify__value" ]; then
                    eval $__midentify__prefix$__midentify__key=\$__midentify__value
                fi
            else
                if [ -n "$__midentify__value" ]; then
                    echo "$__midentify__key=$__midentify__value"
                fi
            fi
            ;;
    esac
done

unset __midentify__fileindex
unset __midentify__allprops
unset __midentify__key
unset __midentify__LF
unset __midentify__line
unset __midentify__output
unset __midentify__nextprefix
unset __midentify__prefix
unset __midentify__propstr
unset __midentify__value