From 4e73c61749f94e49d022be886014a02e6c3fe79c Mon Sep 17 00:00:00 2001 From: Scott Date: Fri, 21 Jan 2022 10:20:02 -0800 Subject: [PATCH] Don't be tricked by speaker groups living on the same IP address as a chromecast; we want the actual device. --- smart_home/chromecasts.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/smart_home/chromecasts.py b/smart_home/chromecasts.py index 7480cec..a5db86f 100644 --- a/smart_home/chromecasts.py +++ b/smart_home/chromecasts.py @@ -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) -- 2.45.2