;;; jao-spt.el --- Access to the spotify-tui CLI -*- lexical-binding: t; -*- ;; Copyright (C) 2021, 2022 jao ;; Author: jao ;; Keywords: multimedia ;; 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 . ;;; Commentary: ;; Simple spotifyd controls via the spt executable. ;;; Code: (require 'jao-minibuffer) (require 'jao-notify) (defvar jao-spt-bin (expand-file-name "~/bin/spt")) (defvar jao-spt-format "'%s %t - %a [%r] %f'") (defvar jao-spt-device nil) (defun jao-spt--exec-async (&rest args) (let ((display-buffer-alist `((".*spt commands.*" display-buffer-no-window))) (buff (get-buffer-create "* spt commands *"))) (apply #'start-process "spt" buff jao-spt-bin args))) (defvar jao-spt--status-str "") (defun jao-spt--pb (&rest args) (let* ((args (mapconcat #'identity args " ")) (dev (if jao-spt-device (format "-d '%s'" jao-spt-device) "")) (cmd (format "%s pb %s -f %s %s" jao-spt-bin args jao-spt-format dev)) (st (string-trim (shell-command-to-string cmd)))) (setq jao-spt--status-str (when (string-prefix-p "▶" st) st)) (jao-minibuffer-refresh) st)) (defun jao-spt--pb* (&rest args) (message (apply 'jao-spt--pb args))) ;;;###autoload (defun jao-spt-play-uri (uri) (jao-spt--exec-async "play" "--uri" uri)) ;;;###autoload (defun jao-spt-update-status () (interactive) (jao-spt--pb)) ;;;###autoload (defun jao-spt-toggle () (interactive) (jao-spt--pb* "-t")) ;;;###autoload (defun jao-spt-next () (interactive) (jao-spt--pb* "-n")) ;;;###autoload (defun jao-spt-previous () (interactive) (jao-spt--pb* "-p")) ;;;###autoload (defun jao-spt-like () (interactive) (jao-spt--pb* "--like")) ;;;###autoload (defun jao-spt-dislike () (interactive) (jao-spt--pb* "--dislike")) ;;;###autoload (defun jao-spt-seek (secs) (interactive "p") (let ((secs (if (zerop secs) 10 secs))) (jao-spt--pb* "--seek" (format "%s%s" (if (> secs 0) "+" "-") secs)))) ;;;###autoload (defun jao-spt-seek-back (secs) (interactive "p") (jao-spt-seek (- secs))) ;;;###autoload (defun jao-spt-echo-current () (interactive) (let ((jao-notify-use-messages-p t)) (jao-notify (jao-spt-update-status)))) ;;;###autoload (defun jao-spt-toggle-shuffle () (interactive) (jao-spt--pb* "--shuffle")) ;;;###autoload (defun jao-spt-set-up () (jao-minibuffer-add-msg-variable 'jao-spt--status-str)) (provide 'jao-spt) ;;; jao-spt.el ends here