.emacs.d/site-lisp/db-music.el

54 lines
1.9 KiB
EmacsLisp
Raw Normal View History

;;; db-music.el -- Music related stuff -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
2019-03-02 14:36:34 +01:00
(require 'emms)
(defun db/play-playlist ()
"Start playing songs from `db/playlist"
(interactive)
(save-window-excursion
(let ((music-buffer-name "*EMMS Playlist* -- Personal"))
(unless (get-buffer music-buffer-name)
(emms-playlist-new music-buffer-name))
(with-current-buffer (get-buffer music-buffer-name)
(emms-stop)
(emms-playlist-set-playlist-buffer)
(emms-playlist-current-clear)
(dolist (track db/playlist)
(when (eq :include (cdr track))
(emms-playlist-current-insert-source 'emms-insert-file (car track))))
(goto-char (point-min))
(emms-shuffle)
(emms-playlist-select-first)
(emms-start)))))
(defun db/update-playlist-from-directory (directory)
"Recursively traverse DIRECTORY and update `db/playlist.
Files not present `db/playlist but that are found in DIRECTORY
are added to `db/playlist with tag :undecided, to show the user
that these files are new. Tracks in `db/playlist that are not
found in DIRECTORY are currently removed from it."
(interactive (list (expand-file-name "songs/"
emms-source-file-default-directory)))
;; First convert to hash table for performance
(let ((playlist-hash (make-hash-table :test #'equal)))
(dolist (track db/playlist)
(when (file-exists-p (car track))
(puthash (car track) (cdr track) playlist-hash)))
(let (new-playlist)
(dolist (file (directory-files-recursively directory ""))
(message "Checking %s" file)
(push (if-let ((state (gethash file playlist-hash nil)))
(cons file state)
(cons file :undecided))
new-playlist))
(customize-save-variable 'db/playlist new-playlist))))
(provide 'db-music)
;;; db-music ends here