Add multiplayer support.

This commit is contained in:
Alexandr Bogomyakov
2019-12-17 15:05:24 +03:00
parent 614185e7f8
commit 530a753527

View File

@@ -12,6 +12,7 @@ const TRACK_NAME: &str = "#[fg=colour3]";
const TRACK_ARTIST: &str = "#[fg=colour3]"; const TRACK_ARTIST: &str = "#[fg=colour3]";
const TRACK_TIME: &str = "#[bg=colour252 fg=colour235 bold]"; const TRACK_TIME: &str = "#[bg=colour252 fg=colour235 bold]";
#[derive(Debug, Clone)]
struct TrackInfo { struct TrackInfo {
title: String, title: String,
artist: String, artist: String,
@@ -69,17 +70,24 @@ fn cpu_load_bar(bar_len: i32) {
print!("{:.2} LA1", one); print!("{:.2} LA1", one);
} }
fn player_info(player: &str) -> Result<TrackInfo, Box<dyn std::error::Error>> { fn get_player() -> Result<Vec<String>, Box<dyn std::error::Error>> {
let conn = Connection::new_session()?; let conn = Connection::new_session()?;
let mut service: String = "org.mpris.MediaPlayer2.".to_owned(); let proxy = conn.with_proxy("org.freedesktop.DBus", "/", Duration::from_millis(5000));
service.push_str(player); let (names,): (Vec<String>,) = proxy.method_call("org.freedesktop.DBus", "ListNames", ())?;
let proxy = conn.with_proxy( let mut players: Vec<String> = Vec::new();
service, for name in names {
"/org/mpris/MediaPlayer2", if name.contains("org.mpris.MediaPlayer2") {
Duration::from_millis(5000), players.push(name);
); //println!("{}", name);
let metadata: Box<dyn arg::RefArg> = proxy.get("org.mpris.MediaPlayer2.Player", "Metadata")?; }
let mut iter = metadata.as_iter().unwrap(); }
Ok(players)
}
fn player_info(players: Vec<String>) -> Result<TrackInfo, Box<dyn std::error::Error>> {
let mut players_vec: Vec<TrackInfo> = Vec::new();
for player in players {
let mut track_info = TrackInfo { let mut track_info = TrackInfo {
artist: "".to_string(), artist: "".to_string(),
title: "".to_string(), title: "".to_string(),
@@ -87,6 +95,15 @@ fn player_info(player: &str) -> Result<TrackInfo, Box<dyn std::error::Error>> {
duration: "".to_string(), duration: "".to_string(),
status: "".to_string(), status: "".to_string(),
}; };
let conn = Connection::new_session()?;
let proxy = conn.with_proxy(
player,
"/org/mpris/MediaPlayer2",
Duration::from_millis(5000),
);
let metadata: Box<dyn arg::RefArg> =
proxy.get("org.mpris.MediaPlayer2.Player", "Metadata")?;
let mut iter = metadata.as_iter().unwrap();
while let Some(key) = iter.next() { while let Some(key) = iter.next() {
if key.as_str() == Some("xesam:title") { if key.as_str() == Some("xesam:title") {
if let Some(title) = iter.next().unwrap().as_str() { if let Some(title) = iter.next().unwrap().as_str() {
@@ -108,7 +125,8 @@ fn player_info(player: &str) -> Result<TrackInfo, Box<dyn std::error::Error>> {
} }
} }
} }
let position: Box<dyn arg::RefArg> = proxy.get("org.mpris.MediaPlayer2.Player", "Position")?; let position: Box<dyn arg::RefArg> =
proxy.get("org.mpris.MediaPlayer2.Player", "Position")?;
track_info.position = format_time(position.as_i64().unwrap() / 1000000); track_info.position = format_time(position.as_i64().unwrap() / 1000000);
// ugly // ugly
let _status_text_box: Box<dyn arg::RefArg> = let _status_text_box: Box<dyn arg::RefArg> =
@@ -119,7 +137,14 @@ fn player_info(player: &str) -> Result<TrackInfo, Box<dyn std::error::Error>> {
"Paused" => track_info.status = "".to_string(), "Paused" => track_info.status = "".to_string(),
_ => track_info.status = "".to_string(), _ => track_info.status = "".to_string(),
}; };
Ok(track_info) players_vec.push(track_info);
}
for player in &players_vec {
if player.status == "".to_string() {
return Ok(player.clone());
}
}
Ok(players_vec[players_vec.len() - 1].clone())
} }
fn format_time(sec: i64) -> String { fn format_time(sec: i64) -> String {
@@ -139,7 +164,7 @@ fn main() {
2 => match args[1].as_ref() { 2 => match args[1].as_ref() {
"-cb" => cpu_load_bar(15), "-cb" => cpu_load_bar(15),
"-mb" => mem_load_bar(15), "-mb" => mem_load_bar(15),
"-p" => match player_info("cmus") { "-p" => match player_info(get_player().unwrap()) {
Ok(mut track_info) => { Ok(mut track_info) => {
let title_len = 30; let title_len = 30;
let artist_len = 30; let artist_len = 30;
@@ -147,6 +172,7 @@ fn main() {
track_info.title.truncate(title_len); track_info.title.truncate(title_len);
track_info.title.push_str(".."); track_info.title.push_str("..");
} }
println!("{}, {}", track_info.artist, track_info.artist.len());
if track_info.artist.len() >= artist_len { if track_info.artist.len() >= artist_len {
track_info.artist.truncate(artist_len); track_info.artist.truncate(artist_len);
track_info.artist.push_str(".."); track_info.artist.push_str("..");