diff --git a/site-lisp/db-music.el b/site-lisp/db-music.el index 569c2ec..8b2edc2 100644 --- a/site-lisp/db-music.el +++ b/site-lisp/db-music.el @@ -25,8 +25,28 @@ (emms-playlist-select-first) (emms-start))))) - -;; End +(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)