def __init__(self, device, dashboard_url='https://home-assistant.io', dashboard_app_name='DashCast'): print('Attempting to launch dashboard on Chromecast', device.name, dashboard_url) self.device = device self.controller = dashcast.DashCastController() self.device.register_handler(self.controller) self.receiver_controller = device.socket_client.receiver_controller self.receiver_controller.register_status_listener(self) self.media_controller = device.socket_client.media_controller self.dashboard_url = dashboard_url self.dashboard_app_name = dashboard_app_name self.logger = logging.getLogger(__name__) self.should_launch = False # Check status on init. self.receiver_controller.update_status() # Keep logic in main loop. while True: if self.should_launch: self.launch_dashboard() elif (self.device.model_name == 'Google Nest Hub' and self.is_dashboard_active() and hasattr(self, 'dashboard_launched') and (time.time() - self.dashboard_launched) > 600): print('10 minute timeout, launching again') self.device.quit_app() self.launch_dashboard() self.receiver_controller.update_status() time.sleep(10)
def cast_url(display, url, force): print("Searching for Chromecasts") casts = pychromecast.get_chromecasts() if len(casts) == 0: print("No Devices Found") return cast = next(cc for cc in casts if display in (None, '') or cc.device.friendly_name == display) if not cast: print('Chromecast with name', display, 'not found') return d = dashcast.DashCastController() cast.register_handler(d) print() print(cast.device) time.sleep(1) print() print(cast.status) print() print(cast.media_controller.status) print() if not cast.is_idle: print("Killing current running app") cast.quit_app() time.sleep(5) time.sleep(1) # Test that the callback chain works. This should send a message to # load the first url, but immediately after send a message load the # second url. warning_message = 'If you see this on your TV then something is broken' d.load_url(url, force, callback_function=lambda result: d.load_url(url, force))
def __init__(self, device, dashboard_url='https://home-assistant.io', dashboard_app_name='DashCast'): self.device = device print('DashboardLauncher', self.device.name) self.controller = dashcast.DashCastController() self.device.register_handler(self.controller) receiver_controller = device.socket_client.receiver_controller receiver_controller.register_status_listener(self) self.dashboard_url = dashboard_url self.dashboard_app_name = dashboard_app_name # Check status on init. self.new_cast_status(self.device.status) # Launch dashboard on init. while True: self.launch_dashboard() time.sleep(60)
def display_nothing(self): with open(self.htmlname,'w') as htmlf: htmlf.write('<html><head><title>Now playing</title>\n<link rel="stylesheet" type="text/css" href="currentlyplaying.css"></head>\n<body>') htmlf.write('<p> </p><p><span class="description">nothing playing</span></p>') htmlf.write('</body></html>') htmlf.close() if(self.showonTV and self.displayed_track!='-'): try: cast = next(cc for cc in self.cclist if cc.device.friendly_name == self.screenCastName) except: print("no tv found") raise else: cast.wait() d = dashcast.DashCastController() cast.register_handler(d) cast.wait() d.load_url('http://'+self.ip+'/currentlyplaying.html?'+str(int(time()))) mc = cast.media_controller self.mc=mc #useful for debugging self.displayed_track='-'
def display_media_content(self,cc): """ Gathers media information of currently playing chromecast, creates html file with media info, and casts it to chromecast TV """ st=cc.media_controller.status if(self.displayed_track!=st.title): #print(st.title) if(cc.media_controller.thumbnail): thumbURL=cc.media_controller.thumbnail with open(self.htmlname,'w') as htmlf: htmlf.write('<html><head><title>Now playing</title>\n<link rel="stylesheet" type="text/css" href="currentlyplaying.css"></head>\n<body>\n<img src="'+thumbURL+'">\n') htmlf.write('<p>Title: <span class="description">'+st.title.encode('ascii','xmlcharrefreplace')+'</span></p>\n') htmlf.write('<p>Artist: <span class="description"> '+st.artist.encode('ascii','xmlcharrefreplace')+'</span></p>\n') htmlf.write('<p>Album: <span class="description">'+st.album_name.encode('ascii','xmlcharrefreplace')+'</span></p>\n') htmlf.write('<p>Service: <span class="description">' + cc.app_display_name.encode('ascii','xmlcharrefreplace')+'</span></p>\n') htmlf.write('<p>Playing on: <span class="description">' + cc.device.friendly_name.encode('ascii','xmlcharrefreplace')+'</span></p>\n') htmlf.write('</body></html>') htmlf.close() else: with open(self.htmlname,'w') as htmlf: htmlf.write('<html><head><title>Now playing</title>\n<link rel="stylesheet" type="text/css" href="currentlyplaying.css"></head>\n<body>') htmlf.write('<p> </p><p><span class="description">Error loading media info</span></p>') htmlf.write('</body></html>') htmlf.close() self.displayed_track=st.title if(self.showonTV): cast = next(cc for cc in self.cclist if cc.device.friendly_name == self.screenCastName) cast.wait() d = dashcast.DashCastController() cast.register_handler(d) cast.wait() d.load_url('http://'+self.ip+'/currentlyplaying.html?'+str(int(time()))) mc = cast.media_controller self.mc=mc #useful for debugging
import time import pychromecast import pychromecast.controllers.dashcast as dashcast chromecasts = pychromecast.get_chromecasts() print([cc.device.friendly_name for cc in chromecasts]) cast = next(cc for cc in chromecasts if cc.device.friendly_name == "Lemon") cast.wait() d = dashcast.DashCastController() cast.register_handler(d) print(cast.device) mc = cast.media_controller mc.play_media('https://i.giphy.com/media/3YIqLjzw0DE6Kdzzzc/giphy.mp4', 'video/mp4') mc.block_until_active() time.sleep(20)
async def displayWebsite(self, url): d = dashcast.DashCastController() self.cast.register_handler(d) d.load_url(url, force=True, reload_seconds=30)
def __init__(self, device, dashboard_url='https://home-assistant.io', dashboard_url_force=False, dashboard_app_name='DashCast'): self.device = device print('DashboardLauncher', self.device.name) # register dashcast controller self.controller = dashcast.DashCastController() self.device.register_handler(self.controller) # register status listener receiver_controller = device.socket_client.receiver_controller receiver_controller.register_status_listener(self) # register connection listener self.device.socket_client.media_controller.register_status_listener( self) self.device.register_connection_listener(self) # set default url and dashboard app name self.dashboard_url = dashboard_url self.dashboard_url_force = dashboard_url_force self.dashboard_app_name = dashboard_app_name self.takeover = False # Check status on init. self.new_cast_status(self.device.status) # Launch dashboard on init. self.launch_dashboard(self.dashboard_url, self.dashboard_url_force) # While dashboard is launching, start MQTT connection print("Starting MQTT") client = mqtt.Client("client_" + str(DISPLAY_NAME)) # create new instance client.on_message = self.on_message # attach function to callback client.on_connect = self.on_connect print("Connecting to Broker: " + MQTT_SERVER) client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD) client.connect(MQTT_SERVER) # connect to broker # wait for dashboard to finish loading, then start MQTT client loop time.sleep(10) client.loop_start() # keep_looping is the control variable. # If it is False, loop stops, program cleans up and exits self.keep_looping = True # if launch_it is set to true, the dashboard is relaunched # otherwise sleep a second and check again self.launch_it = False while self.keep_looping: if self.launch_it: print('launch_it', self.launch_it) self.launch_dashboard(self.dashboard_url, self.dashboard_url_force) self.launch_it = False time.sleep(10) time.sleep(1) client.loop_stop()
def cast_url(cast, url): print('--> {d} : {u}'.format(d=cast.device.friendly_name, u=url)) d = dashcast.DashCastController() cast.register_handler(d) d.load_url(url)