import atexit
import datetime
import logging
-import time
+import threading
import pychromecast
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')
- BaseChromecast.ccasts, BaseChromecast.browser = pychromecast.get_chromecasts()
- 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()
- time.sleep(0.1)
+ self.cast.wait(timeout=1.0)
if self.cast is None:
raise Exception(f'Can\'t find ccast device at {ip}, is that really a ccast device?')