Fixes for Sonos media position (#33379)

This commit is contained in:
Anders Melchiorsen 2020-03-29 00:15:32 +01:00 committed by GitHub
parent dd232a3507
commit 03a090e384
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -490,6 +490,11 @@ class SonosEntity(MediaPlayerDevice):
"""Return True if entity is available.""" """Return True if entity is available."""
return self._seen_timer is not None return self._seen_timer is not None
def _clear_media_position(self):
"""Clear the media_position."""
self._media_position = None
self._media_position_updated_at = None
def _set_favorites(self): def _set_favorites(self):
"""Set available favorites.""" """Set available favorites."""
self._favorites = [] self._favorites = []
@ -553,8 +558,6 @@ class SonosEntity(MediaPlayerDevice):
self._shuffle = self.soco.shuffle self._shuffle = self.soco.shuffle
self._uri = None self._uri = None
self._media_duration = None self._media_duration = None
self._media_position = None
self._media_position_updated_at = None
self._media_image_url = None self._media_image_url = None
self._media_artist = None self._media_artist = None
self._media_album_name = None self._media_album_name = None
@ -570,6 +573,9 @@ class SonosEntity(MediaPlayerDevice):
self.update_media_linein(SOURCE_LINEIN) self.update_media_linein(SOURCE_LINEIN)
else: else:
track_info = self.soco.get_current_track_info() track_info = self.soco.get_current_track_info()
if not track_info["uri"]:
self._clear_media_position()
else:
self._uri = track_info["uri"] self._uri = track_info["uri"]
self._media_artist = track_info.get("artist") self._media_artist = track_info.get("artist")
self._media_album_name = track_info.get("album") self._media_album_name = track_info.get("album")
@ -579,6 +585,7 @@ class SonosEntity(MediaPlayerDevice):
variables = event and event.variables variables = event and event.variables
self.update_media_radio(variables, track_info) self.update_media_radio(variables, track_info)
else: else:
variables = event and event.variables
self.update_media_music(update_position, track_info) self.update_media_music(update_position, track_info)
self.schedule_update_ha_state() self.schedule_update_ha_state()
@ -591,11 +598,15 @@ class SonosEntity(MediaPlayerDevice):
def update_media_linein(self, source): def update_media_linein(self, source):
"""Update state when playing from line-in/tv.""" """Update state when playing from line-in/tv."""
self._clear_media_position()
self._media_title = source self._media_title = source
self._source_name = source self._source_name = source
def update_media_radio(self, variables, track_info): def update_media_radio(self, variables, track_info):
"""Update state when streaming radio.""" """Update state when streaming radio."""
self._clear_media_position()
try: try:
library = pysonos.music_library.MusicLibrary(self.soco) library = pysonos.music_library.MusicLibrary(self.soco)
album_art_uri = variables["current_track_meta_data"].album_art_uri album_art_uri = variables["current_track_meta_data"].album_art_uri
@ -627,26 +638,24 @@ class SonosEntity(MediaPlayerDevice):
) )
rel_time = _timespan_secs(position_info.get("RelTime")) rel_time = _timespan_secs(position_info.get("RelTime"))
# player no longer reports position?
update_media_position |= rel_time is None and self._media_position is not None
# player started reporting position? # player started reporting position?
update_media_position |= rel_time is not None and self._media_position is None update_media_position |= rel_time is not None and self._media_position is None
# position jumped? # position jumped?
if ( if rel_time is not None and self._media_position is not None:
self.state == STATE_PLAYING if self.state == STATE_PLAYING:
and rel_time is not None
and self._media_position is not None
):
time_diff = utcnow() - self._media_position_updated_at time_diff = utcnow() - self._media_position_updated_at
time_diff = time_diff.total_seconds() time_diff = time_diff.total_seconds()
else:
time_diff = 0
calculated_position = self._media_position + time_diff calculated_position = self._media_position + time_diff
update_media_position |= abs(calculated_position - rel_time) > 1.5 update_media_position |= abs(calculated_position - rel_time) > 1.5
if update_media_position: if rel_time is None:
self._clear_media_position()
elif update_media_position:
self._media_position = rel_time self._media_position = rel_time
self._media_position_updated_at = utcnow() self._media_position_updated_at = utcnow()
@ -770,6 +779,7 @@ class SonosEntity(MediaPlayerDevice):
return self._shuffle return self._shuffle
@property @property
@soco_coordinator
def media_content_id(self): def media_content_id(self):
"""Content id of current playing media.""" """Content id of current playing media."""
return self._uri return self._uri