11 个版本
0.1.10 | 2024 年 6 月 7 日 |
---|---|
0.1.9 | 2023 年 4 月 11 日 |
0.1.7 | 2023 年 2 月 19 日 |
0.1.1 | 2023 年 1 月 30 日 |
#1469 在 网络编程
178 每月下载量
用于 12 个 crate(4 个直接使用)
72KB
1.5K SLoC
UPnP 客户端
这是一个用于 Rust 的 UPnP 客户端库。
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
upnp-client = "0.1"
示例
此示例将打印出网络中找到的所有设备。
use colored_json::prelude::*;
use futures_util::StreamExt;
use crate::discovery::discover_pnp_locations;
mod discovery;
mod types;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let devices = discover_pnp_locations().await?;
tokio::pin!(devices);
while let Some(device) = devices.next().await {
let json = serde_json::to_string_pretty(&device)?;
println!("{}", json.to_colored_json_auto()?);
}
Ok(())
}
输出
{
"device_type": "urn:schemas-upnp-org:device:MediaRenderer:1",
"friendly_name": "Kodi (MacBook-Pro-de-Tsiry-4.local)",
"location": "http://192.168.8.101:1825/",
"manufacturer": "XBMC Foundation",
"manufacturer_url": "http://kodi.tv/",
"model_description": "Kodi - Media Renderer",
"model_name": "Kodi",
"model_number": "18.4 Git:20190831-3ade758ceb",
"services": [
{
"control_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
"event_sub_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
"scpd_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
"service_id": "urn:upnp-org:serviceId:AVTransport",
"service_type": "urn:schemas-upnp-org:service:AVTransport:1"
},
{
"control_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
"event_sub_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
"scpd_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
"service_id": "urn:upnp-org:serviceId:ConnectionManager",
"service_type": "urn:schemas-upnp-org:service:ConnectionManager:1"
},
{
"control_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
"event_sub_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
"scpd_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
"service_id": "urn:upnp-org:serviceId:RenderingControl",
"service_type": "urn:schemas-upnp-org:service:RenderingControl:1"
}
]
}
流式传输
use futures_util::StreamExt;
use upnp_client::{
device_client::DeviceClient,
discovery::discover_pnp_locations,
media_renderer::MediaRendererClient,
types::{Device, LoadOptions, Metadata, ObjectClass},
};
const KODI_MEDIA_RENDERER: &str = "Kodi - Media Renderer";
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let devices = discover_pnp_locations().await?;
tokio::pin!(devices);
let mut kodi_device: Option<Device> = None;
while let Some(device) = devices.next().await {
// Select the first Kodi device found
if device.model_description == Some(KODI_MEDIA_RENDERER.to_string()) {
kodi_device = Some(device);
break;
}
}
let kodi_device = kodi_device.unwrap();
let device_client = DeviceClient::new(&kodi_device.location)?.connect().await?;
let media_renderer = MediaRendererClient::new(device_client);
let options = LoadOptions {
dlna_features: Some(
"DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000"
.to_string(),
),
content_type: Some("video/mp4".to_string()),
metadata: Some(Metadata {
title: "Big Buck Bunny".to_string(),
..Default::default()
}),
autoplay: true,
object_class: Some(ObjectClass::Video),
..Default::default()
};
let media_url =
"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
media_renderer.load(media_url, options).await?;
Ok(())
}
查看 示例 目录以获取更多示例。
功能
- 发现设备
- 控制媒体渲染器设备(加载、播放、暂停、停止、搜索等)
- 浏览媒体服务器设备
参考文献
许可证
MIT
依赖项
~24–38MB
~707K SLoC