diff --git a/BeoGateway.indigoPlugin/Contents/Server Plugin/PluginConfig.xml b/BeoGateway.indigoPlugin/Contents/Server Plugin/PluginConfig.xml index 93cb36a..e67823a 100644 --- a/BeoGateway.indigoPlugin/Contents/Server Plugin/PluginConfig.xml +++ b/BeoGateway.indigoPlugin/Contents/Server Plugin/PluginConfig.xml @@ -65,6 +65,24 @@ set_music_control + + + + set_playlist_default + + + + + set_playlist_green + + + + + set_playlist_yellow + diff --git a/BeoGateway.indigoPlugin/Contents/Server Plugin/plugin.py b/BeoGateway.indigoPlugin/Contents/Server Plugin/plugin.py index f8ba971..369feb0 100644 --- a/BeoGateway.indigoPlugin/Contents/Server Plugin/plugin.py +++ b/BeoGateway.indigoPlugin/Contents/Server Plugin/plugin.py @@ -4,6 +4,8 @@ import json import time import logging import requests +import threading +import os from datetime import datetime import Resources.CONSTANTS as CONST @@ -20,18 +22,26 @@ class Plugin(indigo.PluginBase): def __init__(self, pluginId, pluginDisplayName, pluginVersion, pluginPrefs): indigo.PluginBase.__init__(self, pluginId, pluginDisplayName, pluginVersion, pluginPrefs) + # Plugin polling and reporting parameters self.pollinterval = 595 # ping sent out at 9:55, response evaluated at 10:00 self.trackmode = self.pluginPrefs.get("trackMode") self.verbose = self.pluginPrefs.get("verboseMode") self.notifymode = self.pluginPrefs.get("notifyMode") self.debug = self.pluginPrefs.get("debugMode") - self.default_audio_source = self.pluginPrefs.get("defaultAudio") - self.itunes_control = self.pluginPrefs.get("iTunesControl") - self.itunes_source = self.pluginPrefs.get("iTunesSource") - self.goto_flag = datetime(1982, 04, 01, 13, 30, 00, 342380) - self.triggers = [] + # Plugin audio source control parameters + self.default_audio_source = self.pluginPrefs.get("defaultAudio") + self.goto_flag = datetime(1982, 4, 1, 13, 30, 00, 342380) + + # Plugin Apple Music control parameters + self.itunes_control = self.pluginPrefs.get("iTunesControl") + self.playlist_default = self.pluginPrefs.get("playlist_default") + self.playlist_green = self.pluginPrefs.get("playlist_green") + self.playlist_yellow = self.pluginPrefs.get("playlist_yellow") + self.itunes_source = self.pluginPrefs.get("iTunesSource") + + # Gateway network address and login parameters self.host = str(self.pluginPrefs.get('address')).encode('ascii') self.port = [int(self.pluginPrefs.get('mlgw_port')), int(self.pluginPrefs.get('hip_port')), @@ -157,6 +167,9 @@ class Plugin(indigo.PluginBase): myarray.append(item) return myarray + def playlistgenerator(self, filter="", valuesDict=None, typeId="", targetId=0): + return self.iTunes.get_playlist_names() + # ######################################################################################## # ##### Indigo UI Prefs def set_login(self, ui): @@ -218,6 +231,18 @@ class Plugin(indigo.PluginBase): self.default_audio_source = ui.get("defaultAudio") indigo.server.log("Default Audio Source set to " + str(self.default_audio_source), level=logging.DEBUG) + def set_playlist_default(self, ui): + self.playlist_default = ui.get("playlist_default") + indigo.server.log("Default Apple Music Playlist set to " + str(self.playlist_default), level=logging.DEBUG) + + def set_playlist_green(self, ui): + self.playlist_green = ui.get("playlist_green") + indigo.server.log("Green Key Apple Music Playlist set to " + str(self.playlist_green), level=logging.DEBUG) + + def set_playlist_yellow(self, ui): + self.playlist_yellow = ui.get("playlist_yellow") + indigo.server.log("Yellow Key Music Playlist set to " + str(self.playlist_yellow), level=logging.DEBUG) + # ######################################################################################## # ##### Indigo UI Actions def send_beo4_key(self, action, device): @@ -292,11 +317,13 @@ class Plugin(indigo.PluginBase): response = requests.post(url=command, headers=header, data=cmd_data, timeout=1) if cmd_type == "PUT": response = requests.put(url=command, headers=header, data=cmd_data, timeout=1) + else: + response = '' if response.content: response = json.loads(response.content) indigo.server.log(json.dumps(response, indent=4), level=logging.DEBUG) - except requests.ConnectionError, e: + except requests.ConnectionError as e: indigo.server.log("Unable to process BeoNetRemote Command - " + str(e), level=logging.ERROR) def request_state_update(self, action, device): @@ -348,6 +375,7 @@ class Plugin(indigo.PluginBase): if trigger.pluginTypeId == "lightKey" and \ (props["room"] == str(99) or props["room"] == str(room)) and \ props["keyCode"] == str(key_code): + indigo.server.log("Executing Trigger: " + trigger.name, level=logging.DEBUG) indigo.trigger.execute(trigger) break @@ -357,9 +385,10 @@ class Plugin(indigo.PluginBase): for trigger in self.triggers: props = trigger.globalProps["uk.co.lukes_plugins.BeoGateway.plugin"] - if trigger.pluginTypeId == "controlkey" and \ + if trigger.pluginTypeId == "controlKey" and \ (props["room"] == str(99) or props["room"] == str(room)) and \ props["keyCode"] == str(key_code): + indigo.server.log("Executing Trigger: " + trigger.name, level=logging.DEBUG) indigo.trigger.execute(trigger) break @@ -599,6 +628,12 @@ class Plugin(indigo.PluginBase): else: self.message_log(name, header, payload, message) + # Report Thread Count + if self.debug: + thread_count = int(threading.active_count()) + if thread_count > 0: + indigo.server.log("Current Thread Count = " + str(thread_count), level=logging.DEBUG) + # ######################################################################################## # AV Handler Functions @@ -978,13 +1013,13 @@ class Plugin(indigo.PluginBase): # Transport controls for iTunes try: # If N.MUSIC command, trigger appropriate self.iTunes control if message['State_Update']['state'] not in ["", "Standby"]: - self.iTunes.play() + self.iTunes.play(self.playlist_default) except KeyError: pass try: # If N.MUSIC selected and Beo4 command received then run appropriate transport commands if message['State_Update']['command'] == "Go/Play": - self.iTunes.play() + self.iTunes.play(self.playlist_default) elif message['State_Update']['command'] == "Stop": self.iTunes.pause() @@ -1007,6 +1042,11 @@ class Plugin(indigo.PluginBase): elif message['State_Update']['command'] == "Shift-1/Random": self.iTunes.shuffle() + elif "Digit-" in message['State_Update']['command']: + rating = int(message['State_Update']['command'][-1:]) * 100/9 + self.iTunes.set_rating(int(rating)) + + # If 'Info' pressed - update track info elif message['State_Update']['command'] == "Info": track_info = self.iTunes.get_current_track_info() @@ -1022,6 +1062,8 @@ class Plugin(indigo.PluginBase): "\n\tACTIVE AUDIO RENDERERS: " + str(self.gateway.states['AudioRenderers']) + "\n\n", level=logging.DEBUG ) + s = 'say ' + track_info[0] + ', by ' + track_info[2] + ', from the album, ' + track_info[1] + os.system(s) self.iTunes.notify( "Now playing: '" + track_info[0] + @@ -1045,13 +1087,17 @@ class Plugin(indigo.PluginBase): "\n\tStep Down/P- : Previous Track" "\n\tWind : Scan Forwards 15 Seconds" "\n\tRewind : Scan Backwards 15 Seconds" + "\n\n\t** DIGITS **" + "\n\tDigit 0 : Rate Track at 0 (0%), dislike it, and disable it from playback" + "\n\tDigits 1 to 8 : Rate Track from 1 (10%) to 8 (90%)" + "\n\tDigit 9 : Rate Track at 9 (100%) and 'love'' it" "\n\n\t** FUNCTIONS **" "\n\tShift-1/Random : Toggle Shuffle" "\n\tINFO : Display Track Info for Current Track" "\n\tGUIDE : This Guide" "\n\n\t** ADVANCED CONTROLS **" - "\n\tGreen : Shuffle Playlist 'Recently Played'" - "\n\tYellow : Play Digital Radio Stations from Playlist Radio" + "\n\tGreen : Shuffle Playlist '" + self.playlist_green + "'" + "\n\tYellow : Shuffle Playlist '" + self.playlist_yellow + "'" "\n\tRed : More of the Same" "\n\tBlue : Play the Album that the Current Track Resides On\n\n", level=logging.DEBUG @@ -1060,13 +1106,15 @@ class Plugin(indigo.PluginBase): # If colour key pressed, execute the appropriate applescript elif message['State_Update']['command'] == "Green": # Play a specific playlist - defaults to Recently Played - script = ASBridge.__file__[:-12] + '/Scripts/green.scpt' - self.iTunes.run_script(script, self.debug) + # script = ASBridge.__file__[:-12] + '/Scripts/green.scpt' + # self.iTunes.run_script(script, self.debug) + self.iTunes.play_playlist(self.playlist_green) elif message['State_Update']['command'] == "Yellow": # Play a specific playlist - defaults to URL Radio stations - script = ASBridge.__file__[:-12] + '/Scripts/yellow.scpt' - self.iTunes.run_script(script, self.debug) + # script = ASBridge.__file__[:-12] + '/Scripts/yellow.scpt' + # self.iTunes.run_script(script, self.debug) + self.iTunes.play_playlist(self.playlist_yellow) elif message['State_Update']['command'] == "Blue": # Play the current album