diff options
-rw-r--r-- | attic/jao-emms-info-track.el (renamed from lib/media/jao-emms-info-track.el) | 0 | ||||
-rw-r--r-- | attic/jao-emms-lyrics.el (renamed from lib/media/jao-emms-lyrics.el) | 0 | ||||
-rw-r--r-- | attic/jao-emms-random-album.el (renamed from lib/media/jao-emms-random-album.el) | 0 | ||||
-rw-r--r-- | attic/jao-emms.el (renamed from lib/media/jao-emms.el) | 0 | ||||
-rw-r--r-- | attic/misc.org | 133 | ||||
-rw-r--r-- | init.org | 166 | ||||
-rw-r--r-- | lib/media/jao-mpc.el | 224 | ||||
-rw-r--r-- | lib/media/jao-random-album.el | 14 |
8 files changed, 389 insertions, 148 deletions
diff --git a/lib/media/jao-emms-info-track.el b/attic/jao-emms-info-track.el index cf93625..cf93625 100644 --- a/lib/media/jao-emms-info-track.el +++ b/attic/jao-emms-info-track.el diff --git a/lib/media/jao-emms-lyrics.el b/attic/jao-emms-lyrics.el index 0ea52e0..0ea52e0 100644 --- a/lib/media/jao-emms-lyrics.el +++ b/attic/jao-emms-lyrics.el diff --git a/lib/media/jao-emms-random-album.el b/attic/jao-emms-random-album.el index 72e056b..72e056b 100644 --- a/lib/media/jao-emms-random-album.el +++ b/attic/jao-emms-random-album.el diff --git a/lib/media/jao-emms.el b/attic/jao-emms.el index 53b3513..53b3513 100644 --- a/lib/media/jao-emms.el +++ b/attic/jao-emms.el diff --git a/attic/misc.org b/attic/misc.org index 3a4df37..23336e0 100644 --- a/attic/misc.org +++ b/attic/misc.org @@ -1,5 +1,138 @@ #+title: Miscellaneous config bits that i don't use anymore +* emms +*** configuration + #+BEGIN_SRC emacs-lisp + (use-package emms + :pin gnu + :ensure t + :init + (setq emms-score-file "~/.emacs.d/score" + emms-stream-bookmarks-file "~/.emacs.d/streams" + emms-history-file "~/.emacs.d/cache/emms-history" + emms-cache-file "~/.emacs.d/cache/emms-cache" + emms-show-format "%s") + + (setq emms-source-file-default-directory "~/var/lib/music/" + emms-player-list '(emms-player-mpd) + emms-player-mpd-server-name "localhost" + emms-player-mpd-server-port "6600" + emms-player-mpd-music-directory emms-source-file-default-directory) + + (setq emms-volume-change-function 'emms-volume-mpd-change + emms-volume-change-amount 10 + emms-info-ogginfo-coding-system 'utf-8) + + ;; from http://www.shellarchive.co.uk/index.html#%20Prettify%20emms + (setq emms-browser-info-genre-format "%i· %n" + emms-browser-info-artist-format "%i· %n" + emms-browser-info-album-format "%i◨ %n" + emms-browser-info-title-format "%i♪ %n") + + (setq emms-last-played-format-alist + '(((emms-last-played-seconds-today) . "Today at %H:%M") + (604800 . "%a at %H:%M") + ((emms-last-played-seconds-month) . "%d") + ((emms-last-played-seconds-year) . "%m-%d") + (t . ""))) + + :hook ((emms-player-started . emms-player-mpd-show)) + + :config + (eval-after-load "emms-info" + '(add-to-list 'emms-info-functions 'emms-info-mpd))) + + (emms-all) + (emms-mode-line -1) + (emms-playing-time 1) + (emms-playing-time-disable-display) + + (use-package jao-emms-random-album + :after emms + :commands (jao-emms-random-album-next) + :init (setq jao-emms-random-album-notify-icon jao-notify-audio-icon)) + + (use-package jao-emms-info-track + :after emms + :init (setq jao-emms-show-icon jao-notify-audio-icon) + :config (jao-emms-info-setup 50)) + + (use-package jao-emms-lyrics + :after emms + :init (setq jao-lyrics-info-function 'jao-emms-lyrics-track-data)) + + (defvar jao-emms-random-album-notify--pause-icon + "/usr/share/icons/Tango/scalable/actions/media-playback-pause.svg") + + (defun jao-emms--show-status (s status) + (jao-notify (format "%s%s%s" + (cadr s) + (cdr (assoc (car s) status)) + (caddr s)) + "emms" + (if (string= "pause" (cdr (assoc "state" status))) + jao-emms-random-album-notify--pause-icon + jao-notify-audio-icon))) + + (defun jao-emms--osd-status (s &optional pref suff) + (emms-player-mpd-get-status (list s (or pref "") (or suff "")) + 'jao-emms--show-status)) + + #+END_SRC +*** helper functions + #+begin_src emacs-lisp + (defun jao-emms-volume-delta (d) + (funcall emms-volume-change-function d)) + + (defun jao-emms-show-volume () + (jao-emms--osd-status "volume" "Volume " "%")) + + (defalias 'jao-emms-update-cache 'emms-player-mpd-update-all-reset-cache) + + (defun jao-emms-load-streams () + (interactive) + (emms-play-playlist (expand-file-name "~/var/lib/music/streams.list"))) + + (defun jao-emms-search () + (interactive) + (let ((by (completing-read "Search by: " + '("artist" + "composer" + "performer" + "title" + "album" + "names")))) + (if (string= "names" by) + (emms-browser-search-by-names) + (emms-browser-search (list (intern (concat "info-" by))))))) + + (defun jao-emms-echo () + (interactive) + (emms-show) + (jao-emms-update-echo-string) + (emms-show)) + #+end_src +*** Media global aliases + #+begin_src emacs-lisp + (defalias 'jao-player-connect 'emms-player-mpd-connect) + (defalias 'jao-player-toggle 'emms-pause) + (defalias 'jao-player-next 'emms-next) + (defalias 'jao-player-previous 'emms-previous) + (defalias 'jao-player-stop 'emms-stop) + (defalias 'jao-player-start 'emms-start) + (defalias 'jao-player-seek-forward 'emms-seek-forward) + (defalias 'jao-player-seek-backward 'emms-seek-backward) + (defalias 'jao-player-play 'emms-start) + (defalias 'jao-player-search 'jao-emms-search) + (defalias 'jao-player-vol-delta 'jao-emms-volume-delta) + (defalias 'jao-player-volume 'jao-emms-show-volume) + (defalias 'jao-player-osd 'jao-emms-show-osd) + (defalias 'jao-player-echo 'jao-emms-echo) + (defalias 'jao-player-list 'emms-playlist-mode-go) + (defalias 'jao-player-browse 'emms-browser) + (defalias 'jao-player-random-album 'jao-emms-random-album-next) + #+end_src + * enwc #+BEGIN_SRC emacs-lisp (use-package enwc @@ -2927,138 +2927,6 @@ (global-set-key (kbd "<f4>") #'jao-toggle-audio-applet) #+end_src -*** emms -***** configuration - #+BEGIN_SRC emacs-lisp - (use-package emms - :pin gnu - :ensure t - :init - (setq emms-score-file "~/.emacs.d/score" - emms-stream-bookmarks-file "~/.emacs.d/streams" - emms-history-file "~/.emacs.d/cache/emms-history" - emms-cache-file "~/.emacs.d/cache/emms-cache" - emms-show-format "%s") - - (setq emms-source-file-default-directory "~/var/lib/music/" - emms-player-list '(emms-player-mpd) - emms-player-mpd-server-name "localhost" - emms-player-mpd-server-port "6600" - emms-player-mpd-music-directory emms-source-file-default-directory) - - (setq emms-volume-change-function 'emms-volume-mpd-change - emms-volume-change-amount 10 - emms-info-ogginfo-coding-system 'utf-8) - - ;; from http://www.shellarchive.co.uk/index.html#%20Prettify%20emms - (setq emms-browser-info-genre-format "%i· %n" - emms-browser-info-artist-format "%i· %n" - emms-browser-info-album-format "%i◨ %n" - emms-browser-info-title-format "%i♪ %n") - - (setq emms-last-played-format-alist - '(((emms-last-played-seconds-today) . "Today at %H:%M") - (604800 . "%a at %H:%M") - ((emms-last-played-seconds-month) . "%d") - ((emms-last-played-seconds-year) . "%m-%d") - (t . ""))) - - :hook ((emms-player-started . emms-player-mpd-show)) - - :config - (eval-after-load "emms-info" - '(add-to-list 'emms-info-functions 'emms-info-mpd))) - - (emms-all) - (emms-mode-line -1) - (emms-playing-time 1) - (emms-playing-time-disable-display) - - (use-package jao-emms-random-album - :after emms - :commands (jao-emms-random-album-next) - :init (setq jao-emms-random-album-notify-icon jao-notify-audio-icon)) - - (use-package jao-emms-info-track - :after emms - :init (setq jao-emms-show-icon jao-notify-audio-icon) - :config (jao-emms-info-setup 50)) - - (use-package jao-emms-lyrics - :after emms - :init (setq jao-lyrics-info-function 'jao-emms-lyrics-track-data)) - - (defvar jao-emms-random-album-notify--pause-icon - "/usr/share/icons/Tango/scalable/actions/media-playback-pause.svg") - - (defun jao-emms--show-status (s status) - (jao-notify (format "%s%s%s" - (cadr s) - (cdr (assoc (car s) status)) - (caddr s)) - "emms" - (if (string= "pause" (cdr (assoc "state" status))) - jao-emms-random-album-notify--pause-icon - jao-notify-audio-icon))) - - (defun jao-emms--osd-status (s &optional pref suff) - (emms-player-mpd-get-status (list s (or pref "") (or suff "")) - 'jao-emms--show-status)) - - #+END_SRC -***** helper functions - #+begin_src emacs-lisp - (defun jao-emms-volume-delta (d) - (funcall emms-volume-change-function d)) - - (defun jao-emms-show-volume () - (jao-emms--osd-status "volume" "Volume " "%")) - - (defalias 'jao-emms-update-cache 'emms-player-mpd-update-all-reset-cache) - - (defun jao-emms-load-streams () - (interactive) - (emms-play-playlist (expand-file-name "~/var/lib/music/streams.list"))) - - (defun jao-emms-search () - (interactive) - (let ((by (completing-read "Search by: " - '("artist" - "composer" - "performer" - "title" - "album" - "names")))) - (if (string= "names" by) - (emms-browser-search-by-names) - (emms-browser-search (list (intern (concat "info-" by))))))) - - (defun jao-emms-echo () - (interactive) - (emms-show) - (jao-emms-update-echo-string) - (emms-show)) - #+end_src -***** Media global aliases - #+begin_src emacs-lisp - (defalias 'jao-player-connect 'emms-player-mpd-connect) - (defalias 'jao-player-toggle 'emms-pause) - (defalias 'jao-player-next 'emms-next) - (defalias 'jao-player-previous 'emms-previous) - (defalias 'jao-player-stop 'emms-stop) - (defalias 'jao-player-start 'emms-start) - (defalias 'jao-player-seek-forward 'emms-seek-forward) - (defalias 'jao-player-seek-backward 'emms-seek-backward) - (defalias 'jao-player-play 'emms-start) - (defalias 'jao-player-search 'jao-emms-search) - (defalias 'jao-player-vol-delta 'jao-emms-volume-delta) - (defalias 'jao-player-volume 'jao-emms-show-volume) - (defalias 'jao-player-osd 'jao-emms-show-osd) - (defalias 'jao-player-echo 'jao-emms-echo) - (defalias 'jao-player-list 'emms-playlist-mode-go) - (defalias 'jao-player-browse 'emms-browser) - (defalias 'jao-player-random-album 'jao-emms-random-album-next) - #+end_src *** mpris #+begin_src emacs-lisp (use-package jao-mpris @@ -3156,6 +3024,28 @@ (define-key mpdel-browser-mode-map (kbd "n") #'next-line) (define-key mpdel-browser-mode-map (kbd "p") #'previous-line) #+END_SRC +*** mpc + #+begin_src emacs-lisp + (use-package elmpd :ensure t) + + (use-package jao-mpc + :demand t + :commands jao-mpc-setup) + + (jao-mpc-setup) + + (defalias 'jao-player-connect 'jao-mpc-connect) + (defalias 'jao-player-toggle 'jao-mpc-toggle) + (defalias 'jao-player-next 'jao-mpc-next) + (defalias 'jao-player-previous 'jao-mpc-previous) + (defalias 'jao-player-stop 'jao-mpc-stop) + (defalias 'jao-player-seek-forward 'jao-mpc-seek-forward) + (defalias 'jao-player-seek-backward 'jao-mpc-seek-backward) + (defalias 'jao-player-play 'jao-mpc-play) + (defalias 'jao-player-echo 'jao-mpc-echo-current) + (defalias 'jao-player-list 'jao-mpc-show-playlist) + (defalias 'jao-player-browse 'jao-mpc-show-albums) + #+end_src *** hydras #+begin_src emacs-lisp (require 'jao-lyrics) @@ -3163,7 +3053,7 @@ (defun jao-show-some-lyrics (arg) (interactive "P") (if (string-blank-p (or jao-mpris-track-string "")) - (jao-show-lyrics arg 'jao-emms-lyrics-track-data) + (jao-show-lyrics arg 'jao-mpc-lyrics-track-data) (jao-show-lyrics arg 'jao-mpris-artist-title))) (defalias 'jao-player-show-lyrics 'jao-show-some-lyrics) @@ -3185,7 +3075,7 @@ (interactive) (jao-notify "Volume" (format "%s%%" (jao-player-volume)))) - (use-package jao-emms-random-album) + (use-package jao-random-album :demand t) (pretty-hydra-define jao-hydra-spotify (global-map "s-s" :color blue :quit-key "q") @@ -3202,7 +3092,6 @@ "Browse" (("b" mpdel-pop-to-browser "browser") ("l" mpdel-playlist-open "playing list") - ;; ("m" jao-counsel-spotify-change-mpris "change mpris provider") ("c" (mpdel-core-replace-current-playlist) "clear list" :color red) ("s-s" jao-hydra-spotify/body nil)))) @@ -3230,11 +3119,8 @@ ("U" jao-mixer-capture-up "capture up" :color red) ("V" (jao-mixer-get-level "Capture") "show")) "Utilities" - (("C" jao-emms-update-cache "refresh cache") - ("c" jao-player-connect "reconnect to mpd") - ("r" jao-emms-random-album-toggle "toggle random album" - :toggle jao-emms-random-album-p) - ("N" jao-player-random-album "random album") + (("c" jao-player-connect "reconnect to mpd") + ("N" jao-random-album-next "random album") ("s-m" jao-hydra-media/body nil)))) #+end_src diff --git a/lib/media/jao-mpc.el b/lib/media/jao-mpc.el new file mode 100644 index 0000000..512d21b --- /dev/null +++ b/lib/media/jao-mpc.el @@ -0,0 +1,224 @@ +;;; jao-mpc-random-album.el --- random mpc albums -*- 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: + +;; Simple mpd control using mpc commands. + +;;; Code: + +(require 'elmpd) +(require 'jao-minibuffer) +(require 'jao-lyrics) + +(defvar jao-mpc--connection nil) +(defvar jao-mpc-host "localhost") +(defvar jao-mpc-port 6600) + +(defun jao-mpc-disconnect () + (interactive) + (when jao-mpc--connection + (delete-process (elmpd-connection--fd jao-mpc--connection)) + (setq jao-mpc--connection nil))) + +(defun jao-mpc-connect (&optional force) + (interactive) + (when force (jao-mpc-disconnect)) + (unless jao-mpc--connection + (setq jao-mpc--connection + (elmpd-connect :name "jao-mpc" + :host jao-mpc-host + :port jao-mpc-port + :subsystems '((player) . jao-mpc--watcher))) + (jao-mpc--watcher jao-mpc--connection 'player)) + jao-mpc--connection) + +(defun jao-mpc--send (cmd cb) + (elmpd-send jao-mpc--connection cmd cb )) + +(defvar jao-mpc--play-status '()) +(defvar jao-mpc--current '()) +(defvar jao-mpc-minibuffer-str "") + +(defun jao-mpc--update-status (next) + (let ((cb (lambda (_c ok txt) + (when ok + (setq jao-mpc--play-status '()) + (dolist (e (split-string txt "\n" t " ")) + (let ((e (split-string e ": " t " "))) + (when (and (car e) (cadr e)) + (push (cons (car e) (cadr e)) jao-mpc--play-status)))) + (when next (funcall next)))))) + (jao-mpc--send "status" cb))) + +(defun jao-mpc--current-get (x &optional def) + (alist-get x jao-mpc--current def nil #'string=)) + +(defun jao-mpc--status-get (x &optional def) + (alist-get x jao-mpc--play-status def nil #'string=)) + +(defun jao-mpc--playing-p () + (string= (jao-mpc--status-get "state" "") "play")) + +(defun jao-mpc--current-str () + (let ((title (jao-mpc--current-get "Title")) + (album (jao-mpc--current-get "Album")) + (no (string-to-number (jao-mpc--current-get "Track" "0"))) + (len (string-to-number (jao-mpc--status-get "playlistlength" "1"))) + (artist (jao-mpc--current-get "Artist")) + (composer (jao-mpc--current-get "Composer"))) + (format " %s%s %s%s%s" + (jao--put-face (if (zerop no) "" (format "%02d/%s " no len)) + 'jao-themes-f02) + (jao--put-face title 'jao-themes-f00) + (jao--put-face artist 'jao-themes-f01) + (jao--put-face (if composer (format " [%s]" composer) "") + 'jao-themes-f01) + (jao--put-face (if album (format " (%s)" album) "") 'jao-themes-f11)))) + +(defun jao-mpc--update-minibuffer () + (setq jao-mpc-minibuffer-str + (if (jao-mpc--playing-p) (jao-mpc--current-str) "")) + (jao-minibuffer-refresh)) + +(defun jao-mpc--update-current () + (let ((cb (lambda (_c ok txt) + (when ok + (setq jao-mpc--current '()) + (dolist (e (split-string txt "\n" t " ")) + (let ((e (split-string e ": " t " "))) + (when (and (car e) (cadr e)) + (push (cons (car e) (cadr e)) jao-mpc--current)))) + (jao-mpc--update-minibuffer))))) + (jao-mpc--send "currentsong" cb))) + +(defun jao-mpc--watcher (_conn _subsys) + (jao-mpc--update-status #'jao-mpc--update-current)) + + + +(defconst jao-mpc--albums "*MPC Albums*") +(defconst jao-mpc--playlist "*MPC Playlist*") + +(define-derived-mode jao-mpc-albums-mode fundamental-mode "MPC Albums" + "Mode to display the list of albums known by mpd." + (read-only-mode -1) + (delete-region (point-min) (point-max)) + (insert (shell-command-to-string "mpc list album")) + (goto-char (point-min)) + (read-only-mode 1)) + +(define-key jao-mpc-albums-mode-map (kbd "n") #'next-line) +(define-key jao-mpc-albums-mode-map (kbd "p") #'previous-line) +(define-key jao-mpc-albums-mode-map (kbd "RET") #'jao-mpc-add-and-play) +(define-key jao-mpc-albums-mode-map (kbd "q") #'bury-buffer) + +(defun jao-mpc--album-buffer () + (if-let (b (get-buffer jao-mpc--albums)) + b + (with-current-buffer (get-buffer-create jao-mpc--albums) + (jao-mpc-albums-mode) + (current-buffer)))) + +(defun jao-mpc--add-and-play (&optional album) + (interactive) + (let* ((album (or album (string-trim (thing-at-point 'line)))) + (cmd (format "mpc findadd album \"%s\" && mpc play" album))) + (shell-command-to-string "mpc clear") + (shell-command-to-string cmd))) + +(define-derived-mode jao-mpc-playlist-mode fundamental-mode "MPC Playlist" + "Mode to display the list of playlist known by mpd." + (read-only-mode -1) + (delete-region (point-min) (point-max)) + (insert (shell-command-to-string "mpc playlist")) + (goto-char (point-min)) + (read-only-mode 1)) + +(define-key jao-mpc-playlist-mode-map (kbd "n") #'next-line) +(define-key jao-mpc-playlist-mode-map (kbd "p") #'previous-line) +(define-key jao-mpc-playlist-mode-map (kbd "q") #'bury-buffer) + +(defun jao-mpc--playlist-buffer () + (if-let (b (get-buffer jao-mpc--playlist)) + b + (with-current-buffer (get-buffer-create jao-mpc--playlist) + (jao-mpc-playlist-mode) + (current-buffer)))) + +;;;###autoload +(defun jao-mpc-stop () + (interactive) + (shell-command-to-string "mpc stop")) + +;;;###autoload +(defun jao-mpc-toggle () + (interactive) + (jao-mpc--send "pause" nil)) + +;;;###autoload +(defun jao-mpc-play () + (interactive) + (jao-mpc--send "play" nil)) + +;;;###autoload +(defun jao-mpc-next () + (interactive) + (jao-mpc--send "next" nil)) + +;;;###autoload +(defun jao-mpc-previous () + (interactive) + (jao-mpc--send "previous" nil)) + +;;;###autoload +(defun jao-mpc-echo-current () + (interactive) + (jao-notify (jao-mpc--current-str))) + +;;;###autoload +(defun jao-mpc-show-albums () + "Show album list." + (interactive) + (pop-to-buffer (jao-mpc--album-buffer))) + +;;;###autoload +(defun jao-mpc-show-playlist () + "Show current playlist." + (interactive) + (pop-to-buffer (jao-mpc--playlist-buffer))) + +;;;###autoload +(defun jao-mpc-lyrics-track-data () + (when-let* ((title (jao-mpc--current-get "Title")) + (artist (jao-mpc--current-get "Artist"))) + (cons (substring-no-properties title) (substring-no-properties artist)))) + +;;;###autoload +(defun jao-mpc-setup () + (setq jao-lyrics-info-function #'jao-mpc-lyrics-track-data) + (jao-random-album-setup #'jao-mpc--album-buffer + #'jao-mpc--add-and-play + #'jao-mpc-stop) + (jao-mpc-connect) + (jao-minibuffer-add-msg-variable 'jao-mpc-minibuffer-str 1)) + +(provide 'jao-mpc) +;;; jao-mpc.el ends here diff --git a/lib/media/jao-random-album.el b/lib/media/jao-random-album.el index 7158417..791b241 100644 --- a/lib/media/jao-random-album.el +++ b/lib/media/jao-random-album.el @@ -1,6 +1,6 @@ ;; jao-random-album.el -- play random albums -;; Copyright (C) 2009, 2010, 2017, 2018, 2019 Jose Antonio Ortega Ruiz +;; Copyright (C) 2009, 2010, 2017, 2018, 2019, 2021 Jose Antonio Ortega Ruiz ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org> ;; Start date: Sat Jul 04, 2009 13:06 @@ -77,13 +77,11 @@ (defun jao-random-album-next () (interactive) (with-current-buffer (get-buffer (funcall jao-random-album-buffer)) - (save-excursion - (jao-goto-random-album) - (let ((album (string-trim - (substring-no-properties (thing-at-point 'line) 0 -1)))) - (funcall jao-random-album-add-tracks-and-play) - (when jao-random-album-notify-p - (jao-notify album "Next album" jao-random-album-notify-icon)))))) + (jao-goto-random-album) + (let ((album (string-trim (thing-at-point 'line)))) + (funcall jao-random-album-add-tracks-and-play album) + (when jao-random-album-notify-p + (jao-notify album "Next album" jao-random-album-notify-icon))))) (defun jao-random-album-reset () (interactive) |