summaryrefslogtreecommitdiff
path: root/README.rst
diff options
context:
space:
mode:
Diffstat (limited to 'README.rst')
-rw-r--r--README.rst96
1 files changed, 96 insertions, 0 deletions
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..7016bd7
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,96 @@
+python-mpv
+==========
+
+python-mpv is a ctypes-based python interface to the mpv media player. It gives you more or less full control of all
+features of the player, just as the lua interface does.
+
+Installation
+------------
+
+.. code:: bash
+
+ wget -O mpv.py https://raw.githubusercontent.com/jaseg/python-mpv/master/mpv.py
+
+Seriously though, part of the idea of this being all in one handy file is that you can just copy it into your project.
+That also means you don't need to be afraid of customizing it, as it's really not a lot of code.
+
+Usage
+-----
+
+.. code:: python
+
+ import mpv
+ player = mpv.MPV(ytdl=True)
+ player.play('https://youtu.be/DOmdB7D-pUU')
+
+
+Threading
+~~~~~~~~~
+
+The ``mpv`` module starts one thread for event handling, since MPV sends events that must be processed quickly. The
+event queue has a fixed maxmimum size and some operations can cause a large number of events to be sent.
+
+If you want to handle threading yourself, you can pass ``start_event_thread=False`` to the ``MPV`` constructor and
+manually call the ``MPV`` object's ``_loop`` function. If you have some strong need to not use threads and use some
+external event loop (such as asyncio) instead you can do that, too with some work. The API of the backend C ``libmpv``
+has a function for producing a sort of event file descriptor for a handle. You can use that to produce a file descriptor
+that can be passed to an event loop to tell it to wake up the python-mpv event handler on every incoming event.
+
+All API functions are thread-safe. If one is not, please file an issue on github.
+
+Advanced Usage
+~~~~~~~~~~~~~~
+
+.. code:: python
+
+ #!/usr/bin/env python3
+ import mpv
+
+ def my_log(loglevel, component, message):
+ print('[{}] {}: {}'.format(loglevel, component, message))
+
+ player = mpv.MPV(log_handler=my_log, ytdl=True, input_default_bindings=True, input_vo_keyboard=True)
+
+ # Property access, these can be changed at runtime
+ player.observe_property('time-pos', lambda pos: print('Now playing at {:.2f}s'.format(pos)))
+ player.fullscreen = True
+ player.loop = 'inf'
+ # Option access, in general these require the core to reinitialize
+ player['vo'] = 'opengl'
+
+ def my_q_binding(state, key):
+ if state[0] == 'd':
+ print('THERE IS NO ESCAPE')
+ player.register_key_binding('q', my_q_binding)
+
+ player.play('https://youtu.be/DLzxrzFCyOs')
+ player.wait_for_playback()
+
+ del player
+
+.. code:: python
+
+ #!/usr/bin/env python3
+ import mpv
+
+ player = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True)
+
+ player.playlist_append('https://youtu.be/PHIGke6Yzh8')
+ player.playlist_append('https://youtu.be/Ji9qSuQapFY')
+ player.playlist_append('https://youtu.be/6f78_Tf4Tdk')
+
+ player.playlist_pos = 0
+
+ while True:
+ # To modify the playlist, use player.playlist_{append,clear,move,remove}. player.playlist is read-only
+ print(player.playlist)
+ player.wait_for_playback()
+
+Coding conventions
+------------------
+
+The general aim is `PEP 8`_, with liberal application of the "consistency" section. 120 cells line width. Four spaces.
+No tabs. Probably don't bother making pure-formatting PRs except if you think it *really* helps readability or it
+*really* irks you if you don't.
+
+.. _`PEP 8`: https://www.python.org/dev/peps/pep-0008/