;;; emms-setup.el --- Setup script for EMMS -*- lexical-binding: t; -*- ;; Copyright (C) 2005-2022 Free Software Foundation, Inc. ;; Author: Yoni Rabkin ;; Keywords: emms setup multimedia ;; This file is part of EMMS. ;; EMMS 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, or (at your option) ;; any later version. ;; EMMS 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 EMMS; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; This file provides the `emms-setup' feature. With `emms-setup' we ;; can setup Emms with different features enabled. The use of this ;; feature is documented in the Emms manual which is distributed with ;; Emms. ;; ;; The use this feature we can invoke (for example): ;; ;; (require 'emms-setup) ;; (emms-all) ;; ;; The first command loads the feature into Emacs and the second ;; chooses the `emms-all' level. ;;; Code: (require 'emms) (defgroup emms-setup nil "*The Emacs Multimedia System setup utility." :prefix "emms-setup" :group 'multimedia) (defcustom emms-setup-default-player-list '(emms-player-mpg321 emms-player-ogg123 emms-player-mplayer-playlist emms-player-mplayer emms-player-mpv emms-player-vlc emms-player-vlc-playlist) "Default list of players for emms-setup." :type 'list) (defvar emms-setup-discover-player-alist '((emms-player-mpg321 . "mpg123") (emms-player-ogg123 . "ogg123") (emms-player-mplayer . "mplayer") (emms-player-mpv . "mpv") (emms-player-vlc . "vlc")) "Association list of players and their binaries.") ;;;###autoload (defun emms-minimalistic () "An Emms setup script. Invisible playlists and all the basics for playing media." (require 'emms-source-file) (require 'emms-source-playlist) (require 'emms-player-simple) (require 'emms-player-mplayer) (require 'emms-player-mpv) (require 'emms-player-vlc)) ;;;###autoload (defun emms-all () "An Emms setup script. Everything included in the `emms-minimalistic' setup and adds all the stable features which come with the Emms distribution." ;; include (emms-minimalistic) ;; define (eval-and-compile (require 'emms-playlist-mode) (require 'emms-info) (require 'emms-info-mp3info) (require 'emms-info-ogginfo) (require 'emms-info-opusinfo) (require 'emms-info-metaflac) (require 'emms-info-tinytag) (require 'emms-info-exiftool) (require 'emms-info-native) (require 'emms-cache) (require 'emms-mode-line) (require 'emms-mark) (require 'emms-tag-editor) (require 'emms-tag-tracktag) (require 'emms-show-all) (require 'emms-streams) (require 'emms-lyrics) (require 'emms-playing-time) (require 'emms-player-mpd) (require 'emms-player-xine) (require 'emms-playlist-sort) (require 'emms-browser) (require 'emms-mode-line-icon) (require 'emms-cue) (require 'emms-bookmarks) (require 'emms-last-played) (require 'emms-metaplaylist-mode) (require 'emms-stream-info) (require 'emms-score) (require 'emms-history) (require 'emms-i18n) (require 'emms-volume) (require 'emms-playlist-limit) (require 'emms-librefm-scrobbler) (require 'emms-librefm-stream) (require 'emms-mpris)) ;; setup (setq emms-playlist-default-major-mode #'emms-playlist-mode) (add-to-list 'emms-track-initialize-functions #'emms-info-initialize-track) (setq emms-info-functions '(emms-info-native emms-info-cueinfo)) (setq emms-track-description-function #'emms-info-track-description) (when (fboundp 'emms-cache) ; work around compiler warning (emms-cache 1)) (emms-mode-line-mode 1) (emms-mode-line-blank) (emms-lyrics 1) (emms-playing-time-mode 1) (add-hook 'emms-player-started-hook #'emms-last-played-update-current) (emms-score 1)) ;;;###autoload (defun emms-default-players () "Set `emms-player-list' to `emms-setup-default-player-list'." (setq emms-player-list emms-setup-default-player-list)) ;; These are kept around in order not to break anyone's existing ;; setup. ;;;###autoload (defun emms-devel () (emms-all)) (make-obsolete 'emms-devel 'emms-all "4.1") ;;;###autoload (defun emms-standard () (emms-all)) (make-obsolete 'emms-standard 'emms-all "4.1") ;;; ------------------------------------------------------------------ ;;; Player discovery ;;; ------------------------------------------------------------------ (defun emms-setup-discover-player-binary (bin-str) "Find if BIN-STR can be executed in the current environment." (when (not (eq system-type 'gnu/linux)) (error "Player discovery only supported on GNU/Linux.")) (let ((result (call-process "which" nil nil nil bin-str))) (cond ((eq 0 result) t) ((eq 1 result) nil) ((eq 2 result) (error "invalid arguments to `which'."))))) (defun emms-setup-discover-player-has-binary-p (player) "Find if PLAYER has an excecutable in the current environment." (let ((bin-str (alist-get player emms-setup-discover-player-alist))) (if bin-str (emms-setup-discover-player-binary bin-str) nil))) (defun emms-setup-discover-players () "Interactively add players to `emms-player-list'." (interactive) (when (and emms-player-list (y-or-n-p (format "emms-player-list is already set to %s, do you want to empty it first?" emms-player-list))) (setq emms-player-list nil)) (let ((players (copy-tree emms-setup-default-player-list))) (while players (let ((player (car players))) (when (emms-setup-discover-player-has-binary-p player) (when (y-or-n-p (format "Player %s is installed on your system, add it to the Emms player list?" player)) (add-to-list 'emms-player-list player)))) (setq players (cdr players)))) (message "emms-player-list is now set to: %s" emms-player-list)) (provide 'emms-setup) ;;; emms-setup.el ends here