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)) (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
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.
 - Isn’t it true, more often than not?