{"id":13412155,"url":"https://github.com/home-assistant-libs/pychromecast","last_synced_at":"2025-12-11T23:09:48.584Z","repository":{"id":10954489,"uuid":"13265524","full_name":"home-assistant-libs/pychromecast","owner":"home-assistant-libs","description":"Library for Python 3 to communicate with the Google Chromecast.","archived":false,"fork":false,"pushed_at":"2025-05-06T05:23:42.000Z","size":1276,"stargazers_count":2593,"open_issues_count":153,"forks_count":385,"subscribers_count":89,"default_branch":"master","last_synced_at":"2025-05-06T14:51:52.249Z","etag":null,"topics":["cast","chromecast","chromecast-audio","internet-of-things","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/home-assistant-libs.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-10-02T07:58:34.000Z","updated_at":"2025-05-06T05:23:44.000Z","dependencies_parsed_at":"2023-11-21T16:54:02.242Z","dependency_job_id":"6e9c676e-3917-408b-bdfc-b27fed3a4646","html_url":"https://github.com/home-assistant-libs/pychromecast","commit_stats":{"total_commits":666,"total_committers":80,"mean_commits":8.325,"dds":0.7237237237237237,"last_synced_commit":"89e44f44121a08599575b5095e73c1d74e6cdd85"},"previous_names":["balloob/pychromecast"],"tags_count":106,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/home-assistant-libs%2Fpychromecast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/home-assistant-libs%2Fpychromecast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/home-assistant-libs%2Fpychromecast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/home-assistant-libs%2Fpychromecast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/home-assistant-libs","download_url":"https://codeload.github.com/home-assistant-libs/pychromecast/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253584492,"owners_count":21931547,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cast","chromecast","chromecast-audio","internet-of-things","python"],"created_at":"2024-07-30T20:01:21.592Z","updated_at":"2025-12-11T23:09:48.554Z","avatar_url":"https://github.com/home-assistant-libs.png","language":"Python","funding_links":[],"categories":["Python","HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"pychromecast |Build Status|\n===========================\n\n.. |Build Status| image:: https://travis-ci.org/balloob/pychromecast.svg?branch=master\n   :target: https://travis-ci.org/balloob/pychromecast\n\nLibrary for Python 3.11+ to communicate with the Google Chromecast. It\ncurrently supports:\n\n-  Auto discovering connected Chromecasts on the network\n-  Start the default media receiver and play any online media\n-  Control playback of current playing media\n-  Implement Google Chromecast api v2\n-  Communicate with apps via channels\n-  Easily extendable to add support for unsupported namespaces\n-  Multi-room setups with Audio cast devices\n\n*Check out* `Home Assistant \u003chttps://home-assistant.io\u003e`_ *for a\nready-made solution using PyChromecast for controlling and automating\nyour Chromecast or Cast-enabled device like Google Home.*\n\nDependencies\n------------\n\nPyChromecast depends on the Python packages requests, protobuf and\nzeroconf. Make sure you have these dependencies installed using\n``pip install -r requirements.txt``\n\nHow to use\n----------\n\n.. code:: python\n\n    \u003e\u003e import time\n    \u003e\u003e import pychromecast\n    \u003e\u003e import zeroconf\n\n    \u003e\u003e # Create a browser which prints the friendly name of found chromecast devices\n    \u003e\u003e zconf = zeroconf.Zeroconf()\n    \u003e\u003e browser = pychromecast.CastBrowser(pychromecast.SimpleCastListener(lambda uuid, service: print(browser.devices[uuid].friendly_name)), zconf)\n    \u003e\u003e browser.start_discovery()\n    \u003e\u003e # Shut down discovery\n    \u003e\u003e pychromecast.discovery.stop_discovery(browser)\n\n    \u003e\u003e # Discover and connect to chromecasts named Living Room\n    \u003e\u003e chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=[\"Living Room\"])\n    \u003e\u003e [cc.cast_info.friendly_name for cc in chromecasts]\n    ['Living Room']\n\n    \u003e\u003e # Discover and connect to more than one device\n    \u003e\u003e chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=[\"Living Room\",\"Bed Room\",\"Kitchen\"])\n    \u003e\u003e [cc.device.friendly_name for cc in chromecasts]\n    [\"Living Room\",\"Bed Room\",\"Kitchen\"]\n    \n    \u003e\u003e # If you are seeing less devices get discovered than expected add the below parameter. You can lessen or extend the timeout as needed.\n    \u003e\u003e chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=[\"Living Room\",\"Bed Room\",\"Kitchen\"],discovery_timeout=30)\n    \u003e\u003e [cc.device.friendly_name for cc in chromecasts]\n    [\"Living Room\",\"Bed Room\",\"Kitchen\"]\n\n    \u003e\u003e cast = chromecasts[0]\n    \u003e\u003e # Start worker thread and wait for cast device to be ready\n    \u003e\u003e cast.wait()\n    \u003e\u003e print(cast.cast_info)\n    CastInfo(services={ServiceInfo(type='mdns', data='Chromecast-Audio-42feced1d94238232fba92623e2682f3._googlecast._tcp.local.')}, uuid=UUID('42feced1-d942-3823-2fba-92623e2682f3'), model_name='Chromecast Audio', friendly_name='Living room', host='192.168.0.189', port=8009, cast_type='audio', manufacturer='Google Inc.')\n\n    \u003e\u003e print(cast.status)\n    CastStatus(is_active_input=True, is_stand_by=False, volume_level=1.0, volume_muted=False, app_id='CC1AD845', display_name='Default Media Receiver', namespaces=['urn:x-cast:com.google.cast.player.message', 'urn:x-cast:com.google.cast.media'], session_id='CCA39713-9A4F-34A6-A8BF-5D97BE7ECA5C', transport_id='web-9', status_text='')\n\n    \u003e\u003e mc = cast.media_controller\n    \u003e\u003e mc.play_media('http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', 'video/mp4')\n    \u003e\u003e mc.block_until_active()\n    \u003e\u003e print(mc.status)\n    MediaStatus(current_time=42.458322, content_id='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', content_type='video/mp4', duration=596.474195, stream_type='BUFFERED', idle_reason=None, media_session_id=1, playback_rate=1, player_state='PLAYING', supported_media_commands=15, volume_level=1, volume_muted=False)\n\n    \u003e\u003e mc.pause()\n    \u003e\u003e time.sleep(5)\n    \u003e\u003e mc.play()\n\n    \u003e\u003e # Shut down discovery\n    \u003e\u003e pychromecast.discovery.stop_discovery(browser)\n\nAdding support for extra namespaces\n-----------------------------------\n\nEach app that runs on the Chromecast supports namespaces. They specify a\nJSON-based mini-protocol. This is used to communicate between the\nChromecast and your phone/browser and now Python.\n\nSupport for extra namespaces is added by using controllers. To add your own namespace to a current chromecast instance you will first have to define your controller. Example of a minimal controller:\n\n.. code:: python\n\n    from pychromecast.controllers import BaseController\n\n    class MyController(BaseController):\n        def __init__(self):\n            super(MyController, self).__init__(\n                \"urn:x-cast:my.super.awesome.namespace\")\n\n        def receive_message(self, message, data):\n            print(\"Wow, I received this message: {}\".format(data))\n\n            return True  # indicate you handled this message\n\n        def request_beer(self):\n            self.send_message({'request': 'beer'})\n\nAfter you have defined your controller you will have to add an instance to a Chromecast object: `cast.register_handler(MyController())`. When a message is received with your namespace it will be routed to your controller.\n\nFor more options see the `BaseController`_. For an example of a fully implemented controller see the `MediaController`_.\n\n.. _BaseController: https://github.com/balloob/pychromecast/blob/master/pychromecast/controllers/__init__.py\n.. _MediaController: https://github.com/balloob/pychromecast/blob/master/pychromecast/controllers/media.py\n\nExploring existing namespaces\n-------------------------------\nSo you've got PyChromecast running and decided it is time to add support to your favorite app. No worries, the following instructions will have you covered in exploring the possibilities.\n\nThe following instructions require the use of the `Google Chrome browser`_ and the `Google Cast plugin`_.\n\n * In Chrome, go to `chrome://net-export/`\n * Select 'Include raw bytes (will include cookies and credentials)'\n * Click 'Start Logging to Disk'\n * Open a new tab, browse to your favorite application on the web that has Chromecast support and start casting.\n * Go back to the tab that is capturing events and click on stop.\n * Open https://netlog-viewer.appspot.com/ and select your event log file.\n * Browse to https://netlog-viewer.appspot.com/#events\u0026q=type:SOCKET, and find the socket that has familiar JSON data. (For me, it's usually the second or third from the top.)\n * Go through the results and collect the JSON that is exchanged.\n * Now write a controller that is able to mimic this behavior :-)\n\n.. _Google Chrome Browser: https://www.google.com/chrome/\n.. _Google Cast Plugin: https://chrome.google.com/webstore/detail/google-cast/boadgeojelhgndaghljhdicfkmllpafd\n\nIgnoring CEC Data\n-----------------\nThe Chromecast typically reports whether it is the active input on the device\nto which it is connected. This value is stored inside a cast object in the\nfollowing property.\n\n.. code:: python\n\n    cast.status.is_active_input\n\nSome Chromecast users have reported CEC incompatibilities with their media\ncenter devices. These incompatibilities may sometimes cause this active input\nvalue to be reported improperly.\n\nThis active input value is typically used to determine if the Chromecast\nis idle. PyChromecast is capable of ignoring the active input value when\ndetermining if the Chromecast is idle in the instance that the\nChromecast is returning erroneous values. To ignore this CEC detection\ndata in PyChromecast, append a `Linux style wildcard`_ formatted string\nto the IGNORE\\_CEC list in PyChromecast like in the example below.\n\n.. code:: python\n\n    pychromecast.IGNORE_CEC.append('*')  # Ignore CEC on all devices\n    pychromecast.IGNORE_CEC.append('Living Room')  # Ignore CEC on Chromecasts named Living Room\n\nNetworking requirements\n-----------------------\nPychromecast relies on mDNS to discover cast devices. The mDNS protocol relies on multicast UDP on port 5353 which comes with several implications for discovery to work:\n\n-  Multicast UDP must be forwarded by WiFI routers; some WiFi routers are known to drop multicast UDP traffic.\n-  The device running pychromecast must allow both inbound and outbound traffic on port 5353.\n-  The device running pychromecast must be on the same subnet as the cast devices because mDNS packets are not routed across subnets.\n\nIf not all of these conditions are met, discovery will not work. In cases where these conditions are impossible to meet, it's possible to pass a list of known IP-addresses or host names to the discovery functions.\n\nThanks\n------\n\nI would like to thank `Fred Clift`_ for laying the socket client ground\nwork. Without him it would not have been possible!\n\n.. _Linux style wildcard: http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm\n.. _Fred Clift: https://github.com/minektur\n\n|ohf-logo|\n\n.. |ohf-logo| image:: https://www.openhomefoundation.org/badges/pychromecast.png\n   :alt: PyChromecast - A library from the Open Home Foundation\n   :target: https://www.openhomefoundation.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhome-assistant-libs%2Fpychromecast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhome-assistant-libs%2Fpychromecast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhome-assistant-libs%2Fpychromecast/lists"}