diff --git a/homeassistant/components/sensor/twitch.py b/homeassistant/components/sensor/twitch.py index 3763aa30fb4ad09ca5ab3ee81af21890f912495a..57e98bc273de543f1d277a9fcb209acb5f028a1d 100644 --- a/homeassistant/components/sensor/twitch.py +++ b/homeassistant/components/sensor/twitch.py @@ -12,7 +12,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['python-twitch==1.3.0'] +REQUIREMENTS = ['python-twitch-client==0.5.1'] _LOGGER = logging.getLogger(__name__) @@ -20,12 +20,14 @@ ATTR_GAME = 'game' ATTR_TITLE = 'title' CONF_CHANNELS = 'channels' +CONF_CLIENT_ID = 'client_id' ICON = 'mdi:twitch' STATE_OFFLINE = 'offline' STATE_STREAMING = 'streaming' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_CLIENT_ID): cv.string, vol.Required(CONF_CHANNELS, default=[]): vol.All(cv.ensure_list, [cv.string]), }) @@ -33,21 +35,34 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Twitch platform.""" + from twitch import TwitchClient + from requests.exceptions import HTTPError + channels = config.get(CONF_CHANNELS, []) + client = TwitchClient(client_id=config.get(CONF_CLIENT_ID)) + + try: + client.ingests.get_server_list() + except HTTPError: + _LOGGER.error("Client ID is not valid") + return False + + users = client.users.translate_usernames_to_ids(channels) - add_entities([TwitchSensor(channel) for channel in channels], True) + add_entities([TwitchSensor(user, client) for user in users], True) class TwitchSensor(Entity): """Representation of an Twitch channel.""" - def __init__(self, channel): + def __init__(self, user, client): """Initialize the sensor.""" - self._channel = channel + self._client = client + self._user = user + self._channel = self._user.name + self._id = self._user.id self._state = STATE_OFFLINE - self._preview = None - self._game = None - self._title = None + self._preview = self._game = self._title = None @property def should_poll(self): @@ -69,20 +84,6 @@ class TwitchSensor(Entity): """Return preview of current game.""" return self._preview - # pylint: disable=no-member - def update(self): - """Update device state.""" - from twitch.api import v3 as twitch - stream = twitch.streams.by_channel(self._channel).get('stream') - if stream: - self._game = stream.get('channel').get('game') - self._title = stream.get('channel').get('status') - self._preview = stream.get('preview').get('small') - self._state = STATE_STREAMING - else: - self._preview = None - self._state = STATE_OFFLINE - @property def device_state_attributes(self): """Return the state attributes.""" @@ -96,3 +97,16 @@ class TwitchSensor(Entity): def icon(self): """Icon to use in the frontend, if any.""" return ICON + + # pylint: disable=no-member + def update(self): + """Update device state.""" + stream = self._client.streams.get_stream_by_user(self._id) + if stream: + self._game = stream.get('channel').get('game') + self._title = stream.get('channel').get('status') + self._preview = stream.get('preview').get('medium') + self._state = STATE_STREAMING + else: + self._preview = self._client.users.get_by_id(self._id).get('logo') + self._state = STATE_OFFLINE diff --git a/requirements_all.txt b/requirements_all.txt index a16fd558d262577ce6cf3868b36fdcecd590dba4..bc81da036600ebb96903113c3eef97a62285b260 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1145,7 +1145,7 @@ python-tado==0.2.3 python-telegram-bot==11.0.0 # homeassistant.components.sensor.twitch -python-twitch==1.3.0 +python-twitch-client==0.5.1 # homeassistant.components.velbus python-velbus==2.0.19