示例#1
0
    def playItems(self, items):
        startPlaying = False

        for item in items:
            try:
                self.sonosDevice.add_to_queue(item)
            except:
                MusicLogging.Instance().info("  error adding...: " +
                                             sys.exc_info()[0])
            if startPlaying == False:
                try:
                    startPlaying = self.sonosDevice.play_from_queue(0,
                                                                    start=True)
                    # startPlaying = self.sonos.play()
                    MusicLogging.Instance().info("  Playing...")
                except:
                    MusicLogging.Instance().info("  error starting to play...")

        if startPlaying == False:
            try:
                # startPlaying = self.sonos.play_from_queue(0, start=True)
                # noinspection PyUnusedLocal
                startPlaying = self.sonosDevice.play()
                MusicLogging.Instance().info("  Playing...")
            except:
                MusicLogging.Instance().info("  error starting to play...")

        return True
示例#2
0
    def setVolume(self, newVolume, volModifier):
        MusicLogging.Instance().info("  setting Volume to:" + str(newVolume))
        currentHour = time.localtime()[3]
        isNight = 0
        if currentHour < float(self.daytimeRange[0]) or currentHour > float(
                self.daytimeRange[1]):  # is it nighttime?
            isNight = 1

        if isNight:
            maxVol = int(round(self.nightVol * volModifier, 0))
            if newVolume >= maxVol:
                self.setSonosVolume(maxVol)
                MusicLogging.Instance().info(
                    "  " + str(newVolume) +
                    " is to loud for Nighttime volume, setting it to " +
                    str(maxVol))
            elif newVolume < maxVol:
                self.setSonosVolume(newVolume)

        else:
            maxVol = int(round(self.dayVol * volModifier, 0))
            if newVolume >= maxVol:
                self.setSonosVolume(maxVol)
                MusicLogging.Instance().info(
                    "  " + str(newVolume) +
                    " is to loud for Daytime volume, setting it to " +
                    str(maxVol))
            elif newVolume < maxVol:
                self.setSonosVolume(newVolume)
        return True
示例#3
0
    def getMusicLibraryInformationCache(self, searchType, entry, valueType):
        returnItems = list([])

        # noinspection PyUnusedLocal
        startItem = 0
        startAtIndex = 0
        while True:
            try:
                # self.music_library.get_music_library_information('albums', start, max_items, full_album_art_uri)
                playlist_info = self.sonosDevice.music_library.get_music_library_information(
                    searchType, start=startAtIndex, max_items=100)
                returnedItems = playlist_info.number_returned
            except:
                MusicLogging.Instance().info("some error")
                break
            if returnedItems == 0:
                break
            if entry['type'] == valueType:
                for playlist in playlist_info:
                    playlistTitle = playlist.title
                    if playlistTitle == entry['item']:
                        MusicLogging.Instance().info('found ' + entry['item'])
                        try:
                            track_list = self.sonosDevice.music_library.browse(
                                playlist)
                            returnItems.extend(track_list)
                        except:
                            MusicLogging.Instance().info("some error")
            startAtIndex += returnedItems

        # playlist_info = #sonos.music_library.get_music_library_information('sonos_playlists',search_term='Shovels And Rope')
        # MusicLogging.Instance().info('Fonud {} Sonos playlists'.format(playlist_info.number_returned))

        return returnItems
示例#4
0
 def lastTag(self):
     try:
         # noinspection PyUnusedLocal
         var = self.lastSavedTag
         MusicLogging.Instance().info("last Tag found")
     except:
         MusicLogging.Instance().info("last Tag not found")
         self.lastSavedTag = None
     return self.lastSavedTag
示例#5
0
 def rotaryEventHandler(self, event):
     if event == RotaryEncoder.CLOCKWISE:
         MusicLogging.Instance().info("Rotary CLOCKWISE")
         self.rightRotaryTurn(event)
     elif event == RotaryEncoder.ANTICLOCKWISE:
         MusicLogging.Instance().info("Rotary ANTICLOCKWISE")
         self.leftRotaryTurn(event)
     elif event == RotaryEncoder.BUTTONDOWN:
         MusicLogging.Instance().info("Rotary Button down event")
         self.rotaryTouch(event)
     elif event == RotaryEncoder.BUTTONUP:
         MusicLogging.Instance().info("Rotary Button up event")
