Esempio n. 1
0
    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('&', '&amp;')

        metadata = meta_template.format(title=station['title'],
                                        service=tunein_service)

        print mySonos.play_uri(uri, metadata)

        if (len(sys.argv) == 2):
Esempio n. 2
0
File: tunein.py Progetto: DrSAR/SoCo
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('&', '&amp;')

            metadata = meta_template.format(title=fave['title'], service=tunein_service)

            print mySonos.play_uri( uri, metadata)

            if (len(sys.argv) == 2):
               time.sleep( 10)
Esempio n. 3
0
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()