diff options
| -rw-r--r-- | eos/sys/jao-ednc.el (renamed from sys/jao-ednc.el) | 0 | ||||
| -rw-r--r-- | eos/sys/jao-embark.el | 62 | ||||
| -rw-r--r-- | eos/sys/jao-minibuffer.el (renamed from sys/jao-minibuffer.el) | 0 | ||||
| -rw-r--r-- | eos/sys/jao-notify.el (renamed from sys/jao-notify.el) | 0 | ||||
| -rw-r--r-- | eos/sys/jao-osd.el (renamed from sys/jao-osd.el) | 0 | ||||
| -rw-r--r-- | eos/sys/jao-sleep.el (renamed from sys/jao-sleep.el) | 0 | ||||
| -rw-r--r-- | media/espotify.org | 58 | ||||
| -rw-r--r-- | readme.org | 2 | 
8 files changed, 100 insertions, 22 deletions
diff --git a/sys/jao-ednc.el b/eos/sys/jao-ednc.el index 03d4049..03d4049 100644 --- a/sys/jao-ednc.el +++ b/eos/sys/jao-ednc.el diff --git a/eos/sys/jao-embark.el b/eos/sys/jao-embark.el new file mode 100644 index 0000000..9572489 --- /dev/null +++ b/eos/sys/jao-embark.el @@ -0,0 +1,62 @@ +;;; jao-embark.el --- embark actions                 -*- lexical-binding: t; -*- + +;; Copyright (C) 2021  jao + +;; Author: jao <mail@jao.io> +;; Keywords: convenience + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program.  If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Actions and utilities for embark + +;;; Code: + +(require 'embark) + +(defvar jao-embark-video-url-rx +  (format "^https?://\\(?:www\\.\\)?%s/.+" +          (regexp-opt '("youtu.be" +                        "youtube.com" +                        "blip.tv" +                        "vimeo.com" +                        "infoq.com") +                      t)) +  "A regular expression matching URLs that point to video streams") + +(defun jao-embark-video-finder () +  "Check whether we're looking at a video URL. +Return (video-url . <URL>) if so." +  (when-let ((url (thing-at-point-url-at-point))) +    (when (string-match-p jao-embark-video-url-rx url) +      (cons 'video-url url)))) + +(defun jao-embark-play-video-url (&optional url) +  (interactive "sURL: ") +  (let ((cmd (format "mpv %s" (shell-quote-argument url)))) +    (start-process-shell-command "mpv" nil cmd))) + +(add-to-list 'embark-target-finders #'jao-embark-video-finder) + +(embark-define-keymap jao-embark-video-url-map +  "Actions on URLs pointing to remote video streams." +  ("p" jao-embark-play-video-url) +  ("b" browse-url) +  ("f" browse-url-firefox)) + +(add-to-list 'embark-keymap-alist '(video-url . jao-embark-video-url-map)) + +(provide 'jao-embark) +;;; jao-embark.el ends here diff --git a/sys/jao-minibuffer.el b/eos/sys/jao-minibuffer.el index b626151..b626151 100644 --- a/sys/jao-minibuffer.el +++ b/eos/sys/jao-minibuffer.el diff --git a/sys/jao-notify.el b/eos/sys/jao-notify.el index dc48ca4..dc48ca4 100644 --- a/sys/jao-notify.el +++ b/eos/sys/jao-notify.el diff --git a/sys/jao-osd.el b/eos/sys/jao-osd.el index acdc629..acdc629 100644 --- a/sys/jao-osd.el +++ b/eos/sys/jao-osd.el diff --git a/sys/jao-sleep.el b/eos/sys/jao-sleep.el index 93da0e7..93da0e7 100644 --- a/sys/jao-sleep.el +++ b/eos/sys/jao-sleep.el diff --git a/media/espotify.org b/media/espotify.org index 6c07259..5cc0fee 100644 --- a/media/espotify.org +++ b/media/espotify.org @@ -11,10 +11,6 @@ track or album identifier that we can send then to the latter to play,  with emacs completion mechanisms (consult and friends in this case)  providing the glue between both worlds. -Note: you can access this post as an ~org~ file in my [[https://codeberg.org/jao/elibs/src/branch/main/media/espotify.org][jao/elibs -repository]], and transform it to an emacs-lisp file with ~M-x -org-babel-tangle~. -  Let's start with an umbrella customization group:  #+begin_src emacs-lisp    ;;; espotify.el - spotify search and play -  -*- lexical-binding: t; -*- @@ -197,6 +193,19 @@ Let's start with an umbrella customization group:    | album_type    | artists   | available_markets | external_urls | href | id     | images | name       | release_date | release_date_precision | total_tracks | type | uri |    | external_urls | followers | genres            | href          | id   | images | name   | popularity | type         | uri                    |              |      |     | +  Another strategy would be to search for several types and pass to +  our callback the concatenation of all items: + +  #+begin_src emacs-lisp +    (defun espotify-search-all (callback term &optional types filter) +      (let ((types (or types '(album track artist playlist)))) +        (espotify-search* (lambda (&rest items) +                            (funcall callback (apply append items))) +                          term +                          types +                          filter))) +  #+end_src +  * Sending commands to local players    Once we now the URI we want to play (that ~uri~ entry in our items), @@ -283,7 +292,7 @@ Let's start with an umbrella customization group:              ((or 'setup 'refresh) (funcall next action))              ('destroy (setq candidates nil) (funcall next 'destroy))              ((pred stringp) -             (espotify-search* +             (espotify-search-all                (lambda (x)                  (setq candidates (mapcar 'espotify--format-item x))                  (funcall next candidates)) @@ -339,6 +348,26 @@ Let's start with an umbrella customization group:         (espotify--maybe-play (consult-spotify-by 'album filter)))     #+end_src +   And likewise for playlists, artists and combinations thereof: + +  #+begin_src emacs-lisp +     (defun consult-spotify-artist (&optional filter) +       (interactive) +       (espotify--maybe-play (consult-spotify-by 'artist filter))) +  #+end_src + +  #+begin_src emacs-lisp +     (defun consult-spotify-track (&optional filter) +       (interactive) +       (espotify--maybe-play (consult-spotify-by 'track filter))) +  #+end_src + +  #+begin_src emacs-lisp +     (defun consult-spotify-playlist (&optional filter) +       (interactive) +       (espotify--maybe-play (consult-spotify-by 'playlist filter))) +  #+end_src +  * Adding metadata to candidates using Marginalia    Let's add metadata fields to our candidates, so that packages like @@ -358,28 +387,15 @@ Let's start with an umbrella customization group:      (add-to-list 'marginalia-annotators-heavy                   (cons 'spotify-query-result 'espotify-marginalia-annotate)) -  #+end_src - -* Exercises for the reader - -  Defining new interactive commands for other types and queries, -  as well as standard filters shouldn't be too complicated now that we -  have the above tools at our disposal. - -  For instance: -  #+begin_src emacs-lisp -     (defun consult-spotify-playlist (&optional filter) -       (interactive) -       (espotify--maybe-play (consult-spotify-by 'playlist filter))) -  #+end_src - +#+end_src -* Post-amble                                                        :notes: +* Post-amble                                                     :noexport:    #+begin_src emacs-lisp      (provide 'espotify)    #+end_src +  * Footnotes  [fn:1] This is an elegant strategy i first learnt about in SICP, many, @@ -2,13 +2,13 @@  *** Sections +    - [[./eos][eos]] generic utilities for the emacs operating system      - [[./themes][themes]] color themes based on Emacs builtin custom themes      - [[org][org]] utilities for org-mode      - [[./doc][doc]] opening documents (pdfs, mostly)      - [[./media][media]] utilities for music players and the like      - [[./prog][prog]] utilities for compilation and programming modes      - [[./net][net]] utilities for networking (w3m, weather &c.) -    - [[./sys][sys]] generic utilities for external programs      - [[./bmk][bmk]] a web bookmark manager      See also my [[https://jao.io/cgit/emacs][emacs custom files]].  | 
