if (len(sys.argv) < 2): print 'Please pass the IP address of a Zone Player as the first argument' sys.exit() speaker_ip = sys.argv[1] preset = 0 limit = 12 if (len(sys.argv) == 3): preset = int(sys.argv[2]) - 1 limit = 1 mySonos = SoCo(speaker_ip) if mySonos: stations = mySonos.get_favorite_radio_stations(preset, limit) print 'returned %s of a possible %s radio stations:' % ( stations['returned'], stations['total']) for station in stations['favorites']: print station['title'] uri = station['uri'] # TODO seems at least & needs to be escaped - should move this to # play_uri and maybe escape other chars. uri = uri.replace('&', '&') metadata = meta_template.format(title=station['title'], service=tunein_service) print mySonos.play_uri(uri, metadata) if (len(sys.argv) == 2):
if __name__ == '__main__': if (len(sys.argv) > 1): speaker_ip = sys.argv[1] if (len(sys.argv) == 3): preset = int(sys.argv[2]) - 1 limit = 1 else: preset = 0 limit = 12 mySonos = SoCo(speaker_ip) if mySonos: stations = mySonos.get_favorite_radio_stations( preset, limit) print 'returned %s of a possible %s radio stations:' % (stations['returned'], stations['total']) for fave in stations['favorites']: print fave['title'] uri = fave['uri'] # TODO seems at least & needs to be escaped - should move this to play_uri and maybe escape other chars. uri = uri.replace('&', '&') metadata = meta_template.format(title=fave['title'], service=tunein_service) print mySonos.play_uri( uri, metadata) if (len(sys.argv) == 2): time.sleep( 10)
class SonosStateMc: def __init__(self, sonos_ip): self.state_var = SONOS_IDLE self.sonos_ip = sonos_ip self.sonos = SoCo(self.sonos_ip) self.vol_to_return_to = self.sonos.volume self.time_out = 0 self.retry_count = 0 self.state_entry_time = time.time() self.prev_state = SONOS_IDLE self.logged_idle = False self.sound_uri = "" self.play_pending = False self.abort_pending = False self.play_volume = 30 self.track_info_to_return_to = None self.state_info_to_return_to = None def execCmd(self, cmd, param, meta): self.state_var = SONOS_IDLE self.play_pending = False self.abort_pending = False if cmd.lower() == "play": if param == "": self.sonos.play() else: self.sonos.play_uri(param, meta) elif cmd.lower() == "stop": self.sonos.stop() elif cmd.lower() == "volup": self.sonos.volume = self.sonos.volume + 10 elif cmd.lower() == "voldown": self.sonos.volume = self.sonos.volume - 10 def musicStop(self): self.state_var = SONOS_IDLE self.play_pending = False self.abort_pending = False self.sonos.stop() def getDeviceName(self): return self.sonos.player_name def getFavouriteRadioStations(self): return self.sonos.get_favorite_radio_stations(0,6) def playSound(self, soundUri, playVolume): self.sound_uri = soundUri self.play_volume = playVolume self.play_pending = True def elapsedTime(self): return time.time() - self.state_entry_time def changeState(self, newState): self.prev_state = self.state_var self.state_var = newState self.state_entry_time = time.time() def restore(self): self.sonos.volume = self.vol_to_return_to # Check for radio or similar # Currently this is done by checking the track duration if self.track_info_to_return_to["duration"] == "0:00:00": # Handle playing from the radio or similar self.sonos.play_uri(self.track_info_to_return_to["uri"]) else: # Handle continuation of playing a track from the queue try: queue_pos = int(self.track_info_to_return_to["playlist_position"]) - 1 except: return self.sonos.play_from_queue(queue_pos) self.sonos.seek(self.track_info_to_return_to["position"]) if self.state_info_to_return_to["current_transport_state"] == "PAUSED_PLAYBACK" or self.state_info_to_return_to["current_transport_state"] == "STOPPED": self.changeState(SONOS_RESTORE_PEND) self.time_out = 3 self.retry_count = 2 else: self.completed() def abort(self): self.logState("Aborting") self.play_pending = False self.abort_pending = True self.restore() def completed(self): if self.abort_pending: self.logState("Finished - ABORTED") else: self.logState("Finished - OK") self.play_pending = False self.abort_pending = False self.changeState(SONOS_IDLE) def logState(self, info): if self.state_var == SONOS_IDLE: if self.logged_idle: return self.logged_idle = True else: self.logged_idle = False transp_info = self.sonos.get_current_transport_info() track_info = self.sonos.get_current_track_info() print ("StateNow: ", self.state_var, " PrevState", self.prev_state, " TimeOut: ", self.time_out, " Elapsed: ", self.elapsedTime(), "RetryCount: ", self.retry_count, " TranspState: ", transp_info["current_transport_state"], " PlaylistPos: ", track_info["playlist_position"], "Info: ", info) def handleState(self): # Handle idle if self.state_var == SONOS_IDLE: if self.play_pending: self.changeState(SONOS_PLAY_REQ) return # Get current state information from sonos unit transp_info = self.sonos.get_current_transport_info() track_info = self.sonos.get_current_track_info() cur_transp_state = transp_info['current_transport_state'] self.logState("handleStateEntry") # Handle other states if self.state_var == SONOS_PLAY_REQ: self.vol_to_return_to = self.sonos.volume self.track_info_to_return_to = track_info self.state_info_to_return_to = transp_info self.retry_count = 2 self.changeState(SONOS_PAUSE_TRY) elif self.state_var == SONOS_PAUSE_TRY: self.time_out = 10 if cur_transp_state == "PLAYING": self.sonos.pause() self.changeState(SONOS_PAUSE_PEND) elif self.state_var == SONOS_PAUSE_PEND: if cur_transp_state == "PAUSED_PLAYBACK" or cur_transp_state == "STOPPED": self.changeState(SONOS_PLAY_START) elif cur_transp_state == "PLAYING": if self.elapsedTime() > self.time_out: self.retry_count -= 1 if self.retry_count > 0: self.changeState(SONOS_PAUSE_TRY) else: self.logState("FAILED TO PAUSE - STILL PLAYING") self.abort() else: self.logState("FAILED TO PAUSE - UNKNOWN STATE") self.abort() elif self.state_var == SONOS_PLAY_START: self.sonos.volume = self.play_volume self.sonos.play_uri(self.sound_uri) self.time_out = 30 self.retry_count = 2 self.changeState(SONOS_PLAY_PEND) elif self.state_var == SONOS_PLAY_PEND: if cur_transp_state == "PLAYING": self.changeState(SONOS_PLAYING) else: if self.elapsedTime() > self.time_out: self.retry_count -= 1 if self.retry_count > 0: self.changeState(SONOS_PLAY_START) else: self.logState("FAILED TO PLAY") self.abort() elif self.state_var == SONOS_PLAYING: if cur_transp_state == "PLAYING": if self.elapsedTime() > self.time_out: self.logState("FAILED TO FINISH PLAYING BEFORE TIMEOUT - TRACK TOO LONG?") self.abort() else: self.restore() elif self.state_var == SONOS_RESTORE_PEND: if cur_transp_state == "PLAYING": if self.state_info_to_return_to["current_transport_state"] == "PAUSED_PLAYBACK": self.sonos.pause() elif self.state_info_to_return_to["current_transport_state"] == "STOPPED": self.sonos.stop() self.completed() else: if self.elapsedTime() > self.time_out: self.logState("FAILED TO RESTORE") self.completed()