diff options
| author | jao <jao@gnu.org> | 2021-01-23 02:33:49 +0000 | 
|---|---|---|
| committer | jao <jao@gnu.org> | 2021-01-23 02:33:49 +0000 | 
| commit | 09749a0b2e102016d2a6a477092eda17e723989b (patch) | |
| tree | 9d036a0b174ba07c81535a724e4cbfb2f56399ef | |
| parent | 14ac8cbfa7a6d497f4c0016b7bc4c5ce5185aeba (diff) | |
| download | elibs-09749a0b2e102016d2a6a477092eda17e723989b.tar.gz elibs-09749a0b2e102016d2a6a477092eda17e723989b.tar.bz2  | |
espotify: tangling to separate libs
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | media/espotify.org | 75 | 
2 files changed, 52 insertions, 25 deletions
@@ -1,2 +1,4 @@  *.elc  /media/espotify.el +/media/espotify-consult.el +/media/espotify-embark.el diff --git a/media/espotify.org b/media/espotify.org index 65e7ef5..27329d5 100644 --- a/media/espotify.org +++ b/media/espotify.org @@ -3,6 +3,10 @@  #+filetags: emacs  #+PROPERTY: header-args :tangle yes :comments no :results silent +(/Note/: you can tangle this file (e.g., with =C-c C-v t= inside Emacs) +into three elisp libraries, =espotify.el=, =espotify-consult.el= and +=espotify-embark=.) +  We have two kinds of interaction with Spotify: via its HTTP API to  perform operations such as search, and via our local DBUS to talk to  client players running in our computer, such as the official client, @@ -248,7 +252,14 @@ Let's start with an umbrella customization group:        (espotify-call-spotify-via-dbus "OpenUri" uri))    #+end_src +  #+begin_src emacs-lisp +    (provide 'espotify) +  #+end_src +  * Search front-end using consult +  :PROPERTIES: +  :header-args: :tangle espotify-consult.el +  :END:    I am exploring [[https://github.com/minad/consult][consult.el]] (and friends) to replace ivy/counsel,    inspired in part by [[https://protesilaos.com/codelog/2021-01-06-emacs-default-completion/][Protesilaos Stavrou's musings]], and liking a @@ -261,6 +272,9 @@ Let's start with an umbrella customization group:    The top-level command will have this form:    #+begin_src emacs-lisp +    ;;; espotify-consult.el - consult support -  -*- lexical-binding: t; -*- + +    (require 'espotify)      (require 'consult)      (defvar espotify-consult-history nil) @@ -326,9 +340,12 @@ Let's start with an umbrella customization group:    #+begin_src emacs-lisp      (defun espotify--additional-info (x) -      (or (alist-get 'name (alist-get 'album x)) -          (alist-get 'name (car (alist-get 'artists x))) -          (alist-get 'display_name (alist-get 'owner x)))) +      (mapconcat 'identity +                 (seq-filter 'identity +                             `(,(alist-get 'name (alist-get 'album x)) +                               ,(alist-get 'name (car (alist-get 'artists x))) +                               ,(alist-get 'display_name (alist-get 'owner x)))) +                 ", "))      (defun espotify--format-item (x)        (propertize (format "%s%s" @@ -349,7 +366,7 @@ Let's start with an umbrella customization group:     consult looks up for it using the ~:lookup~ function, which we can     simply define as: -   #+begin_src emacs-lisp +   #+begin_src emacs-lisp :tangle espotify-consult.el       (require 'seq)       (defun espotify--consult-lookup (_input cands cand)         (seq-find (lambda (x) (string= cand x)) cands)) @@ -360,8 +377,8 @@ Let's start with an umbrella customization group:     we can play the selected URI right away:     #+begin_src emacs-lisp -     (defun espotify--maybe-play (x) -       (when-let (uri (espotify--uri x)) +     (defun espotify--maybe-play (cand) +       (when-let (uri (when cand (espotify--uri cand)))           (espotify-play-uri uri)))     #+end_src @@ -395,6 +412,9 @@ Let's start with an umbrella customization group:    #+end_src  * Adding metadata to candidates using Marginalia +  :PROPERTIES: +  :header-args: :tangle espotify-consult.el +  :END:    Let's add metadata fields to our candidates, so that packages like    [[https://github.com/minad/marginalia][Marginalia]] can offer it to consult or selectrum. @@ -417,9 +437,16 @@ Let's start with an umbrella customization group:      (add-to-list 'marginalia-annotators-heavy                   '(espotify-search-item . espotify-marginalia-annotate)) -#+end_src +  #+end_src + +  #+begin_src emacs-lisp +    (provide 'espotify-consult) +  #+end_src  * Embark actions +  :PROPERTIES: +  :header-args: :tangle espotify-embark.el +  :END:    In addition to the default action (play the URI in the selected    candidate), we can use embark to define other operations.  For @@ -427,6 +454,8 @@ Let's start with an umbrella customization group:    always look for an album to play:    #+begin_src emacs-lisp +    (require 'espotify-consult) +    (require 'embark)      (defvar espotify--current-item nil) @@ -438,7 +467,8 @@ Let's start with an umbrella customization group:        (delete-region (point-min) (point-max))        (insert (propertize name 'face 'bold))        (newline) -      (when espotify--current-item (insert (pp-to-string espotify--current-item))) +      (when espotify--current-item +        (insert (pp-to-string espotify--current-item)))        (newline)        (goto-char (point-min))        (read-only-mode 1)) @@ -453,31 +483,26 @@ Let's start with an umbrella customization group:            (espotify-play-uri (alist-get 'uri album))          (error "No album for %s" (alist-get 'nmae espotify--current-item)))) -    (with-eval-after-load "embark" -      (embark-define-keymap espotify-item-keymap -        "Actions for Spotify search results" -        ("a" espotify--play-album) -        ("h" espotify--show-info)) +    (embark-define-keymap espotify-item-keymap +      "Actions for Spotify search results" +      ("a" espotify--play-album) +      ("h" espotify--show-info)) -      (defun espotify--annotate-item (cand) -        (setq espotify--current-item (espotify--item cand)) -        (cons 'espotify-search-item cand)) +    (defun espotify--annotate-item (cand) +      (setq espotify--current-item (espotify--item cand)) +      (cons 'espotify-search-item cand)) -      (add-to-list 'embark-transformer-alist -                   '(espotify-search-item . espotify--annotate-item)) +    (add-to-list 'embark-transformer-alist +                 '(espotify-search-item . espotify--annotate-item)) -      (add-to-list 'embark-keymap-alist -                   '(espotify-search-item . espotify-item-keymap))) +    (add-to-list 'embark-keymap-alist +                 '(espotify-search-item . espotify-item-keymap))    #+end_src - -* Post-amble                                                     :noexport: -    #+begin_src emacs-lisp -    (provide 'espotify) +    (provide 'espotify-embark)    #+end_src -  * Footnotes  [fn:1] This is an elegant strategy i first learnt about in SICP, many,  | 
