Library for Python 3 to communicate with the Google Chromecast.

Overview

pychromecast Build Status

Library for Python 3.6+ to communicate with the Google Chromecast. It currently supports:

  • Auto discovering connected Chromecasts on the network
  • Start the default media receiver and play any online media
  • Control playback of current playing media
  • Implement Google Chromecast api v2
  • Communicate with apps via channels
  • Easily extendable to add support for unsupported namespaces
  • Multi-room setups with Audio cast devices

Check out Home Assistant for a ready-made solution using PyChromecast for controlling and automating your Chromecast or Cast-enabled device like Google Home.

Dependencies

PyChromecast depends on the Python packages requests, protobuf and zeroconf. Make sure you have these dependencies installed using pip install -r requirements.txt

How to use

>> import time
>> import pychromecast

>> # List chromecasts on the network, but don't connect
>> services, browser = pychromecast.discovery.discover_chromecasts()
>> # Shut down discovery
>> pychromecast.discovery.stop_discovery(browser)

>> # Discover and connect to chromecasts named Living Room
>> chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["Living Room"])
>> [cc.device.friendly_name for cc in chromecasts]
['Living Room']

>> cast = chromecasts[0]
>> # Start worker thread and wait for cast device to be ready
>> cast.wait()
>> print(cast.device)
DeviceStatus(friendly_name='Living Room', model_name='Chromecast', manufacturer='Google Inc.', uuid=UUID('df6944da-f016-4cb8-97d0-3da2ccaa380b'), cast_type='cast')

>> print(cast.status)
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='')

>> mc = cast.media_controller
>> mc.play_media('http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', 'video/mp4')
>> mc.block_until_active()
>> print(mc.status)
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)

>> mc.pause()
>> time.sleep(5)
>> mc.play()

>> # Shut down discovery
>> pychromecast.discovery.stop_discovery(browser)

Adding support for extra namespaces

Each app that runs on the Chromecast supports namespaces. They specify a JSON-based mini-protocol. This is used to communicate between the Chromecast and your phone/browser and now Python.

Support 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:

from pychromecast.controllers import BaseController

class MyController(BaseController):
    def __init__(self):
        super(MyController, self).__init__(
            "urn:x-cast:my.super.awesome.namespace")

    def receive_message(self, message, data):
        print("Wow, I received this message: {}".format(data))

        return True  # indicate you handled this message

    def request_beer(self):
        self.send_message({'request': 'beer'})

After 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.

For more options see the BaseController. For an example of a fully implemented controller see the MediaController.

Exploring existing namespaces

So 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.

The following instructions require the use of the Google Chrome browser and the Google Cast plugin.

  • In Chrome, go to chrome://net-export/
  • Select 'Include raw bytes (will include cookies and credentials)'
  • Click 'Start Logging to Disk'
  • Open a new tab, browse to your favorite application on the web that has Chromecast support and start casting.
  • Go back to the tab that is capturing events and click on stop.
  • Open https://netlog-viewer.appspot.com/ and select your event log file.
  • Browse to https://netlog-viewer.appspot.com/#events&q=type:SOCKET, and find the socket that has familiar JSON data. (For me, it's usually the second or third from the top.)
  • Go through the results and collect the JSON that is exchanged.
  • Now write a controller that is able to mimic this behavior :-)

Ignoring CEC Data

The Chromecast typically reports whether it is the active input on the device to which it is connected. This value is stored inside a cast object in the following property.

cast.status.is_active_input

Some Chromecast users have reported CEC incompatibilities with their media center devices. These incompatibilities may sometimes cause this active input value to be reported improperly.

This active input value is typically used to determine if the Chromecast is idle. PyChromecast is capable of ignoring the active input value when determining if the Chromecast is idle in the instance that the Chromecast is returning erroneous values. To ignore this CEC detection data in PyChromecast, append a Linux style wildcard formatted string to the IGNORE_CEC list in PyChromecast like in the example below.

pychromecast.IGNORE_CEC.append('*')  # Ignore CEC on all devices
pychromecast.IGNORE_CEC.append('Living Room')  # Ignore CEC on Chromecasts named Living Room

Thanks

I would like to thank Fred Clift for laying the socket client ground work. Without him it would not have been possible!

