From 4da1c95cd9357b5d95b2164aa2c9e960ce8636dc Mon Sep 17 00:00:00 2001 From: jao Date: Thu, 28 Nov 2019 00:08:20 +0000 Subject: Generic random album selector --- misc/jao-random-album.el | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 misc/jao-random-album.el diff --git a/misc/jao-random-album.el b/misc/jao-random-album.el new file mode 100644 index 0000000..7158417 --- /dev/null +++ b/misc/jao-random-album.el @@ -0,0 +1,101 @@ +;; jao-random-album.el -- play random albums + +;; Copyright (C) 2009, 2010, 2017, 2018, 2019 Jose Antonio Ortega Ruiz + +;; Author: Jose Antonio Ortega Ruiz +;; Start date: Sat Jul 04, 2009 13:06 + +;; This file 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 file 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 . + +(require 'jao-notify) + +(defvar jao-random-album-p t) +(defvar jao-random-lines nil) +(defvar jao-random-lines-file (expand-file-name "~/.emacs.d/random-lines")) +(defvar jao-random-album-notify-p t) +(defvar jao-random-album-notify-icon nil) +(defvar jao-random-album-skip-lines 2) + +(defun jao-random-lines () + (or jao-random-lines + (and (file-exists-p jao-random-lines-file) + (with-current-buffer + (find-file-noselect jao-random-lines-file) + (goto-char (point-min)) + (setq jao-random-lines (read (current-buffer))))) + (dotimes (n (1- (line-number-at-pos (point-max))) + jao-random-lines) + (when (> n jao-random-album-skip-lines) + (push (1+ n) jao-random-lines))))) + +(defun jao-random-lines-save () + (with-current-buffer (find-file-noselect jao-random-lines-file) + (delete-region (point-min) (point-max)) + (insert (format "%s\n" jao-random-lines)) + (save-buffer))) + +(defun jao-goto-random-album () + (let* ((pos (random (length (jao-random-lines)))) + (line (nth pos jao-random-lines))) + (setq jao-random-lines (remove line jao-random-lines)) + (jao-random-lines-save) + (goto-line line))) + + +;; User interface +(defvar jao-random-album-buffer) +(defvar jao-random-album-add-tracks-and-play) +(defvar jao-random-album-stop) + +(defun jao-random-album-start () + (interactive) + (setq jao-random-album-p t) + (jao-random-album-next)) + +(defun jao-random-album-stop () + (interactive) + (setq jao-random-album-p nil) + (funcall jao-random-album-stop)) + +(defun jao-random-album-toggle () + (interactive) + (setq jao-random-album-p (not jao-random-album-p)) + (message "Random album %s" + (if jao-random-album-p "enabled" "disabled"))) + +(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)))))) + +(defun jao-random-album-reset () + (interactive) + (setq jao-random-lines nil) + (jao-random-lines-save)) + +(defun jao-random-album-setup (album-buffer add-and-play stop &optional icon) + (setq jao-random-album-buffer album-buffer + jao-random-album-add-tracks-and-play add-and-play + jao-random-album-stop stop + jao-random-album-notify-icon icon)) + + +(provide 'jao-random-album) +;;; jao-random-album.el ends here -- cgit v1.2.3