canary-rs/apps/music-player/src/main.rs

83 lines
2.2 KiB
Rust
Raw Normal View History

2022-10-30 05:26:02 +00:00
use magpie_client::{magpie_types, MagpieClient};
use magpie_types::{CreatePanel, MagpieServerMsg};
2022-09-24 18:54:55 +00:00
use mpris::{PlayerFinder, ProgressTracker};
use ouroboros::self_referencing;
#[self_referencing]
pub struct Player {
player: mpris::Player,
#[borrows(player)]
#[covariant]
tracker: ProgressTracker<'this>,
}
impl Player {
pub fn from_player(player: mpris::Player) -> Self {
2022-10-30 05:26:02 +00:00
println!("Connected to {}", player.identity());
2022-09-24 18:54:55 +00:00
PlayerBuilder {
player,
tracker_builder: |player| player.track_progress(100).unwrap(),
}
.build()
}
pub fn tick(&mut self) -> bool {
self.with_tracker_mut(|tracker| {
let tick = tracker.tick();
if tick.progress_changed {
2022-10-30 05:26:02 +00:00
let p = tick.progress;
2022-09-24 18:54:55 +00:00
println!(
2022-10-30 05:26:02 +00:00
"({:?}/{:?}) {:?} - {:?} - {:?}",
p.position(),
p.length(),
p.metadata().artists(),
p.metadata().album_name(),
p.metadata().title(),
2022-09-24 18:54:55 +00:00
);
}
if tick.track_list_changed {
println!("{:#?}", tick.progress.metadata());
}
tick.player_quit
})
}
}
fn main() {
let args: Vec<String> = std::env::args().collect();
let module_path = args
.get(1)
.expect("Please pass a path to a Canary script!")
.to_owned();
2022-10-30 05:26:02 +00:00
let player_finder = PlayerFinder::new().expect("Could not connect to D-Bus");
2022-09-24 18:54:55 +00:00
2022-10-30 05:26:02 +00:00
let mut magpie = MagpieClient::new().unwrap();
let script = std::path::PathBuf::from(&module_path);
let msg = CreatePanel { id: 0, script };
let msg = MagpieServerMsg::CreatePanel(msg);
magpie.messenger.send(&msg).unwrap();
2022-09-24 18:54:55 +00:00
2022-10-30 05:26:02 +00:00
loop {
println!("Connecting to MRPIS...");
let mut player = match player_finder.find_active() {
Ok(player) => Player::from_player(player),
Err(err) => {
eprintln!("Couldn't find player: {:?}", err);
let wait = std::time::Duration::from_secs(1);
std::thread::sleep(wait);
continue;
2022-09-24 18:54:55 +00:00
}
2022-10-30 05:26:02 +00:00
};
while !player.tick() {}
println!("Disconnected from MPRIS");
}
2022-09-24 18:54:55 +00:00
}