diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/emms-player-mpv.el | 127 | ||||
-rw-r--r-- | lisp/emms-setup.el | 2 |
2 files changed, 129 insertions, 0 deletions
diff --git a/lisp/emms-player-mpv.el b/lisp/emms-player-mpv.el new file mode 100644 index 0000000..6d67f8c --- /dev/null +++ b/lisp/emms-player-mpv.el @@ -0,0 +1,127 @@ +;;; emms-player-mpv.el --- mpv support for EMMS + +;; Copyright (C) 2013-2018 ZHANG Weiyi +;; Copyright (C) 2014 Alex Kost +;; Copyright (C) 2018 stardiviner <numbchild@gmail.com> +;; Copyright (C) 2018 Free Software Foundation, Inc. + +;; Authors: ZHANG Weiyi <dochang@gmail.com>, +;; Alex Kost <alezost@gmail.com>, +;; stardiviner <numbchild@gmail.com> + +;; This file is part of EMMS. + +;; EMMS is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. + +;; EMMS is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with EMMS; if not, write to the Free Software Foundation, +;; Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; This provides a player that uses mpv. It supports pause and +;; seeking. See mpv manual for more. +;; +;; To load subtitles automatically, +;; put "`sub-auto=fuzzy"` in the mpv's config file. +;; +;; To disable the cover display when playing music, use the following: +;; (add-to-list 'emms-player-mpv-parameters "--no-audio-display") +;; Alternatively you can also add "audio-display=no" to mpv's config file. +;; +;; This file is based on `emms-player-mplayer.el'. It was originally hosted at +;; https://github.com/dochang/emms-player-mpv. + +;;; Code: + +(require 'emms-compat) +(require 'emms-player-simple) + +(defcustom emms-player-mpv-input-file + (expand-file-name (locate-user-emacs-file "emms-mpv-input-file")) + "The file to send command to mpv." + :type 'file + :group 'emms) + +(define-emms-simple-player mpv '(file url streamlist playlist) + (concat "\\`\\(https?\\|mms\\)://\\|" + (emms-player-simple-regexp + "ogg" "mp3" "wav" "mpg" "mpeg" "wmv" "wma" + "mov" "avi" "divx" "ogm" "ogv" "asf" "mkv" + "rm" "rmvb" "mp4" "flac" "vob" "m4a" "ape" + "flv" "webm" "m4b" "m4p" "m4v" "m4r" "3gp" + "aac")) + "mpv" "--quiet" "--really-quiet") + +(defadvice emms-player-mpv-start (around append-arguments activate) + (unless (file-exists-p emms-player-mpv-input-file) + (call-process "mkfifo" nil nil nil emms-player-mpv-input-file)) + (let* ((input-file (format "--input-file=%s" emms-player-mpv-input-file)) + (track-arg (let* ((track (ad-get-arg 0)) + (track-type (emms-track-get track 'type)) + (track-name (emms-track-name track))) + (if (memq track-type '(streamlist playlist)) + (format "--playlist=%s" track-name) + track-name))) + (process (apply 'start-process + emms-player-simple-process-name + nil + emms-player-mpv-command-name + (append emms-player-mpv-parameters + (list input-file track-arg))))) + (set-process-sentinel process 'emms-player-simple-sentinel)) + (emms-player-started emms-player-mpv)) + +(emms-player-set emms-player-mpv + 'pause + 'emms-player-mpv-pause) + +(emms-player-set emms-player-mpv + 'resume + 'emms-player-mpv-resume) + +(emms-player-set emms-player-mpv + 'seek + 'emms-player-mpv-seek) + +(emms-player-set emms-player-mpv + 'seek-to + 'emms-player-mpv-seek-to) + +(defun emms-player-mpv--format-command (fmt &rest args) + "Generate shell command to control mpv." + (let ((mpv-cmd (apply 'format fmt args))) + (format "echo %s > %s" + (shell-quote-argument mpv-cmd) + (shell-quote-argument emms-player-mpv-input-file)))) + +(defun emms-player-mpv-pause () + "Depends on mpv's --input-file option." + (let ((cmd (emms-player-mpv--format-command "set pause yes"))) + (call-process-shell-command cmd nil nil nil))) + +(defun emms-player-mpv-resume () + "Depends on mpv's --input-file option." + (let ((cmd (emms-player-mpv--format-command "set pause no"))) + (call-process-shell-command cmd nil nil nil))) + +(defun emms-player-mpv-seek (sec) + "Depends on mpv's --input-file option." + (let ((cmd (emms-player-mpv--format-command "seek %d" sec))) + (call-process-shell-command cmd nil nil nil))) + +(defun emms-player-mpv-seek-to (sec) + "Depends on mpv's --input-file option." + (let ((cmd (emms-player-mpv--format-command "seek %d absolute" sec))) + (call-process-shell-command cmd nil nil nil))) + +(provide 'emms-player-mpv) +;;; emms-player-mpv.el ends here diff --git a/lisp/emms-setup.el b/lisp/emms-setup.el index 47260b5..fde9212 100644 --- a/lisp/emms-setup.el +++ b/lisp/emms-setup.el @@ -52,6 +52,7 @@ emms-player-ogg123 emms-player-mplayer-playlist emms-player-mplayer + emms-player-mpv emms-player-vlc emms-player-vlc-playlist) "*Default list of players for emms-setup." @@ -66,6 +67,7 @@ Invisible playlists and all the basics for playing media." (require 'emms-source-playlist) (require 'emms-player-simple) (require 'emms-player-mplayer) + (require 'emms-player-mpv) (require 'emms-player-vlc)) ;;;###autoload |