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-14.0.2.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 092c65f421991bca565338bc61a0c14861c47e0f5c0a65919a5e93f02dfd071a |
|
MD5 | b780aa4332f812bb88cf5d5880ee46cb |
|
BLAKE2b-256 | dedd92ff0211f59a184cd1976f34370ee5b608eb52d2b4eff495a542a610a060 |
PyChromecast-14.0.2-py2.py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 476f99e87064ab9c475eafeae447446dde1d96839a8711e230e15ba70634ee4d |
|
MD5 | daad788fd483b592dcff7aa239ec24d3 |
|
BLAKE2b-256 | 631ef47185bff8d94648afc89da00d1af5e710f5a557a7d43048ab1106132d28 |