Skip to content

Commit ebe4e4b

Browse files
committed
fix: implement websocket keepalive ping pongs
ehm yea I don't know when this has become necessary
1 parent f275b42 commit ebe4e4b

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ urlencoding = "2.1.3"
2727
uuid = { version = "1.16.0", features = ["v4"] }
2828

2929
[target.'cfg(windows)'.dependencies]
30-
libmpv2 = { git = "https://github.com/Vernoxvernax/libmpv2-rs.git", version = "5.0.1", features = ["build_libmpv"] }
30+
libmpv2 = { git = "https://github.com/Vernoxvernax/libmpv2-rs.git", version = "5.0.1", features = ["build_libmpv"] }

src/mpv.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ use std::time::Duration;
99
use tokio::{
1010
net::TcpStream,
1111
sync::mpsc::{self},
12+
time::interval,
1213
};
1314
use tokio_tungstenite::{
1415
MaybeTlsStream, WebSocketStream, connect_async,
15-
tungstenite::{Message, Utf8Bytes},
16+
tungstenite::{Bytes, Message, Utf8Bytes},
1617
};
1718

1819
use crate::{
@@ -263,7 +264,7 @@ impl Player {
263264
let media_center: &mut Box<dyn MediaCenter> = self.media_center.as_mut().unwrap();
264265

265266
let mut websocket_reader = None;
266-
let mut _websocket_sender = None;
267+
let mut websocket_sender = None;
267268
if handle.config.media_center_type != MediaCenterType::Plex {
268269
let http_address = media_center.get_address();
269270
let protocol = if http_address.contains("https") {
@@ -289,7 +290,7 @@ impl Player {
289290
if let Ok((socket, _)) = connect_async(url).await {
290291
let (sender, reader) = socket.split();
291292
websocket_reader = Some(reader);
292-
_websocket_sender = Some(sender);
293+
websocket_sender = Some(sender);
293294
}
294295
// if this fails, remote control commands will not be available.
295296
}
@@ -305,6 +306,8 @@ impl Player {
305306
// websocket_send(websocket_sender, websocket_output).await;
306307
// });
307308

309+
tokio::spawn(websocket_keepalive(websocket_sender));
310+
308311
let media_title = format!(
309312
"{} | {}",
310313
video.title[0],
@@ -394,8 +397,7 @@ impl Player {
394397
let initial_preferences = (video.preferred_audio_track, video.preferred_subtitle_track);
395398
'main: loop {
396399
if let Ok(msg) = output.try_recv() {
397-
let message = msg.to_string();
398-
if let Ok(json_message) = serde_json::from_str::<WebSocketMessage>(&message.to_string()) {
400+
if let Ok(json_message) = serde_json::from_str::<WebSocketMessage>(&msg) {
399401
if json_message.MessageType == "Playstate" {
400402
match json_message.Data.get("Command").unwrap().as_str().unwrap() {
401403
"PlayPause" => {
@@ -616,3 +618,18 @@ async fn _websocket_send(
616618
}
617619
}
618620
}
621+
622+
async fn websocket_keepalive(
623+
socket: Option<SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>>,
624+
) {
625+
if let Some(mut sock) = socket {
626+
let mut interv = interval(Duration::from_secs(60));
627+
loop {
628+
let _instant = interv.tick().await;
629+
if let Err(e) = sock.send(Message::Ping(Bytes::new())).await {
630+
eprintln!("Failed to send ping: {}", e);
631+
break;
632+
}
633+
}
634+
}
635+
}

0 commit comments

Comments
 (0)