Beispiel #1
0
    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)
Beispiel #2
0
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))
Beispiel #3
0
    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
Beispiel #6
0
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)
Beispiel #7
0
 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)