emms-player-simple-mpv
emms-player-simple-mpv copied to clipboard
An extension of emms-player-simple.el for mpv JSON IPC
[[https://melpa.org/#/emms-player-simple-mpv][file:https://melpa.org/packages/emms-player-simple-mpv-badge.svg]] [[https://stable.melpa.org/#/emms-player-simple-mpv][file:https://stable.melpa.org/packages/emms-player-simple-mpv-badge.svg]]
-
emms-player-simple-mpv
emms-player-simple-mpv.el is an extension of emms-player-simple.el for mpv JSON IPC. It provides basic functions for interface defined in EMMS ( [[https://www.gnu.org/software/emms/][The Emacs Multimedia System]] ).
emms-player-simple-mpv-control-functions.el provides other functions to control mpv.
The following example configuration files are available:
- emms-player-simple-mpv-e.g.time-display.el
- emms-player-simple-mpv-e.g.playlist-fname.el
- emms-player-simple-mpv-e.g.hydra.el
** Table of contents :toc_4:
- [[#emms-player-simple-mpv][emms-player-simple-mpv]]
- [[#requirements][Requirements]]
- [[#setup][Setup]]
- [[#usage][Usage]]
- [[#customization][Customization]]
- [[#macro-define-emms-simple-player-mpv-name-types-regex-command-rest-args][Macro: =define-emms-simple-player-mpv= /name/ /types/ /regex/ /command/ /&rest/ /args/ ]]
- [[#function-emms-player-simple-mpv-add-to-converters-player-regexp-types-fn-optional-appendp][Function: =emms-player-simple-mpv-add-to-converters= /player/ /regexp/ /types/ /fn/ /&optional/ /appendp/ ]]
- [[#user-option-emms-player-simple-mpv-use-volume-change-function-p][User Option: =emms-player-simple-mpv-use-volume-change-function-p= ]]
- [[#minor-mode-emms-player-simple-mpv-keep-volume-mode][Minor Mode: =emms-player-simple-mpv-keep-volume-mode= ]]
- [[#minor-mode-emms-player-simple-mpv-keep-speed-mode][Minor Mode: =emms-player-simple-mpv-keep-speed-mode= ]]
- [[#user-option-emms-player-simple-mpv-keep-properties][User Option: =emms-player-simple-mpv-keep-properties= ]]
- [[#user-option-emms-player-simple-mpv-ipc-dir][User Option: =emms-player-simple-mpv-ipc-dir= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-pause-hook][User Option: =emms-player-simple-mpv-tq-event-pause-hook= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-unpause-hook][User Option: =emms-player-simple-mpv-tq-event-unpause-hook= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-playback-restart-hook][User Option: =emms-player-simple-mpv-tq-event-playback-restart-hook= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-property-change-functions-alist][User Option: =emms-player-simple-mpv-tq-event-property-change-functions-alist= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-filename-functions][User Option: =emms-player-simple-mpv-tq-event-filename-functions= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-volume-functions][User Option: =emms-player-simple-mpv-tq-event-volume-functions= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-speed-functions][User Option: =emms-player-simple-mpv-tq-event-speed-functions= ]]
- [[#user-option-emms-player-simple-mpv-tq-event-duration-functions][User Option: =emms-player-simple-mpv-tq-event-duration-functions= ]]
- [[#example-configuration-files][Example configuration files]]
- [[#emms-player-simple-mpv-egtime-displayel][emms-player-simple-mpv-e.g.time-display.el]]
- [[#emms-player-simple-mpv-egplaylist-fnameel][emms-player-simple-mpv-e.g.playlist-fname.el]]
- [[#emms-player-simple-mpv-eghydrael][emms-player-simple-mpv-e.g.hydra.el]]
- [[#some-examples-of-defining-specific-emms-simple-players-of-mpv][Some examples of defining specific emms simple players of mpv]]
- [[#emms-player-simple-mpv-playlist-mode][emms-player-simple-mpv-playlist-mode]]
- [[#setup-1][Setup]]
- [[#usage-1][Usage]]
- [[#customization-1][Customization]]
- [[#user-option-emms-player-simple-mpv-playlist-mode-display-action][User Option: =emms-player-simple-mpv-playlist-mode-display-action= ]]
- [[#user-option-emms-player-simple-mpv-playlist-mode-format-function][User Option: =emms-player-simple-mpv-playlist-mode-format-function= ]]
- [[#variable-emms-player-simple-mpv-playlist-mode-map][Variable: =emms-player-simple-mpv-playlist-mode-map= ]]
- [[#function-emms-player-simple-mpv-playlist-mode-setup-keybinds][Function: =emms-player-simple-mpv-playlist-mode-setup-keybinds= ]]
- [[#references][References]]
** Requirements
- GNU Emacs 24 or later
- EMMS 4.0 or later
- mpv v0.10.0 or later ( [[https://github.com/mpv-player/mpv]] )
- Unix Sockets
Tested on GNU Emacs 25.3.1 (emacs-mac-app 6.7_0), EMMS 4.3, mpv v0.26.0.
** Setup
#+BEGIN_SRC emacs-lisp (add-to-list 'load-path "/path/to/emms-player-simple-mpv") (require 'emms-player-simple-mpv) ;; This plugin provides control functions (e.g. ab-loop, speed, fullscreen). (require 'emms-player-simple-mpv-control-functions) #+END_SRC
** Usage
#+BEGIN_SRC emacs-lisp
;; An example of setting like emms-player-mplayer.el
;; emms-player-my-mpv' is defined in this case. (define-emms-simple-player-mpv my-mpv '(file url streamlist playlist) (concat "\\
\(http[s]?\|mms\)://\|"
(apply #'emms-player-simple-regexp
"aac" "pls" "m3u"
emms-player-base-format-list))
"mpv" "--no-terminal" "--force-window=no" "--audio-display=no")
(emms-player-simple-mpv-add-to-converters
'emms-player-my-mpv "." '(playlist)
(lambda (track-name) (format "--playlist=%s" track-name)))
(add-to-list 'emms-player-list 'emms-player-my-mpv)
(dolist (map (list emms-playlist-mode-map
emms-stream-mode-map))
(define-key map (kbd "m") 'emms-player-simple-mpv-mute)
(define-key map (kbd "[") 'emms-player-simple-mpv-speed-decrease)
(define-key map (kbd "]") 'emms-player-simple-mpv-speed-increase)
(define-key map (kbd "{") 'emms-player-simple-mpv-speed-halve)
(define-key map (kbd "}") 'emms-player-simple-mpv-speed-double)
(define-key map (kbd "<backspace>") 'emms-player-simple-mpv-speed-normal)
(define-key map (kbd "T") 'emms-player-simple-mpv-ontop)
(define-key map (kbd "F") 'emms-player-simple-mpv-fullscreen)
(define-key map (kbd "9") 'emms-volume-lower)
(define-key map (kbd "0") 'emms-volume-raise))
(let ((map emms-playlist-mode-map))
(define-key map (kbd ",") 'emms-player-simple-mpv-playlist-prev)
(define-key map (kbd ".") 'emms-player-simple-mpv-playlist-next))
#+END_SRC
#+BEGIN_SRC elisp
;; Playing YouTube playlist in reverse order.
;; emms-player-my-mpv-ytpl-reverse' will be defined in this case. (define-emms-simple-player-mpv my-mpv-ytpl-reverse '(url) "\\
http[s]://www\.youtube\.com/playlist\?list="
"mpv" "--no-terminal" "--force-window=no" "--audio-display=no"
"--ytdl" "--ytdl-raw-options=playlist-reverse=")
(add-to-list 'emms-player-list 'emms-player-my-mpv-ytpl-reverse)
#+END_SRC
M-x =emms-player-simple-mpv-playlist-popup= can display playlist
** Customization
**** Macro: =define-emms-simple-player-mpv= /name/ /types/ /regex/ /command/ /&rest/ /args/
This macro emulates =define-emms-simple-player=. See EMMS Manual [[https://www.gnu.org/software/emms/manual/Simple-Players.html#Simple-Players][11 Simple Players]].
**** Function: =emms-player-simple-mpv-add-to-converters= /player/ /regexp/ /types/ /fn/ /&optional/ /appendp/
This function adds a list (/regexp/ /types/ /fn/) to player's =mpv-track-name-converters=.
/fn/ converts track name to input form
when mpv needs specific format such as ffplay format for playing some protocols.
**** User Option: =emms-player-simple-mpv-use-volume-change-function-p=
Default value is =t=.
If the variable is non-nil,
=emms-player-simple-mpv-volume-change= is used as =emms-volume-change-function=
while an emms simple player of mpv is running.
**** Minor Mode: =emms-player-simple-mpv-keep-volume-mode=
If it is non-nil, the last volume value is used when new track starts.
=(emms-player-simple-mpv-keep-volume-mode 1)= provides it.
M-x =emms-player-simple-mpv-keep-volume-mode= toggles it.
**** Minor Mode: =emms-player-simple-mpv-keep-speed-mode=
If it is non-nil, the last speed value is used when new track starts.
Only track type of file is available.
=(emms-player-simple-mpv-keep-speed-mode 1)= provides it.
M-x =emms-player-simple-mpv-keep-speed-mode= toggles it.
**** User Option: =emms-player-simple-mpv-keep-properties=
Alist of property name, function and symbol which has the last value.
The function which checks the last value is available takes no arguments and returns boolean.
**** User Option: =emms-player-simple-mpv-ipc-dir=
The directory name for IPC. If nil, =temporary-file-directory= will be used.
Default value is =nil=.
**** User Option: =emms-player-simple-mpv-tq-event-pause-hook=
Normal hook run when TQ process receives "pause" from mpv.
**** User Option: =emms-player-simple-mpv-tq-event-unpause-hook=
Normal hook run when TQ process receives "unpause" from mpv.
**** User Option: =emms-player-simple-mpv-tq-event-playback-restart-hook=
Normal hook run when TQ process receives "playback-restart" from mpv.
**** User Option: =emms-player-simple-mpv-tq-event-property-change-functions-alist=
Alist of property name and abnormal hook.
When TQ process receives "property-change", an abnormal hook is run.
**** User Option: =emms-player-simple-mpv-tq-event-filename-functions=
Abnormal hook run with one argument which is filename.
=emms-player-simple-mpv-tq-event-property-change-functions-alist= includes it.
**** User Option: =emms-player-simple-mpv-tq-event-volume-functions=
Abnormal hook run with one argument which is volume.
=emms-player-simple-mpv-tq-event-property-change-functions-alist= includes it.
**** User Option: =emms-player-simple-mpv-tq-event-speed-functions=
Abnormal hook run with one argument which is speed.
=emms-player-simple-mpv-tq-event-property-change-functions-alist= includes it.
**** User Option: =emms-player-simple-mpv-tq-event-duration-functions=
Abnormal hook run with one argument which is duration.
** Example configuration files
*** emms-player-simple-mpv-e.g.time-display.el
This file is an example configuration for =emms-playing-time-display= to synchronize with =time-pos= of mpv.
=(requre 'emms-player-simple-mpv-e.g.time-display)= provides it.
*** emms-player-simple-mpv-e.g.playlist-fname.el
This file is an example configuration for displaying =filename= of mpv for each track
when a playlist file is used.
=(requre 'emms-player-simple-mpv-e.g.playlist-fname)= provides it.
*** emms-player-simple-mpv-e.g.hydra.el
This file is an example configuration for hydra ( [[https://github.com/abo-abo/hydra]] ).
It emulates default key bindings of mpv player.
=(requre 'emms-player-simple-mpv-e.g.hydra)= provides it.
#+BEGIN_SRC elisp
;; This variable can be set before loading.
(setq emms-player-simple-mpv-hydra-docstring "mpv hydra\n")
(require 'emms-player-simple-mpv-e.g.hydra)
#+END_SRC
*** Some examples of defining specific emms simple players of mpv
+ [[https://github.com/momomo5717/emms-player-mpv-jp-radios]]
** emms-player-simple-mpv-playlist-mode
Major mode for displaying mpv playlist.
*** Setup
#+BEGIN_SRC elisp (require 'emms-player-simple-mpv-playlist-mode)
;; Some mpv control functions can be added to `emms-player-simple-mpv-playlist-mode-map'. (emms-player-simple-mpv-playlist-mode-setup-keybinds) #+END_SRC
*** Usage
M-x =emms-player-simple-mpv-playlist-popup=
Some commands are defined:
- [[#variable-emms-player-simple-mpv-playlist-mode-map][Variable: =emms-player-simple-mpv-playlist-mode-map= ]]
- [[#function-emms-player-simple-mpv-playlist-mode-setup-keybinds][Function: =emms-player-simple-mpv-playlist-mode-setup-keybinds= ]]
*** Customization
**** User Option: =emms-player-simple-mpv-playlist-mode-display-action=
This will be used for the action arg of =display-buffer= in =emms-player-simple-mpv-playlist-popup=.
Default value is
#+BEGIN_SRC elisp
'((display-buffer-reuse-window
display-buffer-at-bottom
display-buffer-pop-up-window)
(window-height . 0.3))
#+END_SRC
**** User Option: =emms-player-simple-mpv-playlist-mode-format-function=
This can be set to a function name which is used for formatting a entry.
The function takes a entry and the position as arguments.
Default value is =emms-player-simple-mpv-playlist-mode-default-format-function=.
**** Variable: =emms-player-simple-mpv-playlist-mode-map=
Keymap for =emms-player-simple-mpv-playlist-mode= the parent of which is =special-mode=.
The following keys are added.
| Key | Action |
|----------+--------------------------------------------------------------|
| ~RET~ | Play the entry at point. |
| ~d~ | Remove the entry at point. |
| ~M-up~ | Move up the entry at point. |
| ~M-down~ | Move down the entry at point. |
| ~>~ | Call playlist-next. |
| ~<~ | Call playlist-prev. |
| ~r~ | Call playlist-shuffle. |
| ~R~ | Call playlist-shuffle and set playlist-pos to 0. |
| ~g~ | Reload the playlist. |
| ~.~ | Refresh the playlist (point will move to the current entry.) |
| ~c~ | Go to the current entry point. |
**** Function: =emms-player-simple-mpv-playlist-mode-setup-keybinds=
The following keys will be added to =emms-player-simple-mpv-playlist-mode-map=.
| Key | Action |
|---------------+------------------------|
| ~m~ | Toggle mute. |
| ~p~ | Toggle pause. |
| ~<left>/~ | Seek -5 sec. |
| ~<right>~ | Seek +5 sec. |
| ~S-<left>~ | Seek -1 sec. |
| ~S-<right>~ | Seek +1 sec. |
| ~[~ | Decrease speed. |
| ~]~ | Increase speed. |
| ~{~ | Halve speed. |
| ~}~ | Double speed. |
| ~<backspace>~ | Reset speed to normal. |
| ~T~ | Toggle ontop. |
| ~f~ | Toggle fullscreen |
| ~9~ | Decrease volume |
| ~0~ | Increase volume |
| ~l~ | Call ab-loop. |
** References
- emms-player-mpv ( [[https://github.com/dochang/emms-player-mpv]] )
- mpv.el ( [[https://github.com/kljohann/mpv.el]] )
- mpv reference manual ( [[https://mpv.io/manual/]] )