apresolve.rs 949 B

123456789101112131415161718192021222324252627282930
  1. const APRESOLVE_ENDPOINT : &'static str = "https://apresolve.spotify.com/";
  2. const AP_FALLBACK : &'static str = "ap.spotify.com:80";
  3. use hyper;
  4. use hyper_rustls;
  5. use std::io::Read;
  6. use serde_json;
  7. use hyper::net::HttpsConnector;
  8. #[derive(Clone, Debug, Serialize, Deserialize)]
  9. pub struct APResolveData {
  10. ap_list: Vec<String>
  11. }
  12. pub fn apresolve() -> String {
  13. let connector = HttpsConnector::new(hyper_rustls::TlsClient::new());
  14. let client = hyper::Client::with_connector(connector);
  15. (|| {
  16. let mut response = client.get(APRESOLVE_ENDPOINT).send().map_err(|_| ())?;
  17. let mut data = String::new();
  18. response.read_to_string(&mut data).map_err(|_| ())?;
  19. let data : APResolveData = serde_json::from_str(&data).map_err(|_| ())?;
  20. data.ap_list.first().map(Clone::clone).ok_or(())
  21. })().unwrap_or_else(|_| {
  22. warn!("failed to resolve AP, using fallback");
  23. AP_FALLBACK.into()
  24. })
  25. }