Comments
  • More Documentation Needed to Avoid RunTime errors

    More Documentation Needed to Avoid RunTime errors

    Suppose I have a cast cast and have already called cast.wait() Subsequent cast.wait()'s result in RunTimeError's if the thread has already been run and if these errors do occur, then the self.status_event.wait(timeout=timeout) never happens. This is what I suspect indirectly causes my NotConnected errors when I try to set_volume afterwards.

    I will test if the below fixes the problem for me, but before updating pychromecast by 2 years worth of code, no RunTimeError's were being raised by cast.wait(). (EDIT: it does not fix the underlying problem).

    def cast_wait():
        try:
            cast.wait(timeout=WAIT_TIMEOUT)
        except AttributeError:
            pass
        except RuntimeError:
            cast.status_event.wait(WAIT_TIMEOUT)
    
    opened by elibroftw 38
  • Speaker group Spotify not working

    Speaker group Spotify not working

    It doesn't seem to be possible to start Spotify with playback on a chromecast speaker group "cast_type": "group" using the spotify_example.py. Do I need to use the multizone code to achieve this?

    opened by fondberg 26
  • Random issue with chromecast audio dongle

    Random issue with chromecast audio dongle

    This just started happening, one thing I noticed is that all my other chromecasts devices are using port 8008, I tried to swap the port to 8008 by using the port= param but this didnt seem to make a difference. I can connect to the dongle fine from my phone just isnt working via script anymore for only the audio dongle. Just a random connection error.

    Traceback (most recent call last): File "C:\Python27\Echo\test.py", line 158, in CC2 = pychromecast.Chromecast("10.1.1.12",port=8009) File "C:\Python27\lib\site-packages\pychromecast_init_.py", line 169, in init "Could not connect to {}:{}".format(self.host, self.port)) pychromecast.error.ChromecastConnectionError: Could not connect to 10.1.1.12:8009

    opened by strunker 23
  • Feature Request: disableIdleTimeout flag

    Feature Request: disableIdleTimeout flag

    As it seems to be the new Fuchsia OS enforces a 30 seconds timeout for casted webpages as it goes into "ambient" mode, what used to be 15-30 minutes.

    Would it be possible to implement the disableIdleTimeout flag, if it is working, as many other options were incorrect from Google's documentation?

    Reference docs here:

    https://developers.google.com/cast/docs/reference/web_receiver/cast.framework.CastReceiverOptions#disableIdleTimeout

    So user comments here and below regarding the new 30 seconds timeout:

    https://community.home-assistant.io/t/using-catt/130332/398

    opened by GSzabados 18
  • MediaController’s play_media should not set current_time to 0 by default

    MediaController’s play_media should not set current_time to 0 by default

    The documentation for the Load command says currentTime is optional:

    Seconds since beginning of content. If the content is live content, and position is not specifed, the stream will start at the live position

    This is vital to the ability to cast live streams and is not currently possible without deriving a separate controller overriding play_media. Please consider defaulting to None e.g. in this manner:

    diff --git a/pychromecast/controllers/media.py b/pychromecast/controllers/media.py
    index cc47db4..54f9904 100644
    --- a/pychromecast/controllers/media.py
    +++ b/pychromecast/controllers/media.py
    @@ -492,7 +492,7 @@ class MediaController(BaseController):
             content_type,
             title=None,
             thumb=None,
    -        current_time=0,
    +        current_time=None,
             autoplay=True,
             stream_type=STREAM_TYPE_BUFFERED,
             metadata=None,
    @@ -560,7 +560,7 @@ class MediaController(BaseController):
             content_type,
             title=None,
             thumb=None,
    -        current_time=0,
    +        current_time=None,
             autoplay=True,
             stream_type=STREAM_TYPE_BUFFERED,
             metadata=None,
    @@ -628,7 +628,8 @@ class MediaController(BaseController):
                     "media": media,
                     MESSAGE_TYPE: TYPE_LOAD,
                 }
    -        msg["currentTime"] = current_time
    +        if current_time is not None:
    +            msg["currentTime"] = current_time
             msg["autoplay"] = autoplay
             msg["customData"] = {}
    
    opened by andrewshadura 16
  • support non-blocking reconnect

    support non-blocking reconnect

    This change allows the usage of run_once() to reconnect the cast device in a non-blocking way. Every run_once() call it just tries to reconnect the device once for timeout period and finishes the function afterwards.

    opened by fhempy 14
  • Do not automatically start worker thread and connect in Chromecast constructor

    Do not automatically start worker thread and connect in Chromecast constructor

    Do not automatically start worker thread or connect in Chromecast constructor.

    This is a breaking change, and the user will now have to call either of:

    • Chromecast.start(): Start the worker thread and connect to the chromecast device. Connection status will be reported through the listener registered in Chromecast.register_connection_listener.
    • Chromecast.wait(): Wait for connection, this will also start the worker thread if it has not been started.
    • Chromecast.connect(): Connect to the chromecast. This must only be called if the worker thread has not been started. Connection status will be reported through the listener registered in Chromecast.register_connection_listener.

    Background: The automatic connect in the constructor meant that the constructor would hang forever if the number of retries was unlimited and the chromecast could not be found. It was also a bit unnatural to start the worker thread in the constructor.

    opened by emontnemery 13
  • Log spamming.

    Log spamming.

    I get these in my logs every 5th second:

     ERROR (Thread-16) [pychromecast.socket_client] Failed to connect, retrying in 5s
    Traceback (most recent call last):
      File "/home/stefan/.homeassistant/lib/pychromecast/socket_client.py", line 160, in initialize_connection
        self.socket.connect((self.host, 8009))
      File "/usr/lib/python3.4/ssl.py", line 846, in connect
        self._real_connect(addr, False)
      File "/usr/lib/python3.4/ssl.py", line 837, in _real_connect
        self.do_handshake()
      File "/usr/lib/python3.4/ssl.py", line 810, in do_handshake
        self._sslobj.do_handshake()
    ConnectionResetError: [Errno 104] Connection reset by peer
    

    I think it would be enough with an INFO level log instead?

    opened by stefan-jonasson 13
  • Add support to launch and control the default receiver app

    Add support to launch and control the default receiver app

    Chromecast has a default receiver app that is able to play any media on the web that Chrome can decode. Support for this will allow us to launch this app and send media at it.

    opened by balloob 13
  • Fix spotify controller and update example

    Fix spotify controller and update example

    It seems the setCredentials message has changed to addUser at some point in the past, with a different payload.

    We also discovered a new issue with playback (on our google homes and chromecasts at least) where launching the spotify app and adding the user/token to it doesn't cause it to appear in spotify's device list. This updates the example to make the same request the web player does to enable playback on the cast device.

    opened by shocklateboy92 11
  • add support for QUEUE_INSERT

    add support for QUEUE_INSERT

    This is aiming to solve issue https://github.com/home-assistant-libs/pychromecast/issues/403 by allowing users to queue new items after the currently playing track.

    I've added a queue_media() method that works just like play_media(), but instead of playing the media immediately it queues it. The Chromecast will automatically play it after the currently playing (and currently queued) media, and users can also skip to it using queue_next() etc.

    I've also added an example.

    opened by bjesus 11
  • GoogleAssistant

    GoogleAssistant

    from googlecontroller import GoogleAssistant

    host = "192.168.1.28" home = GoogleAssistant(host=host) home.say("test")

    If I run the say test I have the following error in line 20 : if self.cc.media_controller.status.player_state != "PLAYING" or ignore == True: AttributeError: 'GoogleAssistant' object has no attribute 'cc'

    opened by bevrard59 0
  • 1st gen chromecasts not detected on network

    1st gen chromecasts not detected on network

    I have two 1st gen chromecasts, and apparently the firmware was changed a few months ago in a way that prevents pychromecast (13.0.4) from discovering either devices. Trying basic tests found in the README, they fail to find any device. Mobile devices can find the chromecasts using the google home app, but since the fw change, it takes longer to discover than it did before, in many cases. avahi-browse -a doesn't show the chromecasts but avahi-browse _googlecast._tcp does.

    opened by soreau 0
  • Getting error: module 'select' has no attribute 'poll'

    Getting error: module 'select' has no attribute 'poll'

    With pychromecast >= 13.0.2 I am getting an error:

    Traceback (most recent call last): File "C:\Users\bfk\PycharmProjects\SmartImage\venv\lib\site-packages\pychromecast\socket_client.py", line 538, in run if self.run_once(timeout=POLL_TIME_BLOCKING) == 1: File "C:\Users\bfk\PycharmProjects\SmartImage\venv\lib\site-packages\pychromecast\socket_client.py", line 572, in run_once poll_obj = select.poll() AttributeError: module 'select' has no attribute 'poll'

    pip freeze absl-py==1.3.0 astunparse==1.6.3 async-timeout==4.0.2 cachetools==5.2.0 casttube==0.2.1 certifi==2022.12.7 chardet==5.1.0 charset-normalizer==3.0.1 docutils==0.19 flatbuffers==22.12.6 gast==0.5.3 google-auth==2.15.0 google-auth-oauthlib==0.4.6 google-pasta==0.2.0 grpcio==1.51.1 h5py==3.7.0 idna==3.4 ifaddr==0.2.0 keras==2.11.0 Keras-Preprocessing==1.1.2 Kivy==2.1.0 kivy-deps.angle==0.3.3 kivy-deps.glew==0.3.1 kivy-deps.sdl2==0.5.1 Kivy-Garden==0.1.5 kivymd==1.1.1 libclang==14.0.6 Markdown==3.4.1 MarkupSafe==2.1.1 numpy==1.23.5 oauthlib==3.2.2 opencv-python==4.6.0.66 opt-einsum==3.3.0 packaging==22.0 Pillow==9.3.0 protobuf==4.21.11 pyasn1==0.4.8 pyasn1-modules==0.2.8 PyChromecast==13.0.2 Pygments==2.13.0 pyparsing==3.0.9 pypiwin32==223 python-engineio==4.3.4 pywin32==305 requests==2.28.1 requests-oauthlib==1.3.1 rsa==4.9 screeninfo==0.8.1 six==1.16.0 tensorboard==2.10.1 tensorboard-data-server==0.6.1 tensorboard-plugin-wit==1.8.1 tensorflow==2.10.0 tensorflow-estimator==2.11.0 tensorflow-io-gcs-filesystem==0.28.0 termcolor==2.1.1 typing_extensions==4.4.0 urllib3==1.26.13 Werkzeug==2.2.2 wrapt==1.14.1 zeroconf==0.39.4

    Python version 3.10.8

    The error starts on repeat after the line: "cast.wait()" in the example code.

    opened by KnutssonDevelopment 12
  • UnboundLocalError: local variable 'host' referenced before assignment

    UnboundLocalError: local variable 'host' referenced before assignment

    Logger: pychromecast.discovery Source: components/cast/helpers.py:105 First occurred: 03:09:13 (1 occurrences) Last logged: 03:09:13

    Unhandled exception in worker thread Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/pychromecast/discovery.py", line 302, in run self._poll_hosts() File "/usr/local/lib/python3.10/site-packages/pychromecast/discovery.py", line 393, in _poll_hosts self._update_devices(host, devices, uuids) File "/usr/local/lib/python3.10/site-packages/pychromecast/discovery.py", line 430, in _update_devices callback() File "/usr/src/homeassistant/homeassistant/components/cast/discovery.py", line 68, in update_cast discover_chromecast(hass, browser.devices[uuid]) File "/usr/src/homeassistant/homeassistant/components/cast/discovery.py", line 37, in discover_chromecast info = info.fill_out_missing_chromecast_info(hass) File "/usr/src/homeassistant/homeassistant/components/cast/helpers.py", line 105, in fill_out_missing_chromecast_info http_group_status = dial.get_multizone_status( File "/usr/local/lib/python3.10/site-packages/pychromecast/dial.py", line 260, in get_multizone_status _, status = _get_status( File "/usr/local/lib/python3.10/site-packages/pychromecast/dial.py", line 86, in _get_status url = FORMAT_BASE_URL_HTTPS.format(host) + path UnboundLocalError: local variable 'host' referenced before assignment

    opened by provinzio 0
  • How to process next or prev commands?

    How to process next or prev commands?

    Suppose something is played using the media controller and now I press the next button in the google home app. How do I catch that event on the code side?

    opened by elibroftw 0
