"""Show the amount of records in a user's Discogs collection.""" from datetime import timedelta import logging import random import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( ATTR_ATTRIBUTION, CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_TOKEN, ) from homeassistant.helpers.aiohttp_client import SERVER_SOFTWARE import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) ATTR_IDENTITY = "identity" ATTRIBUTION = "Data provided by Discogs" DEFAULT_NAME = "Discogs" ICON_RECORD = "mdi:album" ICON_PLAYER = "mdi:record-player" UNIT_RECORDS = "records" SCAN_INTERVAL = timedelta(minutes=10) SENSOR_COLLECTION_TYPE = "collection" SENSOR_WANTLIST_TYPE = "wantlist" SENSOR_RANDOM_RECORD_TYPE = "random_record" SENSORS = { SENSOR_COLLECTION_TYPE: { "name": "Collection", "icon": ICON_RECORD, "unit_of_measurement": UNIT_RECORDS, }, SENSOR_WANTLIST_TYPE: { "name": "Wantlist", "icon": ICON_RECORD, "unit_of_measurement": UNIT_RECORDS, }, SENSOR_RANDOM_RECORD_TYPE: { "name": "Random Record", "icon": ICON_PLAYER, "unit_of_measurement": None, }, } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_TOKEN): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SENSORS)): vol.All( cv.ensure_list, [vol.In(SENSORS)] ), } ) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Discogs sensor.""" import discogs_client token = config[CONF_TOKEN] name = config[CONF_NAME] try: discogs_client = discogs_client.Client(SERVER_SOFTWARE, user_token=token) discogs_data = { "user": discogs_client.identity().name, "folders": discogs_client.identity().collection_folders, "collection_count": discogs_client.identity().num_collection, "wantlist_count": discogs_client.identity().num_wantlist, } except discogs_client.exceptions.HTTPError: _LOGGER.error("API token is not valid") return sensors = [] for sensor_type in config.get(CONF_MONITORED_CONDITIONS): sensors.append(DiscogsSensor(discogs_data, name, sensor_type)) add_entities(sensors, True) class DiscogsSensor(Entity): """Create a new Discogs sensor for a specific type.""" def __init__(self, discogs_data, name, sensor_type): """Initialize the Discogs sensor.""" self._discogs_data = discogs_data self._name = name self._type = sensor_type self._state = None self._attrs = {} @property def name(self): """Return the name of the sensor.""" return "{} {}".format(self._name, SENSORS[self._type]["name"]) @property def state(self): """Return the state of the sensor.""" return self._state @property def icon(self): """Return the icon to use in the frontend, if any.""" return SENSORS[self._type]["icon"] @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" return SENSORS[self._type]["unit_of_measurement"] @property def device_state_attributes(self): """Return the state attributes of the sensor.""" if self._state is None or self._attrs is None: return None if self._type != SENSOR_RANDOM_RECORD_TYPE: return { ATTR_ATTRIBUTION: ATTRIBUTION, ATTR_IDENTITY: self._discogs_data["user"], } return { "cat_no": self._attrs["labels"][0]["catno"], "cover_image": self._attrs["cover_image"], "format": "{} ({})".format( self._attrs["formats"][0]["name"], self._attrs["formats"][0]["descriptions"][0], ), "label": self._attrs["labels"][0]["name"], "released": self._attrs["year"], ATTR_ATTRIBUTION: ATTRIBUTION, ATTR_IDENTITY: self._discogs_data["user"], } def get_random_record(self): """Get a random record suggestion from the user's collection.""" # Index 0 in the folders is the 'All' folder collection = self._discogs_data["folders"][0] random_index = random.randrange(collection.count) random_record = collection.releases[random_index].release self._attrs = random_record.data return "{} - {}".format( random_record.data["artists"][0]["name"], random_record.data["title"] ) def update(self): """Set state to the amount of records in user's collection.""" if self._type == SENSOR_COLLECTION_TYPE: self._state = self._discogs_data["collection_count"] elif self._type == SENSOR_WANTLIST_TYPE: self._state = self._discogs_data["wantlist_count"] else: self._state = self.get_random_record()