@@ -9,10 +9,11 @@ use std::time::Duration;
99use tokio:: {
1010 net:: TcpStream ,
1111 sync:: mpsc:: { self } ,
12+ time:: interval,
1213} ;
1314use tokio_tungstenite:: {
1415 MaybeTlsStream , WebSocketStream , connect_async,
15- tungstenite:: { Message , Utf8Bytes } ,
16+ tungstenite:: { Bytes , Message , Utf8Bytes } ,
1617} ;
1718
1819use 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