media_renderer_client/
media_renderer_client.rs1use futures_util::StreamExt;
2use upnp_client::{
3 device_client::DeviceClient,
4 discovery::discover_pnp_locations,
5 media_renderer::MediaRendererClient,
6 types::{Device, LoadOptions, Metadata, ObjectClass},
7};
8
9const KODI_MEDIA_RENDERER: &str = "Kodi - Media Renderer";
10
11#[tokio::main]
12async fn main() -> Result<(), Box<dyn std::error::Error>> {
13 let devices = discover_pnp_locations().await?;
14 tokio::pin!(devices);
15
16 let mut kodi_device: Option<Device> = None;
17 while let Some(device) = devices.next().await {
18 if device.model_description == Some(KODI_MEDIA_RENDERER.to_string()) {
20 kodi_device = Some(device);
21 break;
22 }
23 }
24
25 let kodi_device = kodi_device.unwrap();
26 let device_client = DeviceClient::new(&kodi_device.location)?.connect().await?;
27 let mut media_renderer = MediaRendererClient::new(device_client);
28
29 let options = LoadOptions {
30 dlna_features: Some(
31 "DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000"
32 .to_string(),
33 ),
34 content_type: Some("video/mp4".to_string()),
35 metadata: Some(Metadata {
36 title: "Big Buck Bunny".to_string(),
37 ..Default::default()
38 }),
39 autoplay: true,
40 object_class: Some(ObjectClass::Video),
41 ..Default::default()
42 };
43
44 let media_url =
45 "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
46
47 media_renderer.load(media_url, options).await?;
48 let events = media_renderer.subscribe().await;
49 tokio::pin!(events);
50
51 while let Some(event) = events.next().await {
52 println!("\n{}\n", event);
53 }
54
55 Ok(())
60}