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
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))
;; 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?
(term-send-string mpsyt-proc "\\n")
;; Actually send the command to playurl
(term-simple-send (get-process mpsyt-proc-name)
(format "playurl %s" url)))
(defun pc/mpsyt-url-at-point ()
"Play the URL at point using mpsyt."
(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))
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
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
I started off using the command-line interface of
mpsyt by running it using
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. But, I'm
pretty happy with how this all works, right now.