diff options
| author | Yoni Rabkin <yonirabkin@member.fsf.org> | 2014-04-02 14:47:43 -0400 | 
|---|---|---|
| committer | Yoni Rabkin <yonirabkin@member.fsf.org> | 2014-04-02 14:47:43 -0400 | 
| commit | 56c71749e76b3836a1106febc805bec7764cff79 (patch) | |
| tree | 90cd23788e536df85b537da0c892489635eabec9 | |
| parent | 431595d1f1d8e789a3fdedc95223c9d45afbf114 (diff) | |
* lisp/emms-librefm-stream.el: Implement radio handshake call.
| -rw-r--r-- | lisp/emms-librefm-stream.el | 85 | 
1 files changed, 84 insertions, 1 deletions
diff --git a/lisp/emms-librefm-stream.el b/lisp/emms-librefm-stream.el index fc9f5e4..2b232ba 100644 --- a/lisp/emms-librefm-stream.el +++ b/lisp/emms-librefm-stream.el @@ -30,10 +30,93 @@    "alpha.libre.fm"    "URL for the streaming host") +(defvar emms-librefm-stream-debug +  "" +  "Temporary debug information.") +;;; ------------------------------------------------------------------ +;;; radio handshake +;;; ------------------------------------------------------------------ -(provide 'emms-librefm-stream) +;; http://alpha.libre.fm/radio/handshake.php?version=1.3.0.58&platform=linux&username=USERNAME&passwordmd5=PASSWORDMD5&language=en + +(defun emms-librefm-stream-tune-handshake-string () +  (when (not emms-librefm-scrobbler-username) +    (error "null username")) +  (when (not emms-librefm-scrobbler-password) +    (error "null password")) +  (let ((url (concat "http://" +		     emms-librefm-stream-host-url +		     "/radio/handshake.php?" +		     "version=1.3.0.58" "&" +		     "platform=linux" "&" +		     "username=" (url-encode-url emms-librefm-scrobbler-username) "&" +		     "passwordmd5=" (md5 emms-librefm-scrobbler-password) "&" +		     "language=en"))) +    url)) + +(defun emms-librefm-stream-tune-handshake-call () +  "" +  (let ((url-request-method "POST")) +    (let ((response +	   (url-retrieve-synchronously +	    (emms-librefm-stream-tune-handshake-string)))) +      (setq emms-librefm-stream-debug +	    (with-current-buffer response +	      (buffer-substring-no-properties (point-min) +					      (point-max)))) +      response))) + + +;;; ------------------------------------------------------------------ +;;; tuning +;;; ------------------------------------------------------------------ +(defun emms-librefm-stream-tune-string (session-id station) +  "" +  (when (not session-id) +    (error "null session id")) +  (when (not station) +    (error "null station")) +  (let ((url (concat "http://" +		     emms-librefm-stream-host-url +		     "/radio/adjust.php?" +		     "session=" session-id "&" +		     "url=" (url-encode-url station)))) +    url)) + +(defun emms-librefm-stream-tune-call (session-id station) +  "" +  (let ((url-request-method "POST")) +    (let ((response +	   (url-retrieve-synchronously +	    (emms-librefm-stream-tune-string +	     session-id station)))) +      (setq emms-librefm-stream-debug +	    (with-current-buffer response +	      (buffer-substring-no-properties (point-min) +					      (point-max)))) +      response))) + +(defun emms-librefm-stream-handle-tune-response (resbuf) +  "Handle the tune server response." +  (when (not (bufferp resbuf)) +    (error "response not a buffer")) +  (with-current-buffer resbuf +    (goto-char (point-min)) +    (when (not (re-search-forward "^.*200 OK$" (point-at-eol) t)) +      (error "bad HTTP server response")) +    ;; go to the start of the FM response +    (when (not (re-search-forward "\n\n" (point-max) t)) +      (error "bad FM server response")) +    (let ((status (buffer-substring (point-at-bol) +				    (point-at-eol)))) +      (cond ((string= status "OK")         'ok) +	    ((string= status "BADSESSION") 'badsession) +	    (t (error "unhandled response status: [%s]" status)))))) + + +(provide 'emms-librefm-stream)  ;;; emms-librefm-stream.el ends here  | 
