diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-10 13:34:24 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-10 13:34:24 -0500 |
| commit | 3c840b0569ba3461cd61eabc32919f6899a25163 (patch) | |
| tree | e601b0080d7e923d3c3e66446d9d01c474923314 /modules | |
| parent | 1f907e40bb2124084e336d429cd60830df6aa369 (diff) | |
| download | dotemacs-3c840b0569ba3461cd61eabc32919f6899a25163.tar.gz dotemacs-3c840b0569ba3461cd61eabc32919f6899a25163.zip | |
refactor(dirvish): extract playlist filter and sanitize helpers
`cj/dired-create-playlist-from-marked' had its audio-file filtering and trailing-`.m3u' stripping inline among the dired marking, prompting, overwrite-loop, and file-write logic. Lift each into its own pure helper:
- `cj/--playlist-filter-audio (files extensions)' returns only files whose extension matches one of EXTENSIONS (lowercase, no dot). Case-insensitive on the file side.
- `cj/--playlist-sanitize-name (name)' strips a trailing `.m3u' suffix; embedded `.m3u' that isn't at the end is preserved.
Ten Normal/Boundary tests cover keep-only-audio, case-insensitivity, files-without-extension excluded, empty inputs, and the sanitize edge cases (bare name, embedded `.m3u', empty string, just `.m3u').
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/dirvish-config.el | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/modules/dirvish-config.el b/modules/dirvish-config.el index 22d3f07c..438d21fa 100644 --- a/modules/dirvish-config.el +++ b/modules/dirvish-config.el @@ -60,19 +60,32 @@ "List of audio file extensions (lowercase, no dot). Used to filter files for M3U playlists.") +(defun cj/--playlist-filter-audio (files extensions) + "Return the elements of FILES whose extension matches EXTENSIONS. + +Pure helper used by `cj/dired-create-playlist-from-marked'. EXTENSIONS +is a list of lowercase extension strings (no dot). A file with no +extension never matches. Comparison downcases the file's extension so +mixed-case names match." + (cl-remove-if-not + (lambda (f) + (let ((ext (file-name-extension f))) + (and ext (member (downcase ext) extensions)))) + files)) + +(defun cj/--playlist-sanitize-name (name) + "Strip a trailing `.m3u' suffix from NAME and return the result. +Pure helper. An embedded `.m3u' that isn't at the end stays put." + (replace-regexp-in-string "\\.m3u\\'" "" name)) + (defun cj/dired-create-playlist-from-marked () "Create an .m3u playlist file from marked files in Dired (or Dirvish). Filters for audio files, prompts for the playlist name, and saves the resulting .m3u in the directory specified by =music-dir=. Interactive use only." (interactive) (let* ((marked-files (dired-get-marked-files)) - (audio-files - (cl-remove-if-not - (lambda (f) - (let ((ext (file-name-extension f))) - (and ext - (member (downcase ext) cj/audio-file-extensions)))) - marked-files)) + (audio-files (cj/--playlist-filter-audio + marked-files cj/audio-file-extensions)) (count (length audio-files))) (if (zerop count) (user-error "No audio files marked (extensions: %s)" @@ -81,14 +94,11 @@ Filters for audio files, prompts for the playlist name, and saves the resulting (playlist-path nil) (done nil)) (while (not done) - (setq base-name (read-string - (format "Playlist name (without .m3u): "))) - ;; Sanitize: strip any trailing .m3u - (setq base-name (replace-regexp-in-string "\\.m3u\\'" "" base-name)) + (setq base-name (cj/--playlist-sanitize-name + (read-string "Playlist name (without .m3u): "))) (setq playlist-path (expand-file-name (concat base-name ".m3u") music-dir)) (cond ((not (file-exists-p playlist-path)) - ;; Safe to write (setq done t)) (t (let ((choice (read-char-choice @@ -99,11 +109,11 @@ Filters for audio files, prompts for the playlist name, and saves the resulting (?o (setq done t)) (?c (user-error "Cancelled playlist creation")) (?r (setq done nil))))))) - ;; Actually write the file (with-temp-file playlist-path (dolist (af audio-files) (insert af "\n"))) - (message "Wrote playlist %s with %d tracks" (file-name-nondirectory playlist-path) count))))) + (message "Wrote playlist %s with %d tracks" + (file-name-nondirectory playlist-path) count))))) ;;; ----------------------------------- Dired ----------------------------------- |
