def play_media(self, media_type, media_id, **kwargs): """Play media from a URL.""" # We do not want this to be forwarded to a group if media_type == CAST_DOMAIN: try: app_data = json.loads(media_id) except json.JSONDecodeError: _LOGGER.error("Invalid JSON in media_content_id") raise # Special handling for passed `app_id` parameter. This will only launch # an arbitrary cast app, generally for UX. if "app_id" in app_data: app_id = app_data.pop("app_id") _LOGGER.info("Starting Cast app by ID %s", app_id) self._chromecast.start_app(app_id) if app_data: _LOGGER.warning( "Extra keys %s were ignored. Please use app_name to cast media", app_data.keys(), ) return app_name = app_data.pop("app_name") try: quick_play(self._chromecast, app_name, app_data) except NotImplementedError: _LOGGER.error("App %s not supported", app_name) else: self._chromecast.media_controller.play_media( media_id, media_type, **kwargs.get(ATTR_MEDIA_EXTRA, {}))
def play_media(self, media_type, media_id, **kwargs): """Play media from a URL.""" extra = kwargs.get(ATTR_MEDIA_EXTRA, {}) metadata = extra.get("metadata") # We do not want this to be forwarded to a group if media_type == CAST_DOMAIN: try: app_data = json.loads(media_id) if metadata is not None: app_data["metadata"] = extra.get("metadata") except json.JSONDecodeError: _LOGGER.error("Invalid JSON in media_content_id") raise # Special handling for passed `app_id` parameter. This will only launch # an arbitrary cast app, generally for UX. if "app_id" in app_data: app_id = app_data.pop("app_id") _LOGGER.info("Starting Cast app by ID %s", app_id) self._chromecast.start_app(app_id) if app_data: _LOGGER.warning( "Extra keys %s were ignored. Please use app_name to cast media", app_data.keys(), ) return app_name = app_data.pop("app_name") try: quick_play(self._chromecast, app_name, app_data) except NotImplementedError: _LOGGER.error("App %s not supported", app_name) # Handle plex elif media_id and media_id.startswith(PLEX_URI_SCHEME): media_id = media_id[len(PLEX_URI_SCHEME):] media, _ = lookup_plex_media(self.hass, media_type, media_id) if media is None: return controller = PlexController() self._chromecast.register_handler(controller) controller.play_media(media) else: app_data = { "media_id": media_id, "media_type": media_type, **extra } quick_play(self._chromecast, "default_media_receiver", app_data)
def turn_on(self): """Turn on the cast device.""" if not self._chromecast.is_idle: # Already turned on return if self._chromecast.app_id is not None: # Quit the previous app before starting splash screen or media player self._chromecast.quit_app() # The only way we can turn the Chromecast is on is by launching an app if self._chromecast.cast_type == pychromecast.const.CAST_TYPE_CHROMECAST: app_data = {"media_id": CAST_SPLASH, "media_type": "image/png"} quick_play(self._chromecast, "default_media_receiver", app_data) else: self._chromecast.start_app(pychromecast.config.APP_MEDIA_RECEIVER)
app_data = { "media_id": args.media_id, "is_live": args.is_live, "metadata": json.loads(args.metadata), } if args.show_debug: logging.basicConfig(level=logging.DEBUG) if args.show_zeroconf_debug: print("Zeroconf version: " + zeroconf.__version__) logging.getLogger("zeroconf").setLevel(logging.DEBUG) chromecasts, browser = pychromecast.get_listed_chromecasts( friendly_names=[args.cast], known_hosts=args.known_host) if not chromecasts: print(f'No chromecast with name "{args.cast}" discovered') sys.exit(1) cast = chromecasts[0] # Start socket client's worker thread and wait for initial status update cast.wait() print( f'Found chromecast with name "{args.cast}", attempting to play "{args.media_id}"' ) quick_play.quick_play(cast, app_name, app_data) sleep(10) browser.stop_discovery()