summaryrefslogtreecommitdiffhomepage
path: root/lib/media/jao-random-album.el
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2021-02-02 05:16:17 +0000
committerjao <jao@gnu.org>2021-02-02 05:16:17 +0000
commit771abb84830678455de4625ac7f082d8100f0ea0 (patch)
tree0d303c2cb0861b949ca73a9705954f6a69c4f877 /lib/media/jao-random-album.el
parent81eceb5507aa0659e9f0c9761e54e9102085c4ac (diff)
downloadelibs-771abb84830678455de4625ac7f082d8100f0ea0.tar.gz
elibs-771abb84830678455de4625ac7f082d8100f0ea0.tar.bz2
libs -> lib/
Diffstat (limited to 'lib/media/jao-random-album.el')
-rw-r--r--lib/media/jao-random-album.el101
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/media/jao-random-album.el b/lib/media/jao-random-album.el
new file mode 100644
index 0000000..7158417
--- /dev/null
+++ b/lib/media/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 <jao@gnu.org>
+;; 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 <http://www.gnu.org/licenses/>.
+
+(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