From a3bdc1f7920615c41159bfb2f949a745a63a7230 Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Wed, 7 Dec 2011 15:55:26 -0500 Subject: [PATCH] fix login_cached, playlist fetch coming along --- api.coffee | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/api.coffee b/api.coffee index 52e6933..958ba6e 100644 --- a/api.coffee +++ b/api.coffee @@ -40,7 +40,8 @@ load_auth = (callback) -> if err callback err else - callback null, JSON.parse data + auth = JSON.parse data + callback null, auth # elements look like: ['name', {attr: value, attr2: value2,...}, [contents]] # text nodes look like elements with blank names: ['', {}, 'foo'] @@ -211,6 +212,83 @@ tune = (tag, callback) -> req.write args req.end() +# FIXME call tune automatically or remove "tag" argument +get_playlist = (tag, callback) -> + login_cached (err, sk) -> + return callback(err) if err? + + console.log "getting playlist with sk=#{sk}" + http.get { host: 'alpha.libre.fm', port: 80, path: "/2.0/?method=radio.getPlaylist&sk=#{sk}"}, (res) -> + if res.statusCode != 200 + console.log "login response code: #{res.statusCode}" + callback "login response code: #{res.statusCode}" + return + + res.setEncoding 'utf8' + response_text = '' + res.on 'data', (chunk) -> + response_text += chunk + res.on 'end', -> + # while testing, got response_text === "BADSESSION" + console.log "server said: #{response_text}" + parse_xml response_text, (err, response) -> + parse_lfm_xml response_text, (err, lfm) -> + if err + # parse error + callback "Error while parsing server reply while requesting playlist: #{err}" + return + for element in response + if element[0] is 'playlist' + # FIXME write this bit + console.log 'Yay we got a playlist!' + console.log JSON.stringify element[0] + else if element[0] is 'lfm' + if element[1].status isnt 'failed' + callback "Server responded to our playlist request with #{JSON.stringify response}" + return + + # FIXME search for "error" element instead of assuming it's first + code = element[2][0]?.code + if code is 4 # invalid authentication token + delay = 0 + sk_age = now_ms() - auth.sk_date + if sk_age < 30000 + console.log "Server said our auth token was invalid only #{sk_age}ms after we got it." + delay = 30000 - sk_age + console.log "Waiting another #{delay}ms before requesting another one." + # get new auth token + timeout delay, -> + login (err, sk) -> + if err + callback err + return + get_playlist tag, callback + return + else + if typeof element[2][0]?[2] is 'string' + message = JSON.stringify element[2][0][2] + console.log "server response from tune: code #{code} message: #{message}" + callback "Error during tune: code #{code} message: #{message}" + return + # looked through all elements, and didn't find one with name "error" + callback "Error during tune: server responded without success or error message" + +test = (tag, callback) -> + tune tag, (err) -> + if err? + console.log err + callback err + return + get_playlist tag, -> + if err? + console.log err + callback err + return + console.log 'yay' + callback() + +exports.test = test +exports.get_playlist = get_playlist exports.tune = tune exports.login = login # fixme remove this from the API and call it automatically exports.new_auth_token = new_auth_token -- 1.7.10.4