Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

125 lines (106 sloc) 4.071 kb
# Allows Hubot to control pandora on a squeezebox music player
#
# hubot pandorame <artist, song, etc> - plays on pandora
# hubot pause|play
# hubot vol <positive or negative #> - changes volume
# hubot crankit|indoor voices - volume presets
# hubot who's playing? - lists station, artist, song
# hubot thumbsup|thumbsdown - relay preferences to pandora
#
# prerequisites:
# * have accounts on both mysqueezebox.com & pandora
# * have the pandora app installed on squeezebox
# * be signed into your pandora account on mysqueezebox.com
#
# set the env variables:
# * SQUEEZE_BOX_EMAIL (for mysqueezebox.com)
# * SQUEEZE_BOX_PASSWORD
# * SQUEEZE_BOX_PLAYER_ID (MAC address)
#
# tested on both Squeezebox Boom and Squeezebox Radio
Select = require( "soupselect" ).select
HTMLParser = require "htmlparser"
module.exports = (robot) ->
robot.respond /(queue ?up|pandora ?me) (.+)/i, (msg) ->
queueup(msg, msg.match[2])
robot.respond /pause/i, (msg) ->
_cmd msg, ["pause"]
msg.send "lips are sealed"
robot.respond /play/i, (msg) ->
_cmd msg, ["play"]
msg.send "resuming jam"
robot.respond /vol \+?(\-?\d+)/i, (msg) ->
vol(msg,parseInt(msg.match[1] || "10"))
msg.send "commencing volume adjustment"
robot.respond /crank ?it/i, (msg) ->
vol(msg,100)
msg.send "oh hell yeah"
robot.respond /indoor voices/i, (msg) ->
vol msg,-100, () ->
vol(msg,40)
msg.send "what do you work at a library?"
robot.respond /wh(o|at)'?s ?(playing|this)/i, (msg) ->
artist(msg)
robot.respond /\(?thumbsup\)?/i,(msg) ->
_cmd msg, ["pandora","rate",1]
msg.send "glad you like it"
robot.respond /yuck|\(?thumbsdown\)?/i,(msg) ->
_cmd msg, ["pandora","rate",0]
msg.send "seriously! who put that on?"
_login = (msg,cb) ->
enc=encodeURIComponent
data="email=#{enc(process.env.SQUEEZE_BOX_EMAIL)}&password=#{enc(process.env.SQUEEZE_BOX_PASSWORD)}"
msg.http("http://mysqueezebox.com/user/login")
.header("content-length",data.length)
.header("Content-Type","application/x-www-form-urlencoded")
.post(data) (err,res,body) ->
setString = res.headers['set-cookie'][0]
#dirty split
squeeze_session=setString.split('; ')[0].split('=')[1]
cookie = "Squeezebox-player=#{encodeURIComponent(process.env.SQUEEZE_BOX_PLAYER_ID)}; sdi_squeezenetwork_session=#{squeeze_session}"
cb(cookie)
_cmd = (msg,what,cb) ->
data=
"id":1,
"method":"slim.request",
"params":[process.env.SQUEEZE_BOX_PLAYER_ID,what]
json=JSON.stringify(data)
_login msg, (cookie) ->
msg.http("http://mysqueezebox.com/jsonrpc.js")
.header("content-type","application/json")
.header("content-length",json.length)
.header("cookie", cookie)
.post(json) (err,res,body) ->
cb(err,res,body) if cb?
queueup = (msg,what) ->
_login msg, (cookie) ->
msg.http("http://mysqueezebox.com/browse/Pandora/1_#{encodeURIComponent(what)}")
.header("cookie", cookie)
.get() (err,res,body) ->
if body.match(/No items found./)
msg.send "no dice. couldn't find \"#{what}\"."
else
hits=get_number_of_hits body
if hits==1 or what[what.length-1]=='0'
artist msg
else
msg.send "got #{hits} hits for #{what}, trying first"
queueup msg, "#{what}.0"
artist = (msg) ->
_cmd msg, ["status","-",1,"tags:cgABbehldiqtyrSuoKLN"], (err,res,body) ->
r=JSON.parse(body).result
t=r.remoteMeta
if(t.artist)
msg.send "\"#{t.title}\" by #{t.artist} from #{t.album} @ #{r.current_title}"
msg.send "#{t.artwork_url}"
else
msg.send "playing #{r.current_title}"
vol = (msg,amt,cb) ->
delt = if amt>0 then "+" else ""
change="#{delt}#{amt}"
_cmd msg, ["mixer","volume",change], cb
get_number_of_hits = (body)->
html_handler = new HTMLParser.DefaultHandler((()->), ignoreWhitespace: true )
html_parser = new HTMLParser.Parser html_handler
html_parser.parseComplete body
Select( html_handler.dom, '.inline.text' ).length
Jump to Line
Something went wrong with that request. Please try again.