示例#6
0
    def markUnknown(self, aTagUid):
        tag_uid = str(aTagUid)
        MusicLogging.Instance().info("  No record for tag UID: " + tag_uid)
        aUnknownTag = {
            tag_uid: {
                'comment': 'last scan: ' + str(datetime.now()),
                'title': '',
                'vol': 1,
                'time_offset': None,
                'type': None,
                'item': None
            },
        }

        unknownFileName = self.settings + "/" + "2_unknown_Tags" + ".txt"
        if os.path.isfile(unknownFileName):
            unknownTagsJSON = open(unknownFileName)
            unknownTags = json.load(unknownTagsJSON)
            unknownTagsJSON.close()
        else:
            unknownTags = {}

        unknownTags.update(aUnknownTag)
        dump = json.dumps(unknownTags,
                          sort_keys=True,
                          indent=4,
                          separators=(',', ': '))
        fobj_out = open(unknownFileName, "w")
        fobj_out.write(dump)
        fobj_out.close()
示例#7
0
    def play(self, entry):
        playItems = self.getPlayList(entry)

        # restart if last Tag is the same
        lastTag = self.lastTag()
        if not lastTag is None:
            theTimeDelta = datetime.now() - lastTag["scan"]
            MusicLogging.Instance().info("time delta: " + str(theTimeDelta))
            if theTimeDelta < timedelta(seconds=self.restartTime):
                if entry['tag_id'] == lastTag["tag"]:
                    if self.restart():
                        return True

        self.unjoin()
        self.clearQueue()
        if entry['volume']:
            self.setMaxVolume(entry['volume'])

        if entry['type'] == "artist":
            self.playModeShuffleNoRepeat()
        elif entry['type'] == "genre":
            self.playModeShuffleNoRepeat()
        else:
            self.playModeNormal()

        self.playItems(playItems)
        if entry['time_offset']:
            self.setSkipTo(entry['time_offset'])

        self.setLastTag(entry['tag_id'])

        return True
示例#8
0
 def playModeShuffle(self):
     try:
         MusicLogging.Instance().info("do SHUFFLE")
         self.sonosDevice.play_mode = 'SHUFFLE'
         return True
     except:
         return False
示例#9
0
 def unjoinForced(self):
     try:
         self.sonosDevice.unjoin()
         MusicLogging.Instance().info("unjoined")
         return True
     except:
         return False
示例#10
0
 def playModeShuffleNoRepeat(self):
     try:
         MusicLogging.Instance().info("do SHUFFLE_NOREPEAT")
         self.sonosDevice.play_mode = 'SHUFFLE_NOREPEAT'
         return True
     except:
         return False
示例#11
0
 def next(self):
     try:
         self.sonosDevice.next()
         MusicLogging.Instance().info("  playing next track")
         return True
     except:
         return False
示例#12
0
 def playModeRepeatAll(self):
     try:
         MusicLogging.Instance().info("do REPEAT_ALL")
         self.sonosDevice.play_mode = 'REPEAT_ALL'
         return True
     except:
         return False
示例#13
0
 def previous(self):
     try:
         self.sonosDevice.previous()
         MusicLogging.Instance().info("  playing previous track")
         return True
     except:
         return False
示例#14
0
 def playModeNormal(self):
     try:
         MusicLogging.Instance().info("do NORMAL")
         self.sonosDevice.play_mode = 'NORMAL'
         return True
     except:
         return False
示例#15
0
 def restart(self):
     try:
         self.sonosDevice.play()
         MusicLogging.Instance().info("  unpause()...")
         return True
     except:
         return False
示例#16
0
 def sonosVolume(self):
     volume = 0
     try:
         volume = self.sonosDevice.volume
     except:
         MusicLogging.Instance().info("some error")
     return volume
