;; jao-random-album.el -- play random albums -*- lexical-binding: t; -*- ;; Copyright (C) 2009, 2010, 2017-2019, 2021-2022, 2024, 2026 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 'multisession) (defvar jao-random-album-active t) (defvar jao-random-album-notify nil) (defvar jao-random-album-skip-lines 2) (define-multisession-variable jao-random-lines nil) (defun jao-random-album--buffer-lines () (let ((lines nil)) (dotimes (n (1- (line-number-at-pos (point-max))) lines) (when (> n jao-random-album-skip-lines) (push (1+ n) lines))))) (defun jao-random-lines () (or (multisession-value jao-random-lines) (jao-random-lines-save (jao-random-album--buffer-lines)))) (defun jao-random-lines-save (v) (setf (multisession-value jao-random-lines) v)) (defun jao-goto-random-album () (let* ((lines (jao-random-lines)) (pos (random (length lines))) (line (nth pos lines))) (jao-random-lines-save (remove line lines)) (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-active t) (jao-random-album-next)) (defun jao-random-album-stop () (interactive) (setq jao-random-album-active nil) (funcall jao-random-album-stop)) (defun jao-random-album-toggle () (interactive) (setq jao-random-album-active (not jao-random-album-active)) (message "Random album %s" (if jao-random-album-active "enabled" "disabled"))) (defun jao-random-album-next () (interactive) (with-current-buffer (get-buffer (funcall jao-random-album-buffer)) (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 (funcall jao-random-album-notify album))))) (defun jao-random-album-reset () (interactive) (jao-random-lines-save nil)) (defun jao-random-album-setup (album-buffer add-and-play stop) (setq jao-random-album-buffer album-buffer jao-random-album-add-tracks-and-play add-and-play jao-random-album-stop stop)) (provide 'jao-random-album) ;;; jao-random-album.el ends here