media_renderer_client/
media_renderer_client.rs

1use 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        // Select the first Kodi device found
19        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    // media_renderer.stop().await?;
56    // media_renderer.play().await?;
57    // media_renderer.pause().await?;
58
59    Ok(())
60}