summaryrefslogtreecommitdiffhomepage
path: root/media/jao-mpris.el
diff options
context:
space:
mode:
Diffstat (limited to 'media/jao-mpris.el')
-rw-r--r--media/jao-mpris.el128
1 files changed, 128 insertions, 0 deletions
diff --git a/media/jao-mpris.el b/media/jao-mpris.el
new file mode 100644
index 0000000..195ffce
--- /dev/null
+++ b/media/jao-mpris.el
@@ -0,0 +1,128 @@
+;;; jao-mpris.el --- mpris players control -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020 jao
+
+;; Author: jao <mail@jao.io>
+;; Keywords: multimedia
+
+;; This program 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.
+
+;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; controlling and showing info on mpris players
+
+;;; Code:
+
+(require 'dbus)
+(require 'jao-minibuffer)
+(require 'jao-emms-info-track)
+
+(defun jao-mpris--playerctl (&rest args)
+ (shell-command-to-string (format "playerctl %s"
+ (mapconcat #'shell-quote-argument args " "))))
+
+(defmacro jao-playerctl--def (name &rest args)
+ `(defun ,name () (interactive) (jao-mpris--playerctl ,@args)))
+
+(jao-playerctl--def jao-mpris-play-pause "play-pause")
+(jao-playerctl--def jao-mpris-next "next")
+(jao-playerctl--def jao-mpris-previous "previous")
+
+(defun jao-playerctl--status (&optional sep)
+ (let* ((sep (or sep " ||| "))
+ (fmt (mapconcat 'identity
+ '("{{status}}"
+ "{{xesam:trackNumber}}"
+ "{{title}}"
+ "{{artist}}"
+ "{{album}}"
+ "{{duration(mpris:length)}}")
+ sep))
+ (m (jao-mpris--playerctl "metadata" "--format" fmt)))
+ (split-string (car (split-string m "\n")) sep)))
+
+;;;###autoload
+(defun jao-mpris-status-times ()
+ (interactive)
+ (let ((m (jao-mpris--playerctl "metadata" "--format"
+ (concat "{{duration(position)}}/"
+ "{{duration(mpris:length)}}"))))
+ (jao-notify (string-trim m) "Playing")))
+
+;;;###autoload
+(defun jao-mpris-show-osd ()
+ (interactive)
+ (jao-notify jao-spotify-track-string))
+
+;;;###autoload
+(defun jao-mpris-artist-title ()
+ (when-let (s (jao-mpris--playerctl "metadata"
+ "--format"
+ "{{artist}}|||{{title}}"))
+ (let ((s (split-string (string-trim s) "|||")))
+ (cons (car s) (cadr s)))))
+
+(defvar jao-mpris-track-string "")
+
+(defun jao-mpris--track (&rest info)
+ (let ((cs (or info (jao-playerctl--status))))
+ (if (string= "Playing" (or (elt cs 0) ""))
+ (let* ((track (format "%s" (elt cs 1)))
+ (title (elt cs 2))
+ (artist (elt cs 3))
+ (album (elt cs 4))
+ (length (elt cs 5))
+ (duration (cond ((stringp length) length)
+ ((numberp length)
+ (jao-emms--fmt-time (/ length 1e6) "")))))
+ (setq jao-mpris-track-string
+ (format "♪ %s %s %s%s%s"
+ (jao--put-face track 'jao-emms-font-lock-track)
+ (jao--put-face title 'jao-emms-font-lock-title)
+ (jao--put-face artist 'jao-emms-font-lock-artist)
+ (jao--put-face (if album (format " (%s)" album) "")
+ 'jao-emms-font-lock-album)
+ (if duration (format " [%s]" duration) ""))))
+ (setq jao-mpris-track-string "")))
+ (jao-minibuffer-refresh))
+
+(jao-minibuffer-add-variable 'jao-mpris-track-string t)
+
+(defun jao-mpris--handler (iname properties &rest args)
+ (when properties
+ (let ((st (caadr (assoc "PlaybackStatus" properties)))
+ (md (caadr (assoc "Metadata" properties))))
+ (cond ((and st (not (string= "Playing" st)))
+ (setq jao-spotify-track-string ""))
+ (md (let ((tno (caadr (assoc "xesam:trackNumber" md)))
+ (tlt (caadr (assoc "xesam:title" md)))
+ (art (caaadr (assoc "xesam:artist" md)))
+ (alb (caadr (assoc "xesam:album" md)))
+ (len (caadr (assoc "mpris:length" md))))
+ (setq jao-debug md)
+ (jao-mpris--track "Playing" tno tlt art alb len)))))))
+
+
+;;;###autoload
+(defun jao-mpris-minibuffer-register (name &optional bus)
+ (dbus-register-signal (or bus :session)
+ name
+ "/org/mpris/MediaPlayer2"
+ "org.freedesktop.DBus.Properties"
+ "PropertiesChanged"
+ 'jao-mpris--handler))
+
+
+(provide 'jao-mpris)
+;;; jao-mpris.el ends here