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
|
|
|
}
|