1
0
Fork 0
mirror of https://github.com/librespot-org/librespot.git synced 2025-10-05 19:42:03 +02:00

refactor: update dependencies and code for latest ecosystem changes

- Update many dependencies to latest versions across all crates
- Switch from `once_cell::OnceCell` to `std::sync::OnceLock` where appropriate
- Update OAuth to use stateful `reqwest` for HTTP requests
- Fix Rodio backend to honor the requested sample format
This commit is contained in:
Roderick van Domburg 2025-08-13 13:19:48 +02:00
parent 1d5c0d8451
commit ce1ab8ff3f
No known key found for this signature in database
GPG key ID: 607FA06CB5236AE0
25 changed files with 1662 additions and 1205 deletions

View file

@ -13,12 +13,12 @@
use log::{error, info, trace};
use oauth2::basic::BasicTokenType;
use oauth2::reqwest::{async_http_client, http_client};
use oauth2::{
basic::BasicClient, AuthUrl, AuthorizationCode, ClientId, CsrfToken, PkceCodeChallenge,
RedirectUrl, Scope, TokenResponse, TokenUrl,
basic::BasicClient, AuthUrl, AuthorizationCode, ClientId, CsrfToken, EndpointNotSet,
EndpointSet, PkceCodeChallenge, RedirectUrl, Scope, TokenResponse, TokenUrl,
};
use oauth2::{EmptyExtraTokenFields, PkceCodeVerifier, RefreshToken, StandardTokenResponse};
use reqwest;
use std::io;
use std::sync::mpsc;
use std::time::{Duration, Instant};
@ -214,7 +214,7 @@ pub struct OAuthClient {
redirect_uri: String,
should_open_url: bool,
message: String,
client: BasicClient,
client: BasicClient<EndpointSet, EndpointNotSet, EndpointNotSet, EndpointNotSet, EndpointSet>,
}
impl OAuthClient {
@ -281,10 +281,11 @@ impl OAuthClient {
let (tx, rx) = mpsc::channel();
let client = self.client.clone();
std::thread::spawn(move || {
let http_client = reqwest::blocking::Client::new();
let resp = client
.exchange_code(code)
.set_pkce_verifier(pkce_verifier)
.request(http_client);
.request(&http_client);
if let Err(e) = tx.send(resp) {
error!("OAuth channel send error: {e}");
}
@ -299,10 +300,11 @@ impl OAuthClient {
/// Synchronously obtain a new valid OAuth token from `refresh_token`
pub fn refresh_token(&self, refresh_token: &str) -> Result<OAuthToken, OAuthError> {
let refresh_token = RefreshToken::new(refresh_token.to_string());
let http_client = reqwest::blocking::Client::new();
let resp = self
.client
.exchange_refresh_token(&refresh_token)
.request(http_client);
.request(&http_client);
let resp = resp.map_err(|e| OAuthError::ExchangeCode { e: e.to_string() })?;
self.build_token(resp)
@ -318,11 +320,12 @@ impl OAuthClient {
}?;
trace!("Exchange {code:?} for access token");
let http_client = reqwest::Client::new();
let resp = self
.client
.exchange_code(code)
.set_pkce_verifier(pkce_verifier)
.request_async(async_http_client)
.request_async(&http_client)
.await;
let resp = resp.map_err(|e| OAuthError::ExchangeCode { e: e.to_string() })?;
@ -332,10 +335,11 @@ impl OAuthClient {
/// Asynchronously obtain a new valid OAuth token from `refresh_token`
pub async fn refresh_token_async(&self, refresh_token: &str) -> Result<OAuthToken, OAuthError> {
let refresh_token = RefreshToken::new(refresh_token.to_string());
let http_client = reqwest::Client::new();
let resp = self
.client
.exchange_refresh_token(&refresh_token)
.request_async(async_http_client)
.request_async(&http_client)
.await;
let resp = resp.map_err(|e| OAuthError::ExchangeCode { e: e.to_string() })?;
@ -393,13 +397,10 @@ impl OAuthClientBuilder {
}
})?;
let client = BasicClient::new(
ClientId::new(self.client_id.to_string()),
None,
auth_url,
Some(token_url),
)
.set_redirect_uri(redirect_url);
let client = BasicClient::new(ClientId::new(self.client_id.to_string()))
.set_auth_uri(auth_url)
.set_token_uri(token_url)
.set_redirect_uri(redirect_url);
Ok(OAuthClient {
scopes: self.scopes,
@ -433,13 +434,10 @@ pub fn get_access_token(
uri: redirect_uri.to_string(),
e,
})?;
let client = BasicClient::new(
ClientId::new(client_id.to_string()),
None,
auth_url,
Some(token_url),
)
.set_redirect_uri(redirect_url);
let client = BasicClient::new(ClientId::new(client_id.to_string()))
.set_auth_uri(auth_url)
.set_token_uri(token_url)
.set_redirect_uri(redirect_url);
let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
@ -467,10 +465,11 @@ pub fn get_access_token(
// Do this sync in another thread because I am too stupid to make the async version work.
let (tx, rx) = mpsc::channel();
std::thread::spawn(move || {
let http_client = reqwest::blocking::Client::new();
let resp = client
.exchange_code(code)
.set_pkce_verifier(pkce_verifier)
.request(http_client);
.request(&http_client);
if let Err(e) = tx.send(resp) {
error!("OAuth channel send error: {e}");
}