windows compatability
authorMarcel van der Veldt <m.vanderveldt@heutink-ict.nl>
Sat, 30 Nov 2019 15:28:44 +0000 (16:28 +0100)
committerMarcel van der Veldt <m.vanderveldt@heutink-ict.nl>
Sat, 30 Nov 2019 15:28:44 +0000 (16:28 +0100)
mass.py
music_assistant/__init__.py
music_assistant/playerproviders/chromecast.py

diff --git a/mass.py b/mass.py
index cd7dd1ed5fcbeeb7331e54c715979965fb98ecc9..8769261182f015f06f1d56f50a4f95c9a0aa5f5b 100755 (executable)
--- a/mass.py
+++ b/mass.py
@@ -6,7 +6,6 @@ import os
 import logging
 from aiorun import run
 import asyncio
-import uvloop
 
 logger = logging.getLogger()
 logformat = logging.Formatter('%(asctime)-15s %(levelname)-5s %(name)s.%(module)s -- %(message)s')
@@ -79,7 +78,12 @@ if __name__ == "__main__":
         do_update()
     # create event_loop with uvloop
     event_loop = asyncio.get_event_loop()
-    uvloop.install()
+    try:
+        import uvloop
+        uvloop.install()
+    except ImportError:
+        # uvloop is not available on Windows so safe to ignore this
+        logger.warning("uvloop support is disabled")
     # config debug settings if needed
     if debug:
         event_loop.set_debug(True)
index 6e16371d8bb07f83fc64dda717447d33b09e62b5..628faf69fed7cb5d083cde55f3e93486b1c21235 100644 (file)
@@ -3,7 +3,6 @@
 
 import asyncio
 import re
-import uvloop
 import os
 import shutil
 import slugify as unicode_slug
index a9c5eda7d2575d1ee148e769f83b41cf4bd9290d..a20d5b7347eb2453051b3856cea967347dd055bb 100644 (file)
@@ -10,6 +10,7 @@ from pychromecast.controllers.multizone import MultizoneController
 from pychromecast.socket_client import CONNECTION_STATUS_CONNECTED, CONNECTION_STATUS_DISCONNECTED
 import types
 import time
+import uuid
 
 from ..utils import run_periodic, LOGGER, try_parse_int
 from ..models.playerprovider import PlayerProvider
@@ -229,15 +230,27 @@ class ChromecastProvider(PlayerProvider):
 
     async def __handle_group_members_update(self, mz, added_player=None, removed_player=None):
         ''' handle callback from multizone manager '''
+        group_player_id = str(uuid.UUID(mz._uuid))
+        group_player = await self.get_player(group_player_id)
         if added_player:
-            group_player = await self.get_player(str(mz._uuid))
-            group_player.add_group_child(added_player)
+            player_id = str(uuid.UUID(added_player))
+            child_player = await self.get_player(player_id)
+            if child_player and player_id != group_player_id:
+                group_player.add_group_child(player_id)
+                LOGGER.debug("%s added to %s", child_player.name, group_player.name)
         elif removed_player:
-            group_player = await self.get_player(str(mz._uuid))
-            group_player.remove_group_child(added_player)
+            player_id = str(uuid.UUID(removed_player))
+            group_player.remove_group_child(player_id)
+            LOGGER.debug("%s removed from %s", player_id, group_player.name)
         else:
-            group_player = await self.get_player(str(mz._uuid))
-            group_player.group_childs = mz.members
+            for member in mz.members:
+                player_id = str(uuid.UUID(member))
+                child_player = await self.get_player(player_id)
+                if not child_player or player_id == group_player_id:
+                    continue
+                if not player_id in group_player.group_childs:
+                    group_player.add_group_child(player_id)
+                    LOGGER.debug("%s added to %s", child_player.name, group_player.name)
     
     @run_periodic(1800)
     async def __periodic_chromecast_discovery(self):
@@ -265,6 +278,7 @@ class ChromecastProvider(PlayerProvider):
             player_id = str(uuid)
             if not player_id in self.mass.players._players:
                 self.__chromecast_discovered(player_id, discovery_info)
+            self.__update_group_players()
         listener, browser = start_discovery(discovered_callback)
         time.sleep(30) # run discovery for 30 seconds
         stop_discovery(browser)
@@ -299,8 +313,12 @@ class ChromecastProvider(PlayerProvider):
         chromecast.media_controller.register_status_listener(status_listener)
         player.cc.wait()
         self.mass.run_task(self.add_player(player))
-        if player.mz:
-            player.mz.update_members()
+
+    def __update_group_players(self):
+        '''update childs of all group players'''
+        for player in self.players:
+            if player.cc.cast_type == 'group':
+                player.mz.update_members()
 
 def chunks(l, n):
     """Yield successive n-sized chunks from l."""