Seek & SetPosition implementation
This commit is contained in:
committed by
Henrik Friedrichsen
parent
97d3468392
commit
dce6b45472
46
src/mpris.rs
46
src/mpris.rs
@@ -311,7 +311,7 @@ fn run_dbus_server(spotify: Arc<Spotify>, queue: Arc<Queue>, rx: mpsc::Receiver<
|
|||||||
.property::<bool, _>("CanSeek", ())
|
.property::<bool, _>("CanSeek", ())
|
||||||
.access(Access::Read)
|
.access(Access::Read)
|
||||||
.on_get(|iter, _| {
|
.on_get(|iter, _| {
|
||||||
iter.append(false); // TODO
|
iter.append(true);
|
||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -434,6 +434,46 @@ fn run_dbus_server(spotify: Arc<Spotify>, queue: Arc<Queue>, rx: mpsc::Receiver<
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let method_seek = {
|
||||||
|
let queue = queue.clone();
|
||||||
|
let spotify = spotify.clone();
|
||||||
|
f.method("Seek", (), move |m| {
|
||||||
|
if let Some(current_track) = queue.get_current() {
|
||||||
|
let offset = m.msg.get1::<i64>().unwrap_or(0); // micros
|
||||||
|
let progress = spotify.get_current_progress();
|
||||||
|
let new_position = (progress.as_secs() * 1000) as i32
|
||||||
|
+ progress.subsec_millis() as i32
|
||||||
|
+ (offset / 1000) as i32;
|
||||||
|
let new_position = new_position.max(0) as u32;
|
||||||
|
let duration = current_track.duration();
|
||||||
|
|
||||||
|
if new_position < duration {
|
||||||
|
spotify.seek(new_position);
|
||||||
|
} else {
|
||||||
|
queue.next(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(vec![m.msg.method_return()])
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
let method_set_position = {
|
||||||
|
let queue = queue.clone();
|
||||||
|
let spotify = spotify.clone();
|
||||||
|
f.method("SetPosition", (), move |m| {
|
||||||
|
if let Some(current_track) = queue.get_current() {
|
||||||
|
let (_, position) = m.msg.get2::<Path, i64>(); // micros
|
||||||
|
let position = (position.unwrap_or(0) / 1000) as u32;
|
||||||
|
let duration = current_track.duration();
|
||||||
|
|
||||||
|
if position < duration {
|
||||||
|
spotify.seek(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(vec![m.msg.method_return()])
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
let method_openuri = {
|
let method_openuri = {
|
||||||
f.method("OpenUri", (), move |m| {
|
f.method("OpenUri", (), move |m| {
|
||||||
let uri_data: Option<&str> = m.msg.get1();
|
let uri_data: Option<&str> = m.msg.get1();
|
||||||
@@ -512,8 +552,6 @@ fn run_dbus_server(spotify: Arc<Spotify>, queue: Arc<Queue>, rx: mpsc::Receiver<
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Seek, SetPosition (?)
|
|
||||||
|
|
||||||
// https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html
|
// https://specifications.freedesktop.org/mpris-spec/latest/Player_Interface.html
|
||||||
let interface_player = f
|
let interface_player = f
|
||||||
.interface("org.mpris.MediaPlayer2.Player", ())
|
.interface("org.mpris.MediaPlayer2.Player", ())
|
||||||
@@ -542,6 +580,8 @@ fn run_dbus_server(spotify: Arc<Spotify>, queue: Arc<Queue>, rx: mpsc::Receiver<
|
|||||||
.add_m(method_previous)
|
.add_m(method_previous)
|
||||||
.add_m(method_forward)
|
.add_m(method_forward)
|
||||||
.add_m(method_rewind)
|
.add_m(method_rewind)
|
||||||
|
.add_m(method_seek)
|
||||||
|
.add_m(method_set_position)
|
||||||
.add_m(method_openuri);
|
.add_m(method_openuri);
|
||||||
|
|
||||||
let tree = f.tree(()).add(
|
let tree = f.tree(()).add(
|
||||||
|
|||||||
Reference in New Issue
Block a user