ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MPV/README
Revision: 1.2
Committed: Sun Mar 19 23:26:01 2023 UTC (13 months, 4 weeks ago) by root
Branch: MAIN
CVS Tags: rel-0_1
Changes since 1.1: +379 -3 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 NAME
2 AnyEvent::MPV - remote control mpv (https://mpv.io)
3
4 SYNOPSIS
5 use AnyEvent::MPV;
6
7 DESCRIPTION
8 This module allows you to remote control mpv (a video player). It also
9 is an AnyEvent user, you need to make sure that you use and run a
10 supported event loop.
11
12 There are other modules doing this, and I haven't looked much at them
13 other than to decide that they don't handle encodings correctly, and
14 since none of them use AnyEvent, I wrote my own. When in doubt, have a
15 look at them, too.
16
17 Knowledge of the mpv command interface
18 <https://mpv.io/manual/stable/#command-interface> is required to use
19 this module.
20
21 Features of this module are:
22
23 uses AnyEvent, so integrates well into most event-based programs
24 supports asynchronous and synchronous operation
25 allows you to properly pass binary filenames
26 accepts data encoded in any way (does not crash when mpv replies with
27 non UTF-8 data)
28 features a simple keybind/event system
29
30 OVERVIEW OF OPERATION
31 This module forks an mpv process and uses --input-ipc-client (or
32 equivalent) to create a bidirectional communication channel between it
33 and the mpv process.
34
35 It then speaks the somewhat JSON-looking (but not really being JSON)
36 protocol that mpv implements to both send it commands, decode and handle
37 replies, and handle asynchronous events.
38
39 Here is a very simple client:
40
41 use AnyEvent;
42 use AnyEvent::MPV;
43
44 my $videofile = "./xyzzy.mp4";
45
46 my $mpv = AnyEvent::MPV->new (trace => 1);
47
48 $mpv->start ("--", $videofile);
49
50 my $timer = AE::timer 2, 0, my $quit = AE::cv;
51 $quit->recv;
52
53 This starts mpv with the two arguments "--" and $videofile, which it
54 should load and play. It then waits two seconds by starting a timer and
55 quits. The "trace" argument to the constructor makes mpv more verbose
56 and also prints the commands and responses, so you can have an idea what
57 is going on.
58
59 In my case, the above example would output something like this:
60
61 [uosc] Disabled because original osc is enabled!
62 mpv> {"event":"start-file","playlist_entry_id":1}
63 mpv> {"event":"tracks-changed"}
64 (+) Video --vid=1 (*) (h264 480x480 30.000fps)
65 mpv> {"event":"metadata-update"}
66 mpv> {"event":"file-loaded"}
67 Using hardware decoding (nvdec).
68 mpv> {"event":"video-reconfig"}
69 VO: [gpu] 480x480 cuda[nv12]
70 mpv> {"event":"video-reconfig"}
71 mpv> {"event":"playback-restart"}
72
73 This is not usually very useful (you could just run mpv as a simple
74 shell command), so let us load the file at runtime:
75
76 use AnyEvent;
77 use AnyEvent::MPV;
78
79 my $videofile = "./xyzzy.mp4";
80
81 my $mpv = AnyEvent::MPV->new (
82 trace => 1,
83 args => ["--pause", "--idle=yes"],
84 );
85
86 $mpv->start;
87 $mpv->cmd_recv (loadfile => $mpv->escape_binary ($videofile));
88 $mpv->cmd ("set", "pause", "no");
89
90 my $timer = AE::timer 2, 0, my $quit = AE::cv;
91 $quit->recv;
92
93 This specifies extra arguments in the constructor - these arguments are
94 used every time you "->start" mpv, while the arguments to "->start" are
95 only used for this specific clal to0 "start". The argument --pause keeps
96 mpv in pause mode (i.e. it does not play the file after loading it), and
97 "--idle=yes" tells mpv to not quit when it does not have a playlist - as
98 no files are specified on the command line.
99
100 To load a file, we then send it a "loadfile" command, which accepts, as
101 first argument, the URL or path to a video file. To make sure mpv does
102 not misinterpret the path as a URL, it was prefixed with ./ (similarly
103 to "protecting" paths in perls "open").
104
105 Since commands send *to* mpv are send in UTF-8, we need to escape the
106 filename (which might be in any encoding) using the "esscape_binary"
107 method - this is not needed if your filenames are just ascii, or
108 magically get interpreted correctly, but if you accept arbitrary
109 filenamews (e.g. from the user), you need to do this.
110
111 The "cmd_recv" method then queues the command, waits for a reply and
112 returns the reply data (or croaks on error). mpv would, at this point,
113 load the file and, if everything was successful, show the first frame
114 and pause. Note that, since mpv is implement rather synchronously
115 itself, do not expect commands to fail in many circumstances - for
116 example, fit he file does not exit, you will likely get an event, but
117 the "loadfile" command itself will run successfully.
118
119 To unpause, we send another command, "set", to set the "pause" property
120 to "no", this time using the "cmd" method, which queues the command, but
121 instead of waiting for a reply, it immediately returns a condvar that
122 cna be used to receive results.
123
124 This should then cause mpv to start playing the video.
125
126 It then again waits two seconds and quits.
127
128 Now, just waiting two seconds is rather, eh, unuseful, so let's look at
129 receiving events (using a somewhat embellished example):
130
131 use AnyEvent;
132 use AnyEvent::MPV;
133
134 my $videofile = "xyzzy.mp4";
135
136 my $quit = AE::cv;
137
138 my $mpv = AnyEvent::MPV->new (
139 trace => 1,
140 args => ["--pause", "--idle=yes"],
141 on_event => sub {
142 my ($mpv, $event, $data) = @_;
143
144 if ($event eq "start-file") {
145 $mpv->cmd ("set", "pause", "no");
146 } elsif ($event eq "end-file") {
147 print "end-file<$data->{reason}>\n";
148 $quit->send;
149 }
150 },
151 );
152
153 $mpv->start;
154 $mpv->cmd (loadfile => $mpv->escape_binary ($videofile));
155
156 $quit->recv;
157
158 This example uses a global condvar $quit to wait for the file to finish
159 playing. Also, most of the logic is now in an "on_event" callback, which
160 receives an event name and the actual event object.
161
162 The two events we handle are "start-file", which is emitted by mpv once
163 it has loaded a new file, and "end-file", which signals the end of a
164 file.
165
166 In the former event, we again set the "pause" property to "no" so the
167 movie starts playing. For the latter event, we tell the main program to
168 quit by invoking $quit.
169
170 This should conclude the basics of operation. There are a few more
171 examples later in the documentation.
172
173 ENCODING CONVENTIONS
174 As a rule of thumb, all data you pass to this module to be sent to mpv
175 is expected to be in unicode. To pass something that isn't, you need to
176 escape it using "escape_binary".
177
178 Data received from $mpv, however, is *not* decoded to unicode, as data
179 returned by mpv is not generally encoded in unicode, and the encoding is
180 usually unspecified. So if you receive data and expect it to be in
181 unicode, you need to first decode it from UTF-8, but note that this
182 might fail. This is not a limitation of this module - mpv simply does
183 not specify nor guarantee a specific encoding, or any encoding at all,
184 in its protocol.
185
186 METHODS
187 $mpv = AnyEvent::MPV->new (key => value...)
188 Creates a new "mpv" object, but does not yet do anything. The
189 support key-value pairs are:
190
191 mpv => $path
192 The path to the mpv binary to use - by default, "mpv" is used
193 and therefore, uses your "PATH" to find it.
194
195 args => [...]
196 Arguments to pass to mpv. These arguments are passed after the
197 hardcoded arguments used by this module, but before the
198 arguments passed ot "start". It does not matter whether you
199 specify your arguments using this key, or in the "start" call,
200 but when you invoke mpv multiple times, typically the arguments
201 used for all invocations go here, while arguments used for
202 specific invocations (e..g filenames) are passed to "start".
203
204 trace => false|true|coderef
205 Enables tracing if true. In trace mode, output from mpv is
206 printed to standard error using a "mpv>" prefix, and commands
207 sent to mpv are printed with a ">mpv" prefix.
208
209 If a code reference is passed, then instead of printing to
210 standard errort, this coderef is invoked with a first arfgument
211 being either "mpv>" or ">mpv", and the second argument being a
212 string to display. The default implementation simply does this:
213
214 sub {
215 warn "$_[0] $_[1]\n";
216 }
217
218 on_eof => $coderef->($mpv)
219 on_event => $coderef->($mpv, $event, $data)
220 on_key => $coderef->($mpv, $string)
221 These are invoked by the default method implementation of the
222 same name - see below.
223
224 $string = $mpv->escape_binary ($string)
225 This module excects all command data sent to mpv to be in unicode.
226 Some things are not, such as filenames. To pass binary data such as
227 filenames through a comamnd, you need to escape it using this
228 method.
229
230 The simplest example is a "loadfile" command:
231
232 $mpv->cmd_recv (loadfile => $mpv->escape_binary ($path));
233
234 $started = $mpv->start (argument...)
235 Starts mpv, passing the given arguemnts as extra arguments to mpv.
236 If mpv is already running, it returns false, otherwise it returns a
237 true value, so you can easily start mpv on demand by calling "start"
238 just before using it, and if it is already running, it will not be
239 started again.
240
241 The arguments passwd to mpv are a set of hardcoded built-in
242 arguments, followed by the arguments specified in the constructor,
243 followed by the arguments passwd to this method. The built-in
244 arguments currently are --no-input-terminal, --really-quiet (or
245 --quiet in "trace" mode), and "--input-ipc-client" (or equivalent).
246
247 Some commonly used and/or even useful arguments you might want to
248 pass are:
249
250 --idle=yes or --idle=once to keep mpv from quitting when you don't
251 specify a file to play.
252 --pause, to keep mpv from instantly starting to play a file, in case
253 you want to inspect/change properties first.
254 --force-window=no (or similar), to keep mpv from instantly opening a
255 window, or to force it to do so.
256 --audio-client-name=yourappname, to make sure audio streams are
257 associated witht eh right program.
258 --wid=id, to embed mpv into another application.
259 --no-terminal, --no-input-default-bindings, --no-input-cursor,
260 --input-conf=/dev/null, --input-vo-keyboard=no - to ensure only you
261 control input.
262
263 The return value can be used to decide whether mpv needs
264 initializing:
265
266 if ($mpv->start) {
267 $mpv->bind_key (...);
268 $mpv->cmd (set => property => value);
269 ...
270 }
271
272 You can immediately starting sending commands when this method
273 returns, even if mpv has not yet started.
274
275 $mpv->stop
276 Ensures that mpv is being stopped, by killing mpv with a "TERM"
277 signal if needed. After this, you can "->start" a new instance
278 again.
279
280 $mpv->on_eof
281 This method is called when mpv quits - usually unexpectedly. The
282 default implementation will call the "on_eof" code reference
283 specified in the constructor, or do nothing if none was given.
284
285 For subclassing, see *SUBCLASSING*, below.
286
287 $mpv->on_event ($event, $data)
288 This method is called when mpv sends an asynchronous event. The
289 default implementation will call the "on_event" code reference
290 specified in the constructor, or do nothing if none was given.
291
292 The first/implicit argument is the $mpv object, the second is the
293 event name (same as "$data->{event}", purely for convenience), and
294 the third argument is the full event object as sent by mpv. See List
295 of events <https://mpv.io/manual/stable/#list-of-events> in its
296 documentation.
297
298 For subclassing, see *SUBCLASSING*, below.
299
300 $mpv->on_key ($string)
301 Invoked when a key declared by "->bind_key" is pressed. The default
302 invokes the "on_key" code reference specified in the constructor
303 with the $mpv object and the key name as arguments, or do nothing if
304 none was given.
305
306 For more details and examples, see the "bind_key" method.
307
308 For subclassing, see *SUBCLASSING*, below.
309
310 $mpv->cmd ($command => $arg, $arg...)
311 Queues a command to be sent to mpv, using the given arguments, and
312 immediately return a condvar.
313
314 See the mpv documentation
315 <https://mpv.io/manual/stable/#list-of-input-commands> for details
316 on individual commands.
317
318 The condvar can be ignored:
319
320 $mpv->cmd (set_property => "deinterlace", "yes");
321
322 Or it can be used to synchronously wait for the command results:
323
324 $cv = $mpv->cmd (get_property => "video-format");
325 $format = $cv->recv;
326
327 # or simpler:
328
329 $format = $mpv->cmd (get_property => "video-format")->recv;
330
331 # or even simpler:
332
333 $format = $mpv->cmd_recv (get_property => "video-format");
334
335 Or you can set a callback:
336
337 $cv = $mpv->cmd (get_property => "video-format");
338 $cv->cb (sub {
339 my $format = $_[0]->recv;
340 });
341
342 On error, the condvar will croak when "recv" is called.
343
344 $result = $mpv->cmd_recv ($command => $arg, $arg...)
345 The same as calling "cmd" and immediately "recv" on its return
346 value. Useful when you don't want to mess with mpv asynchronously or
347 simply needs to have the result:
348
349 $mpv->cmd_recv ("stop");
350 $position = $mpv->cmd_recv ("get_property", "playback-time");
351
352 $mpv->bind_key ($INPUT => $string)
353 This is an extension implement by this module to make it easy to get
354 key events. The way this is implemented is to bind a
355 "client-message" witha first argument of "AnyEvent::MPV" and the
356 $string you passed. This $string is then passed ot the "on_key"
357 handle when the key is proessed, e.g.:
358
359 my $mpv = AnyEvent::MPV->new (
360 on_key => sub {
361 my ($mpv, $key) = @_;
362
363 if ($key eq "letmeout") {
364 print "user pressed escape\n";
365 }
366 },
367 );
368
369 $mpv_>bind_key (ESC => "letmeout");
370
371 The key configuration is lost when mpv is stopped and must be
372 (re-)done after every "start".
373
374 SUBCLASSING
375 Like most perl objects, "AnyEvent::MPV" objects are implemented as
376 hashes, with the constructor simply storing all passed key-value pairs
377 in the object. If you want to subclass to provide your own "on_*"
378 methods, be my guest and rummage around in the internals as much as you
379 wish - the only guarantee that this module dcoes is that it will not use
380 keys with double colons in the name, so youc an use those, or chose to
381 simply not care and deal with the breakage.
382
383 If you don't want to go to the effort of subclassing this module, you
384 can also specify all event handlers as constructor keys.
385
386 SEE ALSO
387 AnyEvent, the mpv command documentation
388 <https://mpv.io/manual/stable/#command-interface>.
389
390 AUTHOR
391 Marc Lehmann <schmorp@schmorp.de>
392 http://home.schmorp.de/
393