mpris 2.1.0

Idiomatic MPRIS D-Bus interface library
Documentation
use anyhow::{Context, Result};
use mpris::PlayerFinder;

fn main() {
    match print_track_list() {
        Ok(_) => {}
        Err(error) => {
            println!("Error: {}", error);
            for (i, cause) in error.chain().skip(1).enumerate() {
                print!("{}", "  ".repeat(i + 1));
                println!("Caused by: {}", cause);
            }
            std::process::exit(1);
        }
    }
}

fn print_track_list() -> Result<()> {
    let player_finder = PlayerFinder::new().context("Could not connect to D-Bus")?;

    let player = player_finder
        .find_active()
        .context("Could not find any player")?;

    println!(
        "Found {identity} (on bus {bus_name})",
        bus_name = player.bus_name(),
        identity = player.identity(),
    );

    let track_list = player
        .checked_get_track_list()
        .context("Could not get track list for player")?;

    let track_list = match track_list {
        Some(tracks) => tracks,
        None => {
            println!("Player does not support the TrackList interface.");
            return Ok(());
        }
    };

    println!("Track list:\n");
    let iter = track_list
        .metadata_iter(&player)
        .context("Could not load metadata for tracks")?;

    for metadata in iter {
        println!("{:#?}", metadata);
    }

    Ok(())
}