diff --git a/src/main.rs b/src/main.rs index b965904..988f62b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,7 @@ use std::str::FromStr; use tokio_core::reactor::{Core, Handle}; use tokio_io::IoStream; use url::Url; +use std::time::Instant; use librespot::core::authentication::{get_credentials, Credentials}; use librespot::core::cache::Cache; @@ -382,6 +383,7 @@ struct Main { shutdown: bool, last_credentials: Option, + auto_connect_times: Vec, player_event_channel: Option>, player_event_program: Option, @@ -406,6 +408,7 @@ impl Main { spirc_task: None, shutdown: false, last_credentials: None, + auto_connect_times: Vec::new(), signal: Box::new(tokio_signal::ctrl_c().flatten_stream()), player_event_channel: None, @@ -454,6 +457,7 @@ impl Future for Main { if let Some(ref spirc) = self.spirc { spirc.shutdown(); } + self.auto_connect_times.clear(); self.credentials(creds); progress = true; @@ -505,7 +509,16 @@ impl Future for Main { } else { warn!("Spirc shut down unexpectedly"); self.spirc_task = None; + + while (!self.auto_connect_times.is_empty()) && ((Instant::now() - self.auto_connect_times[0]).as_secs() > 600) { + let _ = self.auto_connect_times.remove(0); + } + if self.auto_connect_times.len() >= 5 { + error!("Spirc shut down too often. Exiting to avoid too many login attempts."); + return Ok(Async::Ready(())); + } if let Some(credentials) = self.last_credentials.clone() { + self.auto_connect_times.push(Instant::now()); self.credentials(credentials); progress = true; }