For some time I've been using a custom-made function for
emms-track-description-function with the vlc player.  Recently I started
using the mpv player with EMMS and with that my custom function causes
an error every time a track is read, exemplified by the following
backtrace:

Debugger entered--Lisp error: (json-readtable-error 61)
  json-read()
  
json-read-from-string("=====================================================================================")
  
emms-player-mpv-ipc-recv("=====================================================================================")
  emms-player-mpv-ipc-filter(#<process emms-player-mpv-ipc> 
"{\"event\":\"playback-restart\"}\n")

My custom function adds lines to the playlist buffer that lack the
emms-track property, and apparently the mpv backend does not handle
these.  I've worked around the error with the following advice:

(advice-add #'emms-player-mpv-ipc-recv :before-while
            (lambda (s) (string-match "^{" s)))

I don't know if this error is due to a bug in the mpv backend or if my
custom function is unsupported.  If the latter, it would be helpful to
document the expected format.  If this is really a bug in the mpv
backend, replacing the above advice with the attached patch prevents the
error for me, but I know nothing about the implementation of the mpv
JSON IPC interface, so there is probably a better fix.

Steve Berman

diff --git a/emms-player-mpv.el b/emms-player-mpv.el
index 4b7b908..1683380 100644
--- a/emms-player-mpv.el
+++ b/emms-player-mpv.el
@@ -651,19 +651,20 @@ errors, if any."
 Only used with JSON IPC, never called with --input-file as
 there's no feedback there."
   (emms-player-mpv-debug-msg "json << %s" json)
-  (let*
-      ((json-data (json-read-from-string json))
-       (req-id (alist-get 'request_id json-data))
-       (ev (alist-get 'event json-data)))
-    (when req-id
-      ;; Response to command
-      (emms-player-mpv-ipc-req-resolve req-id
-                                       (alist-get 'data json-data)
-                                       (alist-get 'error json-data)))
-    (when ev
-      ;; mpv event
-      (emms-player-mpv-event-handler json-data)
-      (run-hook-with-args 'emms-player-mpv-event-functions json-data))))
+  (when (string-match "^{" json)
+    (let*
+	((json-data (json-read-from-string json))
+	 (req-id (alist-get 'request_id json-data))
+	 (ev (alist-get 'event json-data)))
+      (when req-id
+	;; Response to command
+	(emms-player-mpv-ipc-req-resolve req-id
+					 (alist-get 'data json-data)
+					 (alist-get 'error json-data)))
+      (when ev
+	;; mpv event
+	(emms-player-mpv-event-handler json-data)
+	(run-hook-with-args 'emms-player-mpv-event-functions json-data)))))

 (defun emms-player-mpv-ipc-fifo-cmd (cmd &optional proc)
   "Send --input-file command string for older mpv versions.

Reply via email to