Skip to content

Commit 0434e79

Browse files
authored
Merge pull request #595 from custom-components/dev
2.5.7
2 parents 11f6c34 + d14510f commit 0434e79

File tree

3 files changed

+57
-25
lines changed

3 files changed

+57
-25
lines changed

custom_components/alexa_media/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"alandtse"
1010
],
1111
"requirements": [
12-
"alexapy==1.5.1"
12+
"alexapy==1.5.2"
1313
],
1414
"homeassistant": "0.96.0"
1515
}

custom_components/alexa_media/media_player.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"""
1010
import asyncio
1111
import logging
12-
from typing import List # noqa pylint: disable=unused-import
12+
import re
13+
from typing import List, Text # noqa pylint: disable=unused-import
1314

1415
from homeassistant import util
1516
from homeassistant.components.media_player import MediaPlayerDevice
@@ -808,9 +809,12 @@ def media_position_updated_at(self):
808809
return self._last_update
809810

810811
@property
811-
def media_image_url(self):
812+
def media_image_url(self) -> Text:
812813
"""Return the image URL of current playing media."""
813-
return self._media_image_url
814+
if self._media_image_url:
815+
return re.sub("\\(", "%28", re.sub("\\)", "%29", self._media_image_url))
816+
# fix failure of HA media player ui to quote "(" or ")"
817+
return None
814818

815819
@property
816820
def media_image_remotely_accessible(self):

custom_components/alexa_media/sensor.py

+49-21
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from homeassistant.exceptions import NoEntitySpecifiedError
1616
from homeassistant.helpers.entity import Entity
1717
from homeassistant.util import dt
18+
import pytz
1819

1920
from . import (
2021
CONF_EMAIL,
@@ -45,6 +46,20 @@
4546
"XXXX-WXX-7": "Every Sunday",
4647
}
4748

49+
RECURRING_PATTERN_ISO_SET = {
50+
None: (),
51+
"P1D": (1, 2, 3, 4, 5, 6, 7),
52+
"XXXX-WE": (6, 7),
53+
"XXXX-WD": (1, 2, 3, 4, 5),
54+
"XXXX-WXX-1": (1),
55+
"XXXX-WXX-2": (2),
56+
"XXXX-WXX-3": (3),
57+
"XXXX-WXX-4": (4),
58+
"XXXX-WXX-5": (5),
59+
"XXXX-WXX-6": (6),
60+
"XXXX-WXX-7": (7),
61+
}
62+
4863

4964
@retry_async(limit=5, delay=5, catch_exceptions=False)
5065
async def async_setup_platform(hass, config, add_devices_callback, discovery_info=None):
@@ -170,23 +185,28 @@ def __init__(
170185
self._unit = None
171186
self._device_class = DEVICE_CLASS_TIMESTAMP
172187
self._icon = icon
188+
self._all = []
189+
self._active = []
190+
self._next = None
191+
self._timestamp: datetime.datetime = None
192+
self._process_raw_notifications()
193+
194+
def _process_raw_notifications(self):
173195
self._all = (
174-
sorted(self._n_dict.items(), key=lambda x: x[1][self._sensor_property])
196+
list(map(self._fix_alarm_date_time, self._n_dict.items()))
175197
if self._n_dict
176198
else []
177199
)
178-
self._all = list(map(self._fix_alarm_date_time, self._all))
179-
self._sorted = (
200+
self._all = list(map(self._update_recurring_alarm, self._all))
201+
self._all = sorted(self._all, key=lambda x: x[1][self._sensor_property])
202+
self._active = (
180203
list(filter(lambda x: x[1]["status"] == "ON", self._all))
181204
if self._all
182205
else []
183206
)
184-
self._next = self._sorted[0][1] if self._sorted else None
185-
self._timestamp: datetime.datetime = None
207+
self._next = self._active[0][1] if self._active else None
186208

187209
def _fix_alarm_date_time(self, value):
188-
import pytz
189-
190210
if (
191211
self._sensor_property != "date_time"
192212
or not value
@@ -222,6 +242,25 @@ def _fix_alarm_date_time(self, value):
222242
)
223243
return value
224244

245+
def _update_recurring_alarm(self, value):
246+
_LOGGER.debug("value %s", value)
247+
alarm = value[1][self._sensor_property]
248+
recurring_pattern = value[1]["recurringPattern"]
249+
while (
250+
recurring_pattern
251+
and alarm < dt.now()
252+
and alarm.isoweekday not in RECURRING_PATTERN_ISO_SET[recurring_pattern]
253+
):
254+
alarm += datetime.timedelta(days=1)
255+
if alarm != value[1][self._sensor_property]:
256+
_LOGGER.debug(
257+
"Alarm with recurrence %s set to %s",
258+
RECURRING_PATTERN[recurring_pattern],
259+
alarm,
260+
)
261+
value[1][self._sensor_property] = alarm
262+
return value
263+
225264
@staticmethod
226265
def _round_time(value: datetime.datetime) -> datetime.datetime:
227266
precision = datetime.timedelta(seconds=1).total_seconds()
@@ -325,18 +364,7 @@ async def async_update(self):
325364
self._n_dict = account_dict["notifications"][self._dev_id][self._type]
326365
except KeyError:
327366
self._n_dict = None
328-
self._all = (
329-
sorted(self._n_dict.items(), key=lambda x: x[1][self._sensor_property])
330-
if self._n_dict
331-
else []
332-
)
333-
self._all = list(map(self._fix_alarm_date_time, self._all))
334-
self._sorted = (
335-
list(filter(lambda x: x[1]["status"] == "ON", self._all))
336-
if self._all
337-
else []
338-
)
339-
self._next = self._sorted[0][1] if self._sorted else None
367+
self._process_raw_notifications()
340368
try:
341369
self.async_schedule_update_ha_state()
342370
except NoEntitySpecifiedError:
@@ -367,9 +395,9 @@ def device_state_attributes(self):
367395

368396
attr = {
369397
"recurrence": self.recurrence,
370-
"total_active": len(self._sorted),
398+
"total_active": len(self._active),
371399
"total_all": len(self._all),
372-
"sorted_active": json.dumps(self._sorted, default=str),
400+
"sorted_active": json.dumps(self._active, default=str),
373401
"sorted_all": json.dumps(self._all, default=str),
374402
}
375403
return attr

0 commit comments

Comments
 (0)