示例#17
0
 def pause(self):
     try:
         self.sonosDevice.pause()
         MusicLogging.Instance().info("  Sonos paused")
         return True
     except:
         return False
示例#18
0
 def stop(self):
     try:
         self.sonosDevice.stop()
         MusicLogging.Instance().info("  Sonos stopped")
         return True
     except:
         return False
示例#19
0
 def setSkipTo(self, time_offset=None):
     if time_offset:
         try:
             self.sonosDevice.seek(time_offset)
             MusicLogging.Instance().info("  Skipped to " + time_offset)
             return True
         except:
             return False
     return False
示例#20
0
 def playPause(self):
     try:
         transportInfo = self.sonosDevice.get_current_transport_info()
         if transportInfo['current_transport_state'] == 'PLAYING':
             self.sonosDevice.pause()
             MusicLogging.Instance().info("  pause()...")
         elif transportInfo['current_transport_state'] == 'PAUSED_PLAYBACK':
             self.sonosDevice.play()
             MusicLogging.Instance().info("  play()...")
         elif transportInfo['current_transport_state'] == 'STOPPED':
             self.sonosDevice.play()
             MusicLogging.Instance().info("  play()... from start")
         else:
             self.sonosDevice.play()
             MusicLogging.Instance().info("  play()... from unknown state")
         return True
     except:
         return False
示例#21
0
    def startSonos(self, speaker):

        # Sonos setup
        MusicLogging.Instance().info("Connecting to Sonos...")
        self.speakers = soco.discover()
        try:
            self.sonosDevice = soco.discovery.by_name(speaker)
        except:
            self.sonosDevice = self.speakers.pop()
        return True
示例#22
0
 def togglePlayModeShuffle(self):
     try:
         if self.sonosDevice.play_mode == 'SHUFFLE':
             self.sonosDevice.play_mode = 'REPEAT_ALL'
             MusicLogging.Instance().info("now: REPEAT_ALL")
         elif self.sonosDevice.play_mode == 'REPEAT_ALL':
             self.sonosDevice.play_mode = 'SHUFFLE'
             MusicLogging.Instance().info("now: SHUFFLE")
         elif self.sonosDevice.play_mode == 'NORMAL':
             self.sonosDevice.play_mode = 'SHUFFLE_NOREPEAT'
             MusicLogging.Instance().info("now: SHUFFLE_NOREPEAT")
         elif self.sonosDevice.play_mode == 'SHUFFLE_NOREPEAT':
             self.sonosDevice.play_mode = 'NORMAL'
             MusicLogging.Instance().info("now: NORMAL")
         else:
             self.sonosDevice.play_mode = 'NORMAL'
             MusicLogging.Instance().info("now: NORMAL")
         return True
     except:
         return False
示例#23
0
 def saveLastTagTime(self):
     # only save when a track is playing
     try:
         transportInfo = self.sonosDevice.get_current_transport_info()
         if transportInfo['current_transport_state'] == 'PLAYING':
             lastTag = self.lastTag()
             if not lastTag is None:
                 self.lastSavedTag = {
                     "tag": lastTag["tag"],
                     "scan": datetime.now()
                 }
                 MusicLogging.Instance().info("last tag time saved")
                 return True
             else:
                 MusicLogging.Instance().info("did not save last tag time")
                 return False
         else:
             MusicLogging.Instance().info("music is currently not playing")
             return False
     except:
         return False
