diff options
| -rw-r--r-- | emms-lastfm.el | 81 | 
1 files changed, 44 insertions, 37 deletions
diff --git a/emms-lastfm.el b/emms-lastfm.el index 5656f14..2f4ac73 100644 --- a/emms-lastfm.el +++ b/emms-lastfm.el @@ -126,7 +126,7 @@ paused track resumes) and sets the track submission timer."  (defun emms-lastfm-cancel-timer ()    "Cancels `emms-lastfm-timer' if it is running."    (when emms-lastfm-timer -    (cancel-timer emms-lastfm-timer) +    (emms-cancel-timer emms-lastfm-timer)      (setq emms-lastfm-timer nil)))  (defun emms-lastfm-pause () @@ -181,7 +181,7 @@ the current track, too."                     'emms-lastfm-cancel-timer)        (remove-hook 'emms-player-paused-hook                     'emms-lastfm-pause) -      (when emms-lastfm-timer (cancel-timer emms-lastfm-timer)) +      (when emms-lastfm-timer (emms-cancel-timer emms-lastfm-timer))        (setq emms-lastfm-md5-challenge nil              emms-lastfm-submit-url    nil              emms-lastfm-process       nil @@ -310,50 +310,32 @@ well or if an error occured."            "&passwordmd5="           (md5 emms-lastfm-password)            "&debug="                 (number-to-string 9))) -(defun emms-lastfm-radio-handshake () -  "Handshakes with the last.fm server." +(defun emms-lastfm-radio-handshake (fn radio-url) +  "Handshakes with the last.fm server. +Calls FN when done with RADIO-URL as its only argument."    (when emms-lastfm-buffer (kill-buffer emms-lastfm-buffer))    (let ((url-request-method "GET"))      (setq emms-lastfm-buffer            (url-retrieve (emms-escape-url                           (emms-lastfm-radio-get-handshake-url)) -                        'emms-lastfm-radio-handshake-sentinel)))) +                        'emms-lastfm-radio-handshake-sentinel +                        (list fn radio-url))))) -(defun emms-lastfm-radio-handshake-sentinel (&rest args) +(defun emms-lastfm-radio-handshake-sentinel (status fn radio-url)    (save-excursion      (set-buffer emms-lastfm-buffer)      (emms-http-decode-buffer)      (setq emms-lastfm-radio-session    (emms-key-value "session"))      (setq emms-lastfm-radio-stream-url (emms-key-value "stream_url"))      (if (and emms-lastfm-radio-session emms-lastfm-radio-stream-url) -        (message "EMMS: Handshaking for Last.fm playback successful.") -      (message "EMMS: Failed handshaking for Last.fm playback.")))) - -(defun emms-lastfm-radio (lastfm-url) -  "Plays the stream associated with the given Last.fm URL. (A -Last.fm URL has the form lastfm://foo/bar/baz, e.g. - -  lastfm://artist/Manowar/similarartists - -or +        (progn +          (message "EMMS: Handshaking for Last.fm playback successful") +          (funcall fn radio-url)) +      (message "EMMS: Failed handshaking for Last.fm playback")))) -  lastfm://globaltags/metal." -  (interactive "sLast.fm URL: ") -  ;; Streamed songs must not be added to the lastfm profile -  (emms-lastfm-disable) -  (when (not (and emms-lastfm-radio-session  -                  emms-lastfm-radio-stream-url)) -    (emms-lastfm-radio-handshake)) -  ;; FIXME: Is there some better code to ensure that execution resumes not -  ;; before the handshake sentinel has finished??? -  (let ((waits 0)) -    (while (and (not (and emms-lastfm-radio-session  -                          emms-lastfm-radio-stream-url)) -                (< waits 10)) -      (setq waits (1+ waits)) -      (sit-for 1))) -  ;; END of FIXME -  (if (and emms-lastfm-radio-session  +(defun emms-lastfm-radio-1 (lastfm-url) +  "Internal function used by `emms-lastfm-radio'." +  (if (and emms-lastfm-radio-session             emms-lastfm-radio-stream-url)        (let ((url-request-method "GET"))          (setq emms-lastfm-buffer @@ -367,6 +349,23 @@ or                 'emms-lastfm-radio-sentinel)))      (message "EMMS: Cannot play Last.fm stream."))) +(defun emms-lastfm-radio (lastfm-url) +  "Plays the stream associated with the given Last.fm URL. (A +Last.fm URL has the form lastfm://foo/bar/baz, e.g. + +  lastfm://artist/Manowar/similarartists + +or + +  lastfm://globaltags/metal." +  (interactive "sLast.fm URL: ") +  ;; Streamed songs must not be added to the lastfm profile +  (emms-lastfm-disable) +  (if (not (and emms-lastfm-radio-session +                emms-lastfm-radio-stream-url)) +      (emms-lastfm-radio-handshake #'emms-lastfm-radio-1 lastfm-url) +    (emms-lastfm-radio-1 lastfm-url))) +  (defcustom emms-lastfm-radio-metadata-period 15    "When listening to Last.fm Radio every how many seconds should  emms-lastfm poll for metadata? If set to nil, there won't be any @@ -376,7 +375,8 @@ The default is 15: That means that the mode line will display the  wrong (last) track's data for a maximum of 15 seconds. If your  network connection has a big latency this value may be too  high. (But then streaming a 128KHz mp3 won't be fun anyway.)" -  :type 'integer +  :type '(choice integer +                 (const :tag "Disable" nil))    :group 'emms-lastfm)  (defun emms-lastfm-radio-sentinel (&rest args) @@ -450,8 +450,14 @@ song."          (message "EMMS: Rated current track.")        (message "EMMS: Rating failed.")))) -(defun emms-lastfm-radio-request-metadata () -  "Request the metadata of the current song and display it." +(defun emms-lastfm-radio-request-metadata (&optional fn data) +  "Request the metadata of the current song and display it. + +If FN is given, call it instead of +`emms-lastfm-radio-request-metadata-sentinel', with DATA as its +first parameter. + +If DATA is given, it should be a list."    (interactive)    ;; we don't want to have hundreds of open buffers, so kill the old one now.    (when emms-lastfm-buffer (kill-buffer emms-lastfm-buffer)) @@ -463,7 +469,8 @@ song."                      "np.php?"                      "session=" emms-lastfm-radio-session                      "&debug="  (number-to-string 0))) -           'emms-lastfm-radio-request-metadata-sentinel)))) +           (or fn 'emms-lastfm-radio-request-metadata-sentinel) +           data))))  (defun emms-lastfm-radio-request-metadata-sentinel (&rest args)    (save-excursion  | 
