aboutsummaryrefslogtreecommitdiff
path: root/emms-playing-time.el
blob: ec7d281ee751161f29080a34998b622f0605f6b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
;;; emms-playing-time.el --- Display emms playing time on mode line

;; Copyright (C) 2005 William XWL

;; Author: William XWL <william.xwl@gmail.com>

;; This program 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 2, or (at your option)
;; any later version.
;;
;; This program 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 this program; if not, write to the Free Software
;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
;; 02110-1301 USA

;;; Commentary:

;; Display playing time on mode line, it looks like: 01:32/04:09.

;; Put this file into your load-path and the following into your
;; ~/.emacs:
;;   (require 'emms-playing-time)

;;; Code:

(defvar emms-playing-time-version "0.1 $Revision: 1.7 $"
  "EMMS playing time version string.")
;; $Id: emms-playing-time.el,v 1.7 2005/09/08 16:07:20 xwl Exp $

(eval-when-compile (require 'cl))
(require 'emms-info)
(require 'emms-info-mp3info)
(require 'emms-player-simple)

;;; Customizations
(defvar emms-playing-time-display-p t
  "Whether to display playing time on mode line or not.")

(defvar emms-playing-time-display-short-p nil
  "Only display elapsed time, don't display total playing time,
e.g., display 02:37 instead of 02:37/05:49.")

(defvar emms-playing-time-display-format " %s "
  "String used for displaying playing time on mode-line.")

;;; Variables
(defvar emms-playing-time 0
  "How long has EMMS run up to now.")

(defvar emms-playing-time-string "")

;;; Functions
(defun emms-playing-time-start ()
  "Get ready for display playing time."
  (when emms-playing-time-display-p
    (setq emms-playing-time 0)
    (emms-playing-time-mode-line)
    (run-at-time t 1 'emms-playing-time-display)))

(add-hook 'emms-player-started-hook 'emms-playing-time-start)

(defun emms-playing-time-stop ()
  "Remove playing time on the mode line."
  (when emms-playing-time-display-p
    (if (or (not emms-player-paused-p)
	    emms-player-stopped-p)
	(progn
	  (setq emms-playing-time-string "")
	  (force-mode-line-update)))
    (cancel-function-timers 'emms-playing-time-display)))

(add-hook 'emms-player-stopped-hook 'emms-playing-time-stop)
(add-hook 'emms-player-finished-hook 'emms-playing-time-stop)

(defun emms-playing-time-pause ()
  "Pause playing time."
  (when emms-playing-time-display-p
    (if emms-player-paused-p
	(emms-playing-time-stop)
      (run-at-time t 1 'emms-playing-time-display))))

(add-hook 'emms-player-paused-hook 'emms-playing-time-pause)

(defun emms-playing-time-seek (sec)
  "Seek forward or backward SEC playing time."
  (when emms-playing-time-display-p
    (setq emms-playing-time (+ emms-playing-time sec))
    (when (< emms-playing-time 0)	; back to start point
      (setq emms-playing-time 0))))

(add-hook 'emms-player-seeked-functions 'emms-playing-time-seek)

(defun emms-playing-time-display ()
  "Display playing time on the mode line."
  (setq emms-playing-time (1+ emms-playing-time))
  (let* ((min (/ emms-playing-time 60))
	 (sec (% emms-playing-time 60))
	 ;; How to adapt `emms-info-format-info' here?
	 (struct
	  (emms-info-get (emms-playlist-selected-track)))
	 (total-min-only
	  (when struct (emms-info-playing-time-min struct)))
	 (total-sec-only
	  (when struct (emms-info-playing-time-sec struct))))
    (setq emms-playing-time-string
	  (format
	   emms-playing-time-display-format
	   (replace-regexp-in-string
	    " " "0"
	    (if (or emms-playing-time-display-short-p
		    ;; unable to get total time info
		    (not total-min-only)
		    (not total-sec-only))
		(format "%2d:%2d" min sec)
	      (format "%2d:%2d/%2s:%2s"
		      min sec total-min-only total-sec-only)))))
    (force-mode-line-update)))

(defun emms-playing-time-mode-line ()
  "Add playing time to the mode line."
  (unless (member 'emms-playing-time-string
		  global-mode-string)
    (setq global-mode-string
	  (append global-mode-string
		  '(emms-playing-time-string)))))


(provide 'emms-playing-time)

;;; emms-playing-time.el ends here