def _search_cast_(self): # This should fix the error socket.gaierror making the system tray to # be closed. try: self.cc = Casting() self.cc.initialize_cast() self.cc.available_devices() except socket.gaierror: if debug is True: print( colors.warning( ':::Threading::: Socket error, CC set to 0')) pass except TypeError: pass except OSError: self.cc.available_devices = [] if len(self.cc.available_devices) == 0 and tray is True: available_devices = [] self.intReady.emit(available_devices) self.finished.emit() else: available_devices = self.cc.available_devices self.intReady.emit(available_devices) self.finished.emit()
class Worker(QObject): finished = pyqtSignal() intReady = pyqtSignal(list) def __init__(self): QObject.__init__(self) @pyqtSlot() def _search_cast_(self): # This should fix the error socket.gaierror making the system tray to # be closed. try: self.cc = Casting() self.cc.initialize_cast() self.cc.available_devices() except socket.gaierror: if debug is True: print(colors.warning( ':::Threading::: Socket error, CC set to 0')) pass except TypeError: pass except OSError: self.cc.available_devices = [] if len(self.cc.available_devices) == 0 and tray is True: available_devices = [] self.intReady.emit(available_devices) self.finished.emit() else: available_devices = self.cc.available_devices self.intReady.emit(available_devices) self.finished.emit()
class Worker(QObject): finished = pyqtSignal() intReady = pyqtSignal(list) def __init__(self): QObject.__init__(self) @pyqtSlot() def _search_cast_(self): # This should fix the error socket.gaierror making the system tray to # be closed. try: self.cc = Casting() self.cc.initialize_cast() self.cc.available_devices() except socket.gaierror: if debug is True: print( colors.warning( ":::Threading::: Socket error, CC set to 0")) pass except TypeError: pass except OSError: self.cc.available_devices = [] if len(self.cc.available_devices) == 0 and tray is True: available_devices = [] self.intReady.emit(available_devices) self.finished.emit() else: available_devices = self.cc.available_devices self.intReady.emit(available_devices) self.finished.emit()
def _updater_(self): chk = Casting() if chk.ip == '127.0.0.1' or None: # We verify the local IP. self.updateready.emit('None') else: try: from mkchromecast.version import __version__ import requests response = requests.get(url).text.split(',') for e in response: if 'tag_name' in e: version = e.strip('"tag_name":') break if version > __version__: print('Version %s is available to download' % version) self.updateready.emit(version) else: print('You are up to date.') self.updateready.emit('False') except UnboundLocalError: self.updateready.emit('error1') except requests.exceptions.ConnectionError: self.updateready.emit('error1') self.upcastfinished.emit()
def _play_cast_(self): if os.path.exists(configf): print(colors.warning(":::Threading::: Configuration file exists.")) print(colors.warning(":::Threading::: Using defaults set there.")) config.read(configf) backend = ConfigSectionMap("settings")["backend"] print(":::Threading backend::: %s." % backend) else: backend = mkchromecast.__init__.backend global cast if backend == "node": stream() else: try: reload(mkchromecast.audio) except NameError: from imp import reload reload(mkchromecast.audio) mkchromecast.audio.main() if platform == "Linux": # We create the sink only if it is not available if check_sink() is False and adevice is None: create_sink() start = Casting() start.initialize_cast() try: start.get_devices() start.play_cast() cast = start.cast # Let's change inputs at the end to avoid muting sound too early. # For Linux it does not matter given that user has to select sink # in pulse audio. Therefore the sooner it is available, the # better. if platform == "Darwin": inputdev() outputdev() self.pcastready.emit("_play_cast_ success") except AttributeError: self.pcastready.emit("_play_cast_ failed") self.pcastfinished.emit()
def _play_cast_(self): if os.path.exists(configf): print(colors.warning(':::Threading::: Configuration file exists.')) print(colors.warning(':::Threading::: Using defaults set there.')) config.read(configf) backend = ConfigSectionMap('settings')['backend'] print(':::Threading backend::: %s.' % backend) else: backend = mkchromecast.__init__.backend global cast if backend == 'node': stream() else: try: reload(mkchromecast.audio) except NameError: from imp import reload reload(mkchromecast.audio) mkchromecast.audio.main() if platform == 'Linux': # We create the sink only if it is not available if check_sink() is False and adevice is None: create_sink() start = Casting() start.initialize_cast() try: start.get_devices() start.play_cast() cast = start.cast # Let's change inputs at the end to avoid muting sound too early. # For Linux it does not matter given that user has to select sink # in pulse audio. Therefore the sooner it is available, the # better. if platform == 'Darwin': inputdev() outputdev() self.pcastready.emit('_play_cast_ success') except AttributeError: self.pcastready.emit('_play_cast_ failed') self.pcastfinished.emit()
def __init__(self): self.cc = Casting() signal.signal(signal.SIGINT, signal.SIG_DFL) self.cast = None self.stopped = False self.played = False self.pcastfailed = False self.read_config() """ These dictionaries are used to set icons' colors """ self.google = { "black": "google", "blue": "google_b", "white": "google_w" } self.google_working = { "black": "google_working", "blue": "google_working_b", "white": "google_working_w", } self.google_nodev = { "black": "google_nodev", "blue": "google_nodev_b", "white": "google_nodev_w", } """ This is used when searching for cast devices """ self.obj = mkchromecast.tray_threading.Worker() # no parent! self.thread = QThread() # no parent! self.obj.intReady.connect(self.onIntReady) self.obj.moveToThread(self.thread) self.obj.finished.connect(self.thread.quit) self.thread.started.connect(self.obj._search_cast_) """ This is used when one clicks on cast device """ self.objp = mkchromecast.tray_threading.Player() # no parent! self.threadplay = QThread() # no parent! self.objp.moveToThread(self.threadplay) self.objp.pcastready.connect(self.pcastready) self.objp.pcastfinished.connect(self.threadplay.quit) self.threadplay.started.connect(self.objp._play_cast_) """ This is used when one clicks on the updater """ self.objup = mkchromecast.tray_threading.Updater() # no parent! self.threadupdater = QThread() # no parent! self.objup.moveToThread(self.threadupdater) self.objup.updateready.connect(self.updateready) self.objup.upcastfinished.connect(self.threadupdater.quit) self.threadupdater.started.connect(self.objup._updater_) self.app = QtWidgets.QApplication(sys.argv) """ This is to determine the scale factor. """ screen_resolution = self.app.desktop().screenGeometry() self.width = screen_resolution.width() self.height = screen_resolution.height() if self.height > 1280: self.scale_factor = 2 else: self.scale_factor = 1 if debug is True: print(":::systray::: Screen resolution: ", self.width, self.height) # This avoid the QMessageBox to close parent processes. self.app.setQuitOnLastWindowClosed(False) if hasattr(QtCore.Qt, "AA_UseHighDpiPixmaps"): self.app.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps) if debug is True: print(":::systray::: High-DPI screen detected...") self.w = QWidget() # This is useful when launching from git repo if os.path.exists("images/" + self.google[self.colors] + ".icns") is True: self.icon = QtGui.QIcon() if platform == "Darwin": self.icon.addFile("images/" + self.google[self.colors] + ".icns") else: self.icon.addFile("images/" + self.google[self.colors] + ".png") else: self.icon = QtGui.QIcon() if platform == "Linux": self.icon.addFile("/usr/share/mkchromecast/images/" + self.google[self.colors] + ".png") else: self.icon.addFile(self.google[self.colors] + ".icns") super(QtWidgets.QMainWindow, self).__init__() self.createUI()
def recasting(): start = Casting() start.initialize_cast() start.get_devices() start.play_cast() return