diff --git a/homeassistant/components/frontend/www_static/images/config_plex_mediaserver.png b/homeassistant/components/frontend/www_static/images/config_plex_mediaserver.png new file mode 100644 index 00000000000..97a1b4b352c Binary files /dev/null and b/homeassistant/components/frontend/www_static/images/config_plex_mediaserver.png differ diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index ae619e64355..4651a963fea 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -10,12 +10,14 @@ import logging from datetime import timedelta from urllib.parse import urlparse +from homeassistant.loader import get_component +import homeassistant.util as util from homeassistant.components.media_player import ( MediaPlayerDevice, SUPPORT_PAUSE, SUPPORT_PREVIOUS_TRACK, SUPPORT_NEXT_TRACK, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO) from homeassistant.const import ( - STATE_IDLE, STATE_PLAYING, STATE_PAUSED, STATE_OFF, STATE_UNKNOWN) -import homeassistant.util as util + CONF_HOST, DEVICE_DEFAULT_NAME, STATE_IDLE, STATE_PLAYING, + STATE_PAUSED, STATE_OFF, STATE_UNKNOWN) REQUIREMENTS = ['plexapi==1.1.0'] MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) @@ -31,70 +33,60 @@ SUPPORT_PLEX = SUPPORT_PAUSE | SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK # pylint: disable=abstract-method, unused-argument -def setup_platform(hass, config, add_devices, discovery_info=None): +def setup_platform(hass, config, add_devices_callback, discovery_info=None): """ Sets up the plex platform. """ - try: - # pylint: disable=unused-variable - from plexapi.myplex import MyPlexUser - from plexapi.exceptions import BadRequest - except ImportError: - _LOGGER.exception("Error while importing dependency plexapi.") - return if discovery_info is not None: + # Parse discovery data host = urlparse(discovery_info[1]).netloc - _LOGGER.error('Discovered PLEX server: %s'%host) + _LOGGER.info('Discovered PLEX server: %s'%host) else: - # 'name' is currently used for plexserver - # This indicates old config method - host = config.get('name','') + host = config.get(CONF_HOST, None) if host in _CONFIGURING: return - setup_plexserver(host, config, hass, add_devices) + setup_plexserver(host, hass, add_devices_callback) -def setup_plexserver(host, hass, add_devices): +def setup_plexserver(host, hass, add_devices_callback): ''' Setup a plexserver based on host parameter''' - from plexapi.server import PlexServer - from plexapi.exceptions import BadRequest + import plexapi + # Config parsing & discovery mix conf_file = hass.config.path(PLEX_CONFIG_FILE) - - # Compatability mode. If there's name, user, etc set in - # configuration, let's use those, not to break anything - # We may want to use this method as option when HA's - # configuration options increase - if config.get('name', ''): - name = config.get('name', '') - user = config.get('user', '') - password = config.get('password', '') - plexuser = MyPlexUser.signin(user, password) - plexserver = plexuser.getResource(name).connect() - - # Discovery mode. Parse config file, attempt conenction - # Request configuration on connect fail - else: - - print('WEEEEJ, host: %s'%host) - try: - # Get configuration from config file - # FIXME unauthenticated plex servers dont require - # a token, so config file isn't mandatory - with open(conf_file,'r') as f: - conf_dict = eval(f.read()) - - plexserver = PlexServer( - 'http://%s'%host, - conf_dict.get(host)['token']) - except IOError: # File not found - request_configuration(host, hass, add_devices_callback) + try: + with open(conf_file,'r') as f: + conf_dict = eval(f.read()) + except IOError: # File not found + if host == None: + # No discovery, no config, quit here return + conf_dict = {} - except NotFound: # Wrong host was given or need token? - _LOGGER.exception("Error connecting to the Hue bridge at %s", host) - return + if host == None: + # Called by module inclusion, let's only use config + host,token = conf_dict.popitem() + token = token['token'] + elif host not in conf_dict.keys(): + # Not in config + conf_dict[host] = { 'token' : '' } + token = None + + _LOGGER.info('Connecting to: htts://%s using token: %s' % + (host, token)) + try: + plexserver = plexapi.PlexServer('http://%s'%host, token) + except Exception: + request_configuration(host, hass, add_devices_callback) + return + except plexapi.exceptions.BadRequest as e: + _LOGGER.error('BLABLA1') + request_configuration(host, hass, add_devices_callback) + return + + _LOGGER.info('Connected to: htts://%s using token: %s' % + (host, token)) plex_clients = {} plex_sessions = {} @@ -155,14 +147,14 @@ def request_configuration(host, hass, add_devices_callback): def plex_configuration_callback(data): """ Actions to do when our configuration callback is called. """ - setup_plexserrver(host, hass, add_devices_callback) + setup_plexserver(host, hass, add_devices_callback) _CONFIGURING[host] = configurator.request_config( hass, "Plex Media Server", plex_configuration_callback, - description=("Enter the X-Plex-Token as descrobed here
" - 'Plex documentation'), - description_image="/static/images/config_plexserver.jpg", - submit_caption="I have pressed the button" + description=('Enter the X-Plex-Token'), + description_image="/static/images/config_plex_mediaserver.png", + submit_caption="Confirm", + fields=[{'Token':'token'}] )