From 56c71749e76b3836a1106febc805bec7764cff79 Mon Sep 17 00:00:00 2001 From: Yoni Rabkin Date: Wed, 2 Apr 2014 14:47:43 -0400 Subject: * lisp/emms-librefm-stream.el: Implement radio handshake call. --- lisp/emms-librefm-stream.el | 85 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) (limited to 'lisp') 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 -- cgit v1.2.3