aboutsummaryrefslogtreecommitdiff
path: root/lisp/emms-librefm-stream.el
diff options
context:
space:
mode:
authorYoni Rabkin <yonirabkin@member.fsf.org>2014-04-02 14:47:43 -0400
committerYoni Rabkin <yonirabkin@member.fsf.org>2014-04-02 14:47:43 -0400
commit56c71749e76b3836a1106febc805bec7764cff79 (patch)
tree90cd23788e536df85b537da0c892489635eabec9 /lisp/emms-librefm-stream.el
parent431595d1f1d8e789a3fdedc95223c9d45afbf114 (diff)
* lisp/emms-librefm-stream.el: Implement radio handshake call.
Diffstat (limited to 'lisp/emms-librefm-stream.el')
-rw-r--r--lisp/emms-librefm-stream.el85
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