json-read error with mpv and custom track description

Stephen Berman <[email protected]>
Newsgroups gmane.emacs.emms.user
Message-ID <[email protected]>
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
emms-player-mpv-ipc-recv.diff (text/x-patch, 1.4 KB)
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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.