I’ve started using the wonderful mpsyt to play any music from youtube, since
I’m not really interested in the video. But, since I use emacs for chat/IRC, I
end up getting youtube links into emacs and opening them opens them up in my
browser. I ended up writing some elisp
to play the songs from within an
instance of mpsyt
running inside an emacs buffer.
(defun pc/short-url-at-point ()
"Gets the short url at point.
This function is required only because
`thing-at-point-url-at-point' ignores urls (without a scheme)
that don't start with www."
(let ((bounds (thing-at-point-bounds-of-url-at-point t)))
(when (and bounds (< (car bounds) (cdr bounds)))
(buffer-substring-no-properties (car bounds) (cdr bounds)))))
(defun pc/mpsyt-url (url)
(let ((buffer (current-buffer))
(mpsyt-proc-name "*mpsyt*"))
;; Start a new term with *mpsyt* if there isn't one
(unless (get-process mpsyt-proc-name)
(when (get-buffer mpsyt-proc-name)
(kill-buffer (get-buffer mpsyt-proc-name)))
(ansi-term "mpsyt" "mpsyt"))
;; Play given url in mpsyt
(let ((mpsyt-proc (get-process mpsyt-proc-name)))
;; If something is already playing, stop it and play this...
(term-send-string mpsyt-proc "\n\n\n")
;; We wait for a bit, since looking for the prompt seems to fail, sometimes?
(sleep-for 1)
(term-send-string mpsyt-proc "\n")
;; Actually send the command to playurl
(term-simple-send (get-process mpsyt-proc-name)
(format "playurl %s" url)))
(switch-to-buffer buffer)))
(defun pc/mpsyt-url-at-point ()
"Play the URL at point using mpsyt."
(interactive)
(let ((url (or (url-get-url-at-point) (pc/short-url-at-point))))
(if (not url)
(message "No URL found")
(message (format "Playing %s with mpsyt" url))
(pc/mpsyt-url url))))
The current version of mpsyt crashes when run from inside emacs due to a bug in the code to get the terminal size, which should be fixed once this patch is merged.
I would’ve expected thing-at-point-url-at-point
to be able to find urls even
when they don’t have a schema, but it tries to guess the schema from urls and
fails to work when the url starts with youtube.com
instead of
www.youtube.com
.
I started off using the command-line interface of mpsyt
by running it using
shell-command
or start-process
. But, it seemed useful to have a buffer of
mpsyt
to switch to – easier to search for new music, repeating songs, etc.
Not all tasks/actions are achievable through mpsyt
’s command line args.
I ended up writing more code than I thought I would have to[1]. But, I’m pretty happy with how this all works, right now.
[1] - Isn’t it true, more often than not?