| 1 | ;;; emms-show-all.el --- Detailed track information for Emms. -*- lexical-binding: t; -*- |
| 2 | |
| 3 | ;; Copyright (C) 2016-2021, 2025 Free Software Foundation, Inc. |
| 4 | |
| 5 | ;; Author: Yoni Rabkin <yrk@gnu.org> |
| 6 | |
| 7 | ;; This file is part of EMMS. |
| 8 | |
| 9 | ;; EMMS is free software; you can redistribute it and/or modify |
| 10 | ;; it under the terms of the GNU General Public License as published by |
| 11 | ;; the Free Software Foundation; either version 3, or (at your option) |
| 12 | ;; any later version. |
| 13 | ;; |
| 14 | ;; EMMS is distributed in the hope that it will be useful, |
| 15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | ;; GNU General Public License for more details. |
| 18 | ;; |
| 19 | ;; You should have received a copy of the GNU General Public License |
| 20 | ;; along with EMMS; if not, write to the Free Software Foundation, |
| 21 | ;; Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
| 22 | |
| 23 | ;;; Commentary: |
| 24 | ;; |
| 25 | ;; Shows all of the available information Emms can provide on the |
| 26 | ;; currently playing track. Based on an idea suggested on the |
| 27 | ;; emms-help mailing list by Ivan Truskov. |
| 28 | |
| 29 | ;;; Code: |
| 30 | |
| 31 | (require 'emms) |
| 32 | (require 'emms-tag-editor) |
| 33 | |
| 34 | |
| 35 | (defvar emms-show-all-buffer-name "Emms Track Information" |
| 36 | "Name of buffer used by `emms-show-all'.") |
| 37 | |
| 38 | (defvar emms-show-all-kill-buffer-on-quit-p nil |
| 39 | "If t, kill the show-all buffer when quitting.") |
| 40 | |
| 41 | (defvar emms-show-all-track-alist nil |
| 42 | "Declare so as to silence the compiler.") |
| 43 | |
| 44 | (defvar emms-show-all-mode-map |
| 45 | (let ((map (make-sparse-keymap))) |
| 46 | (set-keymap-parent map text-mode-map) |
| 47 | (define-key map (kbd "q") #'emms-show-all-mode-bury-buffer) |
| 48 | (define-key map (kbd "E") #'emms-show-all-edit-track) |
| 49 | map) |
| 50 | "Keymap for `emms-show-all-mode'.") |
| 51 | |
| 52 | (define-derived-mode emms-show-all-mode text-mode "Emms-Show-All" |
| 53 | "Major mode for `emms-show-all' |
| 54 | \\{emms-show-all-mode-map}") |
| 55 | |
| 56 | (defun emms-show-all-edit-track () |
| 57 | "Edit the track being shown." |
| 58 | (interactive) |
| 59 | (let ((track emms-show-all-track-alist)) |
| 60 | (emms-show-all-mode-bury-buffer) |
| 61 | (emms-tag-editor-edit-track track))) |
| 62 | |
| 63 | (defun emms-show-all-mode-bury-buffer () |
| 64 | "Bury, and optionally kill the show buffer." |
| 65 | (interactive) |
| 66 | (quit-restore-window |
| 67 | (selected-window) |
| 68 | (when emms-show-all-kill-buffer-on-quit-p 'kill))) |
| 69 | |
| 70 | (defun emms-show-all-setup-buffer () |
| 71 | "Prepare the display buffer." |
| 72 | (let ((buffer (get-buffer-create emms-show-all-buffer-name))) |
| 73 | (with-current-buffer buffer |
| 74 | (when (not (local-variable-p 'emms-show-all-track-alist)) |
| 75 | (make-local-variable 'emms-show-all-track-alist)) |
| 76 | (setq buffer-read-only t) |
| 77 | (when (not (equal major-mode 'emms-show-all-mode)) |
| 78 | (emms-show-all-mode)) |
| 79 | (let ((inhibit-read-only t)) |
| 80 | (erase-buffer))) |
| 81 | buffer)) |
| 82 | |
| 83 | (defun emms-show-all-format (track) |
| 84 | "Format information for TRACK." |
| 85 | (let ((s "")) |
| 86 | (dolist (e (mapcar #'(lambda (tag) |
| 87 | (cons |
| 88 | (format "%s" (car tag)) |
| 89 | (or (emms-track-get track (car tag)) ""))) |
| 90 | emms-tag-editor-tags)) |
| 91 | (setq s (concat s (format "%-17s: %s\n" (car e) (cdr e))))) |
| 92 | s)) |
| 93 | |
| 94 | (defun emms-show-all-insert (track) |
| 95 | "Insert information for TRACK in current buffer." |
| 96 | (let ((type (emms-track-type track))) |
| 97 | (cond ((eq 'file type) |
| 98 | (insert (emms-show-all-format track))) |
| 99 | ((eq 'url type) |
| 100 | (insert |
| 101 | (emms-format-url-track-name (emms-track-name track)))) |
| 102 | (t (insert (concat (symbol-name type) |
| 103 | ": " (emms-track-name track))))))) |
| 104 | |
| 105 | (defun emms-show-all-track (track) |
| 106 | "Display information for TRACK." |
| 107 | (let ((buffer (emms-show-all-setup-buffer))) |
| 108 | (with-current-buffer buffer |
| 109 | (let ((inhibit-read-only t)) |
| 110 | (setq emms-show-all-track-alist track) |
| 111 | (emms-show-all-insert track)) |
| 112 | (pop-to-buffer (current-buffer))))) |
| 113 | |
| 114 | (defun emms-show-all () |
| 115 | "Describe the current EMMS track in detail." |
| 116 | (interactive) |
| 117 | (if emms-player-playing-p |
| 118 | (emms-show-all-track |
| 119 | (emms-playlist-current-selected-track)) |
| 120 | (message "nothing playing right now"))) |
| 121 | |
| 122 | |
| 123 | (provide 'emms-show-all) |
| 124 | |
| 125 | ;;; emms-playlist-mode.el ends here |