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
Python library for audio and music analysis

librosa A python package for music and audio analysis. Documentation See https://librosa.org/doc/ for a complete reference manual and introductory tut

librosa 5.6k Jan 6, 2023
Python Audio Analysis Library: Feature Extraction, Classification, Segmentation and Applications

A Python library for audio feature extraction, classification, segmentation and applications This doc contains general info. Click here for the comple

Theodoros Giannakopoulos 5.1k Jan 2, 2023
cross-library (GStreamer + Core Audio + MAD + FFmpeg) audio decoding for Python

audioread Decode audio files using whichever backend is available. The library currently supports: Gstreamer via PyGObject. Core Audio on Mac OS X via

beetbox 359 Feb 15, 2021
Python library for handling audio datasets.

AUDIOMATE Audiomate is a library for easy access to audio datasets. It provides the datastructures for accessing/loading different datasets in a gener

Matthias 121 Nov 27, 2022
A Python library for audio data augmentation. Inspired by albumentations. Useful for machine learning.

Audiomentations A Python library for audio data augmentation. Inspired by albumentations. Useful for deep learning. Runs on CPU. Supports mono audio a

Iver Jordal 1.2k Jan 7, 2023
Python Audio Analysis Library: Feature Extraction, Classification, Segmentation and Applications

A Python library for audio feature extraction, classification, segmentation and applications This doc contains general info. Click here for the comple

Theodoros Giannakopoulos 3.8k Feb 17, 2021
C++ library for audio and music analysis, description and synthesis, including Python bindings

Essentia Essentia is an open-source C++ library for audio analysis and audio-based music information retrieval released under the Affero GPL license.

Music Technology Group - Universitat Pompeu Fabra 2.3k Jan 3, 2023
Python audio and music signal processing library

madmom Madmom is an audio signal processing library written in Python with a strong focus on music information retrieval (MIR) tasks. The library is i

Institute of Computational Perception 1k Dec 26, 2022
pedalboard is a Python library for adding effects to audio.

pedalboard is a Python library for adding effects to audio. It supports a number of common audio effects out of the box, and also allows the use of VST3® and Audio Unit plugin formats for third-party effects.

Spotify 3.9k Jan 2, 2023
A Python library and tools AUCTUS A6 based radios.

A Python library and tools AUCTUS A6 based radios.

Jonathan Hart 6 Nov 23, 2022
Generating a structured library of .wav samples with Python.

sample-library Scripts for generating a structured sample library with Python Requires Docker about Samples are written to wave files in lib/. Differe

Ben Mangold 1 Nov 11, 2021
A Python port and library-fication of the midicsv tool by John Walker.

A Python port and library-fication of the midicsv tool by John Walker. If you need to convert MIDI files to human-readable text files and back, this is the library for you.

Tim Wedde 52 Dec 29, 2022
music library manager and MusicBrainz tagger

beets Beets is the media library management system for obsessive music geeks. The purpose of beets is to get your music collection right once and for

beetbox 11.3k Dec 31, 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 4, 2023
:speech_balloon: SpeechPy - A Library for Speech Processing and Recognition: http://speechpy.readthedocs.io/en/latest/

SpeechPy Official Project Documentation Table of Contents Documentation Which Python versions are supported Citation How to Install? Local Installatio

Amirsina Torfi 870 Dec 27, 2022
Audio library for modelling loudness

Loudness Loudness is a C++ library with Python bindings for modelling perceived loudness. The library consists of processing modules which can be casc

Dominic Ward 33 Oct 2, 2022
Sparse Beta-Divergence Tensor Factorization Library

NTFLib Sparse Beta-Divergence Tensor Factorization Library Based off of this beta-NTF project this library is specially-built to handle tensors where

Stitch Fix Technology 46 Jan 8, 2022
Music player and music library manager for Linux, Windows, and macOS

Ex Falso / Quod Libet - A Music Library / Editor / Player Quod Libet is a music management program. It provides several different ways to view your au

Quod Libet 1.2k Jan 7, 2023
a library for audio and music analysis

aubio aubio is a library to label music and sounds. It listens to audio signals and attempts to detect events. For instance, when a drum is hit, at wh

aubio 2.9k Dec 30, 2022