跳转到主要内容

Python模块,用于与Google Chromecast通信。

项目描述

为Python 3.11+提供的用于与Google Chromecast通信的库。它目前支持

  • 自动发现网络上的连接Chromecasts

  • 启动默认媒体接收器并播放任何在线媒体

  • 控制当前播放媒体的播放

  • 实现Google Chromecast api v2

  • 通过通道与应用程序通信

  • 易于扩展以添加对不受支持的命名空间的支持

  • 带有音频流设备的多人房间设置

查看 Home Assistant 以使用PyChromecast控制并自动化您的Chromecast或Cast启用设备,如Google Home。

依赖关系

PyChromecast依赖于Python包requests、protobuf和zeroconf。请确保已安装这些依赖项,使用

pip install -r requirements.txt

如何使用

>> import time
>> import pychromecast
>> import zeroconf

>> # Create a browser which prints the friendly name of found chromecast devices
>> zconf = zeroconf.Zeroconf()
>> browser = pychromecast.CastBrowser(pychromecast.SimpleCastListener(lambda uuid, service: print(browser.devices[uuid].friendly_name)), zconf)
>> browser.start_discovery()
>> # 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.cast_info.friendly_name for cc in chromecasts]
['Living Room']

>> # Discover and connect to more than one device
>> chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["Living Room","Bed Room","Kitchen"])
>> [cc.device.friendly_name for cc in chromecasts]
["Living Room","Bed Room","Kitchen"]

>> # If you are seeing less devices get discovered than expected add the below parameter. You can lessen or extend the timeout as needed.
>> chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["Living Room","Bed Room","Kitchen"],discovery_timeout=30)
>> [cc.device.friendly_name for cc in chromecasts]
["Living Room","Bed Room","Kitchen"]

>> cast = chromecasts[0]
>> # Start worker thread and wait for cast device to be ready
>> cast.wait()
>> print(cast.cast_info)
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.')

>> 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)

添加对额外命名空间的支持

在Chromecast上运行的每个应用程序都支持命名空间。它们指定一个基于JSON的迷你协议。这用于Chromecast与您的手机/浏览器以及现在的Python之间的通信。

通过使用控制器添加对额外命名空间的支持。要向当前chromecast实例添加您自己的命名空间,您首先必须定义您的控制器。以下是一个最小控制器的示例

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'})

在定义了控制器之后,您需要将其实例添加到Chromecast对象中: cast.register_handler(MyController())。当接收到带有您命名空间的消息时,它将被路由到您的控制器。

有关更多选项,请参阅BaseController。一个完全实现的控制器示例请参阅MediaController

探索现有命名空间

您已经运行了PyChromecast,并决定是时候为您最喜欢的应用添加支持了。别担心,以下说明将涵盖探索可能性的所有方面。

以下说明需要使用Google Chrome浏览器Google Cast插件

  • 在Chrome中,转到chrome://net-export/

  • 选择“包括原始字节(将包括Cookies和凭证)”

  • 点击“开始记录到磁盘”

  • 打开一个新标签页,浏览到具有Chromecast支持的网络上的您最喜欢的应用,并开始传输。

  • 回到捕获事件的标签页,点击停止。

  • 打开https://netlog-viewer.appspot.com/并选择您的事件日志文件。

  • 浏览到https://netlog-viewer.appspot.com/#events&q=type:SOCKET,找到具有熟悉JSON数据的套接字。(对我来说,通常是上面第二个或第三个。)

  • 遍历结果并收集交换的JSON。

  • 现在编写一个能够模仿此行为的控制器吧 :-)

忽略CEC数据

Chromecast通常会报告它是否连接设备的活动输入。此值存储在以下属性的cast对象中。

cast.status.is_active_input

一些Chromecast用户报告了与他们的媒体中心设备存在CEC不兼容性。这些不兼容性有时会导致此活动输入值报告错误。

此活动输入值通常用于确定Chromecast是否空闲。PyChromecast能够在Chromecast返回错误值的情况下确定Chromecast是否空闲时忽略活动输入值。要在PyChromecast中忽略此CEC检测数据,将以下示例中的Linux样式通配符格式字符串追加到IGNORE_CEC列表中。

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

网络要求

Pychromecast依赖于mDNS来发现cast设备。mDNS协议依赖于端口5353上的多播UDP,这对发现带来了一些影响

  • 多播UDP必须由WiFi路由器转发;一些WiFi路由器已知会丢弃多播UDP流量。

  • 运行pychromecast的设备必须允许端口5353上的入站和出站流量。

  • 运行pychromecast的设备必须与cast设备位于同一子网中,因为mDNS数据包不会跨子网路由。

如果这些条件不全部满足,则发现将无法工作。在这些条件不可能满足的情况下,可以将已知IP地址或主机名列表传递给发现函数。

谢谢

我想感谢Fred Clift为建立套接字客户端基础工作。没有他,这不可能实现!

PyChromecast - A library from the Open Home Foundation

项目详情


发行历史 发布通知 | RSS源

下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分布

PyChromecast-14.0.2.tar.gz (60.4 kB 查看散列值)

上传时间

构建分布

PyChromecast-14.0.2-py2.py3-none-any.whl (75.5 kB 查看散列值)

上传时间 Python 2 Python 3

由以下机构支持