@@ -72,6 +72,7 @@ def __init__(self, loop, host=None, username=None, password=None, verbose=False)
7272 self ._media_title = None
7373 self ._media_image_url = None
7474 self ._media_id = None
75+ self ._favourites = []
7576
7677 self ._verbose = verbose
7778 self ._player_id = None
@@ -144,11 +145,14 @@ def connect(self, host=None, port=HEOS_PORT, callback=None):
144145 if self .player_id :
145146 self .request_now_playing_media ()
146147 self .request_play_state ()
148+ self .request_mute_state ()
147149 self .request_volume ()
148150
149151 if self ._username is not None :
150152 yield from self .ensure_login ()
151153
154+ self .request_browse_source (SID_FAVORITES )
155+
152156 @asyncio .coroutine
153157 def _connect (self , host , port = HEOS_PORT ):
154158 " connect "
@@ -193,7 +197,7 @@ def _parse_message(message):
193197 else :
194198 return {}
195199
196- def _dispatcher (self , command , payload ):
200+ def _dispatcher (self , command , message , payload ):
197201 " call parser functions "
198202 # if self._verbose:
199203 if self ._verbose :
@@ -213,12 +217,14 @@ def _dispatcher(self, command, payload):
213217 PLAYER_NOW_PLAYING_CHANGED : self ._parse_player_now_playing_changed ,
214218 PLAYER_NOW_PLAYING_PROGRESS : self ._parse_player_now_playing_progress ,
215219 SYSTEM_SIGNIN : self ._parse_system_signin ,
220+ BROWSE : self ._parse_browse_browse ,
216221 }
217222 commands_ignored = (
218223 SYSTEM_PRETTIFY ,
219224 )
225+
220226 if command in callbacks .keys ():
221- callbacks [command ](payload )
227+ callbacks [command ](payload , message )
222228 elif command in commands_ignored :
223229 if self ._verbose :
224230 print ('[I] command "{}" is ignored.' .format (command ))
@@ -230,22 +236,23 @@ def _parse_command(self, data):
230236 try :
231237 data_heos = data ['heos' ]
232238 command = data_heos ['command' ]
239+ message = {}
240+ if ('message' in data_heos ):
241+ if data_heos ['message' ].startswith ('command under process' ):
242+ return None
243+ message = self ._parse_message (data_heos ['message' ])
233244 if 'result' in data_heos .keys () and data_heos ['result' ] == 'fail' :
234245 raise AioHeosException (data_heos ['message' ])
235246 if 'payload' in data .keys ():
236- self ._dispatcher (command , data ['payload' ])
247+ self ._dispatcher (command , message , data ['payload' ])
237248 elif 'message' in data_heos .keys ():
238- if data_heos ['message' ] == 'command under process' :
239- return None
240- message = self ._parse_message (data_heos ['message' ])
241- self ._dispatcher (command , message )
249+ self ._dispatcher (command , message , None )
250+ elif 'command' in data_heos .keys ():
251+ self ._dispatcher (command , None , None )
242252 else :
243- raise AioHeosException ('No message or payload in reply.' )
244- # pylint: disable=bare-except
245- except AioHeosException as exc :
246- raise AioHeosException ('Problem parsing ({})' .format (exc ))
253+ raise AioHeosException ('No message or payload in reply. payload: {}' .format (data ))
247254 except :
248- raise AioHeosException ('Problem parsing command.' )
255+ raise AioHeosException ('Problem parsing command: {}' . format ( data ) )
249256
250257 return None
251258
@@ -323,7 +330,7 @@ def login(self):
323330 " login "
324331 self .send_command (SYSTEM_SIGNIN , { 'un' : self ._username , 'pw' : self ._password })
325332
326- def _parse_players (self , payload ):
333+ def _parse_players (self , payload , message ):
327334 self ._players = payload
328335 self ._player_id = self ._players [0 ]['pid' ]
329336
@@ -343,8 +350,8 @@ def request_play_state(self):
343350 " request play state "
344351 self .send_command (GET_PLAY_STATE , {'pid' : self .player_id })
345352
346- def _parse_play_state (self , payload ):
347- self ._play_state = payload ['state' ]
353+ def _parse_play_state (self , payload , message ):
354+ self ._play_state = message ['state' ]
348355
349356 def get_play_state (self ):
350357 """ get play state """
@@ -354,13 +361,17 @@ def request_mute_state(self):
354361 " request mute state "
355362 self .send_command (GET_MUTE_STATE , {'pid' : self .player_id })
356363
357- def _parse_mute_state (self , payload ):
358- self ._mute_state = payload ['state' ]
364+ def _parse_mute_state (self , payload , message ):
365+ self ._mute_state = message ['state' ]
359366
360367 def get_mute_state (self ):
361368 """ get mute state """
362369 return self ._mute_state
363370
371+ def get_favourites (self ):
372+ """ get favourites """
373+ return self ._favourites
374+
364375 def request_volume (self ):
365376 " request volume "
366377 self .send_command (GET_VOLUME , {'pid' : self .player_id })
@@ -374,7 +385,7 @@ def set_volume(self, volume_level):
374385 self .send_command (SET_VOLUME , {'pid' : self .player_id ,
375386 'level' : volume_level })
376387
377- def _parse_volume (self , message ):
388+ def _parse_volume (self , payload , message ):
378389 self ._volume_level = message ['level' ]
379390
380391 def get_volume (self ):
@@ -413,7 +424,7 @@ def request_now_playing_media(self):
413424 " get playing media "
414425 self .send_command (GET_NOW_PLAYING_MEDIA , {'pid' : self .player_id })
415426
416- def _parse_now_playing_media (self , payload ):
427+ def _parse_now_playing_media (self , payload , message ):
417428 if 'artist' in payload .keys ():
418429 self ._media_artist = payload ['artist' ]
419430 if 'album' in payload .keys ():
@@ -511,18 +522,22 @@ def play_content(self, content, content_type='audio/mpeg'):
511522 self ._loop .create_task (self ._upnp .play_content (content , content_type ))
512523 # asyncio.wait([task])
513524
514- def _parse_player_volume_changed (self , message ):
525+ def _parse_player_volume_changed (self , payload , message ):
515526 self ._mute_state = message ['mute' ]
516527 self ._volume_level = int (message ['level' ])
517528
518- def _parse_player_state_changed (self , message ):
529+ def _parse_player_state_changed (self , payload , message ):
519530 self ._play_state = message ['state' ]
520531
521- def _parse_player_now_playing_changed (self , _ ): # pylint: disable=invalid-name
532+ def _parse_player_now_playing_changed (self , payload , message ): # pylint: disable=invalid-name
522533 " event / now playing changed, request what changed. "
523534 self .request_now_playing_media ()
524535
525- def _parse_player_now_playing_progress (self , message ): # pylint: disable=invalid-name
536+ def _parse_player_now_playing_progress (self , payload , message ): # pylint: disable=invalid-name
526537 self ._current_position = int (message ['cur_pos' ])
527538 self ._current_position_updated_at = datetime .utcnow ()
528539 self ._duration = int (message ['duration' ])
540+
541+ def _parse_browse_browse (self , payload , message ):
542+ if (message ['sid' ] == str (SID_FAVORITES )):
543+ self ._favourites = payload
0 commit comments