mirror of
https://github.com/librespot-org/librespot.git
synced 2024-12-18 17:11:53 +00:00
add initial MPRIS support using zbus
- following the spec at https://specifications.freedesktop.org/mpris-spec/latest/ - some properties/commands are not fully supported, yet
This commit is contained in:
parent
80939819dd
commit
de5a2969b7
4 changed files with 1226 additions and 1 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -1911,8 +1911,11 @@ dependencies = [
|
|||
"sha1",
|
||||
"sysinfo",
|
||||
"thiserror",
|
||||
"time",
|
||||
"tokio",
|
||||
"url",
|
||||
"zbus",
|
||||
"zvariant",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -64,7 +64,10 @@ sha1 = "0.10"
|
|||
sysinfo = { version = "0.31.3", default-features = false, features = ["system"] }
|
||||
thiserror = "1.0"
|
||||
tokio = { version = "1.40", features = ["rt", "macros", "signal", "sync", "parking_lot", "process"] }
|
||||
time = { version = "0.3", features = ["formatting"] }
|
||||
url = "2.2"
|
||||
zbus = { version = "4", default-features = false, features = ["tokio"], optional = true }
|
||||
zvariant = { version = "4", default-features = false, optional = true }
|
||||
|
||||
[features]
|
||||
alsa-backend = ["librespot-playback/alsa-backend"]
|
||||
|
@ -82,7 +85,9 @@ with-libmdns = ["librespot-discovery/with-libmdns"]
|
|||
|
||||
passthrough-decoder = ["librespot-playback/passthrough-decoder"]
|
||||
|
||||
default = ["rodio-backend", "with-libmdns"]
|
||||
with-mpris = ["dep:zbus", "dep:zvariant"]
|
||||
|
||||
default = ["rodio-backend", "with-libmdns", "with-mpris"]
|
||||
|
||||
[package.metadata.deb]
|
||||
maintainer = "librespot-org"
|
||||
|
|
20
src/main.rs
20
src/main.rs
|
@ -40,6 +40,11 @@ use librespot::playback::mixer::alsamixer::AlsaMixer;
|
|||
mod player_event_handler;
|
||||
use player_event_handler::{run_program_on_sink_events, EventHandler};
|
||||
|
||||
#[cfg(feature = "with-mpris")]
|
||||
mod mpris_event_handler;
|
||||
#[cfg(feature = "with-mpris")]
|
||||
use mpris_event_handler::MprisEventHandler;
|
||||
|
||||
fn device_id(name: &str) -> String {
|
||||
HEXLOWER.encode(&Sha1::digest(name.as_bytes()))
|
||||
}
|
||||
|
@ -1937,6 +1942,14 @@ async fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-mpris")]
|
||||
let mpris = MprisEventHandler::spawn(player.clone())
|
||||
.await
|
||||
.unwrap_or_else(|e| {
|
||||
error!("could not initialize MPRIS: {}", e);
|
||||
exit(1);
|
||||
});
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
credentials = async {
|
||||
|
@ -1990,6 +2003,10 @@ async fn main() {
|
|||
exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
#[cfg(feature = "with-mpris")]
|
||||
mpris.set_spirc(spirc_.clone());
|
||||
|
||||
spirc = Some(spirc_);
|
||||
spirc_task = Some(Box::pin(spirc_task_));
|
||||
|
||||
|
@ -2035,6 +2052,9 @@ async fn main() {
|
|||
|
||||
let mut shutdown_tasks = tokio::task::JoinSet::new();
|
||||
|
||||
#[cfg(feature = "with-mpris")]
|
||||
shutdown_tasks.spawn(mpris.quit_and_join());
|
||||
|
||||
// Shutdown spirc if necessary
|
||||
if let Some(spirc) = spirc {
|
||||
if let Err(e) = spirc.shutdown() {
|
||||
|
|
1197
src/mpris_event_handler.rs
Normal file
1197
src/mpris_event_handler.rs
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue