diff options
-rw-r--r-- | lisp/emms-librefm-stream.el | 74 |
1 files changed, 62 insertions, 12 deletions
diff --git a/lisp/emms-librefm-stream.el b/lisp/emms-librefm-stream.el index 20b5570..f3c6506 100644 --- a/lisp/emms-librefm-stream.el +++ b/lisp/emms-librefm-stream.el @@ -47,6 +47,10 @@ "" "Last station name tuned to.") +(defvar emms-librefm-stream-emms-tracklist + "" + "List of tracks for streaming.") + ;;; ------------------------------------------------------------------ ;;; HTTP @@ -107,7 +111,7 @@ point after the HTTP headers." base-url base-path (start (point))) - + (if (re-search-forward "^session=\\(.*\\)$" (point-max) t) (setq radio-session-id (match-string-no-properties 1)) (error "no radio session ID from server")) @@ -125,7 +129,7 @@ point after the HTTP headers." (setq emms-librefm-stream-session-id radio-session-id emms-librefm-stream-host-url base-url emms-librefm-stream-host-base-path base-path)) - + (message "radio handshake successful"))) (defun emms-librefm-stream-tune-handshake () @@ -177,7 +181,7 @@ point after the HTTP headers." url stationname (start (point))) - + (if (re-search-forward "^response=\\(.*\\)$" (point-max) t) (setq response (match-string-no-properties 1)) (error "no response status code")) @@ -195,10 +199,8 @@ point after the HTTP headers." (error "no stationname from server")) (setq emms-librefm-stream-station-name stationname) - - (message "successfully tuned to: %s" stationname) - - (emms-librefm-stream-getplaylist))))) + + (message "successfully tuned to: %s" stationname))))) (defun emms-librefm-stream-tune (station) "Make and handle tune call." @@ -253,21 +255,61 @@ point after the HTTP headers." ;;; ------------------------------------------------------------------ -;;; Parse XSPF +;;; XSPF ;;; ------------------------------------------------------------------ -(defun emms-librefm-stream-xspf-tracklist (playlist) +(defun emms-librefm-stream-xspf-find (tag data) "Return the tracklist portion of PLAYLIST or nil." - (let ((tree (copy-tree playlist)) + (let ((tree (copy-tree data)) result) (while (and tree (not result)) (let ((this (car tree))) (when (and (listp this) - (eq (car this) 'trackList)) + (eq (car this) tag)) (setq result this))) (setq tree (cdr tree))) result)) +(defun emms-librefm-stream-xspf-tracklist (playlist) + "Return the tracklist portion of PLAYLIST or nil." + (emms-librefm-stream-xspf-find 'trackList (car playlist))) + +(defun emms-librefm-stream-xspf-get (tag track) + "Return the data associated with TAG in TRACK." + (nth 2 (emms-librefm-stream-xspf-find tag track))) + +(defun emms-librefm-stream-xspf-convert-track (track) + "Convert TRACK to an Emms track." + (let ((location (emms-librefm-stream-xspf-get 'location track)) + (title (emms-librefm-stream-xspf-get 'title track)) + (album (emms-librefm-stream-xspf-get 'album track)) + (creator (emms-librefm-stream-xspf-get 'creator track)) + (duration (emms-librefm-stream-xspf-get 'duration track)) + (image (emms-librefm-stream-xspf-get 'image track))) + (let ((emms-track (emms-dictionary '*track*))) + (emms-track-set emms-track 'name location) + (emms-track-set emms-track 'info-artist creator) + (emms-track-set emms-track 'info-title title) + (emms-track-set emms-track 'info-album album) + (emms-track-set emms-track 'info-playing-time + (/ (parse-integer duration) + 1000)) + (emms-track-set emms-track 'type 'gnufm-streaming) + emms-track))) + +(defun emms-librefm-stream-xspf-convert-tracklist (tracklist) + "Convert TRACKLIST to a list of Emms tracks." + (let (tracks) + (mapc + #'(lambda (e) + (when (and (listp e) + (eq 'track (car e))) + (setq tracks + (append tracks + `(,(emms-librefm-stream-xspf-convert-track e)))))) + tracklist) + tracks)) + ;;; ------------------------------------------------------------------ ;;; stream @@ -279,7 +321,15 @@ point after the HTTP headers." (when (not (stringp station)) (error "bad argument")) (emms-librefm-stream-tune-handshake) - (emms-librefm-stream-tune station)) + (emms-librefm-stream-tune station) + (let ((tracklist + (emms-librefm-stream-xspf-tracklist + (emms-librefm-stream-getplaylist)))) + (when (not tracklist) + (setq emms-librefm-stream-emms-tracklist nil) + (error "could not find tracklist")) + (setq emms-librefm-stream-emms-tracklist + (emms-librefm-stream-xspf-convert-tracklist tracklist)))) (provide 'emms-librefm-stream) |