Releases(13.0.4)
  • 13.0.4(Dec 13, 2022)

    What's Changed

    • Correct timeout in call to poll.poll (#687) @emontnemery
    • Revert "Revert "Fix error with select when python process exceeds 1024 open file descriptors"" (#686) @emontnemery
    Source code(tar.gz)
    Source code(zip)
  • 13.0.3(Dec 12, 2022)

    What's Changed

    • Revert "Fix error with select when python process exceeds 1024 open file descriptors" (#685) @emontnemery

    ⬆️ Dependencies

    3 changes
    • Bump actions/setup-python from 4.3.0 to 4.3.1 (#684) @dependabot
    • Bump black from 22.10.0 to 22.12.0 (#682) @dependabot
    • Bump pylint from 2.15.7 to 2.15.8 (#683) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 13.0.2(Dec 9, 2022)

    What's Changed

    • Adding support for reported unknown devices (#680) @SplinterHead
    • Add Chromecast Ultra and Chromecast HD to the recognised devices (#679) @SplinterHead
    • Fix error with select when python process exceeds 1024 open file descriptors (#676) @logan893
    • Include URL and UUID in Home Assistant controller messages (#613) @emontnemery

    ⬆️ Dependencies

    2 changes
    • Bump pylint from 2.15.6 to 2.15.7 (#678) @dependabot
    • Bump flake8 from 5.0.4 to 6.0.0 (#674) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 13.0.1(Nov 21, 2022)

  • 13.0.0(Nov 21, 2022)

    What's Changed

    • Adapt to pylint 2.15.5 (#670) @emontnemery
    • Added three unknown models with cast-types (#658) @heikkih
    • Revert "pin to protobuf v3" (#669) @emontnemery
    • Pin github actions and add dependabot actions ecosystem (#655) @MartinHjelmare
    • Improve output of discovery examples (#653) @emontnemery
    • Update version_info in init (#640) @clach04

    ⬆️ Dependencies

    12 changes
    • Bump pylint from 2.14.5 to 2.15.6 (#671) @dependabot
    • Bump release-drafter/release-drafter from 5.21.0 to 5.21.1 (#667) @dependabot
    • Bump actions/setup-python from 4.2.0 to 4.3.0 (#664) @dependabot
    • Bump black from 22.8.0 to 22.10.0 (#663) @dependabot
    • Bump actions/checkout from 3.0.2 to 3.1.0 (#661) @dependabot
    • Bump release-drafter/release-drafter from 5.20.1 to 5.21.0 (#657) @dependabot
    • Bump black from 22.6.0 to 22.8.0 (#654) @dependabot
    • Bump flake8 from 5.0.1 to 5.0.4 (#650) @dependabot
    • Bump flake8 from 4.0.1 to 5.0.1 (#649) @dependabot
    • Bump pylint from 2.14.4 to 2.14.5 (#648) @dependabot
    • Bump black from 22.3.0 to 22.6.0 (#644) @dependabot
    • Bump pylint from 2.14.3 to 2.14.4 (#645) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 12.1.4(Jun 21, 2022)

    What's Changed

    • Improve timeout logs (#637) @emontnemery
    • pin to protobuf v3 (#625) @chapmanjacobd

    ⬆️ Dependencies

    2 changes
    • Prepare for pylint 2.14.1 (#634) @emontnemery
    • Bump pylint from 2.14.1 to 2.14.3 (#636) @dependabot
    • Bump pylint from 2.13.9 to 2.14.1 (#633) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 12.1.3(May 25, 2022)

    What's Changed

    • Add additional cast model (#628) @emontnemery
    • Add additional cast model (#624) @emontnemery

    ⬆️ Dependencies

    2 changes
    • Bump pylint from 2.13.8 to 2.13.9 (#626) @dependabot
    • Bump pylint from 2.13.7 to 2.13.8 (#623) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 12.1.2(May 9, 2022)

  • 12.1.1(May 5, 2022)

  • 12.1.0(May 5, 2022)

  • 12.0.0(Apr 26, 2022)

    What's Changed

    • Add load_media_failed callback to MediaStatusListener (#615) @emontnemery
    • Tweak media status (#614) @emontnemery

    ⬆️ Dependencies

    3 changes
    • Bump pylint from 2.13.6 to 2.13.7 (#617) @dependabot
    • Bump pylint from 2.13.5 to 2.13.6 (#616) @dependabot
    • Bump pylint from 2.13.4 to 2.13.5 (#612) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 11.0.0(Apr 1, 2022)

    Breaking Change

    The media controller has been refactored in #607, which means:

    • Controllers not included in the pychromecast repo may need some adjustments
    • The BbcIplayerController and BbcSoundsController no longer have overridden play_media methods

    What's Changed

    • Prepare for pylint 2.13.4 (#610) @emontnemery
    • Refactor media controllers (#607) @emontnemery
    • Update example scripts (#606) @emontnemery
    • Hide dependencies in release-drafter (#601) @MartinHjelmare

    ⬆️ Dependencies

    2 changes
    • Bump pylint from 2.12.2 to 2.13.4 (#608) @dependabot
    • Bump black from 22.1.0 to 22.3.0 (#605) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 10.3.0(Feb 28, 2022)

    What's Changed

    • Show diff when black fails (#596) @emontnemery
    • Fix f-string (#595) @emontnemery
    • Fix black fail introduced by #586 (#597) @emontnemery
    • Log error code on exception (#586) @ColinRobbins
    • Bump protobuf to 3.19.1 and regenerate protobuf files (#592) @emontnemery
    • Bump black from 21.12b0 to 22.1.0 (#591) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 10.2.3(Jan 5, 2022)

    What's Changed

    • Attempt reconnect on unknown exceptions by @emontnemery in https://github.com/home-assistant-libs/pychromecast/pull/584
    • Handle NotConnected exception when reconnecting by @emontnemery in https://github.com/home-assistant-libs/pychromecast/pull/583

    Full Changelog: https://github.com/home-assistant-libs/pychromecast/compare/10.2.2...10.2.3

    Source code(tar.gz)
    Source code(zip)
  • 10.2.2(Dec 20, 2021)

  • 10.2.1(Dec 14, 2021)

  • 10.2.0(Dec 14, 2021)

    What's Changed

    • Enable quick_play for the default media receiver (#573) @emontnemery
    • Bump protobuf to 3.19.1 and regenerate protobuf files (#571) @emontnemery
    • Bump pylint from 2.12.1 to 2.12.2 (#568) @dependabot
    • Bump black from 21.11b1 to 21.12b0 (#569) @dependabot
    • Prepare for black 21.12b0 (#570) @emontnemery
    • Bump pylint from 2.11.1 to 2.12.1 (#566) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 10.1.1(Nov 23, 2021)

    What's Changed

    • HA Lovelace controller: Prevent sending connect message twice (#559) @bramkragten
    • Bump black from 21.11b0 to 21.11b1 (#562) @dependabot
    • Catch zeroconf errors (#564) @emontnemery
    • Bump black from 21.10b0 to 21.11b0 (#561) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 10.1.0(Nov 15, 2021)

  • 10.0.0(Nov 15, 2021)

  • 9.4.0(Nov 11, 2021)

    What's Changed

    • Instantiate metadataType when metadata is provided (#554) @Shane-Wiseman-Bose
    • Add controller for the HomeAssistant Media app (#555) @emontnemery
    • Update home assistant app id (#537) @bramkragten
    • Bump black from 21.9b0 to 21.10b0 (#553) @dependabot
    • Make some block level pylint disable line level (#552) @emontnemery
    Source code(tar.gz)
    Source code(zip)
  • 9.3.1(Oct 19, 2021)

  • 9.3.0(Oct 18, 2021)

    What's Changed

    • Update hostbrowser to only poll audio hosts (#549) @emontnemery
    • Bump flake8 from 4.0.0 to 4.0.1 (#548) @dependabot
    • Bump pylint from 2.10.2 to 2.11.1 (#536) @dependabot
    • Prepare for pylint 2.11 (#547) @emontnemery
    • Bump flake8 from 3.9.2 to 4.0.0 (#546) @dependabot
    • Increase timeout for HostBrowser's polling (#542) @emontnemery
    • Revert "Block JBL devices from host based polling" (#544) @emontnemery
    • Block JBL devices from host based polling (#543) @emontnemery
    • Fix bug in discovery when a device does not return multizone status (#541) @emontnemery
    • Remove unused Event from ReceiverController (#534) @emontnemery
    • Remove spotify controller (#535) @emontnemery
    Source code(tar.gz)
    Source code(zip)
  • 9.2.1(Sep 16, 2021)

    What's Changed

    • Avoid deadlock in Youtube controller (#532) @emontnemery
    • Remove unnecessary app launch in quickplay (#533) @emontnemery
    • Bump black from 21.7b0 to 21.9b0 (#531) @dependabot
    • Bump pylint from 2.9.6 to 2.10.2 (#524) @dependabot
    • Bump pylint from 2.9.5 to 2.9.6 (#517) @dependabot
    • Bump pylint from 2.9.3 to 2.9.5 (#516) @dependabot
    • Bump black from 21.6b0 to 21.7b0 (#515) @dependabot
    • Add force_launch option to BaseController.launch (#500) @dphoyes
    • Bump pylint from 2.9.1 to 2.9.3 (#514) @dependabot
    • Bump pylint from 2.8.3 to 2.9.1 (#512) @dependabot
    • Adjust to pylint 2.9.0 (#511) @emontnemery
    • Bump black from 21.5b2 to 21.6b0 (#507) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 9.2.0(Jun 8, 2021)

    What's Changed

    • Add support for BBC Sounds and iPlayer apps (#503) @blawford
    • Bump black from 21.5b1 to 21.5b2 (#504) @dependabot
    • Bump pylint from 2.8.2 to 2.8.3 (#505) @dependabot
    • Bump black from 21.5b0 to 21.5b1 (#502) @dependabot
    • Bump flake8 from 3.9.1 to 3.9.2 (#501) @dependabot
    • Bump black from 21.4b2 to 21.5b0 (#498) @dependabot
    • Bump black from 21.4b1 to 21.4b2 (#497) @dependabot
    • Bump black from 21.4b0 to 21.4b1 (#496) @dependabot
    • Bump black from 20.8b1 to 21.4b0 (#492) @dependabot
    • Black 21.4b0 (#495) @emontnemery
    • Add known_hosts to additional discovery functions, update examples (#494) @emontnemery
    • Bump pylint from 2.8.1 to 2.8.2 (#493) @dependabot
    • Bump pylint from 2.7.4 to 2.8.1 (#491) @dependabot
    • Bump flake8 from 3.9.0 to 3.9.1 (#490) @dependabot
    • get_chromcasts() copy device list before iteration (#489) @Shane-Wiseman-Bose
    Source code(tar.gz)
    Source code(zip)
  • 9.1.2(Apr 6, 2021)

    What's Changed

    • Handle bad UUIDs from third-party Chromecasts (#486) @manualmanul
    • Reuse SSL context in host browser (#485) @emontnemery
    • Bump pylint from 2.7.2 to 2.7.4 (#482) @dependabot
    • Bump flake8 from 3.8.4 to 3.9.0 (#477) @dependabot
    Source code(tar.gz)
    Source code(zip)
  • 9.1.1(Mar 1, 2021)

  • 9.1.0(Mar 1, 2021)

    What's Changed

    • Add HostBrowser.update_hosts (#476) @emontnemery
    • Handle audio groups removed from known host (#475) @emontnemery
    • Bump pylint from 2.7.1 to 2.7.2 (#474) @dependabot
    • Remove useless pylint and flake8 directives (#472) @emontnemery
    Source code(tar.gz)
    Source code(zip)
  • 9.0.0(Feb 26, 2021)

  • 8.1.2(Feb 26, 2021)

Owner
Home Assistant Libraries
Device libraries used by Home Assistant
Home Assistant Libraries
Stream Music 🎵 𝘼 𝙗𝙤𝙩 𝙩𝙝𝙖𝙩 𝙘𝙖𝙣 𝙥𝙡𝙖𝙮 𝙢𝙪𝙨𝙞𝙘 𝙤𝙣 𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙂𝙧𝙤𝙪𝙥 𝙖𝙣𝙙 𝘾𝙝𝙖𝙣𝙣𝙚𝙡 𝙑𝙤𝙞𝙘𝙚 𝘾𝙝𝙖𝙩𝙨 𝘼𝙫𝙖𝙞𝙡?

Stream Music 🎵 𝘼 𝙗𝙤𝙩 𝙩𝙝𝙖𝙩 𝙘𝙖𝙣 𝙥𝙡𝙖𝙮 𝙢𝙪𝙨𝙞𝙘 𝙤𝙣 𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙂𝙧𝙤𝙪𝙥 𝙖𝙣𝙙 𝘾𝙝𝙖𝙣𝙣𝙚𝙡 𝙑𝙤𝙞𝙘𝙚 𝘾𝙝𝙖𝙩𝙨 𝘼𝙫𝙖𝙞𝙡?

Sadew Jayasekara 15 Nov 12, 2022
Stevan KZ 1 Oct 27, 2021
Audio spatialization over WebRTC and JACK Audio Connection Kit

Audio spatialization over WebRTC Spatify provides a framework for building multichannel installations using WebRTC.

Bruno Gola 34 Jun 29, 2022
This library provides common speech features for ASR including MFCCs and filterbank energies.

python_speech_features This library provides common speech features for ASR including MFCCs and filterbank energies. If you are not sure what MFCCs ar

James Lyons 2.2k Jan 04, 2023
This is my voice assistant Patric!

voice-assistant This is my voice assistant Patric! You can add can add commands and even modify his name Indice How to use Installation guide How to u

Norbert Gabos 1 Jun 28, 2022
無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア

Hiroshiba 0 Aug 29, 2022
Dataset and baseline code for the VocalSound dataset (ICASSP2022).

VocalSound: A Dataset for Improving Human Vocal Sounds Recognition Introduction Citing Download VocalSound Dataset Details Baseline Experiment Contact

Yuan Gong 58 Jan 03, 2023
A voice assistant which can be used to interact with your computer and controls your pc operations

Introduction 👨‍💻 It is a voice assistant which can be used to interact with your computer and also you have been seeing it in Iron man movies, but t

Sujith 84 Dec 22, 2022
🎵 A repository for manually annotating files to create labeled acoustic datasets for machine learning.

🎵 A repository for manually annotating files to create labeled acoustic datasets for machine learning.

Jim Schwoebel 28 Dec 22, 2022
Audio pitch-shifting & re-sampling utility, based on the EMU SP-1200

Pitcher.py Free & OS emulation of the SP-12 & SP-1200 signal chain (now with GUI) Pitch shift / bitcrush / resample audio files Written and tested in

morgan 13 Oct 03, 2022
𝙰 𝙼𝚞𝚜𝚒𝚌 𝙱𝚘𝚝 𝙲𝚛𝚎𝚊𝚝𝚎𝚍 𝙱𝚢 𝚃𝚎𝚊𝚖𝙳𝚕𝚝 💖

TeamDltmusic 𝙰 𝙼𝚞𝚜𝚒𝚌 𝙱𝚘𝚝 𝙲𝚛𝚎𝚊𝚝𝚎𝚍 𝙱𝚢 𝚃𝚎𝚊𝚖𝙳𝚕𝚝 💖 Deploy String Session String Click hear you can find string session OR join He

TeamDlt 5 Jan 18, 2022
Telegram Voice-Chat Bot Written In Python Using Pyrogram.

Telegram Voice-Chat Bot Telegram Voice-Chat Bot To Play Music From Various Sources In Your Group Support All linux based os. Windows Mac Diagram Requi

TheHamkerCat 314 Dec 29, 2022
Okaeri-Music is a telegram music bot project, allow you to play music on voice chat group telegram.

Okaeri-Music is a telegram bot project that's allow you to play music on telegram voice chat group

Wahyusaputra 1 Dec 22, 2021
Powerful, simple, audio tag editor for GNU/Linux

puddletag puddletag is an audio tag editor (primarily created) for GNU/Linux similar to the Windows program, Mp3tag. Unlike most taggers for GNU/Linux

341 Dec 26, 2022
This is a realtime voice translator program which gets input from user at any language and converts it to the desired language that the user asks

This is a realtime voice translator program which gets input from user at any language and converts it to the desired language that the user asks ...

Mohan Ram S 1 Dec 30, 2021
A Music Player Bot for Discord Servers

A Music Player Bot for Discord Servers

Halil Acar 2 Oct 25, 2021
Bot Music Pintar. Created by Rio

🎶 Rio Music 🎶 Kalo Fork Star Ya Bang Hehehe Requirements 📝 FFmpeg NodeJS nodesource.com Python 3.8+ or 3.7 PyTgCalls Generate String Using Replit ⤵

RioProjectX 7 Jun 15, 2022
Graphical interface to control granular sound synthesis.

Granular sound synthesis interface SoundGrain is a graphical interface where users can draw and edit trajectories to control granular sound synthesis

Olivier Bélanger 122 Dec 10, 2022
🎵 Python sound notifications made easy

chime Python sound notifications made easy. Table of contents Table of contents Motivation Installation Basic usage Theming IPython/Jupyter magic Exce

Max Halford 231 Jan 09, 2023
Omniscient Mozart, being able to transcribe everything in the music, including vocal, drum, chord, beat, instruments, and more.

OMNIZART Omnizart is a Python library that aims for democratizing automatic music transcription. Given polyphonic music, it is able to transcribe pitc

MCTLab 1.3k Jan 08, 2023