Don't be tricked by speaker groups living on the same IP address
authorScott <[email protected]>
Fri, 21 Jan 2022 18:20:02 +0000 (10:20 -0800)
committerScott <[email protected]>
Fri, 21 Jan 2022 18:20:02 +0000 (10:20 -0800)
as a chromecast; we want the actual device.

smart_home/chromecasts.py

index 7480cecc36826932ba90d69ecc83f70cf1a43a97..a5db86f3f003395d61ee2436688e44eaaa55d963 100644 (file)
@@ -5,6 +5,7 @@
 import atexit
 import datetime
 import logging
+import threading
 
 import pychromecast
 
@@ -18,27 +19,32 @@ class BaseChromecast(dev.Device):
     ccasts = []
     refresh_ts = None
     browser = None
+    lock = threading.Lock()
 
     def __init__(self, name: str, mac: str, keywords: str = "") -> None:
         super().__init__(name.strip(), mac.strip(), keywords)
         ip = self.get_ip()
         now = datetime.datetime.now()
-        if (
-                BaseChromecast.refresh_ts is None
-                or (now - BaseChromecast.refresh_ts).total_seconds() > 60
-        ):
-            logger.debug('Refreshing the shared chromecast info list')
-            if BaseChromecast.browser is not None:
-                BaseChromecast.browser.stop_discovery()
-            BaseChromecast.ccasts, BaseChromecast.browser = pychromecast.get_chromecasts(
-                timeout=10.0
-            )
-            atexit.register(BaseChromecast.browser.stop_discovery)
-            BaseChromecast.refresh_ts = now
+        with BaseChromecast.lock as l:
+            if (
+                    BaseChromecast.refresh_ts is None
+                    or (now - BaseChromecast.refresh_ts).total_seconds() > 60
+            ):
+                logger.debug('Refreshing the shared chromecast info list')
+                if BaseChromecast.browser is not None:
+                    BaseChromecast.browser.stop_discovery()
+                BaseChromecast.ccasts, BaseChromecast.browser = pychromecast.get_chromecasts(
+                    timeout=15.0
+                )
+                atexit.register(BaseChromecast.browser.stop_discovery)
+                BaseChromecast.refresh_ts = now
 
         self.cast = None
         for cc in BaseChromecast.ccasts:
-            if cc.cast_info.host == ip:
+            if (
+                    cc.cast_info.host == ip
+                    and cc.cast_info.cast_type != 'group'
+            ):
                 logger.debug(f'Found chromecast at {ip}: {cc}')
                 self.cast = cc
                 self.cast.wait(timeout=1.0)