示例#24
0
    def __init__(self, pause, play, togglePlayPause, toggleNext, togglePrev,
                 toggleUnjoin, toggleVolUp, toggleVolDown, toggleShuffle,
                 rightRotaryTurn, leftRotaryTurn, rotaryTouch):
        self.rightRotaryTurn = rightRotaryTurn
        self.leftRotaryTurn = leftRotaryTurn
        self.rotaryTouch = rotaryTouch
        self.lastTagUid = None
        # set all gpios
        if not self.BUTTON_PAUSE == self.NOGPIO:
            GPIO.setup(self.BUTTON_PAUSE, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_PAUSE,
                                  GPIO.RISING,
                                  callback=pause,
                                  bouncetime=200)

        if not self.BUTTON_PLAY == self.NOGPIO:
            GPIO.setup(self.BUTTON_PLAY, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_PLAY,
                                  GPIO.RISING,
                                  callback=play,
                                  bouncetime=200)

        if not self.BUTTON_PLAYPAUSE == self.NOGPIO:
            GPIO.setup(self.BUTTON_PLAYPAUSE,
                       GPIO.IN,
                       pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_PLAYPAUSE,
                                  GPIO.RISING,
                                  callback=togglePlayPause,
                                  bouncetime=800)

        if not self.BUTTON_NEXT == self.NOGPIO:
            GPIO.setup(self.BUTTON_NEXT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_NEXT,
                                  GPIO.RISING,
                                  callback=toggleNext,
                                  bouncetime=200)

        if not self.BUTTON_PREV == self.NOGPIO:
            GPIO.setup(self.BUTTON_PREV, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_PREV,
                                  GPIO.RISING,
                                  callback=togglePrev,
                                  bouncetime=200)

        if not self.BUTTON_UNJOIN == self.NOGPIO:
            GPIO.setup(self.BUTTON_UNJOIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_UNJOIN,
                                  GPIO.RISING,
                                  callback=toggleUnjoin,
                                  bouncetime=200)

        if not self.BUTTON_VOL_UP == self.NOGPIO:
            GPIO.setup(self.BUTTON_VOL_UP, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_VOL_UP,
                                  GPIO.RISING,
                                  callback=toggleVolUp,
                                  bouncetime=200)

        if not self.BUTTON_VOL_DOWN == self.NOGPIO:
            GPIO.setup(self.BUTTON_VOL_DOWN,
                       GPIO.IN,
                       pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_VOL_DOWN,
                                  GPIO.RISING,
                                  callback=toggleVolDown,
                                  bouncetime=200)

        if not self.BUTTON_SHUFFLE == self.NOGPIO:
            GPIO.setup(self.BUTTON_SHUFFLE,
                       GPIO.IN,
                       pull_up_down=GPIO.PUD_DOWN)
            GPIO.add_event_detect(self.BUTTON_SHUFFLE,
                                  GPIO.RISING,
                                  callback=toggleShuffle,
                                  bouncetime=200)

        if self.ROTARY_1 != self.NOGPIO & self.ROTARY_2 != self.NOGPIO:
            MusicLogging.Instance().info("Rotary found")
            encoder = RotaryEncoder(self.ROTARY_1, self.ROTARY_2,
                                    self.rotaryEventHandler)
            if self.ROTARY_BUTTON != self.NOGPIO:
                encoder.setupButton(self.ROTARY_BUTTON)

        # To show that everythin is startet: pulse the led for 5 seconds:
        if self.LED1_BCM != self.NOGPIO:
            self.ledPulse = LedPulse(self.LED1_BCM)
            self.ledPulse.startPulseLedForSeconds(10)
            # ledPulse.startPulseLed()

        MusicLogging.Instance().info("Setting up reader...")
        # Create an object of the class MFRC522
        self.reader = MFRC522.MFRC522()

        # Welcome message
        MusicLogging.Instance().info("Welcome to the MFRC522 reader")

        self.lastTagUid = 'stop'
        self.oldStatus = 0
示例#25
0
 def setLastTag(self, tag_uid):
     MusicLogging.Instance().info("last Tag saved")
     self.lastSavedTag = {"tag": tag_uid, "scan": datetime.now()}
示例#26
0
 def stopAll(self):
     MusicLogging.Instance().info("Stopping RasPi")
     GPIO.cleanup()
示例#27
0
 def stopAll(self):
     MusicLogging.Instance().info("Stopping Sonos")
示例#28
0
 def setSonosVolume(self, volume):
     try:
         self.sonosDevice.volume = volume
     except:
         MusicLogging.Instance().info("some error")
     return True