diff options
-rw-r--r-- | emms-lyrics.el | 157 |
1 files changed, 87 insertions, 70 deletions
diff --git a/emms-lyrics.el b/emms-lyrics.el index 11f0a07..507b052 100644 --- a/emms-lyrics.el +++ b/emms-lyrics.el @@ -1,8 +1,8 @@ ;;; emms-lyrics.el --- Display lyrics synchronically -;; Copyright (C) 2005 William XWL +;; Copyright (C) 2005 William Xu -;; Author: William XWL <william.xwl@gmail.com> +;; Author: William Xu <william.xwl@gmail.com> ;; Keywords: emms music lyric ;; This program is free software; you can redistribute it and/or modify @@ -28,6 +28,9 @@ ;; Put this file into your load-path and the following into your ;; ~/.emacs: ;; (require 'emms-lyrics) +;; +;; Then either `M-x emms-lyrics-enable' or add (emms-lyrics-enable) in +;; your .emacs to enable. ;;; Change Log: @@ -69,20 +72,13 @@ "Lyrics module for EMMS." :group 'emms) -(defcustom emms-lyrics-display-p t - "If non-nil, will diplay lyrics." - :type 'boolean - :group 'emms-lyrics) - (defcustom emms-lyrics-display-on-modeline t - "If non-nil, display lyrics on mode line. See also -`emms-lyrics-display-p'." + "If non-nil, display lyrics on mode line." :type 'boolean :group 'emms-lyrics) (defcustom emms-lyrics-display-on-minibuffer nil - "If non-nil, display lyrics on minibuffer. See also -`emms-lyrics-display-p'." + "If non-nil, display lyrics on minibuffer." :type 'boolean :group 'emms-lyrics) @@ -104,6 +100,9 @@ for lyrics in current directory and this directory." ;;; Emms Lyrics +(defvar emms-lyrics-display-p t + "If non-nil, will diplay lyrics.") + (defvar emms-lyrics-alist nil "a list of the form: '((time0 lyric0) (time1 lyric1)...)). In short, at time-i, display lyric-i.") @@ -132,57 +131,53 @@ contents look like one of the following: [00:39.67]I love you, Emacs! To find FILE, will look up in current directory and `emms-lyrics-dir'." - (when emms-lyrics-display-p - (unless (file-exists-p file) - (setq file (emms-lyrics-find-lyric file))) - (when (and file (not (string= file "")) (file-exists-p file)) - (with-temp-buffer - (insert-file-contents file) - (while (search-forward-regexp "\\[[0-9:.]+\\].*" nil t) - (let ((lyric-string (match-string 0)) - (time 0) - (lyric "")) - (setq lyric - (replace-regexp-in-string ".*\\]" "" lyric-string)) - (while (string-match "\\[[0-9:.]+\\]" lyric-string) - (let* ((time-string (match-string 0 lyric-string)) - (semi-pos (string-match ":" time-string))) - (setq time - (+ (* (string-to-number - (substring time-string 1 semi-pos)) - 60) - (string-to-number - (substring time-string - (1+ semi-pos) - (1- (length time-string)))))) - (setq lyric-string - (substring lyric-string (length time-string))) - (setq emms-lyrics-alist - (append emms-lyrics-alist `((,time ,lyric)))) - (setq time 0))))) - t)))) + (unless (file-exists-p file) + (setq file (emms-lyrics-find-lyric file))) + (when (and file (not (string= file "")) (file-exists-p file)) + (with-temp-buffer + (insert-file-contents file) + (while (search-forward-regexp "\\[[0-9:.]+\\].*" nil t) + (let ((lyric-string (match-string 0)) + (time 0) + (lyric "")) + (setq lyric + (replace-regexp-in-string ".*\\]" "" lyric-string)) + (while (string-match "\\[[0-9:.]+\\]" lyric-string) + (let* ((time-string (match-string 0 lyric-string)) + (semi-pos (string-match ":" time-string))) + (setq time + (+ (* (string-to-number + (substring time-string 1 semi-pos)) + 60) + (string-to-number + (substring time-string + (1+ semi-pos) + (1- (length time-string)))))) + (setq lyric-string + (substring lyric-string (length time-string))) + (setq emms-lyrics-alist + (append emms-lyrics-alist `((,time ,lyric)))) + (setq time 0))))) + t))) (defun emms-lyrics-start () "Start displaying lryics." (setq emms-lyrics-start-time (current-time) emms-lyrics-pause-time nil emms-lyrics-elapsed-time 0) - (when (and emms-lyrics-display-p - (let ((file - (emms-track-get - (emms-playlist-current-selected-track) - 'name))) - (emms-lyrics-read-file - (replace-regexp-in-string - (file-name-extension file) "lrc" file)))) + (when (let ((file + (emms-track-get + (emms-playlist-current-selected-track) + 'name))) + (emms-lyrics-read-file + (replace-regexp-in-string + (file-name-extension file) "lrc" file))) (emms-lyrics-set-timer))) -(add-hook 'emms-player-started-hook 'emms-lyrics-start) - (defun emms-lyrics-stop () "Stop displaying lyrics." (interactive) - (when (and emms-lyrics-alist) + (when emms-lyrics-alist (cancel-function-timers 'emms-lyrics-display) (if (or (not emms-player-paused-p) emms-player-stopped-p) @@ -190,9 +185,6 @@ To find FILE, will look up in current directory and `emms-lyrics-dir'." emms-lyrics-timers nil emms-lyrics-mode-line-string "")))) -(add-hook 'emms-player-stopped-hook 'emms-lyrics-stop) -(add-hook 'emms-player-finished-hook 'emms-lyrics-stop) - (defun emms-lyrics-pause () "Pause displaying lyrics." (if emms-player-paused-p @@ -204,14 +196,11 @@ To find FILE, will look up in current directory and `emms-lyrics-dir'." emms-lyrics-start-time)) emms-lyrics-elapsed-time))) (setq emms-lyrics-start-time (current-time))) - (when (and emms-lyrics-display-p - emms-lyrics-alist) + (when emms-lyrics-alist (if emms-player-paused-p (emms-lyrics-stop) (emms-lyrics-set-timer)))) -(add-hook 'emms-player-paused-hook 'emms-lyrics-pause) - (defun emms-lyrics-seek (sec) "Seek forward or backward SEC seconds lyrics." (setq emms-lyrics-elapsed-time @@ -223,36 +212,65 @@ To find FILE, will look up in current directory and `emms-lyrics-dir'." (when (< emms-lyrics-elapsed-time 0) ; back to start point (setq emms-lyrics-elapsed-time 0)) (setq emms-lyrics-start-time (current-time)) - (when (and emms-lyrics-display-p - emms-lyrics-alist) + (when emms-lyrics-alist (let ((paused-orig emms-player-paused-p)) (setq emms-player-paused-p t) (emms-lyrics-stop) (setq emms-player-paused-p paused-orig)) (emms-lyrics-set-timer))) -(add-hook 'emms-player-seeked-functions 'emms-lyrics-seek) - (defun emms-lyrics-toggle-display-on-minibuffer () - "Toggle display lyric on minibbufer." + "Toggle display lyrics on minibbufer." (interactive) (if emms-lyrics-display-on-minibuffer (progn (setq emms-lyrics-display-on-minibuffer nil) - (message "Disable lyric on minibufer.")) + (message "Disable lyrics on minibufer.")) (setq emms-lyrics-display-on-minibuffer t) - (message "Enable lyric on minibufer."))) + (message "Enable lyrics on minibufer."))) (defun emms-lyrics-toggle-display-on-modeline () - "Toggle display lyric on modeline." + "Toggle display lyrics on mode line." (interactive) (if emms-lyrics-display-on-modeline (progn (setq emms-lyrics-display-on-modeline nil emms-lyrics-mode-line-string "") - (message "Disable lyric on modeline.")) + (message "Disable lyrics on mode line.")) (setq emms-lyrics-display-on-modeline t) - (message "Enable lyric on modeline."))) + (message "Enable lyrics on mode line."))) + +(defun emms-lyrics-enable () + "Enable displaying emms lyrics." + (interactive) + (setq emms-lyrics-display-p t) + (add-hook 'emms-player-started-hook 'emms-lyrics-start) + (add-hook 'emms-player-stopped-hook 'emms-lyrics-stop) + (add-hook 'emms-player-finished-hook 'emms-lyrics-stop) + (add-hook 'emms-player-paused-hook 'emms-lyrics-pause) + (add-hook 'emms-player-seeked-functions 'emms-lyrics-seek) + (message "Displaying emms lyrics enabled.")) + +(defun emms-lyrics-disable () + "Disable displaying emms lyrics." + (interactive) + (setq emms-lyrics-display-p nil) + (emms-lyrics-stop) + (remove-hook 'emms-player-started-hook 'emms-lyrics-start) + (remove-hook 'emms-player-stopped-hook 'emms-lyrics-stop) + (remove-hook 'emms-player-finished-hook 'emms-lyrics-stop) + (remove-hook 'emms-player-paused-hook 'emms-lyrics-pause) + (remove-hook 'emms-player-seeked-functions 'emms-lyrics-seek) + (message "Displaying emms lyrics disabled.")) + +(defun emms-lyrics-toggle () + "Toggle displaying emms lyrics." + (interactive) + (setq emms-lyrics-display-p + (not emms-lyrics-display-p)) + (if emms-lyrics-display-p + (emms-lyrics-enable) + (emms-lyrics-disable))) (defun emms-lyrics-set-timer () "Set timers for displaying lyrics." @@ -284,8 +302,7 @@ LYRIC is current playing lyric. See `emms-lyrics-display-on-modeline' and `emms-lyrics-display-on-minibuffer' on how to config where to display." - (when (and emms-lyrics-display-p - emms-lyrics-alist) + (when emms-lyrics-alist (when emms-lyrics-display-on-modeline (emms-lyrics-mode-line) (setq emms-lyrics-mode-line-string |