JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fix login_cached, playlist fetch coming along
authorJason Woofenden <jason@jasonwoof.com>
Wed, 7 Dec 2011 20:55:26 +0000 (15:55 -0500)
committerJason Woofenden <jason@jasonwoof.com>
Wed, 7 Dec 2011 20:55:26 +0000 (15:55 -0500)
api.coffee

index 52e6933..958ba6e 100644 (file)
@@ -40,7 +40,8 @@ load_auth = (callback) ->
                if err
                        callback err
                else
                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']
 
 # 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()
 
                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
 exports.tune = tune
 exports.login = login # fixme remove this from the API and call it automatically
 exports.new_auth_token = new_auth_token